為什麼 blockxxxxx.dat 中的塊順序與 blockchain.info 不同
我使用 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 個這樣的例子。
對它們進行排序的唯一正確方法是實際重建鏈,使用每個塊頭的“前一個”欄位來標識應該在它之前的塊。這也將幫助您辨識和刪除孤立分支和斷開連接的塊。