riscv32im-risc0-zkvm-elf

层级:3

实现 RV32IM 指令集的 RISC Zero 零知识虚拟机 (zkVM)。

目标维护者

背景

此目标是一个执行环境,用于生成 RISC-V ELF 二进制文件的执行证明以及开发人员希望公开显示的任何输出。为了实现这一点,目标将执行 ELF 以生成包含计算输出和加密密封的收据。可以验证此收据以确保计算及其结果的完整性。此目标是作为软件实现的;它没有硬件实现。

我们有一个名为 cargo-risczero 的货物扩展,允许用户生成项目模板、安装工具以改善用户体验、使用 Docker 环境构建二进制文件以及测试程序。

要求

目标仅支持交叉编译,不支持主机工具。目标支持具有默认分配器的 alloc,并对 std 提供实验性支持。目标期望二进制文件为 ELF 格式。

目标的执行环境是单线程的、非抢占式的,不支持任何特权指令,也不支持未对齐访问。在撰写本文时,VM 拥有 192 MB 的内存,文本/数据、堆和栈需要位于地址范围 0x400 - 0x0C000000 内。二进制文件本身不需要操作系统,可以认为是在裸机上运行。目标不使用 #[target_feature(...)]-C target-feature= 值。

在目标上调用 extern "C" 使用 RISC-V 规范 中概述的 C 调用约定。

为 zkVM 构建

可以通过将 zkVM 添加到 config.toml 中的 target 列表来构建 zkVM 的程序。但是,我们建议在使用 cargo-risczero 实用程序和 risc0-build 箱生成的入门模板中构建程序。此箱使用 -C "link-arg=-Ttext= 调用 rustc,以便它将文本映射到适当的位置,以及生成表示 ELF 和与 ELF 关联的唯一 ID 的变量。入门模板为开发人员提供了对零知识计算有用的系统调用,例如写入公共输出、使用 sha256 进行哈希以及乘以大整数。

构建 Rust 程序

Rust 尚未为此目标提供预编译的工件。要为此目标编译,您需要启用目标构建 Rust(请参阅上面的“构建目标”)。我们不建议使用 build-std,因为我们过去在入门模板上构建核心时遇到了问题。另一种解决方案是通过运行 cargo risczero install 下载 risc0 工具链。

测试

注意:目标是作为名为 zkVM 的软件模拟器实现的,并且没有目标的硬件实现。

测试目标程序最实用的方法是使用我们的入门模板,该模板可以使用 cargo risczero new 命令生成。模板生成一个示例“主机”和“访客”代码。访客代码编译到目标(即 RV32IM),而“主机”代码编译为在运行 Linux 发行版或 macOS 的程序员的机器上运行。主机程序负责在 zkVM 上运行访客二进制文件并检索其公共输出。

目标目前不支持运行 Rust 测试套件。

交叉编译工具链和 C 代码

可以在任何具有 RV32IM 目标的编译器上为此目标构建兼容的 C 代码。在 clang 和 ld.lld 链接器上,可以使用 -march=rv32im-mabi=ilp32 以及 llvm 特性标志 features=+m 和 llvm 目标 riscv32-unknown-none 生成。