riscv32im-risc0-zkvm-elf
层级:3
实现 RV32IM 指令集的 RISC Zero 零知识虚拟机 (zkVM)。
目标维护者
- Frank Laub,
[email protected]
,https://github.com/flaub - Jeremy Bruestle,
[email protected]
,https://github.com/jbruestle - Erik Kaneda,
[email protected]
,https://github.com/SchmErik
背景
此目标是一个执行环境,用于生成 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
生成。