以太坊信标链在5/25 发生7 个区块重组,研究员Barnabé Monnot 综合多位分析师与开发者的见解,以图解的方式叙述重组原因,并强调合并后所有验证节点将使用相同用户端软件,区块重组将不再发生。
简言之,发生重组并非信标链所预期,主因在于部分用户端并未更新针对抵御幽灵攻击的Proposer Boost,导致节点分歧,Monnot 也强调重组并未使验证最终性延迟或出错。
以太坊共识机制
本次的重组原因与以太坊共识层所采用的分叉选择规则LMD GHOST (Last Message Driven Greediest Heaviest Observed SubTree) 有关。
在分析重组原因前,需要了解LMD GHOST 与Slots 的运作机制。
LMD GHOST
当区块链以诚实的方式运作时,链上按理一次只会出现一个新的区块,并获得所有验证者支持,但由于网络延迟或提议者(Block Proposer) 分歧,用户端需要一种演算法来决定要支持哪条链,以太坊所使用的算法称为LMD GHOST,能使用户识别出哪条链包含最多的验证者证明。
Slots
在以太坊的共识机制中,时间被划分为Slots,每个Slot 为12 秒并会选出一个提议者(Block Proposer),并由证明者(Attesters) 进行投票。
提议者会根据LMD-GHOST 分叉选择规则,在他认为拥有最多验证者证明的链构建下一个区块。「提议者」预期在Slot 开始时释出区块,而「证明者」应在Slot 的4 秒时释出投票,从而留给提议者足够时间,让区块能被证明者所见。
而由于引入了Proposer Boost,证明者投给的提议者提升了权重,使运作上倾向于更即时的区块提议。作者接着以图解方式说明重组过程。
如何分叉的?
下图中长方形为重组的七个区块,圆圈为证明(投票),圆圈越大代表权重越高。
区块74 和75 同时出现形成分叉,多个提议者在75 构建区块,但区块74 比竞争链累积更多权重,最终区块82 提议者将区块构建在74 之上,并以重组区块75 到81 为代价结束分叉。
分叉步骤
Slot 73
在Slot 73 时,证明者投给了区块73 并即时完成,目前一切正常。
但在Slot 74 时没有出现任何区块,因此证明者持续投票给区块73,进而增加期权重。
区块73示例区块74、75
下图的事发经过:
区块74 延迟。导致Slot 75 开始时,区块74、75 几乎同时出现。Proposer Boost 赋予了75 更多权重。因此Slot 75 更倾向即时的区块75 而非74。区块73-75 示例而重点在于,并非所有证明者(用户端) 都升级了Proposer Boost,因此两条链票数约五五波:
没有激活Proposer Boost 的用户端更倾向块74。运行Proposer Boost 的用户端较倾向块75。但图中能发现区块74 权重略高于75,这代表没有运行Proposer Boost 的用户端比例较高一些。
区块76
既然区块74 权重更高,为何76 的区块提议者选择了区块75?
这是因为Proposer Boost 适用于当前执行分叉选择的提议者,因此76 提议者误将75 选择为父块,从76 提议者的角度来看:
区块75 证明者+Proposer Boost 在75 的权重> 74 证明者。区块73-76 示例区块76-81
与此同时,区块75-81 的证明者持续在74 与75 两条链之间分配选票,且没有运行Proposer Boost 的用户端验证者持续投票给区块74,进而增加其权重。
区块73-81 示例最后,一位未运行Proposer Boost 的提议者出现,他需要决定在哪条链构建区块,区块82 提议者认为区块74 比81 的权重更高(作者强调区块74 的权重高过75-81 的任何一个区块)。
至此,区块75-81 被有效地重组,甚至运行Proposer Boost 的验证者也将区块82 视为胜出,验证投票也不再分裂。
区块73-83 示例总结
作者认为,区块重组是理论上可能发生,但在现实中却难以实现的案例,也因此他想强调信标链的重组事件是纯属意外。
目前,以太坊开发者从重组事件中已清楚了解验证者之间存在见解分歧的可能性,一组验证者所看到的可能与其他节点不同,也意识到这些分歧可能延迟区块,而Proposer Boost 的不平衡或许是分歧的原因。
此外,作者也认为以太坊合并后,因为硬分叉升级而所有节点皆必须更新,所有验证节点在合并后都将运行相同的用户端软件,这将不会再出现相同肇因而导致的区块重组事件。
他总结道,虽然类似的失败事件让人不满,但区块重组并没有使以太坊(信标链) 的共识机制失效,相反,这次事件让以太坊开发者更谨慎行事,更有动力打造一个无论是在理论上、现实中,都更为稳健的协议。