Solana 的运维者最怕的时刻不是节点宕机,而是全网一起停摆:此时需要人为地把所有验证者一起重启,并且所有人必须就「从哪个区块重启」达成一致——选错区块,意味着已经确认的交易可能被回滚。SIMD-0046 提出了一套叫作 Wen restart 的自动协商流程,把最危险的人工协商环节交给协议。这篇按 SIMD 原文拆解这套集群重启自救协议。
人肉协商是重启里最大的风险
集群重启只发生在全网故障之后,零散的单机重启不影响集群。传统流程由人类挑一个区块让所有节点一起重启,通常选最高的乐观确认区块——字面意思是获得了持有三分之二以上质押量的验证者投票的区块,共识算法的目标是让它永不被回滚。SIMD 直言这一环节的人为失误会伤害整个生态,因此要把「重启点选哪个、区块数据是否齐了」交给自动协商。它同时强调这叫乐观重启:自动流程里布了多重检查,任何一项失败就停机打印调试信息等人接手,而不是闷头往下走。
先停下出块,把话讲清楚
进入重启模式的验证者先进入 wen restart phase:暂停出块与投票,通过 Gossip 向其他参与重启的节点广播自己最后投票的分支。为了不干扰没参与重启的节点,这个阶段用临时分片版本 (current_shred_version + 1) mod 0xffff 隔离流量。广播消息带上最后投票槽位、该槽位的 bank hash,以及用游程编码压缩的祖先槽位位向量,跨度上限硬编码为 65535 个槽位——按约 400 毫秒一个槽换算约合 7.3 小时。这个数字背后的假设是:任何全网故障都会在 7 小时内被人类注意到;迟到超过这个窗口的节点无法以此方式加入,若凑不齐人则退回传统的人工交互重启。

42% 与修复的算术
第二阶段修复本地缺失的区块,铁律是不能漏修,因为乐观确认的区块不可能再回滚;多修无所谓,投票统计阶段会剔除误报。哪些块必须修?协议给的门槛是 67% 减去 5% 不守规矩质押、再减去未参与重启的质押。按至少 80% 验证者参与重启(RESTART_STAKE_THRESHOLD,沿用了 --wait_for_supermajority 的同款阈值)计算,低于 42% 质押的区块在故障前不可能拿到三分之二支持,可以忽略;这个门槛只升不降,一旦有区块越过门槛就可以动手修。
各选各的最重分支,再对答案
收齐 80% 质押的最后投票消息并完成修复后,每个节点独立计算最重分支:把高于门槛的区块按槽位排序,要求它们连成以本地 root 为首的单链,否则打印第一个违规区块并退出。SIMD 用反证法论证了三条安全性质:故障前任何乐观确认的区块必然在链上;链上区块最多有一个孩子也在链上;未确认区块若出现只能位于链尾。最后由命令行统一指定的协调者广播它选定的槽位与 bank hash,其余节点补齐该分支、比对 bank hash、确认它包含本地 root 且与自己的选择同轨——任何一步不符就退出报错等待人工。协调者负责保持在线并汇总各节点的回报状态。
边界与代价
成功退出前,节点在约定的重启槽位生成增量快照,日志打印出下一阶段所需的 --wait_for_supermajority 系列参数:正确的分片版本、重启槽位与期望的 bank hash。非协调者角色跑完流程后以退出码 200 收工,协调者则一直停留在线,既为了让迟到的节点也能拿到最重分支消息,也为了汇总各节点回报、给运维一张集群状态表。跨纪元故障被限制在两个纪元内处理,对反复改票的节点采用先到先记录、分歧存档的策略,留待未来的罚没规则处置。值得注意的边界是:Wen restart 仍是人类发起的应急协议,自动检测故障并自动重启的方案在文档里被评估过,因担心恢复过程本身卡死、延误人工响应而放弃。它的实现状态由 SIMD 文档记录为已实现,具体参数与行为以当前客户端源码为准。本文是机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。