Go-Ethereum
‘待定’的getTransactionCount不起作用?
發送乙太坊交易需要正確增加隨機數。在典型的應用程序中,可能有並發和/或連續請求從同一地址傳輸。
我見過的大多數解決方案都
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 版本中修復