¿Cómo llegar a Nonce que necesita enviar una transacción de Ethereum?

He escrito el código del nodo js para enviar eth usando web3. Obtengo un valor nonce usando getTransactionCount, que funciona bien, pero como todos saben, no puede contar la transacción pendiente, por lo que si envío otra transacción antes de que se confirme la primera, se genera un error. aquí está mi código

                    var pkey1 = xxxxxxxxxxxxxxx;
                    var privateKey = new Buffer(pkey1, 'hex');

                    web3.eth.getTransactionCount(fromAccount, function(err, nonce) {
                        web3.eth.getGasPrice(function(err, gasPrice) {
                            var gasLimit = 31500;
                            gasPriceHex = web3.utils.toHex(gasPrice);
                            gasLimitHex = web3.utils.toHex(gasLimit);
                            nonceHex = web3.utils.toHex(nonce);
                            amountHex = web3.utils.toHex(amount);
                            var rawTx = {
                                nonce: nonceHex,
                                gasPrice: gasPriceHex,
                                gas: gasLimitHex,
                                to: toAccount,
                                from: fromAccount,
                                value: amountHex,
                            };
                            var tx = new Tx(rawTx);
                            tx.sign(privateKey);

                            var serializedTx = tx.serialize();

                            try {
                                web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
                                    if (err) {
                                        console.log(err);
                                        res.json({
                                            status: false,
                                            msg: "Please try after sometime",
                                            httpcode: 400
                                        });
                                    } else {
                                        res.json({
                                            status: true,
                                            msg: "Transaction Done Successfully",
                                            txid: hash,
                                            httpcode: 200
                                        });
                                    }
                                });
                            } catch (e) {
                                res.json({
                                    status: false,
                                    msg: "insufficient funds",
                                    httpcode: 400
                                });
                            }
                        });
                    });

Respuestas (2)

Es responsabilidad del remitente conocer su cuenta nonce. No puede inspeccionar el nodo en busca de transacciones pendientes como sustituto del seguimiento de la cuenta nonce, no de manera confiable.

En general, una billetera realiza un seguimiento del nonce para que el usuario no tenga que preocuparse por eso. Debe tener en cuenta algunos detalles para enviar transacciones a escala de manera confiable.

Consulte esta respuesta para obtener una descripción general conceptual de un proceso confiable y manejo de excepciones con un enlace a una discusión técnica de enfoques alternativos: Cómo enviar muchas transacciones a ethereum, usando js

Espero eso ayude.

Aunque los mineros generalmente pueden clasificar sus transacciones por nonces en su mempool e incluirlas en el orden correcto, esto prácticamente no sucede. Por lo tanto, se recomienda encarecidamente verificar que su transacción anterior se haya incluido en un bloque (y tal vez también se haya verificado al menos durante 2 o 3 bloques) antes de enviar una transacción con el siguiente nonce.

pero este código que estoy usando en la aplicación pública no puedo restringir al usuario para que espere hasta que se confirme la transacción anterior
Entonces ciertamente es hora de rediseñar el código, ya que la red Ethereum probablemente no esté dispuesta a adaptarse a esa aplicación;)
@AnilBaweja Para el mismo caso, he usado web3.eth.getTransactionReceiptel estado y luego encuentro el nonce usandogetTransactionCount