как получить одноразовый номер, который нужно отправить в транзакции ethereum?

Я записал код node js для отправки eth с помощью web3. Я получаю значение одноразового номера, используя getTransactionCount, который работает нормально, но, как всем известно, он не может подсчитать ожидающую транзакцию, поэтому, если я отправлю другую транзакцию до подтверждения первой, она выдаст ошибку. вот мой код

                    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
                                });
                            }
                        });
                    });

Ответы (2)

Ответственность за знание одноразового номера своей учетной записи лежит на отправителе. Вы не можете проверить узел на наличие ожидающих транзакций в качестве замены для отслеживания одноразового номера учетной записи - ненадежно.

Как правило, кошелек отслеживает одноразовый номер, поэтому пользователю не нужно об этом беспокоиться. Вам нужно знать несколько деталей, чтобы надежно отправлять транзакции в масштабе.

См. этот ответ для концептуального обзора надежного процесса и обработки исключений со ссылкой на техническое обсуждение альтернативных подходов: Как отправить много транзакций в Эфириум с помощью js

Надеюсь, поможет.

Хотя майнеры обычно могут сортировать ваши транзакции по одноразовым номерам в своем мемпуле и включать их в нужном порядке, этого практически не происходит. Поэтому настоятельно рекомендуется убедиться, что ваша предыдущая транзакция была включена в блок (и, возможно, также проверена, по крайней мере, для 2 или 3 блоков), прежде чем отправлять транзакцию со следующим одноразовым номером.

но этот код, который я использую в общедоступном приложении, я не могу запретить пользователю ждать, пока не будет подтверждена предыдущая транзакция
Тогда, безусловно, пришло время для редизайна кода, так как сеть Ethereum, вероятно, не захочет адаптироваться к этому приложению ;)
@AnilBaweja В том же случае я использовал web3.eth.getTransactionReceiptстатус, а затем нашел одноразовый номер, используяgetTransactionCount