Я нашел этот репозиторий, который извлекает последние цены на газ с помощью web3:
https://github.com/ethgasstation/gasstation-express-oracle/blob/master/gasExpress.py
Я хотел бы написать аналогичный скрипт, который продолжал бы работать и получать обратный вызов каждый раз, когда возникает новый блок со всеми транзакциями в блоке, и сохранять текущее среднее значение цен на газ, а не вызывать все эти вызовы каждый раз, когда нам нужно чек об оплате.
Похоже, в библиотеке web3 есть опция сервера веб-сокетов. Я борюсь с тем, как это проверить. Позволяет ли testrpc автоматически отслеживать изменения блоков? Если да, то как?
Опрос изменений с помощью фильтра — единственный стандарт, который повсеместно поддерживается на всех узлах. В этом случае вы должны создать новый блочный фильтр и время от времени опрашивать свой узел. Всякий раз, когда поступают новые блоки, вы получаете в ответ список новых блоков. В 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-секундным временем блока.
пользователь19510
web3.eth.getBlockNumber()
сообщает вам номер последнего блока, и если вы не видели его раньше, вы можете обработать блок. Я рекомендую это только потому, что поддержка веб-сокетов еще не очень хороша. Например, ниganache-cli
(ранееtestrpc
), ни Infura не поддерживают его до сих пор.