本文提出了一个RISC-V目标三元组标准,用于在以太坊上使用的zkEVM。该标准旨在统一不同zkEVM的基准测试、形式化验证工作,并降低审计电路的复杂性。它详细定义了最小的RISC-V指令集架构(ISA)及其扩展,例如Zicclsm,以确保与物理硬件的行为一致性并增强鲁棒性。
本提案旨在为以太坊上使用的 zkEVM 标准化 RISC-V 目标三元组。我们希望定义最小目标。
建议目标:
riscv64im_zicclsm-unknown-none-elf
目前,不同的 zkEVM 针对不同的 RISC-V 三元组,标准化有助于在不同的 zkVM 之间规范基准测试(针对所证明的电路),集中形式化验证工作,并降低审计电路的长期复杂性。
| 类别 | 建议设置 |
|---|---|
| ISA 基准 | RV64I |
| 扩展 | M, Zicclsm |
压缩 (C) |
排除 |
浮点 (F, D) |
排除 (软浮点) |
| 特权模式 | 仅机器 (M) |
| 系统调用 / 环境 | 无 |
| ABI | LP64 (软浮点) |
| 对象格式 | ELF,静态链接 |
| 字节序 | 小端序 |
| 内存模型 | 平坦,无 MMU,无分页 |
由于执行层的状态转换函数 (STF) 不包含任何浮点算术,因此证明 STF 的最小 ISA 要求是 RV32I。实际上,它是 RV32IM,否则乘法和除法将非常昂贵。
我们使用 64 位,因为 STF 中使用的许多算法可以利用 64 位字长。例如,U256 整数算术和 keccak256。
需要使用 Zicclsm 扩展。它强制要求必须支持对主内存区域的未对齐加载和存储。虽然针对 RISC-V 的正常运行编译器通常会生成对齐的内存访问,但编译器错误可能会无意中产生未对齐的内存操作。在各种编译器工具链中都观察到过此类错误。如果没有 Zicclsm 支持,在硬件 RISC-V 实现上正确编译和执行的程序将在 zkVM 环境中陷入陷阱或行为不正确。在以太坊的背景下,这会产生一个关键风险:由于编译器错误导致未对齐访问的交易区块将变得无法证明,这可能停止区块生产并损害网络活性。
通过要求使用 Zicclsm,zkVM 与物理 RISC-V 硬件和标准模拟器的行为保持一致,所有这些都透明地处理未对齐访问。这降低了细微兼容性问题的风险,并确保 zkVM 仍然是更广泛的 RISC-V 软件生态系统的一个可靠执行环境。
zkVM 必须提供证明生成期间发生的未对齐内存访问次数的可见性。这使开发人员能够随着时间的推移监控未对齐访问模式,并调查触发它们的特定代码块。至少,zkVM 应该通过命令行输出或日志文件公开每个证明的未对齐访问计数,尽管鼓励更精细的指标。这种可观察性有助于识别潜在的优化机会,并验证未对齐访问仍然像预期一样罕见,同时确保在出现边缘情况时安全措施正常工作。
由于 zkVM 预编译是通过 C 接口定义的,因此无需指定 zkVM 预编译的调用实现细节。
- 原文链接: github.com/eth-act/zkvm-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!