Go-Ethereum

‘待定’的getTransactionCount不起作用?

  • May 31, 2019

發送乙太坊交易需要正確增加隨機數。在典型的應用程序中,可能有並發和/或連續請求從同一地址傳輸。

我見過的大多數解決方案都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'已經指定。

此外,我們是否需要在應用程序端管理 nonce 或者是其他一些解決方案?應用程序端的無狀態解決方案將更易於管理。

正如最近 geth 團隊的成員所證實的那樣,這確實是一個錯誤。錯誤報告

在那之前,您確實需要在應用程序端管理 nonce。

該錯誤已在 1.8.21 版本中修復

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

引用自:https://ethereum.stackexchange.com/questions/6496