當一個或者一群擁有了整個系統中大量算力的礦工出現之后,他們就可以通過攻擊比特幣的共識機制來達到破壞比特幣網絡的安全性和可靠性的目的。
共識攻擊的典型場景就是“51%攻擊”。也就是,一群礦工控制了整個比特幣網絡51%的算力,他們聯合起來攻擊整個比特幣系統。由于這群礦工可以生成絕大多數的塊,他們就可以通過故意制造塊鏈分叉來實現“雙重支付”或者拒絕對某個特定的比特幣地址提供服務。
1.故意制造塊鏈分叉實現“雙重支付”
這種情況是:攻擊者在使舊分叉上的交易記錄失效,然后在新分叉上重新生成一個同樣金額的交易,從而實現雙重支付。舉個例子來說明:
? 攻擊者Mallory在Carol的畫廊買畫,Mallory通過轉賬價值25萬美金的比特幣與Carol進行交易。在等到1個而不是6個交易確認后,Carol將畫包好交給了Mallory。
? 這時,Mallory的一個同伙,一個擁有大量算力的礦池的人Paul,在這筆交易寫進區塊鏈的時候,開始了51%攻擊。首先,Paul利用自己礦池的算力重新計算包含這筆交易的塊,并且在新塊里將原來的交易替換成了另外一筆交易(比如直接轉給了Mallory的另一個錢包而不是Carol的),從而實現了“雙重支付”。這筆“雙重支付”交易使用了跟原有交易一致的UTXO,但收款人被替換成了Mallory的錢包地址。
? 然后,Paul利用礦池在偽造的塊的基礎上,又計算出一個更新的塊,這樣,包含這筆“雙重支付”交易的塊鏈比原有的塊鏈高出了一個塊。按照最行鏈原則,高度更高的分叉區塊鏈取代了原有的區塊鏈,“雙重支付”交易取代了原來給Carol的交易,Carol既沒有收到價值25萬美金的比特幣,價值25萬美元的畫也被Mallory白白拿走了。
為了避免這類攻擊,售賣大宗商品的商家應該在交易得到全網的6個確認之后再交付商品。
2.拒絕對某個特定的比特幣地址提供服務
一個擁有了51%算力可以輕易地忽略某一筆特定的交易。如果這筆交易存在于另一個礦工所產生的區塊中,該攻擊者可以故意分叉,然后重新產生這個區塊,并且把想忽略的交易從這個區塊中移除。這種攻擊造成的結果就是,只要這名攻擊者擁有系統中的絕大多數算力,那么他就可以持續地干預某一個或某一批特定錢包地址產生的所有交易,從而達到拒絕為這些地址服務的目的。
比特幣系統礦工的算力被分成了兩組:誠實算力和攻擊者算力,兩組都在爭先恐后地計算塊鏈上的新塊,只是攻擊者算力算出來的是精心構造的、包含或者剔除了某些交易的塊。因此,攻擊者擁有的算力越少,在這場決逐中獲勝的可能性就越小。相反,一個攻擊者擁有的算力越多,其故意創造的分叉塊鏈就可能越長,可能被篡改的最近的塊或者受其控制的未來的塊就會越多。