Blockchain

為什麼 blockxxxxx.dat 中的塊順序與 blockchain.info 不同

  • September 17, 2018

我使用 python 程式碼解析了 block00000.dat:

class BlockFile:
 def __init__(self, block_filename):
   self.block_filename = block_filename
   self.blockchain = open(block_filename, 'rb', buffering=16*1024*1024)

 def get_next_block(self):
   while True:
     block = Block(self.blockchain)
     if block.is_ready:
       yield block
     else:
       break

完整程式碼是

<https://github.com/keviny/bitcoin-block-parser/blob/master/block.py>

很奇怪,block00000 中的塊順序與 blockchain.info 中的數字不同。

例如:

….

258 00000000613da6433c0f6c61d8bcb17c39603dd4a8595142359905b18b84edcd 259 000000007964a0e8b97bbea93e937c63d4097c42ccb4db464b1ab3047c62869c 260 000000001a748e1c97226c59b9ddf79a54e0857116808a1b5610a52aef4ed5b5 261 0000000025f2bb2ee58597083e13079899ecc6f2bb7e8bfd57e66b324b05d654 262 00000000d80530efa37319e4b4508b0759fdab8ea8a81272cbe8986881489507

….

blockchain.info中的# 是:

258->block #257(沒關係,因為我們使用不同的開始)

259->block #281

260->block #258

261->block #282

262->block #297

這是設計使然,我需要迭代block0000.dat中的所有塊,然後按blockheader中的時間排序以獲得正確的塊順序?

blkxxxx.dat 文件按從對等點下載的順序包含塊。由於客戶端並行地從許多不同的對等點請求塊,並且不同的對等點可能以不同的速度響應,因此很有可能塊被亂序下載。(首先下載標頭,作為一個單獨的步驟,因此客戶端在獲取完整塊之前知道要請求什麼雜湊。)

按時間戳排序也不安全。請參閱為什麼塊亂序? 該協議不強制時間戳的準確性,並且較晚的塊可以合法地具有較早的時間戳。 最後檢查一下,區塊鏈中有近 14000 個這樣的例子。

對它們進行排序的唯一正確方法是實際重建鏈,使用每個塊頭的“前一個”欄位來標識應該在它之前的塊。這也將幫助您辨識和刪除孤立分支和斷開連接的塊。

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