如何通過 ZMQ 從 bitcoind 檢測重組?
我有自己的 bitcoind 伺服器(比特幣核心)並通過 ZMQ 從 bitcoind 接收交易數據。然後將事務儲存到我的數據庫中以進行數據分析或靜態分析。
[bitcoind] –> (通過 ZMQ 進行的比特幣交易) –> [儲存到我的數據庫中]
通常情況下,它執行良好,但有時當檢測到多個鏈時,區塊鏈會重新組織。那時,我也必須更新我的數據庫。我的問題是如何檢測來自 bitcoind 伺服器的重組事件。或者你對此有什麼好主意。
供參考,
- 我正在通過 ZMQ 收聽新的塊生成通知。
- 我擁有自己的數據庫的主要原因是看到有色硬幣交易和交易對手交易。
更新 1
好像只能訂閱四個頻道;hashblock、hashtx、rawblock 和 rawtx。通過 ZMQ 可能無法知道重組。當我收到新塊通知時,我可能必須確認是否存在分叉。
更新 2
每次收到新的交易通知時,我可能必須呼叫 getchaintips RPC。
更新 3
我的理解是我需要以下過程來重組 MY OWN 數據庫。
getchaintips RPC 的響應
{ "height": 420561, "hash": "000000000000000001cb02590846299c91794e9b9f422513cff4b9c1dd5c62a", "branchlen": 0, "status": "active" }, { "height": 419698, "hash": "000000000000000004a3a78750438d0491b6335cbbe9c15099a6e55b6943e51a", "branchlen": 1, "status": "valid-headers" }, { "height": 418868, "hash": "000000000000000000ba1d7d93ad1c7f04fb4a430fdee67c44fbdd3236f2b805", "branchlen": 1, "status": "valid-fork" },
- 當我收到新的 tx 通知時呼叫 getchaintips。
- 比較兩個雜湊。一個是狀態是“有效分叉”,另一個是儲存在我自己的數據庫中相同高度的雜湊值。(如上響應,height=418868,hash=000000000000000000ba1d7d93ad1c7f04fb4a430fdee67c44fbdd3236f2b805)
- 如果兩個雜湊值不同,則刪除valid-fork高度的所有記錄,並從hight獲取事務到活動狀態的高度(如上響應,height=420561),然後將它們插入到我自己的數據庫中。
更新 4
Counterparty 似乎檢測到以下原始碼中的重組。我想我可以將其視為參考。
<https://github.com/CounterpartyXCP/counterparty-lib/blob/5498d891ffec270c64a5804a4273962d2c759fa5/counterpartylib/lib/blocks.py#L1074>
您可以使用該
rawblock
界面來確定是否有重組。每次你收到一個新塊,你就解碼這個塊,特別是塊頭。然後將每個塊及其前一個塊儲存在數據庫中。
當您收到一個與您已經收到的另一個塊共享相同前一個塊的塊時,您就知道重組已經/正在發生。
我不確定 ZeroMQ 具體是如何工作的,但是如果你從 bitcoind 收到一個新的塊通知並且你沒有它,你必須檢索該塊的詳細資訊(
getblock
)。檢查它是否是最好的塊。然後檢查你是否有前一個塊(使用上面塊的詳細資訊中的前一個塊雜湊)並檢索它,直到你的數據庫中有前一個塊或前一個塊是創世塊。
您在此過程中添加的每個塊都需要檢查是否有其他塊處於相同高度並將它們刪除或將它們標記為不屬於最佳鏈。