“51%攻击”是一个充满着想像力的词,总让人有一种刀光剑影看小说的感觉,但其实很多人对这个词的理解是不太准确的。
最常见的理解是按照这个词的字面意思:认为只要算力超过51%,就能对某个系统发动攻击,这个系统就存在中心化或者被攻破的可能性。
比如,我今天随便查了两篇相关的文章,分别是这么说的:
1、当矿池的算力过大,超过全网51%的哈希力,就会发生51%攻击。
2、51%攻击,就是有人掌握了全网51%以上的算力之后,就可以像赛跑一样,抢先完成一个更长的、伪造交易的链。比特币只认最长的链。所以伪造的交易也会得到所有节点的认可,假的也随之变成真的了。这是由比特币的共识机制PoW(工作量证明)决定的。
在追究这些说法是不是正确之前,我们先来研究一下到底51%攻击是指什么呢?它的概念又是怎么定义的呢?
事实上,比特币白皮书全文中并没有出现“51%攻击”这个词,不过倒是有过相关的描述,算是最接近对51%攻击的定义了:
The system is secure as long as honest nodes collectively control more CPU power than any cooperating group of attacker nodes.
只要诚实的计算节点在总体上比任何一个攻击群控制更多的计算能力,那么系统就是安全的。
从这句话可以推论一下,要想一方的计算能力超过另外一方,最好是一方的算力超过50%,比如达到51%时,那它就肯定比另一方多。如果诚实节点拥有51%算力,那系统就是安全的;如果作恶节点拥有51%算力,那它就能对另一方发动51%攻击,那系统就是不安全的,我估计51%攻击就是从这里来的。
江卓尔在《天下大义,当混为一——算力战》中有专门提到他的定义:
大家都知道 “51%算力攻击”:
1、攻击者通过优势算力,挖掘一条比原链更长的攻击链。
2、攻击链向全网广播后,节点按规则,将接受更长的链,丢弃原链。
下图中的直线链(上面的蓝色链和下面的红色链),表示被中立节点接受的主链。
下面,我将把51%攻击拆成“51%”与“攻击”这两个词来分别讲解。
一、51%的算力不是绝对的
1、即使没有51%的算力,比如只有30%,40%的算力,也能发动“51%攻击”;
并不是超过了51%的算力,就一定会发动51%攻击,只是存在这种可能性。
事实上,即使你只有30%的算力,你也有可能连续出5-6个块,也已经可以开始发动很有威胁的“51攻击”了;
即使你有51%的算力,你也有可能半天出不了一个块,而攻击失败,只不过长久看来,你出块的概率等于你算力的权重。
如果把节点分为诚实节点、中立节点、作恶节点的话,那么你只需要比诚实节点的算力多即可,而不必一定需要51%的算力。
2、算力只是这场竞赛的一个方面,还有网络传播等方面因素。
在出块有先后的情况下,基本上谁先出块谁就有很大概率成为最长链。
在同时出块的情况下,谁能更快的传播到51%的网络节点并被接受,并在此基础上进行进一步的扩展和记账,谁就是最长链。
从这个角度说,51%指的不仅是算力,更是指网络节点的接受度。
从这个角度说,更重要的不仅是51%算力,而是利用优势算力抢先出块后的“最长链法则”。
当然,这些都是对同一条链上的竞争而言;
对于已经分裂成不同的两条链而言,比如BCH和BTC,那么无论其中一条领先多少区块,都没有太大意义。
二、算力竞争本身并不是攻击
这里说的是“51%攻击”,而不是说的“51%竞争”,“51%争夺”。
这两者有什么区别呢?
竞争是为了从中获益,而攻击是为了摧毁这条链。
竞争是合理的,即使你拥有超过51%的算力,只要你在规则允许的范围下,正常出块,正常挖矿,那么这就是正常的竞争,仍然是以谁先出块,谁的链最长为判断标准,不能算攻击。
但是,像在ABC与BSV的算力大战中发生的事,比如BSV最初的宣传就是要“用算力摧毁BCHABC”,“让BCH上两年没有任何交易”(虽然最终都没有达成),这种行为就是明确的攻击,而不是单纯的竞争。
一旦51%攻击达成,某条链将被摧毁,攻击方和防守方都会一无所获。
这也就是为什么江卓尔说“攻击方不管胜负,必然损失攻击成本,而防御方有防守优势,如果获胜还可以获得挖矿收入作为补偿”的原因。
有人会问,花那么大的代价,摧毁一条链有什么好处呢?一般来说没什么好处,大部分攻击行为都是弊大于利。一般来说,算力越大越会主动维护整个系统,而这也正是比特币系统内置的博弈论发挥作用的地方。
但在这个案例中,BSV方希望通过摧毁BCHABC,建立自己的BSV正统,这就是摧毁的意义;这也是他曾经说过最终将通过算力战摧毁BTC,从而统一BTC的原因所在。
三、51%攻击的本质
总结:无论是中本聪还是江卓尔对51%攻击的定义,都没有出现51%这个词,我个人认为,51%攻击的更准确的理解是通过优势算力(并不要求51%)实现对最长链的争夺。
毕竟正如白皮书里面最明确的定义:
Nodes always consider the longest chain to be the correct one and will keep working on extending it.
最长链胜出,其它节点在这条链基础上扩展。