From d14c0f827e8f7381d0533ffa36700f86e1a4b047 Mon Sep 17 00:00:00 2001 From: Manish Kumar Date: Wed, 13 Dec 2023 19:16:31 +0530 Subject: [PATCH] benchmark for blake2b, blake3, cfg file added --- hash/risc0/bench/Cargo.lock | 13 +++- hash/risc0/bench/Cargo.toml | 1 + hash/risc0/bench/bench.cfg | 12 ++++ hash/risc0/bench/build.sh | 1 - hash/risc0/bench/methods/guest/Cargo.lock | 67 +++++++++++++++++-- hash/risc0/bench/methods/guest/Cargo.toml | 5 +- .../bench/methods/guest/src/bin/blake2b.rs | 6 +- .../bench/methods/guest/src/bin/blake3.rs | 6 +- .../bench/methods/guest/src/bin/sha256.rs | 15 +++++ hash/risc0/bench/run.sh | 27 ++++++-- hash/risc0/bench/src/benches/blake2b.rs | 11 ++- hash/risc0/bench/src/benches/blake3.rs | 11 +-- hash/risc0/bench/src/benches/mod.rs | 4 +- hash/risc0/bench/src/benches/sha256.rs | 11 +-- hash/risc0/bench/src/main.rs | 47 ++++++++----- 15 files changed, 180 insertions(+), 57 deletions(-) create mode 100644 hash/risc0/bench/bench.cfg diff --git a/hash/risc0/bench/Cargo.lock b/hash/risc0/bench/Cargo.lock index e6430ca..a61040b 100644 --- a/hash/risc0/bench/Cargo.lock +++ b/hash/risc0/bench/Cargo.lock @@ -76,6 +76,7 @@ dependencies = [ "rand", "risc0-zkvm", "serde", + "sha2 0.10.6", ] [[package]] @@ -1113,7 +1114,7 @@ dependencies = [ "risc0-core", "risc0-zkvm-platform", "serde", - "sha2", + "sha2 0.10.8", "tracing", ] @@ -1279,6 +1280,16 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "git+https://github.com/risc0/RustCrypto-hashes?tag=sha2-v0.10.6-risczero.0#7fd6900c4f637bd15ee2642dfa77110f8f1ad065" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" diff --git a/hash/risc0/bench/Cargo.toml b/hash/risc0/bench/Cargo.toml index 6299669..176fdde 100644 --- a/hash/risc0/bench/Cargo.toml +++ b/hash/risc0/bench/Cargo.toml @@ -27,4 +27,5 @@ opt-level = 3 risc0-zkvm = { version = "0.19.0" } serde = "1.0" rand = "0.8.3" +sha2 ={ git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2-v0.10.6-risczero.0" } methods = { workspace = true } \ No newline at end of file diff --git a/hash/risc0/bench/bench.cfg b/hash/risc0/bench/bench.cfg new file mode 100644 index 0000000..d5adade --- /dev/null +++ b/hash/risc0/bench/bench.cfg @@ -0,0 +1,12 @@ +name: "Hashes benchmarking using risc0 prover" +author: +timeout: 100 +params: + [ PROVER: [ risc0 ] + , INPUT_SIZE: [ 256, 512, 1024, 2048 ] + , WHICH: [ LINEAR ] + ] +tags: CPU, SHA256, KECCAK, BLAKE2B, BLAKE3 +comments: + The benchmarks includes for sha256, keccak, blake2b, blake3. + the hashing is done inside the guest and receipt is received which is verified. diff --git a/hash/risc0/bench/build.sh b/hash/risc0/bench/build.sh index 6870477..26156ef 100755 --- a/hash/risc0/bench/build.sh +++ b/hash/risc0/bench/build.sh @@ -1,4 +1,3 @@ #!/bin/bash -# Run the 'cargo bench' command. cargo build --release diff --git a/hash/risc0/bench/methods/guest/Cargo.lock b/hash/risc0/bench/methods/guest/Cargo.lock index bbf6d2f..d98b978 100644 --- a/hash/risc0/bench/methods/guest/Cargo.lock +++ b/hash/risc0/bench/methods/guest/Cargo.lock @@ -8,6 +8,18 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "autocfg" version = "1.1.0" @@ -23,6 +35,19 @@ dependencies = [ "digest", ] +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -52,6 +77,15 @@ dependencies = [ "syn", ] +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -64,6 +98,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + [[package]] name = "cpufeatures" version = "0.2.11" @@ -165,7 +205,10 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" name = "method" version = "0.1.0" dependencies = [ + "blake3", + "risc0-zkp", "risc0-zkvm", + "sha2 0.10.6", "sha3", ] @@ -269,9 +312,9 @@ dependencies = [ [[package]] name = "risc0-core" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f8d9ff7ca4b8a9ecf63e4567dfc5ab73ea4c4c20618cdd36d5c0eb69be80cb2" +checksum = "477e0bb8d2ec0b7955088b521eb596901e652d0faa2ea73bda0b77e05af5c07d" dependencies = [ "bytemuck", "rand_core", @@ -279,9 +322,9 @@ dependencies = [ [[package]] name = "risc0-zkp" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b8f047ec52f645e5e1c46f69303658f9cca96f0a2dcb78b4e7cadef5c2ac3d" +checksum = "d5abb1a0cf847d3f9aed1e563b76c358107e7ba66dbfab28f7144252c990bd82" dependencies = [ "anyhow", "blake2", @@ -294,7 +337,7 @@ dependencies = [ "risc0-core", "risc0-zkvm-platform", "serde", - "sha2", + "sha2 0.10.8", "tracing", ] @@ -326,9 +369,9 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e9d18c75958239e91213a181e836e28dfbede913e4de66fa36e2ad1d70fcdc" +checksum = "2dcd6b66f7a4972001db0acf3f06d99b7851c8d9f0de1f7e0fb4496c66c5cd02" dependencies = [ "bytemuck", "getrandom", @@ -371,6 +414,16 @@ dependencies = [ "syn", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "git+https://github.com/risc0/RustCrypto-hashes?tag=sha2-v0.10.6-risczero.0#7fd6900c4f637bd15ee2642dfa77110f8f1ad065" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" diff --git a/hash/risc0/bench/methods/guest/Cargo.toml b/hash/risc0/bench/methods/guest/Cargo.toml index fb613e6..4f8e376 100644 --- a/hash/risc0/bench/methods/guest/Cargo.toml +++ b/hash/risc0/bench/methods/guest/Cargo.toml @@ -8,4 +8,7 @@ edition = "2021" [dependencies] # If you want to try (experimental) std support, add `features = [ "std" ]` to risc0-zkvm risc0-zkvm = { version = "0.19.0", default-features = false, features = [ "std" ] } -sha3 = "0.10.8" \ No newline at end of file +sha3 = "0.10.8" +sha2 ={ git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2-v0.10.6-risczero.0" } +risc0-zkp = "0.19.1" +blake3 = "1.5.0" \ No newline at end of file diff --git a/hash/risc0/bench/methods/guest/src/bin/blake2b.rs b/hash/risc0/bench/methods/guest/src/bin/blake2b.rs index c28e7e0..4d6c3e5 100644 --- a/hash/risc0/bench/methods/guest/src/bin/blake2b.rs +++ b/hash/risc0/bench/methods/guest/src/bin/blake2b.rs @@ -1,15 +1,15 @@ #![no_main] use risc0_zkvm::{guest::env, sha::Digest}; -use sha3::{Digest as _, Keccak256}; +use risc0_zkp::core::hash::blake2b::{Blake2b, Blake2bCpuImpl}; risc0_zkvm::guest::entry!(main); pub fn main() { let data: Vec = env::read(); - let hash: [u8;32] = Keccak256::digest(data).into(); - let digest = Digest::try_from(hash).unwrap(); + let hash = Blake2bCpuImpl::blake2b(&data); + let digest: Digest = hash.into(); env::commit(&digest) } diff --git a/hash/risc0/bench/methods/guest/src/bin/blake3.rs b/hash/risc0/bench/methods/guest/src/bin/blake3.rs index c28e7e0..fc78b7a 100644 --- a/hash/risc0/bench/methods/guest/src/bin/blake3.rs +++ b/hash/risc0/bench/methods/guest/src/bin/blake3.rs @@ -1,15 +1,15 @@ #![no_main] use risc0_zkvm::{guest::env, sha::Digest}; -use sha3::{Digest as _, Keccak256}; +use blake3::hash; risc0_zkvm::guest::entry!(main); pub fn main() { let data: Vec = env::read(); - let hash: [u8;32] = Keccak256::digest(data).into(); - let digest = Digest::try_from(hash).unwrap(); + let result = hash(&data); + let digest = Digest::try_from(*result.as_bytes()).unwrap(); env::commit(&digest) } diff --git a/hash/risc0/bench/methods/guest/src/bin/sha256.rs b/hash/risc0/bench/methods/guest/src/bin/sha256.rs index 9b47e39..f133700 100644 --- a/hash/risc0/bench/methods/guest/src/bin/sha256.rs +++ b/hash/risc0/bench/methods/guest/src/bin/sha256.rs @@ -9,3 +9,18 @@ pub fn main() { let hash = sha::Impl::hash_bytes(&data); env::commit(&hash) } + +// accelerated sha2 crate +// #![no_main] + +// use risc0_zkvm::{guest::env}; +// use sha2::{Sha256, Digest}; +// // use base16ct::lower::encode_str; +// risc0_zkvm::guest::entry!(main); + +// pub fn main() { + +// let data: Vec = env::read(); +// let result: [u8;32] = Sha256::digest(data).into(); +// env::commit(&result) +// } diff --git a/hash/risc0/bench/run.sh b/hash/risc0/bench/run.sh index 35ba62a..a8a4e62 100755 --- a/hash/risc0/bench/run.sh +++ b/hash/risc0/bench/run.sh @@ -1,10 +1,25 @@ #!/bin/bash +if [ -z ${ZKBENCH_HASH_TYPE} ]; then +ZKBENCH_HASH_TYPE="sha256" +fi -# Set a default value if ZKBENCH_INPUT_SIZE_KB is not set -: ${ZKBENCH_INPUT_SIZE_KB:=1024} +if [ -z ${ZKBENCH_WHICH} ]; then +ZKBENCH_WHICH="LINEAR" +fi -# Set a default value if ZKBENCH_INPUT_SIZE_KB is not set -: ${WHICH:="all"} +if [ -z ${ZKBENCH_NTHREADS} ]; then +ZKBENCH_NTHREADS=1 +fi -# Run cargo run with the specified environment variable -cargo run $WHICH $ZKBENCH_INPUT_SIZE_KB +if [ -z ${ZKBENCH_INPUT_SIZE_KB} ]; then +ZKBENCH_INPUT_SIZE_KB=1024 +fi + +echo "Running benchmarks with the following configurations:" +echo "HASH = $ZKBENCH_HASH_TYPE" +echo "WHICH = $ZKBENCH_WHICH" +echo "NTHREADS = $ZKBENCH_NTHREADS" +echo "Input Size (KB) = $ZKBENCH_INPUT_SIZE_KB" + +# Run the benchmarks using cargo run +CARGO_BUILD_JOBS=$ZKBENCH_NTHREADS cargo run $ZKBENCH_HASH_TYPE $ZKBENCH_INPUT_SIZE_KB diff --git a/hash/risc0/bench/src/benches/blake2b.rs b/hash/risc0/bench/src/benches/blake2b.rs index 71c6ff5..c5d7f32 100644 --- a/hash/risc0/bench/src/benches/blake2b.rs +++ b/hash/risc0/bench/src/benches/blake2b.rs @@ -1,29 +1,28 @@ use methods::{ - KECCAK_ELF, KECCAK_ID + BLAKE2B_ELF, BLAKE2B_ID }; use risc0_zkvm::{default_prover, ExecutorEnv}; use risc0_zkvm::{ sha}; // use rand::RngCore; use std::time::Instant; -pub fn keccak_bench(input: Vec) { +pub fn blake2b_bench(input: Vec) { - let start_time = Instant::now(); - let env = ExecutorEnv::builder().write(&input).unwrap().build().unwrap(); // Obtain the default prover. let prover = default_prover(); + let start_time = Instant::now(); // Produce a receipt by proving the specified ELF binary. - let receipt = prover.prove_elf(env, KECCAK_ELF).unwrap(); + let receipt = prover.prove_elf(env, BLAKE2B_ELF).unwrap(); // For example: let _output: sha::Digest = receipt.journal.decode().unwrap(); let elapsed_time1 = start_time.elapsed(); // verify your receipt - receipt.verify(KECCAK_ID).unwrap(); + receipt.verify(BLAKE2B_ID).unwrap(); let elapsed_time2 = start_time.elapsed(); diff --git a/hash/risc0/bench/src/benches/blake3.rs b/hash/risc0/bench/src/benches/blake3.rs index 71c6ff5..204c3a3 100644 --- a/hash/risc0/bench/src/benches/blake3.rs +++ b/hash/risc0/bench/src/benches/blake3.rs @@ -1,29 +1,30 @@ use methods::{ - KECCAK_ELF, KECCAK_ID + BLAKE3_ELF, BLAKE3_ID }; use risc0_zkvm::{default_prover, ExecutorEnv}; use risc0_zkvm::{ sha}; // use rand::RngCore; use std::time::Instant; -pub fn keccak_bench(input: Vec) { +pub fn blake3_bench(input: Vec) { - let start_time = Instant::now(); + let env = ExecutorEnv::builder().write(&input).unwrap().build().unwrap(); // Obtain the default prover. let prover = default_prover(); + let start_time = Instant::now(); // Produce a receipt by proving the specified ELF binary. - let receipt = prover.prove_elf(env, KECCAK_ELF).unwrap(); + let receipt = prover.prove_elf(env, BLAKE3_ELF).unwrap(); // For example: let _output: sha::Digest = receipt.journal.decode().unwrap(); let elapsed_time1 = start_time.elapsed(); // verify your receipt - receipt.verify(KECCAK_ID).unwrap(); + receipt.verify(BLAKE3_ID).unwrap(); let elapsed_time2 = start_time.elapsed(); diff --git a/hash/risc0/bench/src/benches/mod.rs b/hash/risc0/bench/src/benches/mod.rs index 3007ce6..fbc1943 100644 --- a/hash/risc0/bench/src/benches/mod.rs +++ b/hash/risc0/bench/src/benches/mod.rs @@ -1,2 +1,4 @@ pub mod sha256; -pub mod keccak; \ No newline at end of file +pub mod keccak; +pub mod blake2b; +pub mod blake3; \ No newline at end of file diff --git a/hash/risc0/bench/src/benches/sha256.rs b/hash/risc0/bench/src/benches/sha256.rs index 169244a..553623f 100644 --- a/hash/risc0/bench/src/benches/sha256.rs +++ b/hash/risc0/bench/src/benches/sha256.rs @@ -3,29 +3,30 @@ use methods::{ }; use risc0_zkvm::{default_prover, ExecutorEnv}; use risc0_zkvm::{ sha}; +// use sha2; // use rand::RngCore; use std::time::Instant; pub fn sha_bench(input: Vec) { - let start_time = Instant::now(); let env = ExecutorEnv::builder().write(&input).unwrap().build().unwrap(); // Obtain the default prover. let prover = default_prover(); + let start_time = Instant::now(); // Produce a receipt by proving the specified ELF binary. let receipt = prover.prove_elf(env, SHA256_ELF).unwrap(); - - // TODO: Implement code for retrieving receipt journal here. + let elapsed_time = start_time.elapsed(); // For example: let _output: sha::Digest = receipt.journal.decode().unwrap(); - + // verify your receipt receipt.verify(SHA256_ID).unwrap(); - let elapsed_time = start_time.elapsed(); + eprintln!("Total time: {:?}", elapsed_time); + eprintln!("Hash: {:?}", _output); } \ No newline at end of file diff --git a/hash/risc0/bench/src/main.rs b/hash/risc0/bench/src/main.rs index 8a64580..243a0e0 100644 --- a/hash/risc0/bench/src/main.rs +++ b/hash/risc0/bench/src/main.rs @@ -1,6 +1,10 @@ mod benches; -use benches::sha256::sha_bench; -use benches::keccak::keccak_bench; +use benches::{ + sha256::sha_bench, + keccak::keccak_bench, + blake2b::blake2b_bench, + blake3::blake3_bench, +}; use rand::Rng; @@ -14,7 +18,7 @@ fn generate_bytes(size: usize) -> Vec { fn main() { let args: Vec = std::env::args().collect(); - let mut flag = 0; + // let mut flag = 0; let hash_type = &args[1]; let size_kb = args[2].parse::().unwrap(); @@ -22,23 +26,30 @@ fn main() { eprintln!("data size(bytes): {:?}", size_kb); let input = generate_bytes(size_kb); - if hash_type == "all" || hash_type == "sha256" { - println!("SHA256 Benchmarking: "); - sha_bench(input.clone()); - println!(""); - flag = 1; + match hash_type.as_str() { + "sha256" => { + println!("SHA256 Benchmarking: "); + sha_bench(input.clone()); + } + "keccak" => { + println!("KECCAK Benchmarking: "); + keccak_bench(input.clone()); + } + + "blake2b" => { + println!("Blake2b Benchmarking: "); + blake2b_bench(input.clone()); + } + + "blake3" => { + println!("Blake3 Benchmarking: "); + blake3_bench(input.clone()); + } + _ => { + println!("Wrong Benchmark Name!"); + } } - if hash_type == "all" || hash_type == "keccak" { - println!("KECCAK Benchmarking: "); - keccak_bench(input.clone()); - println!(""); - flag = 1; - } - - if flag == 0 { - println!("Wrong Benchmarking Name"); - } println!("All Done!"); }