51% 攻擊並重寫到最新的檢查點
這不是關於 51% 價格的後果的問題,也不是關於攻擊者動機的問題。假設我們不在乎這不現實,也不在乎攻擊者是否理性。
讓我們假設攻擊者始終擁有 50%+1 (51%) 的挖礦算力。
我的理解是,如果我擁有 51% 的挖礦能力,我總是可以機率性地將區塊鏈重寫為具有更多 PoW 的區塊鏈。我知道程式碼庫中有某些區塊的雜湊值的檢查點,所以我不能等待幾十年(或幾百年),從頭開始重寫區塊鏈。
我讀了這個聲明,我不知道它是否正確:
加密事實:最困難的最長(比特幣)鏈獲勝,除非檢查點阻止它。
但是我可以總是重寫到最新的檢查點嗎?
這些檢查點是什麼時候添加的,這些檢查點有多“回溯”?
節點可以接受協議中硬編碼的最大塊數或“重寫”數嗎?(節點會拒絕具有最多 PoW 的鏈,因為它“試圖重寫太多塊”)。
如果我擁有 99% 的算力,這與擁有 75% 或 51% 的算力有何不同?
我的意思是,理論上,有沒有我可以用 99% 發動的攻擊而我不能用 51% 發動的攻擊?
這實際上只是一個問題,我認為可以歸結為:如果我擁有 51% 的算力,我是否可以始終重寫到最新的檢查點?
只要兩個相互競爭的鏈尖都遵守相同的規則,總難度最高(“較重”)的鏈將獲勝,無論高度如何。執行初始同步的節點將通過比較由於標頭優先同步而由其對等方提供的鏈提示的總難度自動結束在較重的鏈上。
但是,已經與“較輕”鏈同步的已修剪比特幣核心節點如果不再將所有塊保留到兩條鏈的共同祖先,將無法重組為較重的節點。相反,這樣一個修剪過的節點必須從頭開始重新同步。
如果攻擊者控制的算力相當於 SHA-256d 算力的 100%,那麼他們今天將能夠在大約 186 天內重建與比特幣具有相同總難度的區塊鏈。
檢查點系統已被棄用(參見例如此GitHub-discussion ),取而代之的是自 0.14.0 以來的新版本的比特幣核心預設使用假定的有效塊。初始同步的性能因此通過與使用的檢查點相同的機制得到改進:直到
assumevalid
塊的高度,腳本/簽名的驗證被跳過,只檢查塊的有效性,填充 UTXO 集,以及任何關於交易的數據收集該節點的錢包。過檢查點的優點
assumevalid
是它不會強制節點進入預定義的鏈。使用者可以在其節點的配置中選擇另一個塊或完全關閉該功能。預設情況下,Bitcoin Core 使用比發布早數週的區塊高度。因此,針對此類攻擊的防禦措施可能是集體同意
assumevalid
在攻擊者的鏈分叉後與集合重新同步到任何塊。
請參閱什麼是檢查點?澄清一下。引用ThePiachu的回答:
檢查點被硬編碼到標準客戶端中。這個概念是,標準客戶端將接受直到檢查點的所有交易都是有效且不可逆的。如果有人試圖從檢查點之前的一個塊開始分叉區塊鏈,客戶端將不會接受分叉。這使得這些塊“一成不變”。
現在,回到你的問題:
如果我有 51% 的算力 […] 我可以一直重寫到最新的檢查點嗎?
是的。您的場景中的攻擊者可以強製網路接受他的鏈,因為他將超過 PoW 中的其他礦工。他只需要等到他的私有分叉比目前的共識鍊長,然後發布-節點會接受。最大的問題是攻擊者在控制時可以進行潛在的雙重支出。
請注意,51% 的攻擊也可能在不到總雜湊算力的一半的情況下進行。Satoshi 在其論文的第 11 節中討論了這一點。當一個人控制超過 50% 的算力時,攻擊成功的機率達到 1。
我的意思是,理論上,有沒有我可以用 99% 發動的攻擊而我不能用 51% 發動的攻擊?
不,超出這一點並不重要。