弹跳攻击 -- 过于古老因此仅供知晓
It is an extremely common mistake, people think the writer's imagination is always at work, so that he's constantly inverting an endless supply of incidents and episodes, that he simply dreams up his stories out of thin air.
-- The Grand Budapest Hotel
同样极易误解的是,大部分人认为对以太坊的一次成功攻击会让黑客凭空创造以太币或者将他人的以太币划入私有账户。虽然这样的行为的确会被归类为攻击,但若我们从“针对以太坊的攻击”这一概念出发,我们发现它所能包含的范畴远超于这两类行为。
一个更加准确的等价概念,在我看来,应该是对以太坊已有协议的偏离。但是,这一描述方式的边界十分模糊,以至于部分行为与其说是攻击,不如说是对协议的不同理解。
好在这篇文章所要讨论的攻击并不模糊。只需要从它达到的直观效果中进行简单的推理,我们就能看到他所带来的巨大危害。
弹跳攻击(“Bouncing Attack")出现的非常早,攻击者在不同时间段的不同支链上投票,引导协议认定的合法链在两条支链之间来回跳转,推迟链上的最终确定性。这一攻击的出现基础,是早期的以太坊设计中,参与者们忽略了分叉选择规则设计需求的一个重要的基本属性:当两条分叉出现时,分叉选择规则对于某条分叉的偏向性应当(在某一时间点做出选择后)随时间增加且不会改变。
我们可以看到早期的PoW类区块链天然的带有这一属性,当其中一个链新挖出一个区块后,诚实的矿工会聚集在这条链上,不断增加它的优势。这样的属性可以被描述为分叉选择规则的”稳定性“,即用当前分叉选择的结果能很好的预测未来的分叉选择。
但是最初作为分叉选择规则的的LMD GHOST并不具备这样的属性。LMD GHOST的全称是Latest Message Driven Greedy Heaviest-Observed Sub-Tree。其规则如下:
在PoW类区块链中,区块链的状态演变是由新的区块所推进的。矿工们在每一个新的区块到来时更新本地视图,选择主链并计算新的区块。但在以太坊的PoS协议中,状态演变是由验证者们投票决定的,这也是Message Driven的含义。
Latest则代表验证者只根据最新的投票信息进行决策,这表现在规则的第二步。它也是导致这一攻击的重点,为了理解它所导致的不稳定,我们不妨假设攻击者具有百分之十的投票权重,分叉的投票情景如下图所示:
攻击者在slot n中发布一个验证,认可上面的链为主链,此时上面的链获得了百分之七十的投票,成为多数。随后在下一个slot里,攻击者转而认可下面的链,发布占据百分之十比重的票,使得下面的链上的最新区块获得百分之七十的投票。由于LMD GHOST中选取的验证消息是最新的(slot数最高),因此上一轮投票的结果不会被纳入,下面的支链成为新的主链。攻击者在两轮投票中选择了不同的两个链,支持他们在不同的时段成为主链。
不过,我们发现这一攻击出现的前提十分苛刻:攻击者知晓两条链的存在,但诚实者们似乎并不如此,不然也不会出现如此奇妙的投票结果。既然诚实的验证者们在slot n中选择了上面的支链作为主链,那他们应当继续为slot n+1中该链的新块投票。但其中的一部分验证者未能知晓到该区块,反而得知了另一条链上的最新区块,并决定为其投票。这显然是在极端的网络情况下才会出现的。
但是,这样的情景在如今异步的网络环境中并非不可达到,因而在协议设计时必须加以考虑。此外,我们发现这一攻击对于攻击者拥有的投票占比要求并不严苛,只要攻击者的投票能成为主链选择的”最后一根稻草“,百分之一或更少也同样可行。但相应的,随着攻击者拥有的投票占比下降,完成这一攻击的网络条件也变得更加难以实现。
上述场景已经让攻击者可以发动双花攻击了。但它在以太坊协议中能造成的危害不止于此。在这一节,我们引入以太坊PoS协议的两个重要基本概念:Justified和Finalized。他们代表的是区块的两种不同状态。
我们可以简单的认为:一个新的区块需要受到三分之二的投票才会被认可为Justified。如果一个区块进入Justified状态,且它的直接父区块(即中间不存在其他区块)此前处于Justified状态,那么这个父区块的状态将会更新为Finalized。在PoS协议中,所有被Finalized的区块不可以被回滚,他们将一直存在于合法链上。
定义Finalized这一概念是为了防止区块被回滚,毕竟PoS不需要工作量证明,只需要投票信息。如果攻击者用某种获取到了其他验证者的签名,攻击者就可以轻易伪造一条支链,回滚曾经的链上交易。
虽然Justified和Finalized都是针对区块状态的概念,但在实际场景中,状态的变化是以epoch为单位进行的。验证者们会根据他们看到的网络视图,在每一轮epoch中进行一次FFG投票。声明它所看到的上一个Justified的检查点和最新的检查点。
攻击者进行弹跳攻击的时候,主链的选择是每隔一个epoch变动一次。这使得一条链上相邻的两个epoch无法都进入Justified的状态,导致两条链都不可被Finalized。
在放弃将以太坊迁移到 PoS 的先前设计后不久,Vitalik 于 2018 年 7 月 31 日发布了信标链权益证明共识的原始迷你规范。这一举动被证明十分有效,因为 Alistair Stewart 发现了IMD GHOST中的缺陷,提出了弹跳攻击。
对弹跳攻击的深入理解。从实现攻击的基础上回头检视必要的前提条件
对弹跳攻击的防御:主链的跳转需要在限定时间内
详细介绍Justified和Finalized的文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!