web3.eth.getBlock('ожидание') возвращает последний блок, а не ожидающий блок, это ожидается?

Я пытаюсь использовать web3 или JSON-RPC, чтобы получить список ожидающих транзакций.

В документах API web3 говорится, что вызов web3.eth.getBlock('pending')вернет структуру, показывающую блок, numberи hashбудет нулевым. Ответ на этот вопрос соглашается и говорит, что block.transactionsбудут незавершенные транзакции. Но я вижу ненулевые значения для полей numberи , которые соответствуют блоку, и список транзакций, которые были включены в этот блок. На самом деле, и вернуть тот же результат. Например, при работе локального узла контроля четности (Parity/v1.4.7-beta-f2058bd-20161227):hashlatestweb3.eth.getBlock('pending')web3.eth.getBlock('latest')

> let Web3 = require('web3');
> let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
> blockL = web3.eth.getBlock('latest');
> blockP = web3.eth.getBlock('pending');
> [blockL.number, blockL.hash]
[ 2971275, '0x2187511e60d49a5ed081ccc31ee4f76365727254e9001f4b563c47cee457ed3f' ]
> [blockP.number, blockP.hash]
[ 2971275, '0x2187511e60d49a5ed081ccc31ee4f76365727254e9001f4b563c47cee457ed3f' ]

Я попытался сделать вызов JSON-RPC напрямую, а также получил последний блок, а не информацию об ожидающем:

$ curl -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["pending",false],"id":0}' localhost:8545
  { "result" : {
       ... ,
       "number" : "0x2d4c56", 
       ...
       "hash" : "0xb0d47255dbeae836384321b1141ae221254fa7ee4ded07f3d49afb875f05a44e"
       ... }
  }

Я также пытался использовать узел Infura RPC и получил аналогичные результаты.

Я неправильно понимаю, что pendingдолжно означать? Есть ли другой способ использовать web3 или JSON-RPC для получения списка ожидающих транзакций?

(Когда я использую web3.eth.filter('pending'), я вижу ожидающие транзакции по мере их поступления на мой узел, но это отличается от запроса текущего ожидающего набора.)

Ответы (2)

Этот ответ подсказывает мне, что web3.eth.getBlock('pending')он актуален только в том случае, если вы занимаетесь майнингом. Ты?

Если нет, то да... возвращение текущего добытого блока кажется ожидаемым поведением.

Нет, я не занимался майнингом. Я видел этот ответ, но когда я перечитал его сейчас, он кажется специфичным для встроенной консоли geth, а не для интерфейса web3/RPC, поскольку он относится к средствам доступа, отличным от web3, таким как eth.pendingTransactions. Документы web3 и JSON-RPC не предполагают, что для просмотра pendingтранзакций требуется локальный майнинг, и я вижу их с web3.eth.filter('pending'). Моя мотивация — отслеживать жизненный цикл транзакций, созданных Dapp. Я хотел бы сравнить список транзакций, которые я пытался отправить, с теми, которые в настоящее время ожидаются или добыты.
Этот ответ Петера Силаджи предполагает pending, что он полезен для пользовательского интерфейса, который хочет показать ход транзакции. Думаю, я всегда могу позвонить web3.eth.getTransaction()по каждой из интересующих сделок. Если он находится на рассмотрении, значение .blockNumberбудет нулевым.

Ваш узел четности будет возвращать другой ожидающий блок только тогда, когда включен один из режимов miningили sealing( ). --force-sealingЭто заставляет узел создавать ожидающие блоки и учитывать их при вызовах API.