getTransactionCount mit 'pending' funktioniert nicht?

Das Senden von Ethereum-Transaktionen erfordert das ordnungsgemäße Erhöhen der Nonce. In einer typischen Anwendung kann es gleichzeitige und/oder aufeinanderfolgende Übertragungsanforderungen von derselben Adresse geben.

Die meisten Lösungen, die ich gesehen habe, verwenden getTransactionCount(fromAddress, 'pending'), um die Nonce der Transaktion festzulegen, die dann mit gesendet wird sendRawTransaction.

Wenn zwei Anforderungen im selben Block auftreten, getTransactionCount(fromAddress, 'pending')sollte zwischen den Anforderungen erhöht werden. Dies scheint jedoch nicht der Fall zu sein:

> 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

Wie Sie sehen können, getTransactionCount(from, 'pending')steigt es erst, nachdem der Block abgebaut wurde. Infolgedessen verwendet die zweite Anforderung dieselbe Nonce und die zweite Transaktion schlägt fehl (in die Warteschlange gestellt, gelöscht usw.).

Ist das ein Fehler mit getTransactionCount? Ich würde davon ausgehen, dass es eine erhöhte Nonce zurückgeben sollte, weil 'pending'angegeben wurde.

Müssen wir auch die Nonce auf der Anwendungsseite verwalten oder gibt es eine andere Lösung dafür? Eine zustandslose Lösung auf der Anwendungsseite wäre viel einfacher zu verwalten.

Hier gilt das gleiche. getTransactionCountmit pendingnur Erhöhungen, wenn ein Block für mich abgebaut wurde. Riecht wie ein Fehler und wird weiter untersucht.

Antworten (2)

Dies ist in der Tat ein Fehler, wie kürzlich von Mitgliedern des Geth-Teams bestätigt wurde. Fehlerbericht

Bis dahin müssen Sie sich zwar anwendungsseitig mit Nonce behelfen.

Der Fehler wurde in Version 1.8.21 behoben

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