51%攻击概述
51%攻击指的是:51%算力和49%算力分别产生两条链条,(需要做网络隔离)然后51%算力的链条成为最长链,覆盖49%的链条。51%攻击实际上是51%以上攻击的概括,可以是52%攻击,也可以是53%攻击,更可以是99%攻击,99.9999%攻击,算力比重越大,成功概率越高。
如果只有51%算力,攻击覆盖1个区块的成功概率只有50%,覆盖2个区块的成功概率只有25%。10个区块只有0.1%,要覆盖的区块越多,成功概率呈指数下降,越来越渺茫。相关算法在比特币白皮书有详细论述。
最长链的判定原则
比特币白皮书并没有判断最长链的代码实现例子,早期比特币代码也比较简单,只是按照区块高度判定最长链,这种判定方法已经被废弃。现在判定最长链是依据“累计难度(工作量)”来做计算,每一个区块会累积chainwork数值,区块的难度系数越高累积的chainwork越快,具体算法举例如下:
- 区块1:难度1 chainwork=0
- 区块2:难度1 chainwork=1
- 区块3:难度1 chainwork=2
- 区块4:难度1 chainwork=3
- 区块5:难度1 chainwork=4
依次类推。
我们来找一个具体的例子,两个相邻的区块,通过getblock命令查询其chainwork值如下:
getblock 00000000004e21391302f0a9d51bfa7ee0fd2af67f70c7fe2182d65e9719dc55
"difficulty": 256,
"chainwork": "0000000000000000000000000000000000000000007cb5f9cafa4ffcd4ccac4b",
getblock 00000000001f323bb6cd087d5f57d27f094257b4d3170bc0da8d02bd94275e61
"difficulty": 256,
"chainwork": "0000000000000000000000000000000000000000007cb5f9cafa50fcd5ccad4b",
关于难度值的计算过程有很多详细的文档,这里不再重述,我们需要知道chainwork值的最后8个数字(16进制,对应32位)是对应目标hash难度阈值,简易计算直接去掉,前面部分的数值就是难度值累积,因此上述两个区块的难度值累加数值如下:
0x7cb5f9cafa4ffc 0x7cb5f9cafa50fc
两者相减0x7cb5f9cafa50fc-0x7cb5f9cafa4ffc=0x100=256(10进制),第一个区块的难度值就是256。难度值256对应1.8G的算力(10分钟出块),这里再次略去大量算法解释。
总而言之,通过chainwork数值,可以直观获得该链条的累积工作量,而具有高chainwork值的链条,(需要先做网络隔离)可以覆盖低chainwork值的链条。
51%攻击实践思路
拥有高算力的矿工,将某个节点从网络中隔离出来,然后进行挖矿,使该链条出块,是为攻击链,攻击链的chainwork超过诚实链之后,将攻击链广播出来(取消网络隔离),便可成功覆盖掉诚实链。初步总结实践思路如下:
- 选择期望的攻击点,删除攻击点之后的区块,目标是覆盖攻击点之后区块
- 将删除区块后的节点,进行网络隔离,以防止同步诚实链的区块
- 启动高速算力进行挖矿,直到chainwork超过诚实链
- 同步监测匹配诚实链和攻击链的chainwork
- 选择适当的时机,取消网络隔离,广播攻击链
实践这些思路可以手动操作全节点实现,需要有矿工提供算力即可,如果有现成的工具,欢迎发邮件给页脚的地址交流。经过验证之后,公开提供给矿工使用。
BCH原链覆盖新链的可能性
BCH原链使用Bitcoin ABC 0.15.1版本节点,随着网络的复苏,算力不断上升,有没有可能成为最长链,覆盖掉BCH新链。这种可能性是存在:
- BCH原链和新链仍然在不断重放交易,两者的网络是互通的。
- 新链无法覆盖原链,因为原链的0.15.1版本不兼容不接受新链的区块。
- 原链可以覆盖新链,因为新链必然向下兼容及接受0.15.1版本的区块,否则2017年11月份之前的区块全部作废,这是不可能的。
- BCH新链的算力并没有快速增长,随着技术的发展,算力成本快速下降
- BCH新链的算力来源严重依赖少数大矿工,比如比特大陆等发起者,这些中心化的公司经营如发生变动,会导致算力枯竭,出块困难,进入”死亡螺旋”
- 此消彼长,不排除在未来数十年后,BCH原链社区发展算力超过BCH新链,且更加去中心化
- 积累到某个时间,BCH原链一举覆盖BCH新链,重夺BCH的名号。
BCH原链矿工的51%攻击意义
攻击链和诚实链在比特币白皮书里面是用于论述矿工进行分裂攻击并不划算,这样可以保证链条的高可用性和稳定性。我们知道比特币是一套基于数学(密码学)的系统,它的核心价值在于客观存在,不会受到主观意识的影响,在它早期算力低下的时候,有没有发生过51%攻击及测试,攻击链多次覆盖诚实链呢?这并不重要,重要的是,这个结果是比特币代码所认可的,最强的算力成为最终的选择,攻击成功,则攻击链也就变身为诚实链,矿工是基于“自私”干活,而不是基于“诚实”,这是比特币存在的根本。基于这个根本,我们才敢判断比特币是不易灭的,攻击比特币成功者自动成为比特币,比特币永远附身于胜者,这是数学上的意义。在复苏BCH原链的过程中,我们无法主观判定社区的价值输出量化,只能交给市场去竞争,不排斥任何竞争手段,由市场无形的手来决定:
- 攻击是有成本的,也是一种投入,每一次攻击都必须推高chainwork,无形中推高链条安全门槛
- 公平竞争选出最强持有者,算力竞争是数学层面的永远公平,链条的价值积累来自于竞争,竞争才是活力来源
- 先竞争后合作,合作是打出来的,不是谈出来的,矿工达到足够离散化之后,自然会导向共同维护一条主链的共识
- 经历多次洗牌和沉淀,形成事实上的治理架构、制衡平衡体制,而不是少数人所谓拍脑门的顶层设计,有利于生态的持续发展
- 社区的去中心化是在一开始就奠定的,没有实质上的控制人,“无”比“有”更难被打败
来吧,51%攻击!