benchmark for blake2b, blake3, cfg file added

This commit is contained in:
Manish Kumar 2023-12-13 19:16:31 +05:30
parent 0318e18032
commit d14c0f827e
15 changed files with 180 additions and 57 deletions

View File

@ -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"

View File

@ -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 }

View File

@ -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.

View File

@ -1,4 +1,3 @@
#!/bin/bash
# Run the 'cargo bench' command.
cargo build --release

View File

@ -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"

View File

@ -9,3 +9,6 @@ edition = "2021"
# 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"
sha2 ={ git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2-v0.10.6-risczero.0" }
risc0-zkp = "0.19.1"
blake3 = "1.5.0"

View File

@ -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<u8> = 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)
}

View File

@ -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<u8> = 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)
}

View File

@ -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<u8> = env::read();
// let result: [u8;32] = Sha256::digest(data).into();
// env::commit(&result)
// }

View File

@ -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

View File

@ -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<u8>) {
let start_time = Instant::now();
pub fn blake2b_bench(input: Vec<u8>) {
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();

View File

@ -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<u8>) {
pub fn blake3_bench(input: Vec<u8>) {
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();

View File

@ -1,2 +1,4 @@
pub mod sha256;
pub mod keccak;
pub mod blake2b;
pub mod blake3;

View File

@ -3,22 +3,22 @@ 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<u8>) {
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();
@ -26,6 +26,7 @@ pub fn sha_bench(input: Vec<u8>) {
// verify your receipt
receipt.verify(SHA256_ID).unwrap();
let elapsed_time = start_time.elapsed();
eprintln!("Total time: {:?}", elapsed_time);
eprintln!("Hash: {:?}", _output);
}

View File

@ -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<u8> {
fn main() {
let args: Vec<String> = std::env::args().collect();
let mut flag = 0;
// let mut flag = 0;
let hash_type = &args[1];
let size_kb = args[2].parse::<usize>().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" {
match hash_type.as_str() {
"sha256" => {
println!("SHA256 Benchmarking: ");
sha_bench(input.clone());
println!("");
flag = 1;
}
if hash_type == "all" || hash_type == "keccak" {
"keccak" => {
println!("KECCAK Benchmarking: ");
keccak_bench(input.clone());
println!("");
flag = 1;
}
if flag == 0 {
println!("Wrong Benchmarking Name");
"blake2b" => {
println!("Blake2b Benchmarking: ");
blake2b_bench(input.clone());
}
"blake3" => {
println!("Blake3 Benchmarking: ");
blake3_bench(input.clone());
}
_ => {
println!("Wrong Benchmark Name!");
}
}
println!("All Done!");
}