通用 Move 策略
共享限制
在第一个 Move 兼容 IR 中允许:- 布尔值
- 无符号整数
- 地址
- 字节向量
- 具有具体字段的结构体
- 降级为标签的简单枚举
- 一阶函数
- 显式入口
- 显式中止代码
- 用于事件、资源和对象的目标能力
- 高阶运行时函数
- 任意 Lean 闭包
- 任意递归
- Lean 堆对象
- 原始 IO
- 动态反射
- 未表示为能力的目标系统调用
Sui
Sui 使用以对象为中心的模型。持久化状态映射到带有UID 的对象。
生成的对象示例:
首个包布局:
Counter对象。init(ctx: &mut TxContext)。increment(counter: &mut Counter)。value(counter: &Counter): u64。- Move 单元测试。
Aptos
Aptos 更接近于账户作用域的资源。 示例生成的资源:
首个包布局:
init(account: &signer).increment(account: &signer) acquires Counter.value(addr: address): u64 acquires Counter.- Move 单元测试。
acquires 子句。
代码生成必须理解资源访问,而不是在事后修补字符串。
Move 的可移植 IR 需求
IR 必须编码:- 哪些结构体是持久化资源或对象
- 所有权模式
- 入口可变性
- 中止代码
- 访问路径
- 事件定义
- ability 需求
- 目标特定的包地址/模块名称
Sui 对比 Aptos 优先
Aptos 对于首个生成的包来说可能更容易,因为其账户资源更接近传统的存储单元。从战略角度看,Sui 对于测试抽象更为重要,因为其对象模型与 EVM 的差异更大。 建议的顺序:- Aptos Counter 资源 POC。
- Sui Counter 对象 POC。
- 比较 IR 差异。
- 将更简洁的路径提升为首个 Experimental Move 目标。
开放性问题
- Move 包生成应该使用 Lean、Zig 还是小型独立生成器来实现?
- 生成的 Move 应该暴露 public view 函数、entry 函数,还是两者兼有?
- 通用资产在 Sui 和 Aptos 上应如何映射到
Coin<T>? - Move 的 ability 系统中有多少内容应该在可移植 IR 中建模?
- 源代码生成是否应该保留回溯到 Lean 定义的注释?