Web3js

未解決 web3eth.sendSignedTransaction 的承諾

  • October 28, 2021

我正在測試我離線簽署的交易是否被 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 次確認或失敗(被拒絕)之前不會解決。

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