Ethereum-Web3-Filter nicht gefunden

Ich habe an vielen Stellen einen Fehler aufgelistet: Error: filter not foundbei der Verwendung eines Filters mit web3.

von https://blockone.thomsonreuters.com/docs/

Es ist wichtig zu beachten, dass, wenn Sie die Überwachungsfunktionen von web3 verwenden, diese in Bezug auf ihr Backend zustandsbehaftet sind – sie verlassen sich auf regelmäßige Abfragen mit einem Handle, das nur dem spezifischen Knoten bekannt ist, mit dem Sie gesprochen haben, als Sie sie eingerichtet haben. Offensichtlich ist dies ein Problem, wenn die Wiederverbindung automatisch unter der Sichtbarkeit Ihres App-Codes erfolgt – alle von Ihnen verwendeten Handles werden ungültig. Ihre Aufrufe würden aufgrund eines fehlerhaften Handles mit "Error: filter not found...." fehlschlagen – an diesem Punkt liegt es in Ihrer Verantwortung, die Watch-Aufrufe erneut auszugeben . Wenn Sie sich zufällig wieder mit einem Knoten mit einer anderen Blockhöhe verbinden, verpassen Ihre Beobachter möglicherweise Ereignisse. Daher ist es wichtig, nach Ereignissen seit dem Blockieren des letzten empfangenen Ereignisses zu suchen .

Hier ist mein Code

try {
    var filterMempool = web3.eth.filter('pending');
    filterMempool.watch(function (error, txHash) {
        if (error) {
            console.log('pending filter error: ' + error);
        } else {
            try {
                const currentTx = web3.eth.getTransaction(txHash);
                doSomething(currentTx);
            }
            catch (err) {
                console.log('mempool getTransaction error: ' + err);
            }
        }
    });
}
catch (error) {
    console.log(`filterMempool filter error: ${error}`);
}

Meine Fragen:

1) Wie kann ich die Überwachungsanrufe erneut ausgeben?

2) Wie kann ich sicherstellen, dass ich keine Veranstaltungen verpasse?

Antworten (1)

Du hast deine Frage schon irgendwie beantwortet. Der Überwachungsaufruf ist eine zustandsbehaftete Operation. Manchmal kann es vorkommen, dass wir die Verbindung verlieren, wie in https://blockone.thomsonreuters.com/docs/ erklärt .

1) Wie kann ich die Überwachungsanrufe erneut ausgeben?

Sie können einfach aufhören, den Emitter des aktuellen Ereignisses zu beobachten, und Ihren web3.eth.filter('pending') aufrufen. nochmal.

2) Wie kann ich sicherstellen, dass ich keine Veranstaltungen verpasse?

Ausnahmsweise können Sie alle Ereignisse ab dem "lastSeen"-Block bis zum letzten mithören. Von da an hören Sie wieder nur das „Neueste“ („pending“).

Ein modifizierter (Pseudo-)Code könnte wie folgt aussehen:

var currentBlock;
var filterMempool = web3.eth.filter('pending');

function filter() {

    filterMempool.watch(function (error, txHash) {
        if (error) {
            console.log('pending filter error: ' + error);
            console.log("Reinitialising filter");
            filterMempool.stopWatching();
            filterMempool.once({
                fromBlock: currentBlock,
                toBlock: 'pending'
            }, function(error, data) {
                // DO your stuff you want to do
                // Restart filter
                filter();
            });
        } else {
            const currentTx = web3.eth.getTransaction(txHash);
            currentBlock = currentTx.blockNumber;
            doSomething(currentTx);

        }
    });
}

Möglicherweise müssen Sie einige Änderungen vornehmen, bis der Code ausgeführt wird, aber ich denke, dies sollte der Weg sein, um das Filterproblem zu lösen.