# 以太坊区块

> 远地虚拟机的参考工作负载。在虚拟机内运行以太坊区块的 revm 客户程序、与 zkEVM 测试发布版本的每个用例都一致的无状态校验器，以及一个区块的证明说明了什么。

远地虚拟机证明任意的 RV32IMAC 程序。它的参考工作负载，也就是测量和调优所依据的那个，是常见工作负载中最难的一个：在虚拟机内用 revm（Rust 实现的 EVM）校验以太坊区块。同一个库 `revm_block` 既为客户程序（guest）编译，也为宿主机（host）编译，两个二进制程序证明两个不同的陈述。

## 两个二进制程序，两个陈述

| 二进制程序 | 证明者提示（advice） | 公开输出（journal） | 含义 |
| --- | --- | --- | --- |
| `revm-block` | 一个 `BlockWitness`：交易所读取的前置状态 | 每笔交易的状态、gas 和返回数据；一个日志承诺；一份后置状态摘要 | 存在某个规范的见证，使 `revm_block::run` 产生这份公开输出：这是对一次执行的证明，而不是对区块有效性的证明 |
| `revm-block-stateless` | zkEVM 基准格式的无状态输入 | 43 字节：载荷的根、判定结果、链 ID、schema ID | 具有此根的载荷，在这条链上、在这个分叉下，是或不是一个有效区块 |

真正证明区块的是**无状态校验器**。它实现了以太坊执行规范中的 `verify_stateless_new_payload`：解码请求，对照父区块检查祖先区块头和区块头规则，恢复每笔交易的发送者，在一个通过哈希约束到父区块状态根的前置状态上执行每笔交易，处理提款和请求，并重新计算收据根、bloom、gas、请求哈希、区块访问列表和后置状态根。见证本身不需要额外的绑定：公布的根固定了载荷，见证通过哈希受这个根约束，所以错误的见证无法让无效的载荷变得有效。判定结果为 `false`，只说明这份输入没有通过校验。

## 分叉与一致性

校验器根据输入的 schema ID 确定分叉，没有编译进任何激活时间表：Osaka、BPO1、BPO2 和 Amsterdam。`tests-zkevm` v21.0.1 发布版本的全部 **67,251** 个测试对在原生运行下一致；CI 用一个已提交的、包含 34 个用例的子集约束这个库，该子集在两种输入布局下覆盖了该发布版本涉及的每条规则。

## 实践中的委托

两个二进制程序都声明了 `KECCAK_F`、`SHA256_COMP`、`MOD_MUL` 和 `EC_ADD`。Keccak 经由 `alloy-primitives` 的 native-keccak 钩子用到其电路。SHA-256、secp256k1 和 BN254 经由打过补丁的 `revm-precompile`、`k256` 和 `ark-ff` 副本用到各自的电路，每个副本都以上游代码作为回退路径。每个发送者都在客户程序中按 EIP-2 的规则恢复，所用的 `k256` 算术被补丁路由到 `MOD_MUL` 和 `EC_ADD`。

这两个二进制程序以 `--release` 构建，证明时每个高度可选的电路族都使用 `2^20`：无状态二进制程序的 `.text` 约为 1.96 MB，占 `2^20` 表覆盖范围的 96.6%。

## 实测区块

`glamsterdam-devnet-8` 的第 257,510 号区块，经由 `revm-block-stateless`：60 笔交易，101.5 Mgas，1.98 亿个周期，切分为 207 个分片。基础证明在一台 32 vCPU、247.7 GiB 内存的机器上耗时 2,481 s，内存峰值 174 GiB；递归另外花费约 2,620 s；合约以 3,620,026 gas 接受了结果。[性能](https://apogee.gweb3networks.com/docs/architecture/performance)逐一拆解了每个阶段。

## 区块证明不做什么

- **校验器的输入来自外部的见证生成方。** `eth_getProof` 返回每个键路径上的 trie 节点，但使某个分支折叠的删除操作，需要一个不在任何已改变键的路径上的兄弟节点。因此仓库中的记录器无法生成无状态输入；这些输入来自 `tests-zkevm` 发布版本或 zkEVM 基准测试的数据集。
- **mini-block 二进制程序证明的是在一个已记录的前置状态上的一次执行**，通常是某个区块的前几笔交易，不对状态根作任何断言。它的公开输出每笔交易增加一条记录，最终会超出公开窗口，这就是完整区块要走无状态校验器的原因。

规范见[以太坊区块](https://apogee.gweb3networks.com/docs/auditors/spec/ethereum)。
