Web3js
web3 eth 返回返回一個不存在的交易雜湊
我正在嘗試創建類似這樣的交易:
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,節點認為在此交易之前還有另一個,但它還不知道,只是刪除了該交易。小心你發送的隨機數