Web3js
getTransaction 為某些 pendingTransactions 訂閱結果返回 null
我已經訂閱了主網中的 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 確實支持最終一致性,通常以毫秒為單位,因此您將在下一個塊之前看到它。