BCH的51攻击与防守

算力是协议的执行者,不是协议的制定者,任何修改协议的算力,都会产生一个分叉,与原来的链分离。

51攻击,是指使用超过全网51%的算力,使用相同的协议规则,连续生成自己区块,不广播,当超过正常的区块高度的时候,广播这些区块,可以覆盖正常的区块,以达到某种获利的目的。

比特币共识机制

简单说一下比特币的共识机制,因为这是51攻击的原理。矿池在收到挖到一个区块时,会验证区块是否合法,如果不合法,就会直接拒绝。

验证的规则有很多,举例说两个拒绝的例子:

例1:区块大小超限,直接拒绝。比如比特币限制size为1M(现在比特币限制的不是size,是weight),如果收到大于1M的的区块,会直接拒绝。

例2:区块中包括未知的操作码或交易结构,直接拒绝。比如BCH分叉时,添加了重放保护,导致交易结构不同,BTC会拒绝BCH的区块,同时,BCH也会拒绝BTC的区块。

验证合法的区块,也不一定最终成为主链,它会遵守最长链获胜的规则。51攻击一定是在相同协议的情况下才可以进行的,否则协议不同,会被直接拒绝,没有争夺最长链的机会。

最长链获胜,是通俗的说法,准确的说是累计了最多难度的区块链,由于BCH的DAA难度调整很快,如果采用故意让难度降下来,然后获得的最长链的方式,并不会获胜的。下文列举的例子,产生的链都比较短,并没有影响难度调整,仍然用“最长链获胜”的说法举例。

例如,当前区块链的高度为100,矿池收到高度为101的区块A,并验证合法。不久又收到另一个高度为101的区块B。矿池会把这两个块都当作候选区块,并选择在其中一个区块后面继续挖矿,例如选择区块A继续挖矿。如果矿池挖到新区块高度为102的区块C,会把102连接在区块A后面,并广播出去,此时区块B就成了孤块,但是区块B不会直接丢掉,会放入暂存池。

BCH的51攻击与防守_第1张图片

如果矿池收到新的区块高度为102的区块D,和区块D后面的高度为103的区块E,区块D的父区块是区块B, 那么矿池收到的区块A和自己挖的区块C就成了孤块,区块C最终是否成为主链,要看后面生成的区块是否足够多,也就是最长链才能获胜。

BCH的51攻击与防守_第2张图片

单个区块成为孤块比较常见,连续两个区块成为孤块就很少见了。这也是比特币要求确认越多越安全的原因,一般6个确认就很安全了。

51攻击不能做什么和能做什么

上面文章说了,51攻击必须是在相同协议的情况下才有效,任何改变协议的算力生成的区块链,都会分离出来成为一条分叉链,那么51攻击能做什么和不能做什么?

51攻击不能做什么

51攻击不能修改协议,例如:

1.不能把别人的币变成自己的币。

2.不能增加比特币的产量。

3.不能阻止别人把交易发出去。(显示0确认)

51攻击能做什么

1.拒绝当前一笔交易。

2.拒绝当前的所有交易,打空块。

3.回滚最近的一笔交易或多笔交易。

4.让其它矿工最近挖到的区块无效。

 

一种典型的51攻击方式 

当前区块高度为100,攻击者拥有70%的算力。攻击者发送一万个BTC到交易所,同时隐藏算力,不接受正常的区块,并且自己在区块高度100后面开始生成101,102….区块,不广播。这些区块不包含刚才自己发送的那一笔交易。(其它人的交易是否包括,无所谓了)。正常区块高度到达106,交易所经过6个确认后,资金入账。攻击者把这一万个BTC卖掉,提现成功。由于攻击者的算力高于诚实算力,攻击者的区块高度已经达到108,超过诚实区块高度了,攻击者把区块广播出去。按照最长链获胜的规则,攻击者的8个区块会替换6个诚实区块。此时,攻击者的一万个币又回到了自己的钱包,攻击成功。

山寨币由于算力小,经常发生51攻击,例如BTG。

BCH在2018年11月15日后可能受到的51攻击

目前的算力分布

自称中本聪的Craig Steven Wright表示要在2018年11月15日以后发动51算力战,要使用BSV代替BCH。

由于BSV的协议和BCH已经不相同,所以无论是BCH的算力大,还是BSV的算力大,都不存在区块替换的情况,算力战只可能是51攻击

如果CSW想用算力51攻击BCH,需要算力至少达到BCH算力的一半以上。以当前(11月7日)BCH的价格和算力,是BTC的0.096倍,4.5E左右,也就是说CSW能控制的算力至少要达到2.3E以上,才有可能发动51攻击。由于算力跟着价格走,BCH的价格越低,CSW控制的算力占有的比例就越大。

BCH的51攻击与防守_第3张图片

从上图统计的算力分布,CSW能控制的矿池有Coingeek,SVPool,BMG,这些矿池的算力加起来大约有35%,即使把Other算力也算进来,也只有45%的算力,大约2E左右,目前看来,没有发动51攻击的条件。

为了使51攻击可能,我们假设CSW控制的算力达到3E,BCH的价格不变,总算力4.5E,那么CSW控制的算力就达到了66%,有条件发动51攻击了。其实,不是这样的,由于BCH和BTC使用相同的挖矿算法,算力在BCH和BTC之间的算力可以相互流动,真正要发动51攻击,攻击一方的算力必须超过防守一方可以调用的总算力才行,包括可以租来的算力。目前BCH的守护方,可以调用的算力超过BTC和BCH总算力的一半以上,估计有30E左右,这样看来,51攻击还是打不起来。但是有人会说,守护方的算力不可能一直放在BCH,那样会因为挖矿收益不高,损失很大。的确是这样的,守护方的算力不需要一直放在BCH,只需要有可以随时调用的算力大于攻击方的算力,让攻击算力生成的区块作废,再撤回守护算力就可以了。也就是说,守护BCH的算力,只需要做好准备随时调用的,至于你现在挖什么无所谓。

BCH的51攻击怎么打

如果CSW真的控制了BCH的66%算力,并且非要打算力战,我们看看怎么打和怎么防守。

从CSW的目的来看,他要攻击BCH,目的不是为了双花,只是为了让BCH混乱不可用。因为他说过要让BCH在两年内不可用。那么51攻击的打法可能会有些不同。

CSW的目的是为了更大程度的破坏BCH,尽量减少自己的损失。

守护的一方保护BCH,从交易所安全,矿池收益,个人交易等多方面考虑,尽量不让相关生态受影响,并使用最小的成本。

攻击开始

攻击者控制3E算力,中立矿池占有1.5E算力。用户张三充值100BCH到交易所,该交易在诚实区块高度60001成功打包。

攻击者开始从高度60001开始打包空块(打空块可以让最近的所有交易都回滚,造成最大程序的破坏),我们把攻击者生成的区块取名为A-60001,但是不广播,当高度达到A-60009的时候,诚实区块的高度由于算力较小,只达到60006。 

BCH的51攻击与防守_第4张图片

广播攻击区块

这时攻击者把这9个区块广播出去,这时从60001到60006的诚实区块被替换,攻击成功。

由于交易所采用6个确认入账,此时用户张三的充值的100BCH已经成功确认。用户此时把BCH卖掉再提现,攻击者51攻击成功后,用户发现自己的100个BCH又回来了,交易所受到了损失。

BCH的51攻击与防守_第5张图片

此时中立矿池按照最长链获胜的规则,会自动跟随攻击区块在A-60009后面自动挖矿,但是中立矿池刚才的6个块的收益没有了。 

守护算力反攻

守护BCH的算力此时发现51攻击了,开始调用算力,在诚实区块B-60006后面继续挖矿,并正常广播,此时节点会监视到网络有分叉,同时存在两条链。

守护的一方,具体要调用多少算力,要看与中立矿池的配合情况。如果中立矿池什么也不做,那么中立矿池此时会和攻击算力在一起,相当于有4.5E的算力在攻击区块A-60009后面继续挖矿,正常打包并广播区块。守护算力此时需要调用大于4.5E的算力,比如调用7E的算力在城实区块B-60006后面继续挖矿,正常打包交易并广播区块。由于诚实区块比攻击区块少了3个高度,因此7E的守护算力生成的区块高度超过攻击算力的区块,大约需要64分钟(当前难度下,4.5E的算力10分钟一个块,7E算力6.4分钟一个块),此时攻击算力和中立矿池新生成6个区块,高度为A-600015,守护算力新生成10个区块,高度为B-60016。此时,中立矿池会回到诚实区块继续挖矿。在此期间,如果有用户转帐,会在两条链上同时确认。

BCH的51攻击与防守_第6张图片

防守成功

中立矿池会失去A-60010至A-60015这6个区块,但是原来丢失的B-60001至B-60006会被守护算力拉回来。

攻击算力A-60001至A-60015这15个区块全部作废,攻击者要是想把自己作废的15个区块拉回来,需要投入超过7E的算力。

守护算力的7E算力在BCH挖10个区块,并没有导致BCH难度立即上升,此时的收益与挖BTC相同,因此收益不会有损失,守护算力可以延长几个区块后,退出挖矿。

被攻击算力作废的交易(张三充值到交易所100BCH),此时又恢复了正常。

BCH的51攻击与防守_第7张图片

更优的防守

在上面的防守中,除了攻击者受到了损失,中立矿池也受到了损失,有没有办法让中立矿池也不受损失呢?其实是可以的,但是需要额外的协调成本。

当守护算力在诚实区块下挖矿的时候,守护算力负责人开始协调中立矿池,让中立矿池同时也在诚实区块链继续挖矿。这样守护算力只需要调用更少的算力就可以了。比如守护算力调用3E的算力,加上中立矿池的1.5E算力,大约需要110分钟生成11个区块(B-60006至B-600017),攻击算力在110分钟大约生成7个区块(A-60010至A-600016),此时诚实区块是最长链,攻击算力的16个区块作废。

如果协调成本太高,或者中立矿池担心挖矿收益受到损失,那么中立矿池可以暂时不挖BCH,只留下攻击算力和守护算力,这样守护算力就不需要协调了。

这种方式,貌似很完美,除了攻击者有损失,其它人都没有损失。

更小代价的攻击

在上面的攻击中,攻击者的代价不小,如果损失16个区块,相当于亏损12.5*4000*16=80万RMB,除了可以吹一把51攻击之外,没有其它影响,因为攻击的区块被作废了。

那么攻击者如何用最小的代价去捣乱一下呢?

目前,交易所充值BCH大部分使用3个确认入账,那么攻击者使用66%的算力生成4个区块就可以超过诚实算力的3个区块的高度了,此时把攻击区块广播出去,然后停止挖矿。如果守护算力没有过来把诚实区块拉回来,那么攻击者就可以宣布攻击成功。如果守护算力把攻击区块作废了,也只损失4个区块(20万RMB),就当是骚扰一下。

51攻击的一些总结

  • 51攻击一定是在相同的协议下进行的。

  • 51攻击能调用的算力包括一切你所能拿到的所有算力。比如你调用矿池的算力,同时给用户补贴。

  • 51攻击后,不一定会有守护算力,比如BTG。

  • 51攻击后,如果没有守护算力,交易所提高确认数不一定会起到安全作用。

  • 51攻击后,如果有守护算力,交易所提前确认数一定会起到安全作用。

  • 51攻击的时候,需要先隐藏算力(不出块),此时会引起警觉。

  • 如果当前BCH算力是4.5E,攻击者的3E算力不在BCH挖矿,那么攻击者需要超过4.5E的算力才能发动攻击。

  • 无论是攻击者还是防守者,算力在同一个节点或同一套系统内才容易操作

你可能感兴趣的:(【区块链】)