理论上,比特币的[[去中心化共识规则]]机制是容易被矿工(或矿池)试图使用自己的算力实行欺骗破坏进行攻击的。就像我们前面讲的,比特币的共识机制依赖于这样一个前提,那就是绝大多数的矿工,出于自己利益最大化的考虑,都会通过诚实地挖矿来维持整个比特币系统。然而,当一个或者一群矿工拥有了整个系统中大量算力之后,他们就可以通过攻击比特币的共识机制来达到破坏比特币网络的安全性和可靠性的目的。
共识攻击只能影响整个区块链未来的共识,或者说,最多能影响最近的区块的共识(最多影响过去几十个块)。
攻击场景:
共识攻击的一个典型场景就是“51%攻击”。想象这么一个场景,一群矿工控制了整个比特币网络51%的算力,他们联合起来打算攻击整个比特币系统。由于这群矿工可以生成绝大多数的区块,他们就可以通过故意制造区块链分叉来实现“双重支付”或者通过拒绝服务的方式来阻止特定的交易或者攻击特定的钱包地址。区块链分叉/双重支付攻击指的是攻击者通过从指定区块之前的区块开始分叉,导致其后的已经确认的区块无效,然后重新收敛这些区块到一个替代的区块链。有了充足算力的保证,一个攻击者可以一次性篡改最近的6个或者更多的区块,从而使得这些区块包含的本应无法篡改的交易无效。值得注意的是,==双重支付只能在攻击者拥有的钱包所发生的交易上进行,因为只有钱包的拥有者才能生成一个合法的签名用于双重支付交易。==攻击者在自己的交易上进行双重支付攻击,如果可以通过使交易无效而实现一种不可逆转的且不用付款的购买行为,这种攻击就是有利可图的。
举个例子:攻击者Mallory在Carol的画廊购买了将中本聪描绘为普罗米修斯的三联组画(The Great Fire),Mallory通过转账价值25万美元的比特币与Carol进行交易。在等到一个而不是六个交易确认之后,Carol将这幅组画包好,交给了Mallory。这时,Mallory的一个同伙,一个拥有大量算力的矿池的人Paul,在这笔交易写进区块链的时候,开始了51%攻击。首先,Paul指示矿池使用同样的区块高度重新对包含这笔交易的区块进行挖矿,并且在新区块里将原来的交易替换成了支付给Mallory的另外一笔交易,从而实现了双重支付。这笔双重支付交易使用了跟原有交易一致的UTXO,但收款人被替换成了Mallory的钱包地址而不是Carol的,实际上就是Mallory继续持有自己的比特币。然后,Paul指示矿池在伪造区块的基础上,又计算出一个更新的块,这样,包含这笔双重支付交易的区块链比原有的区块链高出了一个区块(导致从包含Mallory交易之前的区块开始分叉)。到此,高度更高的分叉区块链取代了原有的区块链,双重支付交易取代了原来给Carol的交易,Carol既没有收到价值25万美金的比特币,原本拥有的三幅价值连城的画也被Mallory白白拿走了。在整个过程中,Paul矿池里的其他矿工可能自始至终都没有觉察到这笔双重支付交易有什么异样,因为挖矿程序都是自动在运行,并且不会时时监控每一个区块中的每一笔交易。
共识攻击中除了“双重支付”攻击,还有一种攻击场景就是拒绝为某个特定参与者(特定比特币地址)提供服务。一个拥有了系统中绝大多数算力的攻击者,可以轻易地忽略某一笔特定的交易。如果这笔交易存在于另一个矿工所产生的区块中,该攻击者可以故意分叉,然后重新产生这个区块,并且把想忽略的交易从这个区块中移除。这种攻击造成的结果就是,只要这名攻击者拥有系统中的绝大多数算力,那么他就可以持续地干预某一个或某一批特定钱包地址产生的所有交易,从而达到拒绝为这些地址服务的目的。
全网算力的急剧增长已经使得比特币系统不再可能被某一个矿工攻击。
