Bitcoin-Core

讀取 blk*.dat 文件時如何處理不完整的塊?

  • February 17, 2018

我正在嘗試從頭開始為 blk*.dat 文件編寫解析器。現在,我可以讀取塊,提取標題欄位並根據標題欄位計算正確的塊雜湊。

我只是嘗試通過所有 blk 文件執行解析器,但在成功讀取前約 300 個 blk 文件後失敗。當使用十六進制編輯器檢查失敗的文件時,我發現了兩個“魔術字節欄位”,僅由 4 個其他字節分隔。

在此處輸入圖像描述

由於強制塊頭的長度應該是 80 字節,我現在很困惑。

我發現了三個可能相關的問題:

  1. 讀取時出現 blk 文件錯誤 - 格式是否發生了變化?
  2. 你怎麼知道你是否在一個不完整的 blk*.dat 文件的末尾?
  3. blk00*.dat 文件中的零

基於這些其他問題,我的猜測如下:

  • 這是一個“不完整的塊”
  • 當一個塊只能部分下載或寫入磁碟時,就會發生這種情況。
  • 刪除受影響的 blk 文件並重新下載部分區塊鏈沒有意義,因為這種情況可能會再次發生。
  • 解析器應該能夠跳過這些塊。
  • 整個 blk 文件沒有失去實際數據並且沒有損壞。
  • “不完整塊”將被下載並再次寫入 blk 文件(或其他 blk 文件)中。

我的哪些假設是正確的?..哪些不是?我錯過了什麼嗎?

我要回答我自己的問題。這些是我根據 Nade Eldrege 和同名的評論得出的結論。

假設 1:這是一個“不完整的塊”

是的,這是一個不完整的塊。更具體地說,它不是 blk 文件格式的一部分。

假設 2:當一個塊只能部分下載或寫入磁碟時會發生這種情況。

是的,證據強烈表明,當比特幣在寫入磁碟時被中斷/殺死時,就會發生這種情況。如果重新啟動,它只會繼續下載新塊並將其寫入 blk 文件。它不會清理不完整的塊。

假設 3:刪除受影響的 blk 文件並重新下載部分區塊鏈沒有意義,因為這種情況可能會再次發生。

是和不是。是的,因為不中斷地刪除和重新下載 blk 文件可以解決問題。但是,在編寫 blk-parser 時,它應該能夠處理這些不完整的塊。例如,通過跳到下一個有效塊。

假設 4:解析器應該能夠跳過這些塊。

是的。見#3

假設 5:整個 blk 文件沒有失去實際數據並且沒有損壞。

我不確定,但由於 bitcoind 只是繼續下載塊並且沒有任何問題,因此可以假設不完整的塊只是在之後重新下載。

假設 6:“不完整塊”將被下載並再次寫入 blk 文件(或其他 blk 文件)中。

似乎是這樣。見#5

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