Wie erhalte ich nur das neueste Protokoll von meiner Veranstaltung?

Ich verwende derzeit Oraclize in meinem Vertrag und rufe eine Vertragsfunktion von meinem Front-End aus auf und möchte nicht mit dem nächsten Aufruf fortfahren, bis die Oraclize-Funktion zurückgegeben wurde. Also habe ich mich entschieden, ein Ereignis mit einem Filter zu verwenden, und es funktioniert beim ersten Mal perfekt, dann wartet es bei den nächsten Aufrufen nicht wirklich darauf, dass die Oraclize-Funktion wieder zurückkehrt, es nimmt nur den Rückgabewert von der vorherigen Oraclize-Funktion und verwendet das, weil es das alte protokollierte Ereignis verwendet und nicht auf das neueste wartet.

Dies führt mich zu der Frage, warum mein Filter das vom Smart Contract im letzten Aufruf ausgegebene Ereignis abhört/verwendet, anstatt darauf zu warten, dass das neue Ereignis aufgerufen wird. Es gibt später den neuen Oraclize-Wert zurück, wenn ich myEvent.stopListening() nicht verwende, damit ich weiß, dass Oraclize nach dem ersten Aufruf noch funktioniert.

Meine Frage ist, wie hörst/reagierst du nur auf das letzte Ereignis? Im Moment nimmt es das Ereignis, das zuvor ausgelöst wurde, und wird dadurch ausgelöst.

Hier ist mein Front-End-Code, der das Ereignis beobachtet:Code

Ich habe auch versucht, verschiedene Kombinationen für den Filter zu verwenden, wie zum Beispiel: {fromBlock: 'latest', toBlock:'latest} oder {fromBlock: 'latest'}

Beide funktionieren überhaupt nicht, sie werden beim ersten Mal nie ausgelöst. Wenn ich die Funktion dann erneut aufrufe, haben sie das gleiche Problem und werden sofort beim vorherigen protokollierten Ereignis ausgelöst.

Kann mir jemand erklären, was 'latest' tut, denn ich scheine ein schlechtes Verständnis zu haben. Auch wenn dies einen Unterschied macht, findet mein Event-Aufruf in meinem Smart-Vertrag in __callback() von Oraclize statt, und mein Front-End-Überwachungscode wird in einen Rückruf eingefügt, wo der Benutzer auf eine Schaltfläche klickt und eine Zahl eingibt und die Transaktion sendet. Verursacht die Platzierung innerhalb einer Callback-Funktion diesen seltsamen Fehler?

Vielen Dank für Ihre Hilfe oder Ihr Verständnis. Ich habe die Dokumentation sowohl zu Vertragsereignissen als auch zu web3.eth.filters durchgesehen, konnte dies jedoch nicht herausfinden. Sorry für die riesige Textwand.

TL:DR Wie bringen Sie Ihre watch() dazu, nur nach neuen Ereignisprotokollen zu suchen und nicht auf vergangene Ereignisprotokolle zu reagieren, die ausgelöst wurden? Danke schön!

Es ist num.watchnichtcontractInstance.watch

Antworten (2)

Ändern Sie den Code wie folgt:

 var num=contractInstance.Result({},{fromBlock: 0, toBlock: 'latest' });
     num.watch(function(error,result){
 });

Hier rufen wir die Ereignisse aus Block 0 ab, und zwar durch Hinzufügen eines fromBlockParameters zum aktuellen Block, indem wir den toBlockParameter zum Ereignis hinzufügen.

Oh, schieße, ich habe die Variablennamen und die Vertragsvariable für den Screenshot geändert, um sie leichter verständlich zu machen, und habe ContractInstance.watch() anstelle von num.watch() eingefügt. In meinem aktuellen Code, der nicht funktioniert, verwende ich num.watch () und nicht die contractInstance. Ich habe festgestellt, dass das, was es tut, Sinn macht, weil ich es so spezifiziere, dass es nach Protokollen von Block 0 bis zum letzten Block sucht, und es funktioniert beim ersten Mal perfekt, dann beim zweiten Mal usw. Es gibt automatisch den vorherigen Oraclize-Aufruf zurück War.
@savard versuchen Sie fromBlockes als letztes ... und entfernen Sie estoBlock
Ich verstehe nicht, warum fromBlock: 'latest', toBlock: 'latest' nicht funktioniert, um nur nach der neuesten/letzten Antwort zu suchen. Wenn ich das verwende, erkennt es das Ereignisprotokoll nie und läuft für immer, bis ich die Funktion erneut ausführe. Dann gibt es auch den letzten Oraclize-Aufruf zurück. Vielen Dank jedoch für Ihre Antwort @cmr , das war mein Fehler. Ich werde den Fragen-Screenshot bearbeiten. Haben Sie eine Idee, warum es nicht "funktionieren" würde, wenn ich die Syntax korrekt verwende? (Technisch funktioniert es, nur nicht so, wie ich es brauche). Vielen Dank im Voraus!
@savard jede Aktualisierung
Ja, ich habe gerade den Test von fromBlock: 'latest, toBlock: 'latest' + 1 beendet und es hat funktioniert! Ich denke, weil mein Ereignis von der Oraclize-Funktion zurückkehrt, die 1 - 2 Blöcke in der Zukunft zurückgibt, also hat fromBlock: 'latest' es nicht abgefangen. Vielen Dank! Ich habe in den letzten 3 Tagen damit gekämpft und Sie haben mich dazu inspiriert, diese Konfiguration auszuprobieren.
@savard Es hat mir auch geholfen, ein Level hinzuzufügen. Danke

Wenn Sie Ereignisse von 0 bis spätestens abrufen , erhalten Sie immer alle Ereignisse, die stattgefunden haben. Wenn Sie zuvor Daten festgeschrieben haben und die Uhr einfach von den angegebenen zu und von Blöcken starten, werden Sie sehen, dass Sie bald alles erhalten, was festgeschrieben wurde.

Versuche dies:

var event = conInst.YourEventName({},{
     fromBlock:'latest', 
     toBlock:'pending'}, 
   function(error, result) {
    if (!error)
        console.log(result.args);
   });

Dadurch erhalten Sie die Daten, die gerade abgebaut werden. Das Problem dabei ist, dass Sie wahrscheinlich nicht immer alle Protokolle haben (je nachdem, wer mit Ihrem Smart Contract interagiert). Aber es gibt Ihnen sicherlich das Erste, was auf die Blockchain gehen wird.

Eine andere Möglichkeit, dies vollständig zu beweisen, besteht darin, sie intern zu filtern. Angenommen, Sie haben eine Zuordnung von einer ID zu einer Struktur, jetzt haben Sie für eine ID einige Daten geändert, jetzt erhalten Sie sowohl die alte als auch die neue für dieselbe ID. Was Sie also tun können, ist, die "blockNumber" im Ereignis zu übergeben. Wenn Sie also die Datensätze erhalten, durchlaufen Sie sie und sehen einfach, ob Sie für dieselbe ID mehrere haben und die höchste blockNumber nehmen.

Es ist genau so, wie ich es mache, aber es ist langsam. Sie können einen anderen Weg gehen, aber Sie bekommen die Idee.

Und wie bekomme ich alle Ereignisse hierher, wenn fromBlock: 0, toBlock: "latest" nur das neueste Ereignis zurückgibt?