blake3 and blake2s hash benchmark

This commit is contained in:
Manish Kumar 2024-08-21 11:49:56 +05:30
parent 20210448a2
commit 739f15ef9e
7 changed files with 164 additions and 6 deletions

View File

@ -386,6 +386,12 @@ dependencies = [
"rayon",
]
[[package]]
name = "arrayref"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a"
[[package]]
name = "arrayvec"
version = "0.7.6"
@ -554,6 +560,28 @@ dependencies = [
"wyz",
]
[[package]]
name = "blake2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
dependencies = [
"digest 0.10.7",
]
[[package]]
name = "blake3"
version = "1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7"
dependencies = [
"arrayref",
"arrayvec",
"cc",
"cfg-if",
"constant_time_eq",
]
[[package]]
name = "block-buffer"
version = "0.10.4"
@ -742,6 +770,12 @@ version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]]
name = "constant_time_eq"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
[[package]]
name = "convert_case"
version = "0.4.0"
@ -1259,6 +1293,8 @@ dependencies = [
name = "guest"
version = "0.1.0"
dependencies = [
"blake2",
"blake3",
"jolt-sdk",
"sha2",
"sha3",

View File

@ -3,9 +3,9 @@ name = "guest"
version = "0.1.0"
edition = "2021"
[[bin]]
name = "guest"
path = "./src/lib.rs"
# [[bin]]
# name = "guest"
# path = "./src/lib.rs"
[features]
guest = []
@ -14,3 +14,5 @@ guest = []
jolt = { package = "jolt-sdk", git = "https://github.com/a16z/jolt", rev = "4805d038f7b6e7ca5e7ef64aefa62213aecac01a"}
sha2 = { version = "0.10.8", default-features = false }
sha3 = { version = "0.10.8", default-features = false }
blake3 = { version = "1.5.4", default-features = false }
blake2 = { version = "0.10.6", default-features = false }

View File

@ -3,6 +3,8 @@
use sha2::{Sha256, Digest};
use sha3::Keccak256;
use blake3::hash;
use blake2::Blake2s256;
// sha256
#[jolt::provable]
@ -21,3 +23,19 @@ fn sha3(input: &[u8]) -> [u8; 32] {
let result = hasher.finalize();
Into::<[u8; 32]>::into(result)
}
// blake3
#[jolt::provable]
fn blake3(input: &[u8]) -> [u8; 32] {
let result = hash(input);
Into::<[u8; 32]>::into(result)
}
// blake2
#[jolt::provable]
fn blake2(input: &[u8]) -> [u8; 32] {
let mut hasher = Blake2s256::new();
hasher.update(input);
let result = hasher.finalize();
Into::<[u8; 32]>::into(result)
}

View File

@ -0,0 +1,42 @@
use std::time::Instant;
use ark_serialize::CanonicalSerialize;
pub fn blake2_bench(input: Vec<u8>) {
let (prove_blake2, verify_blake2, guest_build_time) = {
let start = Instant::now();
let (prove, verify) = guest::build_blake2();
let elapsed = start.elapsed();
(prove, verify, elapsed)
};
let (output, proof, proving_time) = {
let start = Instant::now();
let (output, proof) = prove_blake2(input.as_slice());
let elapsed = start.elapsed();
(output, proof, elapsed)
};
let mut proof_bytes = Vec::new();
proof.serialize_compressed(&mut proof_bytes).unwrap();
let (is_valid, verification_time) = {
let start = Instant::now();
let is_valid = verify_blake2(proof);
let elapsed = start.elapsed();
(is_valid, elapsed)
};
assert!(is_valid);
println!("output: {:?}", hex::encode(output));
println!("guest build time: {:?}", guest_build_time);
println!("proving time: {:?}", proving_time);
println!("verification time: {:?}", verification_time);
println!("proof size: {:?} bytes", proof_bytes.len());
}

View File

@ -0,0 +1,42 @@
use std::time::Instant;
use ark_serialize::CanonicalSerialize;
pub fn blake3_bench(input: Vec<u8>) {
let (prove_blake3, verify_blake3, guest_build_time) = {
let start = Instant::now();
let (prove, verify) = guest::build_blake3();
let elapsed = start.elapsed();
(prove, verify, elapsed)
};
let (output, proof, proving_time) = {
let start = Instant::now();
let (output, proof) = prove_blake3(input.as_slice());
let elapsed = start.elapsed();
(output, proof, elapsed)
};
let mut proof_bytes = Vec::new();
proof.serialize_compressed(&mut proof_bytes).unwrap();
let (is_valid, verification_time) = {
let start = Instant::now();
let is_valid = verify_blake3(proof);
let elapsed = start.elapsed();
(is_valid, elapsed)
};
assert!(is_valid);
println!("output: {:?}", hex::encode(output));
println!("guest build time: {:?}", guest_build_time);
println!("proving time: {:?}", proving_time);
println!("verification time: {:?}", verification_time);
println!("proof size: {:?} bytes", proof_bytes.len());
}

View File

@ -1,2 +1,4 @@
pub mod sha2;
pub mod sha3;
pub mod sha3;
pub mod blake3;
pub mod blake2;

View File

@ -5,6 +5,8 @@ mod benches;
use benches::{
sha2::sha2_bench,
sha3::sha3_bench,
blake3::blake3_bench,
blake2::blake2_bench,
};
fn generate_bytes(size: usize) -> Vec<u8> {
@ -27,18 +29,32 @@ pub fn main() {
match hash_type.as_str() {
"sha256" => {
println!("SHA256 Benchmarking: ");
println!("sha256 Benchmarking: ");
eprintln!("data size(bytes): {:?}", size);
let input = generate_bytes(size);
sha2_bench(input.clone());
}
"keccak" => {
println!("KECCAK Benchmarking: ");
println!("keccak Benchmarking: ");
eprintln!("data size(bytes): {:?}", size);
let input = generate_bytes(size);
sha3_bench(input.clone());
}
"blake3" => {
println!("blake3 Benchmarking: ");
eprintln!("data size(bytes): {:?}", size);
let input = generate_bytes(size);
blake3_bench(input.clone());
}
"blake2" => {
println!("blake2 Benchmarking: ");
eprintln!("data size(bytes): {:?}", size);
let input = generate_bytes(size);
blake2_bench(input.clone());
}
_ => {
println!("Wrong Benchmark Name!");