Stylus 怎么给 Arbitrum 装上第二台虚拟机?WASM 激活、计费与互调拆解 图 1
Stylus 怎么给 Arbitrum 装上第二台虚拟机?WASM 激活、计费与互调拆解 · 图 1

给 EVM 配一台并列的第二引擎

Stylus 是 Arbitrum Nitro 技术栈的一次升级(官方文档将其归入 ArbOS 32),核心动作只有一个:在原有 EVM 之外加一台地位平等的 WebAssembly 虚拟机,官方把这称为 MultiVM——一切是叠加式的,EVM 合约的行为与在以太坊上完全一致。WASM 是浏览器和服务器软件早已普及的二进制格式,天生为速度和可移植性设计,还带沙箱隔离。从此 Rust、C、C++ 等能编译到 WASM 的语言可以直接写智能合约,Go、Sway、Move、Cairo 也在支持范围内,其中 Rust 的工具链最成熟。

共享同一棵状态树

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

Stylus 合约不是外挂链:它与 Solidity 合约共享同一棵 EVM 状态树。存储布局用 sol_storage! 宏或 #[storage] 属性声明,可以直接映射到 Solidity 的存储槽位;#[entrypoint] 生成统一入口 user_entrypoint,入参是 calldata 的字节长度、返回是输出字节长度,#[public] 标注对外方法并生成路由。合约对链下环境的唯一依赖是一组被导入的 hostio 宿主函数——读区块号、读存储、发事件都走这层受控接口,这正是沙箱的边界所在。正因为状态同一、布局互认,Solidity 合约可以调用 Rust 合约,反过来也行,互操作是协议层的而非桥式的:同一个地址空间里,两种虚拟机里的程序能直接看见并调用彼此。合约部署后还需要一个激活(activation)步骤:把链上的 WASM 在节点本地编译成 x86 或 ARM 原生机器码,通过激活检查后才可调用;官方入门页也提醒,链发生相关升级后老 Stylus 合约可能需要重新激活才能继续被调用。

内存与计算如何计费

WASM 侧的执行模型与 EVM 差异明显。合约编译到 wasm32-unknown-unknown 目标:三十二位寻址、线性内存、按六十四 KB 页增长,栈被限制在约 32 KB 以保证内存有界;扩容通过显式的 memory.grow,并且在真的扩页之前会先调用 pay_for_memory_grow 计费,避免”先挥霍后买单”。编译参数还关闭引用类型、开启批量内存操作,一切都朝着可确定、可计量、可重放的方向裁剪。官方给出的定价直觉是:一次 EVM 操作的耗时约等于数千次 WASM 操作,因此计费单位更细,内存与计算密集型任务(哈希、序列化合并、密码学循环)的 Gas 明显低于把同等逻辑硬写进 EVM 字节码或预编译。收益是任务相关的——一笔简单的转账或一次存储读写,瓶颈在状态访问而不是指令吞吐,换语言并不会神奇变便宜;评估 Stylus 值不值,先问自己的负载是不是算得多、存得少。

可复现部署与验证

Stylus 的部署交易把压缩后的 WASM 放进 calldata 发布上链。cargo stylus 默认在 Docker 容器里完成部署以保证可复现,任何人拿同一套代码可以重建出与链上一致的字节码;工具还提供对指定部署交易哈希做本地验证的路径,检查压缩编码与激活条件是否都通过。Arbiscan 对 0.5.0 及以上工具版本部署的合约提供源码验证入口。对审计者与集成方来说,这意味着”源码到链上程序”的一致性可以用工具核对而不是口头信任发布者:先看部署交易里 calldata 的哈希,再和公开仓库构建产物比对,任何编译环境差异都会在复现失败时暴露。

与欺诈证明的渊源及边界

Nitro 栈早就在用 WASM:欺诈证明回放执行时依赖的正是这套把执行状态编译成可重放程序的体系,Stylus 相当于把同一基础设施开放给开发者使用。两条边界值得写清。其一,语言换代不消除逻辑漏洞:Rust 的所有权系统挡住的是内存错误那一类缺陷,越权调用、价格预言机误用、依赖库投毒与业务逻辑错误在 Rust 合约里同样会发生,而且 Stylus 生态的审计工具与分析经验沉淀明显少于 Solidity,升级合约时的存储迁移语义也要按 SDK 文档逐项核对。其二,Stylus 是 Arbitrum 链上的执行环境扩展,合约仍运行在同一条 Rollup 的安全模型内——排序器可用性、数据可用性与欺诈证明的假设不因换语言而改变。Gas 优势也随网络拥堵与定价参数浮动,动手迁移前以链上实时报价和基准测试为准,而不是引用某篇介绍里的固定倍数。