Bitcoin-Core

Bitcoind 重組後不通過 ZMQ 發佈區塊

  • January 31, 2020

在測試網上,我正在執行一個比特幣核心守護程序(bitcoind),並使用 ZMQ 接收有關交易和區塊的更新(訂閱了“rawblock”和“rawtx”)。

我很好奇 ZMQ 將如何處理鏈重組,所以我讓它在一夜之間執行,記錄我收到通知的每個塊的雜湊。

第二天早上,使用getchaintipsRPC,我可以看到確實發生了分叉,如下所示:

[
 {
   "height": 1664502,
   "hash": "00000000000000315e8e11c0babc400475f3a9bfc21678f32ca8f0f878f7e807",
   "branchlen": 0,
   "status": "active"
 },
 {
   "height": 1664491,
   "hash": "00000000002d324cbfe1261d506f85e9baf61d30e762e342f4f44429d4d6e1fb",
   "branchlen": 1,
   "status": "valid-fork"
 }
]

然而,根據我自己的日誌,我只收到了一個高度塊1664491,這是(現在陳舊的)塊"...d4d6e1fb",如下所示:

Received block 000000000001a2a613d4c66e78233f4d9fbfcf8e08502507c39c95460120cbda at height 1664490
Received block 00000000002d324cbfe1261d506f85e9baf61d30e762e342f4f44429d4d6e1fb at height 1664491
Received block 000000000000001b8f4e6ba531411eae489a6dc5e9c9c07ef9e2288f3f623014 at height 1664492
Received block 00000000000000436dfb1f1bb687bca8b905a994bcaece65ede27170fd453462 at height 1664493
Received block 00000000002753e7d21158cb6bcb8093779c7a3e7868762161edf7bedf50ce3c at height 1664494
Received block 00000000000000f18a226b32ae8399a3faf3a4c4155e153e7067f02e31c02385 at height 1664495
Received block 00000000000000ff309ae5442d7e5a271fb22cd7cac97d95d8a47a3d9d135c18 at height 1664496
Received block 000000000000606889000756962c02619a11158559d6f060daf68cef25cd0726 at height 1664497
Received block 000000000016c716d24a9dbd115807be235bf74e4fd4dec33d2e84a55a3c3a8a at height 1664498
Received block 000000000000012f5a3553526f751cb385a630cad7c285ba84a5468e8085213a at height 1664499
Received block 0000000000000119e1f42b0d345c59eb9bbf7dc9ed7591b3716ebbc26a9930b9 at height 1664500
Received block 00000000000000022b963361b5b33dcc733f1b9a20adff75336ce48d29be2227 at height 1664501

好奇,我在 height 查找了現在正確的塊的雜湊,1664491實際上是000000000001d39f8f818382632fd4c4929a34da542103d37ebfba85980d6496.

使用 RPC 命令getblock,我可以從我的 bitcoind 守護程序獲取有關此塊的資訊,這意味著它知道它。但是,我從未通過 ZMQ 收到有關此區塊的通知,這有點令人擔憂。

這是預期的行為嗎?在鏈重組期間,我是否只能期望 ZMQ 發布新鏈的尖端,讓我弄清楚發生了重組,然後不得不手動檢索新塊?

這種行為是否記錄在某處?我並不完全有信心依靠自己的實驗來弄清楚如何處理這個問題。

這是預期的行為嗎?在鏈重組期間,我只能期望 ZMQ 發布新鏈的尖端嗎?

是的,只要鏈的活動尖端發生變化,就會發出 ZMQ 通知。

如果你有一個鏈 B1-B2-B3,並且有一個 1-deep reorg 重寫 B3,你最終會得到 B1-B2-B3’-B4。此處的小費從 B3 變為 B4;它不會在兩者之間回到 B2。

讓我弄清楚發生了重組,然後不得不手動檢索新塊?

無論如何,你必須這樣做。ZMQ 不是一個可靠的協議,因此您必須能夠從失去的消息中恢復(通常,節點暫時關閉)。處理這個問題意味著發現最新的技巧與你以前的相比是一個重組。

對於 ZMQ,這通常是正確的,您可以將其用作通知機制,以便在發生更新時立即執行更新,但您也需要用於獲取恢復的基礎設施。

有關更多資訊,請參閱<https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md>上的比特幣核心 ZMQ 文件。

引用自:https://bitcoin.stackexchange.com/questions/93068