# 远地虚拟机概览

> 一页看清全部事实：远地虚拟机证明什么、如何证明、成本多少、依赖哪些假设，以及 1.0.0 版止步于何处。

## 一段话概述

远地虚拟机是一台 RISC-V zkVM。它证明：一个由其映像摘要所指明的 RV32IMAC 程序，在给定的公开输入上运行到某个退出状态，并写出了给定的公开输出。它把这份证明经由递归树带到一份 Groth16 证明，交由以太坊合约检验。每个电路都是 BN254 标量域上的分层 GKR 电路，每个已承诺列都用 Mercury 打开，每个挑战都来自 Poseidon2 transcript。域、曲线、配对、MSM、哈希、多项式承诺、GKR 证明者和 Groth16 全部在仓库内实现。它的参考工作负载是以太坊区块校验。

## 基本事实

| | 远地虚拟机 v1.0.0 |
| --- | --- |
| 证明陈述的内容 | 具有此身份的程序，在其映像上从入口点启动，以此公开输入和某份证明者提示（advice）逐条指令执行，直至以此状态调用 `EXIT`，并已写出此公开输出（journal） |
| 指令集 | 单 hart 的 RV32IMAC：RV32IMA 的 59 条指令（40 条基础指令、8 条 M 扩展指令、11 条 A 扩展指令），压缩指令在加载时展开 |
| 客户程序（guest）语言 | Rust，`#![no_std]` 加 `alloc`，stable 1.96.1，目标 `riscv32imac-unknown-none-elf` |
| 算术化 | 23 个电路族，每个都是分层 GKR 电路：7 个用于指令，5 个用于内存窗口，6 个委托，5 个用于递归 |
| 论证 | 门由求和校验（sumcheck）证明；内存由覆盖整个执行过程的单一读/写多重集证明；查找（lookup）由 LogUp 证明 |
| 域 | BN254 的标量域，254 位 |
| 承诺 | Mercury，基于 KZG 的多线性承诺；无论列数多少，每个分片只需一个 704 字节的打开证明 |
| 可信设置 | PSE 的 perpetual powers of tau，第 80 次贡献；链上判定器另有一个专属于其电路的第二次仪式 |
| Transcript | `Fr` 上的 Poseidon2 双工海绵，宽度 3，速率 2 |
| 结算 | 递归树 → Groth16 判定器 → `ApogeeVerifier.sol` |
| 安全级别 | 约 100 位，由 BN254 决定 |
| 零知识 | 否。证明是简洁的，但不是零知识的，也没有任何盲化 |
| 委托运算 | keccak-f[1600] 轮函数、SHA-256 轮函数、Poseidon2、BN254 `Fr` 运算、针对四个以太坊模数的 256 位模乘、secp256k1 与 BN254 G1 上的完全点加 |
| 公开值 | 输入最多 16,380 字节，公开输出最多 16,380 字节；证明者提示最多 2 GiB |
| 执行长度 | 最多 `2^36 − 1` 个周期 |
| 代码大小 | 表高度为 `2^22` 时 `.text` 不超过 7.94 MiB；默认情况下映像不超过 4 MiB |
| 第三方密码学 | 证明路径上没有。arkworks、Plonky3 和 zkhash 只作为测试参照（oracle）出现 |

## 实测数据

所有数据均来自 `glamsterdam-devnet-8` 的第 257,510 号区块，由无状态校验器客户程序执行：60 笔交易，101.5 Mgas，198M 个周期。来源：规范的 [recursion §10](https://apogee.gweb3networks.com/docs/auditors/spec/recursion#s10) 与 [streaming §1](https://apogee.gweb3networks.com/docs/auditors/spec/streaming#s1)。

| 阶段 | 结果 |
| --- | --- |
| 基础证明 | 207 个分片，14.5 MB，在 32 vCPU、247.7 GiB 内存的机器上耗时 2,481 s，峰值 RSS 173.92 GiB |
| 递归树 | 116 个分片：四个叶节点，每个至多涵盖 64 个基础分片（合计 2,157 s，峰值 92 GiB），以及一个根节点（460 s，1.03 MB） |
| 判定器电路 | 7,896,686 个约束，定义域大小为 `2^23` |
| 判定器证明 | 在一台 18 核笔记本电脑上耗时 18.5 s、占用 6.1 GB，读取密钥用时 1 s |
| 链上验证 | 3,620,026 gas，34,980 字节 calldata，合约折叠 358 个点 |
| 一致性 | 全部 67,251 个 `tests-zkevm` v21.0.1 测试对在原生运行下一致 |

## 验证者必须持有的值

两个值，都要取自证明者无法控制的渠道：

- **程序身份**，一个域元素。如果对照的是证明者提供的身份，证明只能说明有某个程序运行过。
- **仪式的 SRS 摘要。** 基于已知 `τ` 构造的密钥，只有通过这项比对才会被拒绝。

验证密钥本身可以来自任何人：加载时会根据其自身内容重新计算这两个值，并要求其中的电路与验证者的注册表一致。[安全模型](https://apogee.gweb3networks.com/docs/architecture/security)列出了全部假设。

## v1.0.0 止步之处

- **不是零知识的。** Mercury、GKR 和判定器中都没有盲化。
- **证明者提示不受绑定。** 客户程序要将它与证明所绑定的某样东西进行核对。
- **陷入（trap）不可证明。** 未对齐的访问、对映射内存之外的访问、`ebreak`，或者 pc 处没有指令，都会使运行终止，且不产生证明。
- **`sc.w` 总是成功。** 这是与 RV32IMAC 唯一的偏差：没有保留（reservation）状态。
- **委托固定为六种。** 任意模数的 EVM `MULMOD`、`MODEXP` 与 BLS12-381 都以普通指令运行。
- **证明受内存限制。** 实测区块的内存峰值为 174 GiB；内存占用取决于同时处理中的分片，而不是运行长度。
- **判定器密钥随根的形状而定**，其可信程度取决于它的仪式。开发用密钥是可伪造的。

## 谁在构建

远地虚拟机是 G Web3 面向区块链原生应用环境的研究计划的旗舰项目：每个经济应用一个经过优化的环境，各自以有效性证明结算到以太坊。该计划的立场见[核心理念](https://www.gweb3networks.com/thesis.html)；下一个版本的方向见[量子跃迁](https://apogee.gweb3networks.com/docs/quantum-leap)。
