Aleo之家
中文资讯网

SDK 快速入门 安装 Nexus zkVM

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 runcargo nexus runcargo nexus run

您应该会看到主机程序打印:

Setting up Nova public parameters...Proving execution of vm... output is 15!>>>>> LoggingRead private input: (3, 5)<<<<<Verifying execution...  Succeeded!

如果要从命令行执行 guest 程序,可以导航到并使用命令来执行此操作。./src/guestcargo nexus

4. 其他主机程序选项

有几种方法可以配置 guest 程序的运行和验证方式。也许最重要的是,SDK 支持两个替代证明器:HyperNova 和 Jolt。

要使用 HyperNova,只需使用上面的示例,在程序中替换 。novahypernova

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 文件夹(在新选项卡中打开).

赞(0)
未经允许不得转载:Aleo之家 » SDK 快速入门 安装 Nexus zkVM