diff --git a/prover/examples/README.md b/prover/examples/README.md index be0177cb..e21906f9 100644 --- a/prover/examples/README.md +++ b/prover/examples/README.md @@ -67,11 +67,14 @@ cd prover/examples/sha2 cargo build --target=mips-unknown-linux-musl ``` -* Run the host program +* Run the host program + +// echo -n 'world!' | sha256sum +// 711e9609339e92b03ddc0a211827dba421f38f9ed8b9d806e1ffdd8c15ffa03d ``` cd ../.. -RUST_LOG=info ELF_PATH=examples/sha2/target/mips-unknown-linux-musl/debug/sha2-bench SEG_OUTPUT=/tmp/output cargo run --release --example zkmips bench +ARGS="711e9609339e92b03ddc0a211827dba421f38f9ed8b9d806e1ffdd8c15ffa03d world!" RUST_LOG=info ELF_PATH=examples/sha2/target/mips-unknown-linux-musl/debug/sha2-bench SEG_OUTPUT=/tmp/output cargo run --release --example zkmips bench Or diff --git a/prover/examples/sha2/src/main.rs b/prover/examples/sha2/src/main.rs index 68e64b39..5e1fadbe 100644 --- a/prover/examples/sha2/src/main.rs +++ b/prover/examples/sha2/src/main.rs @@ -8,11 +8,15 @@ use alloc::vec::Vec; zkm_runtime::entrypoint!(main); pub fn main() { + let public_input: [u8; 32] = zkm_runtime::io::read(); let input: Vec = zkm_runtime::io::read(); let mut hasher = Sha256::new(); hasher.update(input); let result = hasher.finalize(); - zkm_runtime::io::commit::<[u8; 32]>(&result.into()); + let output: [u8; 32] = result.into(); + assert_eq!(output, public_input); + + zkm_runtime::io::commit::<[u8; 32]>(&output); } diff --git a/prover/examples/zkmips.rs b/prover/examples/zkmips.rs index 05ef467c..c0d3f37d 100644 --- a/prover/examples/zkmips.rs +++ b/prover/examples/zkmips.rs @@ -52,13 +52,25 @@ fn prove_sha2_bench() { let mut state = load_elf_with_patch(&elf_path, vec![]); // load input - let input = [5u8; 32]; - state.add_input_stream(&input.to_vec()); + let args = env::var("ARGS").unwrap_or("data-to-hash".to_string()); + // assume the first arg is the hash output(which is a public input), and the second is the input. + let args: Vec<&str> = args.split_whitespace().collect(); + assert_eq!(args.len(), 2); + + let public_input: Vec = hex::decode(args[0]).unwrap(); + state.add_input_stream(&public_input); + log::info!("expected public value in hex: {:X?}", args[0]); + log::info!("expected public value: {:X?}", public_input); + + let private_input = args[1].as_bytes(); + log::info!("private input value: {:X?}", private_input); + state.add_input_stream(&private_input); let (total_steps, mut state) = split_prog_into_segs(state, &seg_path, "", 0); let value = state.read_public_values::<[u8; 32]>(); log::info!("public value: {:X?}", value); + log::info!("public value: {} in hex", hex::encode(value)); let seg_file = format!("{seg_path}/{}", 0); let seg_reader = BufReader::new(File::open(seg_file).unwrap());