Block
新塊的處理順序是什麼?
節點 A 收到一個高度為 的最新塊
h1
,它確定它是有效的,因此將該塊儲存在磁碟上。稍後,它收到另一個具有相同高度h1
但比前一個更大的工作量證明的塊。節點 A 會做什麼?我也對處理新塊的順序感到困惑。源碼中的順序:
success success Check(block)----------->store block on disk------------------>ReceivedBlockTransaction-------->ActivateBestChain
如果
ReceivedBlockTransaction
或ActivateBestChain
將要失敗,磁碟是否會回滾?如果它會回滾,為什麼不把receivedBlockTransaction
and放在ActivateBestchain
前面store block on disk
?
首先要澄清的是:建立在同一個父塊上的****相同高度
的兩個競爭塊總是具有相同數量的工作量證明,因為這取決於難度,這對於兩個競爭者來說都是相同的。
因此,只有在競爭的鏈尖通過累積更大的長度而領先於先前接受的鏈尖時,才會在實踐中發生鏈重組。*
如果標頭可能使其成為最佳鏈,比特幣核心將其接收的競爭塊儲存為側分支。否則它會丟棄它們。
當發生鏈重組時,Bitcoin Core 將一次一個地撤消從尖端開始的每個塊,恢復到具有新的最佳鏈的共同祖先,然後將一次一個地應用新的最佳鏈中的塊,直到它位於新提示。
- 可以圍繞難度變化建構一個案例,其中競爭鏈尖端在同一高度具有不同的難度。然後,在相同高度,難度較高的將替換難度較低的。但是,這將需要超過一個塊長度的鏈拆分。
當客戶端收到衝突的區塊鏈時,整體工作量較高的鏈將“獲勝”,成為節點 A 認為真正的鏈。如果兩條鏈相等(例如,因為兩個礦工幾乎同時發現了一個區塊),它將保留兩條鏈,直到它看到其中一條鏈上的新區塊使其成為最佳鏈。在您描述的範例中,這稱為鏈重組。
我對原始碼不夠熟悉,無法準確告訴您它是如何做到的,但很明顯它確實做到了。我會假設一旦它知道它是孤立的,它就會從磁碟中刪除孤立鏈的塊。