getTransactionCount с «ожиданием» не работает?

Отправка транзакций Ethereum требует правильного увеличения одноразового номера. В типичном приложении могут быть одновременные и/или последовательные запросы на передачу с одного и того же адреса.

Большинство решений, которые я видел, используют getTransactionCount(fromAddress, 'pending')для установки одноразового номера транзакции, которая затем отправляется с использованием sendRawTransaction.

Если два запроса происходят в одном и том же блоке, то getTransactionCount(fromAddress, 'pending')между запросами должно увеличиваться. Однако, похоже, это не так:

> web3.eth.getTransactionCount("0xf82e...", "pending");
5
> web3.eth.sendTransaction({from: "0xf82...", to: "0xf1c...", value: 42000000000000000});
I0624 15:57:41.848826 eth/api.go:1193] Tx(0xbd094a59eb8f05653f35fa93a9254db95bc6b9b5bdd3b95aedda27bb781545f9) to: 0xf1c...
"0xbd094a59eb8f05653f35fa93a9254db95bc6b9b5bdd3b95aedda27bb781545f9"
> web3.eth.getTransactionCount("0xf82...", "pending");
5
> I0624 15:57:59.315075 miner/worker.go:337] 🔨  Mined block (#4529 / 7788e873). Wait 5 blocks for confirmation
I0624 15:57:59.315639 miner/worker.go:555] commit new work on block 4530 with 1 txs & 0 uncles. Took 529.458µs
I0624 15:57:59.315664 miner/worker.go:433] 🔨 🔗  Mined 5 blocks back: block #4524
I0624 15:57:59.315989 miner/worker.go:555] commit new work on block 4530 with 1 txs & 0 uncles. Took 310.783µs
> web3.eth.getTransactionCount("0xf82...", "pending");
6

Как видите, getTransactionCount(from, 'pending')увеличивается только после того, как блок был добыт. В результате второй запрос использует тот же одноразовый номер, и вторая транзакция завершается сбоем (поставлена ​​в очередь, отброшена и т. д.).

Это ошибка с getTransactionCount? Я предполагаю, что он должен возвращать увеличенный одноразовый номер, потому что 'pending'он был указан.

Кроме того, нужно ли нам управлять одноразовым номером на стороне приложения или это какое-то другое решение? Решением без сохранения состояния на стороне приложения было бы намного проще управлять.

То же самое. getTransactionCountс pendingувеличением только тогда, когда блок был добыт для меня. Пахнет как ошибка и будет исследовать дальше.

Ответы (2)

Это действительно ошибка, как недавно подтвердили члены команды geth. Отчет об ошибке

До тех пор вам действительно нужно будет управлять одноразовым номером на стороне приложения.

Ошибка исправлена ​​в версии 1.8.21.

https://github.com/ethereum/go-ethereum/pull/15794