惡意多數礦工能否改寫歷史?
擁有大部分算力(比如 99%)的惡意礦工是否可以通過重寫歷史來執行雙花攻擊?
如果是這樣,我無法理解如何。如果不是,在什麼情況下雙花是可能的?
考慮以下簡單假設:
- 惡意礦工 M 控制 99% 的算力
- M 不控制太多的“中繼功率”(例如,它只執行網路中的單個節點)
- 目前的合法區塊鏈(攻擊前)是無分叉的,由區塊 B0、B1、…、B10 組成,並且網路中 100% 的節點都同意這一點。
- 攻擊者想要作廢塊 B6-B10
- 攻擊者探勘了替代塊 B6’(在 B5 之上)、B7’、…、B11’。
攻擊者如何進行攻擊?
如果他先發布 B6’,不是所有節點都拒絕它建立在最後一個塊之外的塊之上,從而阻止攻擊嗎?
如果他先發布 B11’,不是所有節點都拒絕它建立在未知塊之上(還沒有看到 B10’),從而阻止攻擊嗎?
讓我們假設您的理論是正確的,並且網路上的實際節點不會接受這個新的、有效的、更長的區塊鏈。
這本身就是一個錯誤。也許對於 5 塊重組並不明顯,但如果它是 2 塊深度的重組(實際上在實踐中發生),那麼您的論點同樣正確。如果無法接受 2 個區塊的深度重組,節點將被困在較短的鏈中。這實際上也是可以利用的:有人可能故意讓你處於這種狀態,因為你不會在鏈上看到可能與攻擊者試圖發送給你的付款衝突的新付款。
這適用於任何深度的重組。如果我們不接受 12 塊深度重組,那麼如果網路有幾個小時的分區,網路將保持非常痛苦的狀態。能夠在每種情況下接受最長的有效鏈對於使比特幣收斂是絕對必要的。
所以:我們需要一種機制來重新組織幾乎任何深度。在比特幣核心 0.10 中,隨著標頭優先同步的引入,它的完成方式發生了變化。
在 0.10 之前,攻擊者會首先廣播 B11’,而受害者並不知道。它將發出一條
getblocks
消息來請求 B5(使用塊定位器)和 B11’ 之間的塊的雜湊值。當它接收到這些雜湊時,它會使用 一個一個地下載它們getdata
,查看它們是否缺少父級,將它們放入孤兒池(沒有已知父級的塊的集合)中,當它們都被接收到時,請注意它們已連接, 並切換到它。從 0.10 開始,攻擊者將
inv
B11’。受害者將使用一條getheaders
消息來請求 B5 和 B11’ 之間的塊頭以及getdata
塊 B11’ 本身。當標頭到達時,它們會被即時驗證(按照高度增加的順序,所以它們總是連接)。到 B11’ 到達時,我們已經知道它的雙親,並且知道(假設雙親是有效的)這實際上將是新的最佳鏈。然後我們將開始獲取實際的塊 B6’ 到 B10’ 以填補空白,當它們都到達時,切換到該鏈。