在上一期,我们为大家讲述了通过对最重链规则进行“平衡攻击”,从而阻止新的诚实交易被确认的方法。
在本期中,我们将讲述另一种攻击方式,我们称为“分割攻击”。这种攻击方式目前没有见其他地方公开提到过,是 Conflux 在分析“最重链规则”的安全性时发现的。
在上一期介绍平衡攻击的时候,我们提到,攻击者将诚实的节点分割成 2 个算力均等社区,利用其对网络的控制能力,让 2 个社区的诚实节点在不同的子树下挖新的区块,从而产生两个差不多大的子树。
本期所讲的攻击方式,在最开始的时候与平衡攻击类似,也是将诚实的节点分割成若干个算力差不多的社区,每个社区在不同的子树下挖区块。这里我们以分割成 3 个社区为例。
(图中每一个红色圆圈代表一个的区块,攻击者让3个社区的诚实节点分别在右侧 3 个不同的子树下贡献算力)
与此同时,攻击者会在 3 个区块的父亲区块(上图中左上侧的圆圈)后面再生成一个区块,并在这个区块下面挖块。一段时间之后,区块之间的结构如下图所示。(这里我们假设攻击者占 40% 全网总算力。)
(图中方框代表在一段时间内新生成的一些区块。其中虚线表示坏人藏起来没有广播区块。蓝色表示好人生成的区块)
与平衡攻击不同,攻击者并不打算让 3 个好人社区为这 3 棵子树谁更重争执下去。相反,攻击者让之前被藏起来的孩子成为最重的孩子。
之后,攻击者如法炮制,重复上述这个过程。
在每一轮中,如果好人平均生成 30 个区块,那么每棵子树下平均有 10 个区块。
攻击者只需要广播 11 个区块(可能会因为随机性略多一些)就可以完成自己的目的。而在同一时间,攻击者可以新生成 20 个区块。
这样攻击者藏的链就会越来越长。而且,这条链上的每一个区块最终还会成为所有诚实节点所认可的主链。也就是说,攻击者用藏了很久的区块控制了主链。
如果一个区块被攻击者藏了很久,后来又成为了所有诚实节点所认可的主链。这是一件非常可怕的事情,攻击者可能已经在这个区块的子树中藏了足够多的区块,它可以在任何时刻将这些藏起来的区块广播出来,形成一棵权重很大的子树,用来打败好人的子树。
这样,如果好人子树中有交易已经被确认,那么这些被确认的交易就会被逆转。也就是说,攻击者完成了“双花攻击”。
幸运的是,一个区块是不是被藏了很久,虽然在最重链规则下很难判断,但结合“树图结构”后,我们有能力去发现那些被藏了很久的主链区块。
如果我们相应地推迟这个区块之后交易的确认,就可以避免被“双花”。
但是,这会带来另一个问题,就是交易迟迟无法确认。总的来说,在合理的确认规则之下,“分割攻击”只能够做到“存活性攻击”。
那么,利用树图结构,我们是否有能力去探测这种攻击呢?探测到这种攻击以后,又有什么应对方式呢?我们将在未来几期讲解。
END