Bitcoin-Core
讀取 blk*.dat 文件時如何處理不完整的塊?
我正在嘗試從頭開始為 blk*.dat 文件編寫解析器。現在,我可以讀取塊,提取標題欄位並根據標題欄位計算正確的塊雜湊。
我只是嘗試通過所有 blk 文件執行解析器,但在成功讀取前約 300 個 blk 文件後失敗。當使用十六進制編輯器檢查失敗的文件時,我發現了兩個“魔術字節欄位”,僅由 4 個其他字節分隔。
由於強制塊頭的長度應該是 80 字節,我現在很困惑。
我發現了三個可能相關的問題:
基於這些其他問題,我的猜測如下:
- 這是一個“不完整的塊”
- 當一個塊只能部分下載或寫入磁碟時,就會發生這種情況。
- 刪除受影響的 blk 文件並重新下載部分區塊鏈沒有意義,因為這種情況可能會再次發生。
- 解析器應該能夠跳過這些塊。
- 整個 blk 文件沒有失去實際數據並且沒有損壞。
- “不完整塊”將被下載並再次寫入 blk 文件(或其他 blk 文件)中。
我的哪些假設是正確的?..哪些不是?我錯過了什麼嗎?
我要回答我自己的問題。這些是我根據 Nade Eldrege 和同名的評論得出的結論。
假設 1:這是一個“不完整的塊”
是的,這是一個不完整的塊。更具體地說,它不是 blk 文件格式的一部分。
假設 2:當一個塊只能部分下載或寫入磁碟時會發生這種情況。
是的,證據強烈表明,當比特幣在寫入磁碟時被中斷/殺死時,就會發生這種情況。如果重新啟動,它只會繼續下載新塊並將其寫入 blk 文件。它不會清理不完整的塊。
假設 3:刪除受影響的 blk 文件並重新下載部分區塊鏈沒有意義,因為這種情況可能會再次發生。
是和不是。是的,因為不中斷地刪除和重新下載 blk 文件可以解決問題。但是,在編寫 blk-parser 時,它應該能夠處理這些不完整的塊。例如,通過跳到下一個有效塊。
假設 4:解析器應該能夠跳過這些塊。
是的。見#3
假設 5:整個 blk 文件沒有失去實際數據並且沒有損壞。
我不確定,但由於 bitcoind 只是繼續下載塊並且沒有任何問題,因此可以假設不完整的塊只是在之後重新下載。
假設 6:“不完整塊”將被下載並再次寫入 blk 文件(或其他 blk 文件)中。
似乎是這樣。見#5