getTransactionCount con 'pendiente' no funciona?

El envío de transacciones de Ethereum requiere incrementar el nonce correctamente. En una aplicación típica, puede haber solicitudes simultáneas y/o consecutivas para transferir desde la misma dirección.

La mayoría de las soluciones que he visto usan getTransactionCount(fromAddress, 'pending')para establecer el nonce de la transacción, que luego se envía usando sendRawTransaction.

Si ocurren dos solicitudes en el mismo bloque, entonces getTransactionCount(fromAddress, 'pending')debería aumentar entre las solicitudes. Sin embargo, este no parece ser el caso:

> 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

Como puede ver, getTransactionCount(from, 'pending')solo aumenta después de que se ha minado el bloque. Como resultado, la segunda solicitud usa el mismo nonce y la segunda transacción falla (en cola, descartada, etc.).

¿Es esto un error con getTransactionCount? Supongo que debería devolver un nonce aumentado, porque 'pending'se ha especificado.

Además, ¿necesitamos administrar el nonce en el lado de la aplicación o hay alguna otra solución para esto? Una solución sin estado en el lado de la aplicación sería mucho más sencilla de administrar.

Igual aquí. getTransactionCountcon pendingsolo aumentos cuando se extrajo un bloque para mí. Huele a bicho y lo investigaré más a fondo.

Respuestas (2)

De hecho, esto es un error, como lo confirmaron recientemente los miembros del equipo geth. Informe de error

Hasta entonces, deberá administrar nonce en el lado de la aplicación.

El error se ha corregido en la versión 1.8.21

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