Лучший способ отслеживать транзакции блоков по мере их совершения

Я нашел этот репозиторий, который извлекает последние цены на газ с помощью web3:

https://github.com/ethgasstation/gasstation-express-oracle/blob/master/gasExpress.py

Я хотел бы написать аналогичный скрипт, который продолжал бы работать и получать обратный вызов каждый раз, когда возникает новый блок со всеми транзакциями в блоке, и сохранять текущее среднее значение цен на газ, а не вызывать все эти вызовы каждый раз, когда нам нужно чек об оплате.

Похоже, в библиотеке web3 есть опция сервера веб-сокетов. Я борюсь с тем, как это проверить. Позволяет ли testrpc автоматически отслеживать изменения блоков? Если да, то как?

Поскольку блоки создаются относительно редко (примерно каждые 15 секунд), простой опрос — хороший способ. web3.eth.getBlockNumber()сообщает вам номер последнего блока, и если вы не видели его раньше, вы можете обработать блок. Я рекомендую это только потому, что поддержка веб-сокетов еще не очень хороша. Например, ни ganache-cli(ранее testrpc), ни Infura не поддерживают его до сих пор.

Ответы (1)

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

block_filter = web3.eth.filter('latest')

# get list of new blocks:
latest_blocks = web3.eth.getFilterChanges(block_filter.filter_id)

# wait a few seconds, and then again:
latest_blocks = web3.eth.getFilterChanges(block_filter.filter_id)

Существуют специфичные для узла реализации, которые имеют модель стиля pub/sub, например четность parity_subscription. Используя это, вы можете «подписаться» на изменения в последнем блоке и получать новые данные, когда они появляются. Но это нестандартно, поэтому поддержка в версиях web3* слабая/отсутствует. Вам придется управлять низкоуровневым взаимодействием с интерфейсом json-rpc.

ИМО, это не стоит настраивать, так как опрос не отнимет у вас много времени по сравнению с 15-секундным временем блока.