SDK 快速入门
1. 安装 Nexus zkVM
首先,安装 Rust:Rust 安装说明(在新选项卡中打开).
此外,请确保您有CMAKE(在新选项卡中打开).
接下来,安装 RISC-V 目标:
rustup target add riscv32i-unknown-none-elf
然后,安装 Nexus zkVM:
cargo install --git https://github.com/nexus-xyz/nexus-zkvm cargo-nexus --tag 'v0.2.4'
验证安装:
cargo nexus --help
这应该会打印可用的 CLI 命令。
2. 创建新的 Nexus 主机项目
要以编程方式使用 zkVM,我们需要两个程序:一个运行在 zkVM 上的来宾程序,以及一个运行 zkVM 本身的主机程序。
在 nexus-zkvm 签出的某个地方,运行:
cargo nexus host nexus-host
这将创建一个具有以下结构的新 Rust 项目目录:
./nexus-host├── Cargo.lock├── Cargo.toml└── src └── main.rs └── guest └── Cargo.toml └── rust-toolchain.toml └── src └── main.rs
这里,是我们的主持人节目,而 是我们的嘉宾节目。./src/main.rs
./src/guest/src/main.rs
例如,您可以将 的内容更改为:./src/guest/src/main.rs
#![cfg_attr(target_arch = "riscv32", no_std, no_main)] use nexus_rt::{println, read_private_input, write_output}; #[nexus_rt::main]fn main() { let input = read_private_input::<(u32, u32)>(); let mut z: i32 = -1; if let Ok((x, y)) = input { println!("Read private input: ({}, {})", x, y); z = (x * y) as i32; } else { println!("No private input provided..."); } write_output::<i32>(&z)}
此来宾程序尝试从输入磁带中读取两个整数,记录它们是否存在,如果存在,则返回其产品。
然后,将 的内容更改为:./src/main.rs
use nexus_sdk::{ compile::CompileOpts, nova::seq::{Generate, Nova, PP}, Local, Prover, Verifiable,}; type Input = (u32, u32);type Output = i32; const PACKAGE: &str = "guest"; fn main() { println!("Setting up Nova public parameters..."); let pp: PP = PP::generate().expect("failed to generate parameters"); let mut opts = CompileOpts::new(PACKAGE); opts.set_memlimit(8); // use an 8mb memory println!("Compiling guest program..."); let prover: Nova<Local> = Nova::compile(&opts).expect("failed to compile guest program"); let input: Input = (3, 5); print!("Proving execution of vm..."); let proof = prover .prove_with_input::<Input>(&pp, &input) .expect("failed to prove program"); println!( " output is {}!", proof .output::<Output>() .expect("failed to deserialize output") ); println!(">>>>> Logging\n{}<<<<<", proof.logs().join("\n")); print!("Verifying execution..."); proof.verify(&pp).expect("failed to verify proof"); println!(" Succeeded!");}
此主机程序使用自定义内存限制编译来宾程序,然后调用生成的二进制文件作为 input。(3, 5)
然后,zkVM 将运行 guest 程序并生成其正确执行的证明。
证明完成后,主机程序从输出磁带上读取输出并将其与任何日志一起打印出来,然后验证证明。
3. 运行您的程序
cargo run -r
请注意,我们使用 ,而不是 。我们的主机程序只是一个普通的 Rust 程序,而用于从命令行执行客户程序。cargo run
cargo nexus run
cargo nexus run
您应该会看到主机程序打印:
Setting up Nova public parameters...Proving execution of vm... output is 15!>>>>> LoggingRead private input: (3, 5)<<<<<Verifying execution... Succeeded!
如果要从命令行执行 guest 程序,可以导航到并使用命令来执行此操作。./src/guest
cargo nexus
4. 其他主机程序选项
有几种方法可以配置 guest 程序的运行和验证方式。也许最重要的是,SDK 支持两个替代证明器:HyperNova 和 Jolt。
要使用 HyperNova,只需使用上面的示例,在程序中替换 。nova
hypernova
Jolt 支持是实验性的,特别是目前不允许在 guest 程序中输入、输出、日志记录或断言。您可以使用像
#![no_std]#![no_main] fn fib(n: u32) -> u32 { match n { 0 => 0, 1 => 1, _ => fib(n - 1) + fib(n - 2), }} #[nexus_rt::main]fn main() { let n = 10; let result = fib(n); core::hint::black_box(result);}
以及一个主机程序(如
use nexus_sdk::{compile::CompileOpts, jolt::Jolt, Local}; const PACKAGE: &str = "guest"; fn main() { let opts = CompileOpts::new(PACKAGE); // defaults to local proving let prover: Jolt<Local> = Jolt::compile(&opts).expect("failed to load program"); println!("Proving execution of vm..."); let proof = prover.prove().expect("failed to prove program"); print!("Verifying execution..."); proof.verify().expect("failed to verify proof"); println!(" Succeeded!");}
要查看使用 SDK 的更多示例,请查看examples 文件夹(在新选项卡中打开).