Security
如果我發布早期區塊的修改版本會發生什麼?它會立即被對等節點拒絕嗎?
我正在閱讀《精通比特幣》這本書,已經讀完了第 2 章和第 10 章,但我仍然沒有找到答案。
假設目前主鏈有 5 個區塊:
B0 <- B1 <- B2 <- B3 <- B4
隨著新交易的湧入,誠實的礦工正在探勘
B5
第 6 個區塊。如果我向比特幣網路發布一個修改過的
B2
,比如說B2'
,這個修改過的區塊被其他對等方接收到時會發生什麼?假設B2'
包含所有交易,B2
除了一筆交易的轉移比特幣金額稍作修改但仍然是有效金額。
- 會
B2'
直接被拒嗎?看起來不是這樣,因為修改後的交易似乎仍然有效。據我所知,接收節點使用較早的塊,B0
和B1
,來驗證B2'
,我認為驗證會成功。我對嗎?- 如果
B2'
不立即拒絕,對等節點是否會將其連結B1
為輔助鏈?我實際上認為B2'
應該被拒絕,但是在閱讀了掌握比特幣的第 10 章之後,我似乎沒有找到理由來證明為什麼應該拒絕它。- 此外,如果無論如何
B2'
都連結到B1
,那麼當第 6 個區塊 ,B5
現在被探勘和發佈時會發生什麼?根據第 10 章,“交易……被重新插入記憶體池以包含在下一個區塊中,因為它們所在的區塊不再位於主鏈中。” 所以我認為現在B2'
將被刪除,其交易將被重新插入記憶體池。然後 in 中所有未修改的交易B2'
將再次被刪除,因為它們已包含在B2
主鏈中,而修改後的交易 inB2'
將被拒絕,因為它與 in 中的對應物衝突B2
。謝謝你的幫助!
節點會立即拒絕它。
如果您只是簡單地更改 B2 的數據並發送它,那麼根據定義,該塊將無效,因為工作證明和默克爾樹將不再有效。
如果您修改數據並重建 merkle 樹並重做工作證明以產生替代的、有效的
B2'
(請注意,此新塊中的所有其他內容也必須有效,包括交易),節點仍將在鏈上升時拒絕它到 B4 的工作量更大。節點會將總工作量最大的鏈視為有效鏈。如果你想重寫歷史,你需要探勘一條新鏈,回到你想要開始重寫的區塊,並探勘到它的總工作量超過目前最佳鏈的點。如果您隨後廣播這條新的區塊鏈,它將導致節點執行重組,並丟棄前一條鏈。
至於返回記憶體池的交易,這確實發生在重組的情況下。來自已刪除塊的所有交易都將返回到記憶體池。通常,由於礦工通常會選擇相似的交易,替換舊塊的新塊將確認大部分相似的交易,因此記憶體池通常只會在它結束時略有不同。