Я записал код 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
});
}
});
});
Ответственность за знание одноразового номера своей учетной записи лежит на отправителе. Вы не можете проверить узел на наличие ожидающих транзакций в качестве замены для отслеживания одноразового номера учетной записи - ненадежно.
Как правило, кошелек отслеживает одноразовый номер, поэтому пользователю не нужно об этом беспокоиться. Вам нужно знать несколько деталей, чтобы надежно отправлять транзакции в масштабе.
См. этот ответ для концептуального обзора надежного процесса и обработки исключений со ссылкой на техническое обсуждение альтернативных подходов: Как отправить много транзакций в Эфириум с помощью js
Надеюсь, поможет.
Хотя майнеры обычно могут сортировать ваши транзакции по одноразовым номерам в своем мемпуле и включать их в нужном порядке, этого практически не происходит. Поэтому настоятельно рекомендуется убедиться, что ваша предыдущая транзакция была включена в блок (и, возможно, также проверена, по крайней мере, для 2 или 3 блоков), прежде чем отправлять транзакцию со следующим одноразовым номером.
Анил Баведжа
Никита Фукс
Крисси Мариам Роберт
web3.eth.getTransactionReceipt
статус, а затем нашел одноразовый номер, используяgetTransactionCount