Protocol

阻止庫存消息

  • January 2, 2016

我編寫了一些用於連接網路、接收庫存和請求數據的程式碼。我注意到的是,除非我特別請求塊,否則我的本地節點永遠不會向我發送包含塊的庫存消息。

因此,如果我使用零停止散列進行 getblocks 呼叫,我將獲得所有塊直到提示,但之後不再有任何庫存消息。是否需要某種信號來告訴我連接到的節點,當發現新塊時,我希望庫存塊消息流向我?

我正在連接協議版本 70002,relaybool 為 1,nodeservices 為 1。

我沒有看到其他關於這個問題的提及,所以我想知道是否存在未被發現的談判問題或其他問題。

沒有可見的禁令分數,連接來自本地主機,我得到一個 verack 並且正常的 tx 庫存消息被流式傳輸。無論是否使用 -whitelist 都會發生這種情況。除非我通過 getblocks 請求塊,否則我永遠不會收到塊庫存更新或未經請求的塊消息。在我檢索塊直到提示流沒有開始之後。

更新:程式碼與另一台電腦上的比特幣核心實例同步沒有問題,但本地比特幣核心實例永遠不會發送塊庫存或響應 getheaders 請求。問題僅發生在 localhost 到 localhost 發起的連接上。

Bitcoind 的區塊目錄已損壞。(0.11.0)

經過詳盡的測試,事實證明,bitcoind 的塊目錄在某種程度上已損壞,因此即使一切都表明它位於正確的鏈尖端,但它不會在沒有明確的 getblocks 請求的情況下向對等方提供塊。它會忽略 getheaders 請求,而不是中繼塊庫存。完全重新同步解決了這個問題。

關鍵是要意識到相同的程式碼可以毫無問題地連接到外部節點,並且在 Wireshark 轉儲期間,本地節點根本不會將塊中繼到網路上。

您需要在返回的 invs 中的最後一個條目上發出 getdata。這用作您已處理響應的觸發器,其餘的將自動發送。

請注意,從 0.10 版本開始,Bitcoin Core 不再使用 getdata/inv/getdata/block 循環進行同步,而是使用 getheaders/headers(用於同步 headers)。然後在發現標頭後從不同的對等方非同步獲取實際塊。

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