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:
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!
Ä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 fromBlock
Parameters zum aktuellen Block, indem wir den toBlock
Parameter zum Ereignis hinzufügen.
fromBlock
es als letztes ... und entfernen Sie estoBlock
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.
Crissi Mariam Robert
num.watch
nichtcontractInstance.watch