在 geth 節點上訂閱新的 txpool 交易
我知道可以使用txpool API查詢 geth 節點的 txpool狀態。但是,我想知道是否有可能訂閱進入 geth 節點的 txpool 的新事務,可能在 websockets 或本地套接字 rpc 連接上?我也想在 Go 中編寫訂閱新 txpool 交易的程序。
我在go-ethereum 內部發現了這個訂閱,但不幸的是,它看起來並沒有暴露。
請注意,我不僅在談論本地待處理交易(此處已回答),還包括所有到達 txpool 的交易。
背景:我想做關於搶先交易的研究。Flash Boys 2.0 論文的作者在 github上發布了他們的geth fork ,他們用它來觀察 txpool 中的 gas 拍賣。但是,使用 fork 不如擴展 geth 的 API 以使外部應用程序可以訂閱 txpool udpate 那樣可重用和可維護。
自 2017 年底以來,我們一直在使用經過修改的 geth 客戶端執行ethviewer.live 。跟上最新版本的 geth 肯定很痛苦。此外,當我們無法跟上分叉時,我們會出現中斷。正如@Eugene 所建議的那樣,我嘗試過
web3.eth.subscribe('pendingTransactions')
,它似乎工作正常。不過有一個警告——Geth 上的訂閱 API 是盡力而為,這意味著它可能偶爾會錯過 TX 或阻止。如果您需要所有數據,則需要進行狀態管理並使用 Web3.eth 函式提取任何失去的數據。根據 GitHub 的討論,Geth 可能無法解決此問題,而 Parity 似乎可以解決此問題。由於您對搶先交易感興趣,請注意節點在收到包含它們的塊後會獲得大部分交易。例如,
--maxpeers = 50
在ethviewer.live上,大約 40% 的交易在包含它們的區塊到達之後到達(即,區塊時間戳或到達時間 < 交易到達時間)。我還通過轉儲blockchair.com交易池進行了檢查,發現比例約為 55%(不知道他們用作什麼--maxpeers
)。這些測量進行了幾天。--- maxpeers
因此,除了擁有良好的頻寬外,您可能還想玩高值。
這有點違反直覺,但是雖然
web3.eth.getPendingTransactions()
只返回本地待處理交易(from
交易欄位值匹配節點內的帳戶),但web3.eth.subscribe('pendingTransactions')
將返回一個全域待處理交易流。請在此處查找使用範例。