未解決 web3eth.sendSignedTransaction 的承諾
我正在測試我離線簽署的交易是否被 Ropsten 網路接受。我正在使用 Web3.js (web3@1.0.0-beta.51) 送出交易,如下所示:
我連接到一個 INFURA 節點,然後使用
web3.eth.sendSignedTransaction
. 根據文件,這應該返回一個PromiEvent
. 但是,送出發出的事件不會被擷取,並且承諾永遠不會解決。儘管如此,該交易仍被送出到網路並且是有效的(這是一項簡單的交易,將資金從一個非合約賬戶發送到另一個賬戶)。可以在任何區塊瀏覽器中找到它,例如 etherscan。1中的程式碼未按預期執行:
const Web3 = require('web3'); const Tx = require('ethereumjs-tx') const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/v3/my_Infura_key")); ; const privateKey = new Buffer(a_private_key_controlling_an_account_with_say_more_than_1_ether, 'hex') const rawTx = { nonce: '0x00', // adjust accordingly if it's not the first transaction by the account gasPrice: '0x09184e72a000', gasLimit: '0x2710', to: '0x0000000000000000000000000000000000000000', value: '0x00', data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057', chainId: 3 } const tx = new Tx(rawTx); tx.sign(privateKey); const serializedTx = tx.serialize(); web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')) .on('receipt', console.log); // result: the code simply hangs without printing anything
上面的程式碼只是掛起,因為返回的承諾
sendSignedTransaction
永遠不會被解決。也沒有收到任何事件,因此.on('receipt')
永遠不會觸發。然而,交易成功送出到網路,並且發送者賬戶被扣除了大約 0.21 乙太幣(由於沒有傳輸價值,天然氣的價格)。所以問題不在於送出,而PromiEvent
在於web3.eth.sendSignedTransaction
返回。我懷疑這個問題可能與 INFURA 節點的問題有關,並且在其他地方討論了事件,但我不知道是否是這種情況。我無法檢查
web3
通過本地 geth 節點實例化會發生什麼。無論如何,我在文件1中沒有看到他們提到PromiEvent
僅適用於某些 Web3 實例的地方。任何人都知道為什麼會發生這種行為?
我在這裡遇到了同樣的問題,我發現了一個臨時問題:
問題出在 web3 更新檔上,我使用的是“1.0.0-beta.52”版本。所以,我回到“1.0.0-beta.37”,一切正常。
我不知道為什麼不使用新版本…順便說一句
我在使用 web3@1.2.9 時遇到了同樣的問題,但最後,這是預期的行為。
據我所知,PromiEvent返回一個TransactionReceipt。由於交易在沒有確認的情況下不能有收據,因此承諾在獲得 1 次確認或失敗(被拒絕)之前不會解決。