Go-Ethereum
事務待處理時,getTransaction 有時會返回 null
我希望獲得實時交易數據,因為它被廣播到乙太坊網路,所以我訂閱了
pendingTransactions
. 但這只會返回交易雜湊,所以我必須呼叫getTransaction
每個雜湊來獲取更詳細的數據。const Web3 = require('web3') const web3 = new Web3('ws://localhost:8546'); web3.eth.subscribe('pendingTransactions', function(error, result){ if (error) console.log(error); }) .on("data", function(hash){ let promise = web3.eth.getTransaction(hash); promise.then(console.log); });
它大約 95% 的時間都在工作,但有時它只是返回
null
。我不知道為什麼會這樣。我知道這里之前有人問過這個問題,但我發現答案是不可接受的。交易的掛起狀態並沒有阻止其他 95% 的人返回數據,那為什麼 5% 的人有問題呢?我還嘗試對失敗的那些設置超時並重試,但問題總是相同的,所以問題不在於我的 cpu 可能超載。在確認交易之前,是否沒有可靠的方式獲取實時交易數據?
我能想像的唯一合理的事情是這筆交易被另一筆費用更高的交易所取代。
乙太坊客戶端在任何時候都可以在待處理池中進行多少交易是有限制的。因此可以放棄費用較低的交易。
由於同步它是一個 p2p 協議,一些低費用交易將隨著時間的推移不斷出現和消失。
顯然,這曾經發生在 ropsten 網路上。
我今天從 ropsten 上的輕節點得到它,即使交易有 10 次確認。
請求有可能
getTransaction()
被發送到稍微落後的對等點嗎?無論如何,由於這似乎是一個罕見的臨時問題,我的解決方案是使用一個簡單重試的包裝函式。
async getTransaction(transactionHash: string): Promise<Tx> { for (let attempt = 1; attempt <= 60; attempt++) { const transaction = await web3.eth.getTransaction(transactionHash); if (transaction) return transaction; await delay(10 * 1000); } throw new Error(`Failed to receive transaction from getTransaction("${transactionHash}")`); },
出於同樣的原因,我對
getTransactionReceipt()
.