← 返回博客

Rotifer v0.6.5:跨绑定验证 — IR 可移植性从纸面走向现实

一个 RotiferBinding trait、一个模拟 Web3 环境、9 个跨绑定测试,证明基因可以在根本不同的执行环境间传播。

Rotifer 协议声称基因是可移植的——编译为 IR,在任何绑定环境中运行。在 v0.6.5 之前,这只是规范中的承诺,没有任何实际验证。本版本改变了这一点。

问题:只有一个绑定,零验证

IR 规范明确声明:

IR 1.0 发布条件:至少有两个绑定环境通过跨绑定互操作测试。

我们只有一个绑定环境(Local/Cloud),跨绑定测试数量为零。IR 规范中最关键的 §10(跨绑定互操作协议)从未在真实代码上运行过。

方案:抽象、模拟、验证

与其花数月构建完整的 Web3 Binding(Solidity 合约、Arbitrum 部署、代币经济学),我们选择了最小方案:构建一个差异足够大的 Mock,触发协商协议的每条路径。

RotiferBinding Trait

新增 RotiferBinding trait,抽象”执行环境”的含义:

pub trait RotiferBinding: Send + Sync {
fn binding_id(&self) -> &str;
fn metering_unit(&self) -> MeteringUnit;
fn capabilities(&self) -> &BindingCapabilities;
fn execute_ir(&self, ir_bytes: &[u8], context: &Context,
input: Value, phenotype: &Phenotype) -> Result<GeneResult>;
fn negotiate(&self, requirements: &IrRequirements) -> NegotiationResult;
}

每个绑定声明自身的标识、计量单位(Fuel / Gas / WallClock)、可用宿主函数和资源上限。现有的 wasmtime 沙箱被重构为 LocalBinding,行为完全不变——224 个现有测试全部通过。

Web3MockBinding

第二个绑定模拟链上约束:

维度LocalBindingWeb3MockBinding
计量Fuel(上限 1M)Gas = Fuel × price(上限 500K)
内存64 MB16 MB
超时30s5s
文件系统允许禁止
扩展宿主函数getBlockNumbergetChainId

同一个 wasmtime 引擎,完全不同的约束。这些差异足以覆盖 Capability Negotiation 协议的所有路径。

Capability Negotiation:三态结果

当基因的 IR 被传输到新绑定时,协议进行兼容性协商:

协商检查必需宿主函数、可选宿主函数、内存需求和资源预算。6 种类型化的 IncompatibilityReason 变体提供精确诊断——不是字符串错误。

9 个跨绑定测试

计划 6 个,交付 9 个:

  1. 基础互操作 — echo 基因在 Local 编译,传输到 Web3Mock 执行
  2. 资源超限 — 需要 32 MB 的基因被 Web3Mock(16 MB 上限)拒绝
  3. 可选函数降级 — 使用 getBlockNumber 的基因在 Local 中获得 PartiallyCompatible
  4. 必需函数拒绝 — 需要 chainCall 的基因在 Local 中获得 Incompatible
  5. Gas 计量验证 — 同一 IR、同一计算,报告不同的计量单位
  6. 无 IR 回退 — Wrapped 基因(无 irHash)返回 ERROR_NO_IR_AVAILABLE 7-9. 双向传输 — Web3Mock → Local 方向的传输验证

254 个 Rust 测试全部通过(原有 224 + 30 个 binding 测试)。

发现:7 条规范建议

验证产出了正式的 IR 跨绑定验证报告,包含 7 条针对 IR 0.2.0 的建议:

优先级建议
将 Capability Negotiation 提升为正式子协议(§10.5)
明确编译期拦截 vs 运行时降级的扩展函数处理策略
区分”核心互操作协议”(步骤 3-5)和”完整传播流程”(步骤 1-7)
定义跨绑定资源计量语义
从 WASM 自定义段自动提取 IrRequirements
明确扩展函数命名约定
在协商中预留版本检查点

IR 1.0 进度

v0.6.5 完成后,IR 版本可以从 0.1.0 升级到 0.2.0。核心互操作路径已验证。但 IR 1.0 仍需真实(非 Mock)的 Web3 Binding 和外部开发者 RFC 反馈。

后续影响

v0.6.5 是基础设施——没有新 CLI 命令,没有 UI 变化,没有面向用户的功能。但它为后续一切打下了基础:


升级: npm i -g @rotifer/playground@latest

文档: rotifer.dev/docs

源码: gitlab.com/rotifer-protocol/rotifer-playground