四个证明位怎么推出最终化?检查点状态机的两条推演线 图 1
四个证明位怎么推出最终化?检查点状态机的两条推演线 · 图 1

很多人知道以太坊最终性要等两个多数派签名,但说不清”已证明”和”已最终化”在状态机里到底怎么区分。信标链用四个证明位加两组检查点字段来记录这件事,每个纪元末尾由一段确定性规则推演。本文按规范里的 weigh_justification_and_finalization 函数,把四条判定规则逐条讲清。

状态里的四个位和六个检查点

信标状态里与最终性相关的字段有三块:previous_justified_checkpoint 和 current_justified_checkpoint 两个检查点,加上 justification_bits 这个长度 4 的位数组。每个纪元开始时,位数组整体向老的方向挪一格,current 检查点先原样搬到 previous 位置,然后依次测试”上一个纪元的目标票够不够三分之二""当前纪元的目标票够不够三分之二”,够就把对应位点亮、把检查点更新为该纪元检查点。这里的三分之二是按总活跃余额的加权投票比,判据写成乘法形式:目标票余额乘 3 大于等于活跃总余额乘 2。

四个证明位滚动窗口与最终化判定路径的抽象示意

四条最终化规则

证明只说明”这一段的多数派签过”,最终化要靠旧检查点与位模式的组合。规范列了四条规则,两条走旧 previous 检查点、两条走旧 current 检查点。第一种模式:第 2、3、4 个最近的位都为真,且旧 previous 检查点的纪元加 3 等于当前纪元,则把旧 previous 检查点设为最终化点——含义是连续三个纪元接力证明,第一段还挂在第四段上。第二种模式:第 2、3 位为真且旧 previous 检查点纪元加 2 等于当前纪元——这是上一轮已经证明过一次的链条再补一跳。第三、四种模式对称地作用于旧 current 检查点:第 1、2、3 位全真对应纪元加 2 的情形,第 1、2 位为真对应纪元加 1 的情形。任何一条命中,finalized_checkpoint 就前移,命中的那条检查点之前的内容从此不可在诚实假设下被推翻。

为什么最快也要两个纪元

正常节奏下,纪元 N 的验证要在纪元 N 过半后才能在下一个区块里被处理,所以位点亮本身就有一拍延迟;再叠加”检查点纪元差”的约束,从提议到最终化的最短路径约为两个纪元。按规范常量(时隙 12 秒、每纪元 32 时隙)折算,一个纪元 384 秒,最短最终化路径约十二三分钟,这与日常观察到的十几分钟量级吻合。若网络分裂、多数派交替出现在不同分支上,位模式无法命中任何一条规则,最终化就停摆——这正是后来不活跃流失机制要处理的情形。

排障时的读法

Beacon 接口能直接读出 justification_bits 与两个检查点。当链出现”还在出块但不最终化”,先看位数组:四位里真假交错、旧检查点纪元对不上任何规则的行号模式,说明分裂而非延迟;若位模式接近命中、只等下一批目标票,则多半是大目标票迟滞。再对照两个检查点的纪元差:差值持续扩大说明证明在滚、最终化断链,差值原地不动说明证明本身停摆。

证明与最终化在节点侧的分工

对同步中的节点来说,这两级状态还有工程含义。客户端在评估尚未最终化的分支时,只能参考在当前证明状态下合法的链:分叉选择实现会为证明候选维护对应的检查点状态,验证一条分支时要确认其证明来源与自己接受的证明锚点一致——这就是 LMD-GHOST 与 Casper FFG 组合里”FFG 提供证明锚点、LMD 在锚点上算头”的分工。最终化之后的检查点则允许节点安全裁剪与重建状态:历史重组在诚实假设下到不了那里。检查点同步、弱主观性窗口这些信任工具,本质都是向新加入的节点交付最近一个可信证明检查点。

边界与常见误解

第一,位数组只有四位,意味着判定窗口只覆盖最近四个纪元,更久的历史不靠位而靠已最终化检查点接力。第二,创世头两个纪元会跳过这套推演,避开桩数据的边角情况。第三,规则里的乘法判据等价于”不低于三分之二”,引用时不必纠结取整方向,直接看规范写法。第四,最终化的安全前提是诚实验证者占比超过三分之一,这是共识安全假设而不是无条件保证。

本文只描述协议状态机,不构成投资建议;常量与判定规则以官方共识规范当前版本为准。