Truffle Exec-Rückgabeereignisse

Ich habe eine JavaScript-Datei eingerichtet, die meinen Vertrag aufnimmt und die verschiedenen Funktionen ausführt und dann die richtigen Ereignisse zurückgibt. Die Datei läuft durch 'truffle exec'.

Ich verwende die folgende Zeile, um meine Ereignisse zurückzugeben:

      let myEvent = contract.ThisEvent({}, {fromBlock: 0, toBlock: 'latest'});
  myEvent.get((error, logs) => {
    logs.forEach(log => console.log(
      'Message: ' + log.args.message
    ))
  });

Das Problem, mit dem ich konfrontiert bin, ist, dass ich eine Vielzahl von Ereignissen mit demselben Namen habe, die jedoch unterschiedliche Nachrichten zurückgeben. Die Idee ist, dass jedes Ereignis in einer bestimmten Reihenfolge (wie in der Funktion eingerichtet) zurückgegeben wird. Aber wenn ich versuche, sie in der JS-Datei auszuführen, werden sie am Ende in der falschen Reihenfolge im Terminal zurückgegeben.

Ich bin mir nicht sicher, wie ich die Ereignisse in der richtigen Reihenfolge zurückgeben kann. Kann ich vielleicht den fromBlock/toBlock ändern, um dies zu erreichen? Und wenn ja, gibt es eine Möglichkeit, im Voraus herauszufinden, in welchem ​​​​Block welche Veranstaltung stattfinden wird?

Danke!

Antworten (1)

Auf die gleiche Weise wie Sie log.args.messagekönnen Sie log.blockNumbersehen, in welchem ​​Block dieses Ereignis ausgegeben wurde, und sie so anordnen. Allerdings könnten Sie einige von ihnen aus der Reihe bringen, da Transaktionen nicht immer in derselben Reihenfolge abgebaut werden, in der sie gesendet werden .

Hinweis 1: Mit dieser Funktion durchlaufen Sie die gesamte Kette, was sehr langsam sein kann. Normalerweise werden Ereignisse verwendet, um Benachrichtigungen auszulösen, wenn etwas passiert. Wenn Sie sie aus anderen Gründen verwenden, sollten Sie in Erwägung ziehen, sie in einer Datenstruktur im Smart zu speichern Vertrag.

Wenn Sie es für Benachrichtigungen verwenden, müssen Sie nicht die gesamte Kette lesen, sondern nur die Blöcke überprüfen, während sie abgebaut werden.

var event = myContractInstance.myEvent([{valueA: 23}] [, additionalFilterObject] , function(error, result){
 if (!error)
   console.log(result);
});

Hinweis 2: Sie scheinen web3 0.2x zu verwenden (Vorsicht beim Upgrade auf Version 1.x, da sich viele Dinge ändern)