Blockchain
為什麼比特幣不對競爭的區塊鏈分叉施加額外的限制,而不是鏈的長度?(例如,時間和確認計數)
在比特幣的工作量證明系統中,關於哪個區塊鏈應該被認為是“真正的”區塊鏈的共識僅基於(?)哪個鏈更長。
因此,引用 Nate Eldredge 寫得很好的回答,典型的 51% 攻擊如下所示:
- 攻擊者私下開始探勘他們自己的鏈,該鏈在某個區塊 N 處與主鏈不同。
- 攻擊者將硬幣存入您的企業,並從地址 A 發送。將此交易稱為 X。
- 攻擊者在自己的鏈中插入與 X 衝突的交易 X’;通常 X’ 將硬幣從地址 A 發送到屬於攻擊者的另一個地址。
- 攻擊者在主鏈的 N+1、…、N+6 塊中等待交易 X 的多次確認(將 6 替換為您的業務需要的任意數量的確認)。
- 一旦有足夠的確認讓您滿意,您就可以向攻擊者提供商品或服務。
- 攻擊者釋放他自己的鏈,該鏈現在擁有最多 N+50 個區塊。由於更長,這條鏈被網路接受。這條鏈不包含交易 X,而是 X’,所以你沒有你認為你擁有的硬幣。
請注意,直到第 6 步,網路上的一切看起來都完全正常;只有攻擊者知道發生了什麼。
那麼我的問題是:為什麼比特幣不指定最大持續時間和/或最大確認次數,之後競爭/分叉塊被拒絕,即使它由更長的(秘密預挖的)子塊鏈支持?
用虛擬碼總結這個想法:
CUTOFF_TIME = 1200 # seconds CUTOFF_CONFIRMATIONS = 3 is_acceptable_block(new_block, parent_block): if not is_valid_block(new_block): return false if is_first_child(new_block, parent_block): return true old_block = get_first_child(parent_block) if age_difference(new_block, old_block) > CUTOFF_TIME: return false if child_chain_length(old_block) > CUTOFF_CONFIRMATIONS: return false return child_chain_length(new_block) > child_chain_length(old_block)
如果這可行,那麼上述 51% 攻擊場景將變得更加困難;因此,在可以安全地相信交易之前等待的時間/確認量會減少,對吧?
那麼我的問題是:為什麼比特幣不指定最大持續時間和/或最大確認次數,之後競爭/分叉塊被拒絕,即使它由更長的(秘密預挖的)子塊鏈支持?
因為您無法向攻擊時不在網路上的節點*證明這一點。*這意味著:
- 攻擊者有可能創建一條新鏈,如果有足夠多的節點加入網路,而新鍊是最好的,就會導致一半的節點認為一條鍊是最好的,而一半的節點認為這條鍊是最好的。其他鏈條是最好的。
- 如果在新節點說最好的鏈不是真正的鏈時讓新節點信任舊節點,那麼您現在正在將您信任的人的圈子擴大到中繼鏈的人,以及探勘它的人。以前,如果兩個節點認為不同的鍊是最好的,你可以同時下載並肯定地說一個比另一個更好。如果您實施了此更改,則需要確定哪個節點更值得信賴。
如果這可行,那麼上述 51% 攻擊場景將變得更加困難;因此,在可以安全地相信交易之前等待的時間/確認量會減少,對吧?
51% 攻擊可以通過任意數量的確認來雙花輸出。經常引用的 6 次確認數據來自比特幣論文,Satoshi 計算出擁有 10% 網路雜湊算力的攻擊者追趕的機會不到 0.1%。