Как восстановить поток событий Ethereum после обрыва WebSocket
Идентификатор подписки привязан к соединению. Чтобы получить все подходящие события после обрыва, обработчику нужно восстановить интервал с последней сохранённой позиции.
Откройте подписку до чтения пропущенных блоков
Откройте новый сокет, подпишитесь на уведомления о вершине цепочки и дождитесь идентификатора подписки. Если нужны финализированные события, используйте уведомления как сигнал для опроса. Этот запрос отправляется по WebSocket.
{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}
Сразу запросите по RPC eth_getBlockByNumber с параметрами ["finalized",false]. Пусть в базе последним полностью обработанным финализированным блоком записан 850, а RPC уже возвращает 875. С тем же фильтром приложения вызовите eth_getLogs для блоков с 851 по 875 включительно. Восстанавливать каждое из 25 уведомлений о новых блоках не требуется.
Зафиксируйте прогресс после обработки
Записывайте каждую обработанную порцию событий вместе с номером и хешем её последнего блока. После перезапуска сверьте хеш с ответом RPC на сохранённой высоте. При расхождении приостановите обработку и проверьте сеть и адрес сервера. По каждому сигналу сканируйте интервал от первой необработанной высоты до текущего финализированного блока.
Продолжайте опрос в тишине
Периодический опрос позволит продолжить обработку, если связь исчезла, а сокет ещё считается открытым. Интервал выбирайте по допустимой задержке данных. Описанная схема дожидается финализации. Для отображения предварительных событий также понадобится откат изменений при реорганизации цепочки. geth.ethereum.org Срок жизни подписки и обработка реорганизаций в Geth