This should print the available CLI commands. At present, the cargo nexus CLI is minimal, providing just a cargo nexus host command to setup an SDK based project.
2
Create a new Nexus host project
To use the zkVM programmatically, you need two programs: a guest program that runs on the zkVM, and a host program that operates the zkVM. Create the project with:
Here, ./src/main.rs is the host program, while ./src/guest/src/main.rs is the guest program.
Replace ./src/guest/src/main.rs with this guest program (takes two integers, one public and one private, logs values, returns their product):
src/guest/src/main.rs
#![cfg_attr(target_arch ="riscv32", no_std, no_main)]usenexus_rt::println;#[nexus_rt::main]#[nexus_rt::public_input(x)]fnmain(x:u32,y:u32)->u32{println!("Read public input: {}",x);println!("Read private input: {}",y);x*y}
Then replace ./src/main.rs with this host program (compiles guest, invokes it with public input x = 5 and private input y = 3, reads output and logs, and verifies the proof):
src/main.rs
usenexus_sdk::{compile::{cargo::CargoPackager,Compile,Compiler},stwo::seq::Stwo,ByGuestCompilation,Local,Prover,Verifiable,Viewable,};constPACKAGE:&str="guest";fnmain(){println!("Compiling guest program...");letmutprover_compiler=Compiler::<CargoPackager>::new(PACKAGE);letprover:Stwo<Local>=Stwo::compile(&mutprover_compiler).expect("failed to compile guest program");letelf=prover.elf.clone();// save elf for use with test verificationprint!("Proving execution of vm... ");let(view,proof)=prover.prove_with_input::<u32,u32>(&3,&5).expect("failed to prove program");// x = 5, y = 3assert_eq!(view.exit_code().expect("failed to retrieve exit code"),nexus_sdk::KnownExitCodes::EXIT_SUCCESSasu32);letoutput:u32=view.public_output::<u32>().expect("failed to retrieve public output");assert_eq!(output,15);// z = 15println!("output is {}!",output);println!(">>>>> Logging\n{}<<<<<",view.logs().expect("failed to retrieve debug logs").join(""));print!("Verifying execution...");proof.verify_expected::<u32,u32>(&5,// x = 5nexus_sdk::KnownExitCodes::EXIT_SUCCESSasu32,&15,// z = 15&elf,// expected elf (program binary)&[],// no associated data,).expect("failed to verify proof");println!(" Succeeded!");}
This host program compiles the guest, runs the zkVM with supplied inputs, retrieves output and logs, and verifies the proof of correct execution.
3
Run your program
Run the host program (which executes and proves the guest program) with:
Run host
$cargorun-r
You should see output similar to:
Expected output
Proving execution of vm... output is 15!
>>>>> Logging
Read public input: 5
Read private input: 3
<<<<<
Verifying execution... Succeeded!
For more examples using the SDK with more complicated guest programs, see the walkthroughs for Gale-Shapley stable matching and the lambda calculus:
In addition to the Stwo-based Nexus zkVM 3.0 prover, the SDK supports a legacy mode that uses the Nova, HyperNova, and (experimental) Jolt-based Nexus zkVM 2.0 machine. This machine uses a different runtime and requires additional host-side configuration due to public parameters and reference strings.
To use legacy mode, activate the appropriate feature for the nexus-sdk dependency in the host program: legacy-nova, legacy-hypernova, or legacy-jolt. Examples of using legacy mode to prove legacy guest programs are provided in the examples folder on GitHub: