riscv32im-risc0-zkvm-elf

等级:3

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

目标维护者

背景

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

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

要求

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

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

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

为 zkVM 构建

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

构建 Rust 程序

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

测试

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

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

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

交叉编译工具链和 C 代码

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