Web3js

如何獲得需要在乙太坊交易中發送的隨機數?

  • February 27, 2020

我已經寫下節點 js 程式碼以使用 web3 發送 eth。我正在使用 getTransactionCount 獲得 nonce 值,它工作正常,但眾所周知,它不能計算待處理的交易,所以如果我在第一個交易確認之前發送另一個交易,它會產生錯誤。這是我的程式碼

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

發送者有責任知道他們的帳戶隨機數。您不能檢查節點是否有待處理的交易來代替跟踪帳戶隨機數——不可靠。

通常,錢包會跟踪隨機數,因此使用者無需擔心。您需要了解一些細節才能可靠地大規模發送交易。

有關可靠過程和異常處理的概念性概述,請參閱此答案,並附有替代方法技術討論的連結:How to send a lot of transactions to ethereum, using js

希望能幫助到你。

儘管礦工通常可以通過他們記憶體池中的 nonce 對您的交易進行排序,並以正確的順序將它們包含在內,但這實際上不會發生。因此,強烈建議在使用下一個 nonce 發送交易之前驗證您之前的交易是否包含在一個區塊中(並且可能至少驗證 2 或 3 個區塊)。

引用自:https://ethereum.stackexchange.com/questions/50619