Bitcoin-Core
如何維護本地記憶體池的持續更新副本?
假設我想建構一個交易數據庫,該數據庫使用 JSON-RPC 和 ZeroMQ 從本地執行的比特幣核心節點不斷更新。我關心的是如何使它能夠抵禦鏈重組和其他可能導致交易失去的事件。
如果我將自己僅限於已確認的交易,那麼只聽新塊似乎很簡單,並且在重組的情況下,回滾在特定高度確認的所有交易並重新應用新的鏈提示。
但是,如果我還想包含未確認的交易,它會變得更加複雜。然後對於每筆新交易(無論是在記憶體池中還是在一個塊中),我都需要檢查它是否與一個或多個未確認的交易衝突並刪除它們。比特幣核心已經這樣做了,但除了在
rawtx
ZeroMQ 事件中發布新交易之外,它沒有表明未確認的交易已被丟棄。那麼,有沒有一種簡單的方法來維護 Bitcoin Core 記憶體池的鏡像呢?
一些想法:
- 每 30 秒左右呼叫
getrawmempool
一次 RPC 以獲取記憶體池的目前狀態。這樣做的好處是非常簡單,但效率低下,這意味著鏡像會落後。- 維護目前在記憶體池中的交易花費的所有輸出的索引,並對照它檢查每個新交易。但是,我不確定這是否涵蓋需要刪除事務的所有情況,並且它當然不包括由於
-maxmempool
and 而刪除的事務-mempoolexpiry
。
有兩種方法可以做到這一點:ZMQ 和 Tracepoints。
可
zmqpubsequence
用於通知所有記憶體池事件。有關更多資訊,請參閱PR和測試。它專為記憶體池鏡像案例而設計。另一種方法是跟踪點,但這需要應用目前的PR 草案。Tracepoints 的工作方式與 ZMQ 類似,因為您的程序將使用 tracepoints 介面並等待通知。