Как выгрузить события Ethereum по диапазонам без пропусков

При выгрузке событий ограничение RPC может прервать обработку посередине. Разбейте историю на интервалы с известными границами, чтобы продолжить с первого необработанного блока.

Зафиксируйте верхнюю границу

Вызовите eth_getBlockByNumber с параметрами ["finalized",false] и сохраните номер блока из ответа. Это последняя высота данной выгрузки. Пример фильтра для mainnet получает события контракта WETH с блока 16 000 000 до 16 000 015 включительно. Отправьте запрос на HTTP RPC.

{"jsonrpc":"2.0","id":1,"method":"eth_getLogs","params":[{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","fromBlock":"0xf42400","toBlock":"0xf4240f"}]}

Сохраните границу вместе с результатами

Следующий интервал начинается с 0xf42410. В одной транзакции базы запишите события и отметьте, что обработка дошла до 0xf4240f включительно. Пустой массив также завершает интервал. После сбоя до фиксации повторите тот же запрос. Уникальный ключ из хеша блока и индекса события в пределах сети защитит от двойной записи.

Разделите слишком большой диапазон

Если сервер отклонил диапазон из-за размера, запросите 0xf42400–0xf42407 и 0xf42408–0xf4240f отдельно. При ограничении частоты запросов сделайте паузу. Если даже один блок превышает лимит результатов, сузьте фильтр по сигнатуре события, когда это допускает задача, либо используйте сервер, который возвращает весь результат. Оставьте отметку прогресса на последнем полностью обработанном блоке. ethereum.org Параметры фильтра событий Ethereum