摘要
RFC 0001 定义了产品方向。本 RFC 定义了实现该方向的初步工程形态。 ProofForge 不应为每个链使用单一的后端策略。它应该将目标划分为不同的实现家族:- 直接编译器目标:ProofForge 拥有大部分降级逻辑,如当前的 EVM/Yul 后端。
- Wasm 宿主目标:ProofForge 发射 Wasm 模块以及特定于链的宿主 ABI 适配器,如 NEAR 和 CosmWasm。
- 二进制工具链目标:ProofForge 发射中间对象/位码并调用特定于链的打包器/链接器,如 Solana sBPF。
- 源代码生成目标:ProofForge 发射目标源代码包,如 Sui Move 和 Aptos Move。
- ZK 电路源代码生成目标:ProofForge 发射目标源代码包,并将电路制品生成委托给目标原生工具,如 Psy/DPN。
设计目标
- 保持 Lean 作为面向用户的业务逻辑、类型和证明语言。
- 通过能力和目标清单使目标差异保持显式。
- 在替换成熟的目标原生工具之前,先与其集成。
- 使每次构建都生成机器可读的制品元数据。
- 使每个受支持的目标通过至少一个本地冒烟测试和一个能力矩阵条目来获得支持。
建议的仓库形态
当前仓库可以向此布局演进(标记为 planned 的路径尚未在仓库中):Target 和 IR 模块存在。
目标 profile
每个目标都应该由一个TargetProfile 来描述。
从概念上讲:
| 目标 id | 家族 | 制品 | 状态 |
|---|---|---|---|
evm | EVM | 运行时字节码 | 已实现基线 |
wasm-near | Wasm 宿主 | NEAR 兼容 Wasm | 已在 Lean 分叉中进行 Research |
wasm-cosmwasm | Wasm 宿主 | CosmWasm Wasm | 新实现路径 |
solana-sbpf-linker | Solana | Solana sBPF ELF .so | 新的首选 Research 路径 |
solana-zig-fork | Solana | Solana sBPF ELF .so | 备选/参考路径 |
move-sui | Move | Sui Move 包 | Research/源代码生成路径 |
move-aptos | Move | Aptos Move 包 | Research/源代码生成路径 |
psy-dpn | ZK 电路源代码生成 | DPN 电路 JSON + ABI | Experimental/源代码生成路径 |
wasm-polkadot (ink!)。
参见 decisions.md。
能力矩阵
编译器在降级前应使用目标能力矩阵。如果合约使用了目标无法表示的能力,构建应失败并提供精确的诊断信息。| 能力 | EVM | NEAR | CosmWasm | Solana | Sui | Aptos | Psy DPN |
|---|---|---|---|---|---|---|---|
| 持久化标量状态 | 插槽存储 | 宿主 KV | 宿主 KV | 账户数据 | 对象字段 | 账户资源 | Psy 存储/状态 |
| 调用者/发送者 | msg.sender | predecessor/signer | MessageInfo.sender | 签名者账户 | TxContext.sender | signer | Psy 用户/上下文 |
| 接收到的原生价值 | msg.value | 附加存款 | 消息信息中的资金 | lamport 账户 | coin 对象 | coin 资源 | Psy 特有的资产流 |
| 事件/日志 | EVM 日志 | 日志/事件 | 事件/属性 | 日志/事件 | 事件 | 事件 | Research |
| 跨合约调用 | call/staticcall | promises | 子消息 | CPI | 模块调用/交易 | 模块调用 | invoke_sync / invoke_deferred |
| 状态账户/对象选择 | 隐式合约 | 隐式合约 | 隐式合约 | 显式账户 | 显式对象 | 账户资源 | Psy 合约/用户状态 |
| 动态映射存储 | mapping/keccak 插槽 | KV 前缀 | KV 前缀 | 账户拥有的数据或 PDA | 动态字段/表 | 表资源 | 固定容量 Psy 存储 |
| 合约部署包 | 字节码 | Wasm | Wasm | ELF .so | Move 包 | Move 包 | DPN 电路 JSON + 部署 JSON |
制品元数据
每次构建都应在目标输出旁发射proof-forge-artifact.json。
初始 schema:
CLI 形态
当前 CLI 直接支持 EVM 字节码:scripts/<target>/ 下。
EVM 目标
当前流水线:- 保留
ProofForge.Evm作为第一个具体的 target adapter / extension SDK。 - 在统一清单存在之前,保留
.evm-methods作为目标元数据。 - 在现有字节码路径周围添加制品元数据。
- 在重大 IR 重构之前,为简单示例添加黄金 Yul 快照。
NEAR 目标
Lean 分叉已经展示了所需的 Wasm-host 模式:Lean.Near:带有@[extern "lean_near_*"]函数的 Lean SDK。host/near/lean_near.zig:从 Lean 对象到 NEAR 宿主导入的桥接。tools/zigc-near:生成方法导出并链接运行时的包装器。near-strip-wasi-imports.cjs:移除 WASI 导入并检查 MVP Wasm 兼容性。
- 将
lean_near_*extern 声明移出核心 EmitZig 运行时 extern。 - 使宿主桥接选择由目标驱动,而不是“所有 Wasm 都意味着 NEAR”。
- 将方法导出元数据移入通用的目标清单。
- 保留 NEAR 作为 Wasm-host 运行时形态的首个参考。
CosmWasm 目标
CosmWasm 应与 NEAR 共享 Wasm-host 目标家族,但它需要一个单独的目标适配器。Wasm 是制品格式;合约 ABI 则不同。 预期流水线:interface_version_8allocatedeallocateinstantiateexecutequery- 稍后可选:
migrate,reply,sudo,ibc_*
- 带有
instantiate、execute({"increment":{}})和query({"get_count":{}})的 Counter 合约。 - 构建 Wasm。
- 运行
cosmwasm-check。 - 运行一个调用 instantiate/execute/query 的本地 Rust 或基于 CLI 的冒烟测试。
Solana 目标
Solana 应该有两个实现 profile。首选路径:solana-sbpf-linker
zignocchio 项目展示了一个有用的无分叉流程:
Lean.Solana:account、instruction data、signer、PDA、CPI、log、return data。- Zig 中的
lean_solana_*桥接函数。 solana_contract_root.zig:导出单个entrypoint(input) -> u64。- 指令分发元数据,取代 NEAR 风格的方法导出。
- 每个入口的显式 account schema。
index 字段的完整示例见 targets/solana-sbf.md):
- 快速确定性程序测试:尽可能使用 Mollusk。
- 部署式冒烟测试:
solana-test-validator --bpf-program。 - 第一个合约:无 CPI,一个 PDA/账户状态。
- 第二个合约:对 System Program 的 CPI。
- 第三个合约:SPL Token CPI。
回退/参考轨道:solana-zig-fork
solana-sdk-mono 项目展示了另一条路线:
sbpf-linker,它也应该作为一个参考。
Move 目标
Move 目标不应尝试编译完整的 Lean 运行时。第一个实现应该从受限的可移植 IR 生成 Move 源代码包。 共享的 Move 限制:- 仅限一阶函数。
- 无闭包或高阶运行时值。
- 运行时无任意 Lean 堆对象。
- 数据类型必须映射到 Move 结构体/枚举或生成的变体。
- 副作用必须是目标能力,而不是任意 IO。
- 证明保留在 Lean 中,并在 Move 源代码生成之前进行检查。
Sui
Sui 使用以对象为中心的 Move 模型。持久化状态应映射到带有UID 的对象。
流水线:
| 可移植概念 | Sui 映射 |
|---|---|
| 合约状态 | 带有 UID 的对象结构体 |
| 调用者 | tx_context::sender |
| 入口方法 | entry fun |
| 原生价值 | sui::coin::Coin 对象 |
| 事件 | sui::event::emit |
| 动态映射 | sui::table、动态字段或显式子对象 |
- 带有
UID、key、store的 Counter 对象。 - 生成
entry fun和public fun。 - 添加 Move 单元测试。
Aptos
Aptos 使用更接近账户作用域存储的模块/资源模型。 流水线:| 可移植概念 | Aptos 映射 |
|---|---|
| 合约状态 | 账户下的 struct State has key |
| 调用者 | &signer |
| 入口方法 | public entry fun |
| 原生价值 | aptos_coin / 同质化资产 API |
| 事件 | event 模块 API |
| 动态映射 | table 资源 |
- 账户拥有的 counter 资源。
initialize(account: &signer)increment(account: &signer)get(addr: address): u64
实现阶段
与 RFC 0001 和 decisions.md 保持一致:阶段 1:目标注册表、可移植 IR、元数据
- 添加目标 id 和能力集(capability-registry.md)。
- 按照 portable-ir.md 实现可移植 IR。
- 定义 Counter 共享场景。
- 添加制品元数据 schema。
- 保持当前 EVM 命令正常工作。
阶段 2:并行 spike(CosmWasm + Solana)
- Wasm-host 提取和
wasm-cosmwasmCounter spike。 - 带有指令清单的
solana-sbpf-linkerCounter spike。 - 两者都依赖于阶段 1 的完成;可以并行运行。
阶段 3:EVM 强化(进行中)
- 为 EVM 构建发射
proof-forge-artifact.json。 - 核心 EVM 示例的黄金输出测试。
阶段 4:Move 源代码生成(Aptos 优先)
- 受限的 Move 兼容 IR 子集。
- Aptos counter 包;Sui object POC 作为后续。
阶段 5:跨目标场景强化和云准备
- 跨多个目标的共享场景测试。
- 在两个以上 Experimental 目标之后的云平台设计。
开放工程风险
- sBPF 上的 Lean 运行时可能太大或使用了不支持的 section。
- 完整的 Lean 堆/对象模型对于 Solana 的计算预算来说可能过于昂贵。
- CosmWasm 可能需要比 NEAR 的第一条路径更紧凑的 no-WASI 运行时。
- Move 代码生成需要真实的权属/资源模型,而不是字符串模板。
- 过于接近 EVM 的可移植 IR 将在 Solana 和 Move 上失败。
- 过于通用的可移植 IR 将变得无法用于实际合约。
已定决策
决策日志请参见 decisions.md。关键项:- 在非 EVM spike 之前完成阶段 1。
- 阶段 1 之后并行进行 CosmWasm 和 Solana spike。
solana-sbpf-linker作为主要 Solana 路径;solana-zig-fork作为备选。- Aptos 优先的 Move POC;Sui 紧随其后。
Research 参考
- 本仓库中的 EVM 基线:
ProofForge.Compiler.LCNF.EmitYul,ProofForge.Evm,scripts/evm/foundry-smoke.sh。 - 本地 Lean fork (lean4-zig-compiler) 中的 NEAR 参考:
Lean.Near.lean,tools/zigc-near,src/runtime/zig/host/near。 - Solana fork-target 参考:
https://github.com/DaviRain-Su/solana-sdk-mono.git。 - Solana stock-Zig 参考:
https://github.com/vitorpy/zignocchio。 - sbpf-linker:
https://github.com/blueshift-gg/sbpf-linker。 - CosmWasm 文档:
https://cosmwasm.cosmos.network/。 - Sui Move 文档:
https://docs.sui.io/concepts/sui-move-concepts。 - Aptos Move 文档:
https://aptos.dev/network/blockchain/move。