Web3js

getTransaction 為某些 pendingTransactions 訂閱結果返回 null

  • March 8, 2022

我已經訂閱了主網中的 ETH pendingTransactions。我正在為每個收到的pendingTransaction 做getTransaction,如下所示。

web3.eth.subscribe('pendingTransactions', function(error, txnid) {
   if (txnid) {
       web3.eth.getTransaction(txnid, function(err, txn) {
           if (!err) {
               console.log(txn);
           }
           else
               console.log(err);
       });
   }
   else
       console.log(error);
});

我的問題是,對於某些 txnid,我得到了 txn=null。如果我在一段時間後嘗試,我會得到正確的響應。

有沒有其他方法可以監聽所有新的傳入交易並getTransaction為它們服務?

這個問題到現在已經兩年了。但是我想回答,因為原始答案不是正確的解釋。正如評論所說,Geth 不需要getTransaction()將交易提供給API之前對其進行探勘。

相反,問題在於 Geth 的 txPool 一致性模型不是完全的先讀後寫。當一個 tx 雜湊發布給訂閱者時,不能保證它會被處理以在 API 上提供服務。如果您嘗試在getTransaction()之後立即獲取,您可能會遇到競爭條件並獲得空(即未找到)結果。

解決方案不是等待下一個區塊被探勘,而是在短時間內重試。Geth 確實支持最終一致性,通常以毫秒為單位,因此您將在下一個塊之前看到它。

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