Web3js

web3 eth 返回返回一個不存在的交易雜湊

  • June 27, 2020

我正在嘗試創建類似這樣的交易:

var sender = meth.eth.accounts.privateKeyToAccount(data.fromPrivate)
meth.sendTransaction({
 sender,
 to: data.to,
 amount: data.value,
}, cb)

MEth.prototype.sendTransaction = function(data, cb, curCb, nonce_offset) {
   nonce_offset = nonce_offset || 0
   var meth = this
   this.eth.getTransactionCount(data.sender.address).then(nonce => {
       nonce = nonce + nonce_offset

       this.l.acquire("tx", function(done) {
           if (nonce <= meth.nonce) {
               nonce = meth.nonce + 1
           }
           var tx = {
               nonce: web3.utils.toHex(nonce),
               value: web3.utils.toHex(data.amount || 0),
               to: data.to,
               // from: data.sender.address,
               // gasPrice: web3.utils.toHex(data.gasPriceGwei * 1e9),
               gasLimit: web3.utils.toHex(data.gasLimit || 3000000),
               data: '0x0'
           }

           if(data.encodedData) {
               tx.data = data.encodedData;
           }

           data.sender.signTransaction(tx).then(raw => {
               meth.eth.sendSignedTransaction(raw.rawTransaction, err => {
                   if (!err)
                       meth.nonce = nonce
                   else {
                       if(err.message.startsWith('Returned error: known transaction') || 
                           err.message.startsWith('Returned error: already known')) {
                           var newtx = tx
                           meth.sendTransaction(data, cb, curCb, nonce_offset + 1)
                           done()
                           return
                       }
                   }
                   done()

                   if (!err) {
                       meth.eth.getTransaction(raw.transactionHash).then(function(nettx) {
                           if(!nettx)
                               var fee = undefined
                           else
                               var fee = parseInt(nettx.gasPrice) * nettx.gas
                           cb(err, raw.transactionHash, fee)
                       })
                   } else cb(err)
               })

               curCb && curCb(null)

           })
       
       })
   });
}

問題是我定期執行 getTransaction 並設法竊取資訊,但在另一個時刻我什至沒有時間。而且在任何情況下,交易都不會出現在網路上,也就是說,好像節點設法接受了交易並出於某種原因立即將其刪除。控制台中沒有錯誤消息,我嘗試使用.on('error'),它也沒有返回任何內容,我什麼都不明白,我不明白我怎麼能理解我的問題是什麼。我使用 infura ropsten 網路。

$ node eth.js
balance, 98276995500000000
null '0xc33771b09d8f9a922cb3daf5623cca2997b49b0fce503dcb55f1e97306cc2734' undefined // getTransaction -> fee = undefined

$ node eth.js
balance, 98276995500000000
null '0xc33771b09d8f9a922cb3daf5623cca2997b49b0fce503dcb55f1e97306cc2734' 9000000 // getTransaction -> fee = 9000000, the hash is repeated accordingly, there are no errors at the same time, there is no transaction in the explorer 

$ node eth.js
balance, 98276995500000000 undefined undefined
null '0xc33771b09d8f9a922cb3daf5623cca2997b49b0fce503dcb55f1e97306cc2734' undefined // again fee undefined, and again the same hash

所以我想出了我的問題。這很難理解,但關鍵是我試圖讓 nonce + 1 如果它等於或小於上次執行的時間。

一般來說,如果你不深入細節,你的nonce應該被清楚地觀察到。在我的情況下,當網路期望 nonce 0 時,我嘗試將 nonce 設為 1,節點認為在此交易之前還有另一個,但它還不知道,只是刪除了該交易。小心你發送的隨機數

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