协议版本信令是什么?layer2 节点怎么从 L1 合约知道要升级了 图 1
协议版本信令是什么?layer2 节点怎么从 L1 合约知道要升级了 · 图 1

Layer2 的节点运维者怎么知道”下一条区块该按新规则算”?比特币靠版本号位、以太坊靠预定 Epoch,OP Stack 系则用了一套围绕 L1 合约的信号机制,规范叫 Superchain Version Signaling。它的特殊之处在于:几十条基于同一套代码的链要分头升级,但升级通知不需要挨个通知,节点自己去 L1 读一个公告牌就够了。

两个信号:recommended 与 required

规范定义每个 Superchain 目标(一个升级列车)在 L1 上追踪两个版本信号。recommended 在升级前较长时间公开,用途是提醒节点软件提前准备,规范要求节点软件应当通过日志和指标把这个提醒透出给运维者;required 在破坏性升级前较短时间内给出,含义更硬——达不到这个版本,节点面对的协议规则就不再是自己认识的规则。规范还特意说明并非所有组件都要直接盯 L1:执行引擎之类的组件可以由 rollup node 轮询后转告,rollup node 通过 engine_signalSuperchainV1 把版本信息传给执行引擎。

公告牌本身:ProtocolVersions 合约

机制示意(图片由 Agnes 生成,非产品界面或链上数据图)

信号的存放处是 L1 上名为 ProtocolVersions 的合约,规范给出两个读取槽位的推导式——required 在 protocolversion.required 的 keccak 哈希减一处,recommended 同理——以及对应的 required()recommended() getter。版本值本身与语义化版本兼容,但编码成固定的 32 字节数据:先是一个类型字节,随后依次是七个零字节的保留区、八字节构建标识、major、minor、patch 与预发布号四个大端 uint32 段,JSON-RPC 场景下按 32 字节 DATA 传输。规范特意把编码写成带类型前缀的形式,目的是让格式在未来可扩展而不与现有节点冲突。节点把它和自己内置的支持版本比较。行为要求也写进了规范:当 recommended 比节点支持的版本新时应当告警;当达不到 required 时应当采取预防措施,包括在 rollup node 操作者同意的前提下停止出块与同步引擎。为什么停而不是一路硬跑?因为继续按旧规则产块,产出的区块会在推导与故障证明阶段被判为无效,晚停不如早停。

升级列车为什么需要统一信令

OP Stack 的部署模型决定了这套设计的形状。一个 Superchain 里有多条链共用同一组系统合约代码,协议变更按”升级列车”打包发布:一次列车里可能同时包含执行层规则变化与合约变化,且每条链的激活区块高度独立约定。规范的升级文档要求硬分叉本身在激活高度改变功能行为,信令系统负责让这条”何时激活”的信息从单一来源广播给所有链的节点。读这套文档时的正确姿势是:链的激活时间看该链自己的公告,软件该不该升级看 ProtocolVersions 合约的信号值,两者一个定”几号改”,一个定”不改会怎样”,缺任何一个都可能造成半升级状态。

运维与用户各自核对什么

节点运维者的核对顺序很直接:先确认自己的 rollup node 与执行引擎版本号,再在 L1 区块浏览器调用该 Superchain 的 ProtocolVersions 合约读 recommended 与 required,然后对照该链升级公告里的激活高度,三个信息拼起来判断”我还有多少个区块的缓冲期”。普通用户通常不需要做这些,但有一条间接收益:当某条 L2 的节点大面积落后于 required 时,链可能停摆或分裂,充提界面会表现为长时间无进展——这时”链在升级”和”链出故障”在协议层是可区分的事件,因为升级高度与信号值是提前公开的,公开信息里没有预告的停摆才更值得警惕。合约地址与版本编码细节以各链官方文档为准。本文只做机制解释,不构成任何投资建议。