From de7edef3829a082cac27585057ed377e762e34b1 Mon Sep 17 00:00:00 2001 From: Manish Kumar Date: Tue, 5 Mar 2024 14:18:30 +0530 Subject: [PATCH] sha256 and keccak benchmark --- hash/sp1/bench/.gitignore | 16 +++++++ hash/sp1/bench/keccak/Cargo.toml | 9 ++++ .../keccak/elf/riscv32im-succinct-zkvm-elf | Bin 0 -> 119608 bytes hash/sp1/bench/keccak/src/main.rs | 20 ++++++++ hash/sp1/bench/script/Cargo.toml | 10 ++++ hash/sp1/bench/script/rust-toolchain | 3 ++ hash/sp1/bench/script/src/benches/keccak.rs | 42 +++++++++++++++++ hash/sp1/bench/script/src/benches/sha256.rs | 43 ++++++++++++++++++ hash/sp1/bench/script/src/main.rs | 37 +++++++++++++++ hash/sp1/bench/sha256/Cargo.toml | 10 ++++ .../sha256/elf/riscv32im-succinct-zkvm-elf | Bin 0 -> 113704 bytes hash/sp1/bench/sha256/src/main.rs | 22 +++++++++ 12 files changed, 212 insertions(+) create mode 100644 hash/sp1/bench/.gitignore create mode 100644 hash/sp1/bench/keccak/Cargo.toml create mode 100755 hash/sp1/bench/keccak/elf/riscv32im-succinct-zkvm-elf create mode 100644 hash/sp1/bench/keccak/src/main.rs create mode 100644 hash/sp1/bench/script/Cargo.toml create mode 100644 hash/sp1/bench/script/rust-toolchain create mode 100644 hash/sp1/bench/script/src/benches/keccak.rs create mode 100644 hash/sp1/bench/script/src/benches/sha256.rs create mode 100644 hash/sp1/bench/script/src/main.rs create mode 100644 hash/sp1/bench/sha256/Cargo.toml create mode 100755 hash/sp1/bench/sha256/elf/riscv32im-succinct-zkvm-elf create mode 100644 hash/sp1/bench/sha256/src/main.rs diff --git a/hash/sp1/bench/.gitignore b/hash/sp1/bench/.gitignore new file mode 100644 index 0000000..0be6e72 --- /dev/null +++ b/hash/sp1/bench/.gitignore @@ -0,0 +1,16 @@ +# Cargo build +**/target + +# Cargo config +.cargo + +# Profile-guided optimization +/tmp +pgo-data.profdata + +# MacOS nuisances +.DS_Store + +# Proofs +**/proof-with-pis.json +**/proof-with-io.json diff --git a/hash/sp1/bench/keccak/Cargo.toml b/hash/sp1/bench/keccak/Cargo.toml new file mode 100644 index 0000000..2d61e41 --- /dev/null +++ b/hash/sp1/bench/keccak/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +[package] +version = "0.1.0" +name = "keccak-program" +edition = "2021" + +[dependencies] +sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" } +sha3 = "0.10.8" \ No newline at end of file diff --git a/hash/sp1/bench/keccak/elf/riscv32im-succinct-zkvm-elf b/hash/sp1/bench/keccak/elf/riscv32im-succinct-zkvm-elf new file mode 100755 index 0000000000000000000000000000000000000000..9c17edc2b012c2734645477791bd145393a73a9c GIT binary patch literal 119608 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 literal 0 HcmV?d00001 diff --git a/hash/sp1/bench/keccak/src/main.rs b/hash/sp1/bench/keccak/src/main.rs new file mode 100644 index 0000000..b7fd57e --- /dev/null +++ b/hash/sp1/bench/keccak/src/main.rs @@ -0,0 +1,20 @@ + +#![no_main] +sp1_zkvm::entrypoint!(main); +use sha3::{Digest, Keccak256}; + +pub fn main() { + + let input = sp1_zkvm::io::read::>(); + + // create a keccak object + let mut hasher = Keccak256::new(); + + // write input message + hasher.update(input); + + // read hash digest + let result: [u8;32] = hasher.finalize().into(); + + sp1_zkvm::io::write(&result); +} diff --git a/hash/sp1/bench/script/Cargo.toml b/hash/sp1/bench/script/Cargo.toml new file mode 100644 index 0000000..0b5f047 --- /dev/null +++ b/hash/sp1/bench/script/Cargo.toml @@ -0,0 +1,10 @@ +[workspace] +[package] +version = "0.1.0" +name = "bench-script" +edition = "2021" + +[dependencies] +sp1-core = { git = "https://github.com/succinctlabs/sp1.git" } +rand = "0.8" +hex = "0.4" \ No newline at end of file diff --git a/hash/sp1/bench/script/rust-toolchain b/hash/sp1/bench/script/rust-toolchain new file mode 100644 index 0000000..f7ee87e --- /dev/null +++ b/hash/sp1/bench/script/rust-toolchain @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly-2024-01-25" +components = ["llvm-tools", "rustc-dev"] \ No newline at end of file diff --git a/hash/sp1/bench/script/src/benches/keccak.rs b/hash/sp1/bench/script/src/benches/keccak.rs new file mode 100644 index 0000000..2ede7ca --- /dev/null +++ b/hash/sp1/bench/script/src/benches/keccak.rs @@ -0,0 +1,42 @@ + +use sp1_core::{SP1Prover, SP1Stdin, SP1Verifier}; +use rand::Rng; +use hex::encode; + +const KECCAK_ELF: &[u8] = include_bytes!("../../../keccak/elf/riscv32im-succinct-zkvm-elf"); + +pub fn generate_random_bytes(length: usize) -> Vec { + let mut rng = rand::thread_rng(); + (0..length).map(|_| rng.gen::()).collect() +} + + +pub fn keccak_benchmark(size: usize) { + // Generate proof. + let mut stdin = SP1Stdin::new(); + let data = generate_random_bytes(size); + + stdin.write(&data); + + let t0 = std::time::Instant::now(); + let mut proof = SP1Prover::prove(KECCAK_ELF, stdin).expect("proving failed"); + let t1 = t0.elapsed(); + // Read output. + let hash_bytes = proof.stdout.read::<[u8;32]>(); + let hash = encode(hash_bytes); + println!("hash: {}", hash); + + // Verify proof. + let t2 = std::time::Instant::now(); + SP1Verifier::verify(KECCAK_ELF, &proof).expect("verification failed"); + let t3 = t2.elapsed(); + + // Save proof. + proof + .save("proof-with-io.json") + .expect("saving proof failed"); + + println!("succesfully generated and verified proof for the program!"); + println!("Proof Generation Time: {:?}", t1); + println!("Proof verification Time: {:?}", t3); +} diff --git a/hash/sp1/bench/script/src/benches/sha256.rs b/hash/sp1/bench/script/src/benches/sha256.rs new file mode 100644 index 0000000..eff61f3 --- /dev/null +++ b/hash/sp1/bench/script/src/benches/sha256.rs @@ -0,0 +1,43 @@ + +use sp1_core::{SP1Prover, SP1Stdin, SP1Verifier}; +use rand::Rng; +use hex::encode; + +const SHA256_ELF: &[u8] = include_bytes!("../../../sha256/elf/riscv32im-succinct-zkvm-elf"); + +pub fn generate_random_bytes(length: usize) -> Vec { + let mut rng = rand::thread_rng(); + (0..length).map(|_| rng.gen::()).collect() +} + + +pub fn sha256_benchmark(size: usize) { + + // Generate proof. + let mut stdin = SP1Stdin::new(); + let data = generate_random_bytes(size); + + stdin.write(&data); + + let t0 = std::time::Instant::now(); + let mut proof = SP1Prover::prove(SHA256_ELF, stdin).expect("proving failed"); + let t1 = t0.elapsed(); + // Read output. + let hash_bytes = proof.stdout.read::<[u8;32]>(); + let hash = encode(hash_bytes); + println!("hash: {}", hash); + + // Verify proof. + let t2 = std::time::Instant::now(); + SP1Verifier::verify(SHA256_ELF, &proof).expect("verification failed"); + let t3 = t2.elapsed(); + + // Save proof. + proof + .save("proof-with-io.json") + .expect("saving proof failed"); + + println!("succesfully generated and verified proof for the program!"); + println!("Proof Generation Time: {:?}", t1); + println!("Proof verification Time: {:?}", t3); +} diff --git a/hash/sp1/bench/script/src/main.rs b/hash/sp1/bench/script/src/main.rs new file mode 100644 index 0000000..267dc58 --- /dev/null +++ b/hash/sp1/bench/script/src/main.rs @@ -0,0 +1,37 @@ +pub mod benches{ + pub mod keccak; + pub mod sha256; +} +use crate::benches::keccak::keccak_benchmark; +use crate::benches::sha256::sha256_benchmark; +use std::process; + +fn main() { + let args: Vec = std::env::args().collect(); + + if args.len() != 3 { + println!("Wrong number of arguments! The program expects two arguments: and "); + // Exit the program with a non-zero exit code + process::exit(1); + } + + let bench_type = &args[1]; + let size = args[2].parse::().unwrap(); + + match bench_type.as_str() { + + "sha256" => { + println!("Running sha256: "); + let _ = sha256_benchmark(size); + } + + "keccak" => { + println!("Running keccak benchmark: "); + let _ = keccak_benchmark(size); + } + + _ => { + println!("Wrong Benchmark Name!"); + } + } +} diff --git a/hash/sp1/bench/sha256/Cargo.toml b/hash/sp1/bench/sha256/Cargo.toml new file mode 100644 index 0000000..9973ccb --- /dev/null +++ b/hash/sp1/bench/sha256/Cargo.toml @@ -0,0 +1,10 @@ +[workspace] +[package] +version = "0.1.0" +name = "sha256-program" +edition = "2021" + +[dependencies] +sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" } +sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", package = "sha2", branch = "patch-v0.10.8" } + diff --git a/hash/sp1/bench/sha256/elf/riscv32im-succinct-zkvm-elf b/hash/sp1/bench/sha256/elf/riscv32im-succinct-zkvm-elf new file mode 100755 index 0000000000000000000000000000000000000000..d5f80e9ab85b37b6d884dabd77169d6b5d96de86 GIT binary patch literal 113704 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 + + // create a Sha256 object + let mut hasher = Sha256::new(); + + // write input message + hasher.update(input); + + // read hash digest + let result: [u8;32] = hasher.finalize().into(); + + sp1_zkvm::io::write(&result); +}