Фильтр Ethereum web3 не найден

У меня ошибка указана во многих местах: Error: filter not foundпри использовании фильтра с web3.

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

Важно отметить, что, если вы используете функции наблюдения web3, они сохраняют состояние по отношению к их серверной части — они полагаются на периодический опрос с дескриптором, который известен только конкретному узлу, с которым вы разговаривали, когда вы их настроили. Очевидно, что это проблема, если переподключение происходит автоматически в невидимости кода вашего приложения — любые такие дескрипторы, которые вы используете, будут признаны недействительными. Ваши вызовы будут ошибочными из-за неправильного дескриптора с "Ошибка: фильтр не найден..." - в этот момент вы несете ответственность за повторную отправку вызовов часов . Если вам случится переподключиться к узлу с другой высотой блока, ваши наблюдатели могут пропустить события. Поэтому важно проверять события, начиная с блока последнего полученного события .

Вот мой код

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}`);
}

Мои вопросы:

1) Как мне перевыпустить звонки часов?

2) Как убедиться, что я не пропущу ни одного события?

Ответы (1)

Вы вроде уже ответили на свой вопрос. Watch call — это операция с отслеживанием состояния. Иногда может случиться так, что мы потеряем соединение, как описано в https://blockone.thomsonreuters.com/docs/ .

1) Как мне перевыпустить звонки часов?

Вы можете просто перестать наблюдать за текущим эмиттером событий и вызвать свой web3.eth.filter('pending'); снова.

2) Как убедиться, что я не пропущу ни одного события?

На этот раз вы можете прослушать все события, происходящие от блока «lastSeen» до самого последнего. Оттуда вы снова слушаете только «последние» («ожидающие»).

Модифицированный (псевдо) код может выглядеть так:

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);

        }
    });
}

Возможно, вам придется внести некоторые изменения, пока код не заработает, но я думаю, что это должно решить проблему с фильтром.