八个人投票出链却卡死了:EIP-3436 给 Clique 补一条四步择块规则 图 1
八个人投票出链却卡死了:EIP-3436 给 Clique 补一条四步择块规则 · 图 1

先认一下 Clique

Clique 是以太坊客户端内置的权威证明共识:出块权不靠算力抽签,而是发给一份可投票增删的验证者名单,轮到谁谁出块。主网测试网 Goerli 长期用它,多套客户端各跑各的实现。问题出在”两条链摆在一起该认哪条”这件事上:早期规范只有一条总难度取胜的规则,而 Clique 里每个块的难度贡献只有 1(在轮值位置出块)或 2(补位出块),两条长度相近的分支的总难度极易打平。打平之后听谁的,规范没说。

卡死是怎么发生的

提案动机段记录了真实事故:Goerli 多客户端环境出现过不止一次链停摆,活跃验证者超过一半,按常理不该停摆。理据部分给了一个八验证者的推演。设八个验证者按地址排序即轮值顺序,链本来按顺序推进,验证者 8 刚出完自己的轮值块,随后 5、7、8 三人掉线,剩下 1 到 6 号继续出块。这时两条分支同时生长:一条由 1 号正常轮值接 3 号补位,另一条由 2、4、6 号各自补位。两边对公共祖先的净难度贡献都是 3,谁都不肯换——认对方并不增加难度优势,理性节点全部站在原地。链停住了,最后还是靠一位本已离线的验证者回来才打破僵局。这就是活锁式的死锁。

四步规则

提案给的裁决顺序是:第一步比总难度(沿用旧规);第二步比谁更短——区块高度更低的链优先,这样补位多、跳号快的那条会被弃掉;第三步比谁”最近一次轮到出块”发生得更晚,用公式说就是对每个块按该高度减去出块者索引再对验证者数取模,取结果更大的那条;第四步如果还平,把块哈希当成无符号整数比大小。前三层各自对应一个直觉:长度、轮值公平、最后用哈希做确定性随机。关键是全链路确定性——任何节点、任何顺序拿到同一对头块,都会选同一条。

为什么第三层要这么绕

只靠”更短链”仍留有一个双分支完全等长的构型(理据段的第二种场景:7、8 掉线后 1、3、5 与 2、4、6 各出一条三步分支,难度与长度全等)。哈希比大小能裁决,但会让轮值公平让位于运气。第三层的设计目标是在诉诸运气之前先问一句:两边各让掉一个出块位的话,按轮值谁最没理由坚持?公式里那个取模算的正是”这个验证者上一次坐庄有多遥远”,把更晚轮值的一方判负,等价于坚持按轮值表办事。

现状与读法

提案状态 Stagnant,需要与 EIP-225(Clique 本体)放在一起读。提案原文记录了 Goerli 多客户端环境的停摆与当时各家客户端择块策略的分歧;至于各实现后来各自打过哪些补丁,本文不展开。把这条规则当作”确定性平局裁决”的教科书样本最划算:任何弱最终性系统只要允许同高度竞争块,早晚要回答同一个问题——平局时听谁的,而答案必须是不用商量的。

快速问答

问:为什么总难度会打平? 答:Clique 的难度增量只有 1 和 2 两档,分支间轮值模式不同就会精确抵消;它不像工作量证明那样累加大数值的真实哈希功。

问:哈希比大小会不会让攻击者挑块? 答:出块者可以微调内容改变哈希,但哈希只能赢在最后一层,前三层规则先消掉了大部分依赖哈希的场景;这也是把哈希放最后的原因。

问:权益证明的主网需要这套规则吗? 答:不需要。主网的分叉选择由 LMD-GHOST 加检查点最终性负责,本质是用权重投票替代了平局裁决,Clique 的场景是可信名单内部的小圈子协调。

一个更小的沙盒

把八人推演缩到两分钟能算完的规模:只有两个验证者 A、B,规则只有总难度。A 与 B 同时在各自高度出一块,两块的难度都是 2(补位),总难度打平,节点按先见为准——但不同节点先见不同,网络就此裂成认识两块的两种节点,谁也不换。加上四步规则后,第二步的链长或第三步的轮值差必然先把局面收干净,运气只剩最后兜底。平局裁决的价值在小样本里最刺眼:规则每少一层,“先看谁”的成分就多一点,而先看谁意味着先发包的人拥有免费的投票权。

风险提示:本文只做共识机制说明,不构成任何投资建议。