跑得快和吵得清是两件事
Arbitrum Nitro 的节点每天都在重复同一件事:把排序后的交易喂给状态转移函数,算出新状态。正常时这样跑越快越好;可一旦两名验证者对结果有分歧,快就不够用了——裁决必须在一台谁也无法作弊的”通用机器”上逐步重放,还得让以太坊主网上的合约能复核。Nitro 的答案是同一段源码编译两个目标:日常执行用 Go 原生编译,跑本机最快的机器码;一旦进入争议,同样的代码编译成 WebAssembly 字节码,作为双方共同参照的裁判介质。
WAVM:对 WebAssembly 的删减与补全
https://assets.skjop.cn/articles/202609021032/content-1.jpg
官方白皮书把裁判用的字节码称为 WAVM,它是 wasm 的一个受限变体,改动分三类。删:把 Go 编译器根本不会生成的 wasm 特性移除,转换阶段顺带验证确实不存在。限:禁掉浮点指令,用 Berkeley SoftFloat 库的函数调用替代,避免不同硬件的浮点结果差异毁掉确定性;把嵌套控制流展平成跳转;把耗时不定的指令改写成固定成本的组合。补:增加与区块链交互的指令,比如读写链上全局状态、从信箱取下一条消息、宣告状态转移函数正常结束。一番手术之后,每条指令的语义和成本都足够直白,才撑得起下一步。
争议落到链上时:一步证明
互动式欺诈证明的最后一步,是双方在某个 WAVM 状态的哈希上彻底僵持:执行一条指令之后,状态哈希到底该是多少。每个 WAVM 状态都被组织成一棵 Merkle 树,树根哈希代表整个虚拟机。提出主张的一方调用主网上一部单步证明验证合约,提交一份把状态树局部展开的证据;合约据此读出下一条指令、模拟执行、算出新状态的树根,与主张比对。见证找得到当且仅当这条指令真的能把”执行前哈希”推到”执行后哈希”——这份保证靠 WAVM 指令集与验证合约的配套设计维持,官方白皮书强调其设计目标是让有效见证总能用可行的主网 gas 验证完。状态树之外还有一招哈希神谕:状态转移函数只持有状态树根,需要内容时按哈希取原像,前提是整棵树公开可见且单节点尺寸有上限。
重放二进制与链上那个哈希
节点软件里对应这套流程的产物叫重放二进制:同一状态转移函数的 wasm 版与 WAVM 版打包在一起,重放到争议高度时逐条重跑。它体积太大放不进链,于是链上 Rollup 合约只存一个三十二字节的 WASM 模块根哈希——对 WAVM 二进制的 Merkle 化结果。验证者启动时必须带着与链上哈希逐位一致的二进制,否则没法参与欺诈证明;官方文档同时提醒,代码哪怕行为等价的改动也会改变这个哈希,因此升级节点镜像时必须带上与链上一致的版本。换句话说,链上那串哈希就是”裁判机器”的出厂编号。
快与可证明怎么不打架
这套设计的妙处在于两种编译目标共享同一份源码。官方白皮书把动机说得很直白:系统日常跑要快,裁决跑要结构化、与机器无关,两者天然拉扯;同源代码分别编译,快的一侧不牺牲正确性,裁判侧不用重写一遍虚拟机。对节点运维者,副作用是”验证者模式”的开与关:普通节点只做原生执行,开启验证的节点才需要随身携带重放二进制。Stylus 上线后这条通道又被复用了一次——部署的 WASM 合约程序同样要经历激活、气量计量与可证明化,普通执行时即时编译成本机码,进争议时回到 WAVM 重放。
它不改变的东西
无论编译目标怎么换,Nitro 的安全叙事没有变:这是一条乐观 Rollup,默认接受提案、出错才上链打官司;以太坊主网始终是最终裁决场地,任何升级与状态判定都以 L1 合约记载为准。WASM 裁判机降低的是”证明成本”,不是”信任数量”——排序器仍决定交易顺序,验证者仍要自愿跟进。Arbitrum Nitro 是什么?一笔交易从提交到批次上链的完整旅程 讲的是同一台机器平时怎么跑。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。