diff --git a/hash/jolt/bench/Cargo.lock b/hash/jolt/bench/Cargo.lock index 5060814..ad88127 100644 --- a/hash/jolt/bench/Cargo.lock +++ b/hash/jolt/bench/Cargo.lock @@ -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", diff --git a/hash/jolt/bench/guest/Cargo.toml b/hash/jolt/bench/guest/Cargo.toml index 7121051..10d0fa8 100644 --- a/hash/jolt/bench/guest/Cargo.toml +++ b/hash/jolt/bench/guest/Cargo.toml @@ -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 } \ No newline at end of file diff --git a/hash/jolt/bench/guest/src/lib.rs b/hash/jolt/bench/guest/src/lib.rs index f919b8b..ce46dfd 100644 --- a/hash/jolt/bench/guest/src/lib.rs +++ b/hash/jolt/bench/guest/src/lib.rs @@ -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) +} diff --git a/hash/jolt/bench/src/benches/blake2.rs b/hash/jolt/bench/src/benches/blake2.rs new file mode 100644 index 0000000..763cb53 --- /dev/null +++ b/hash/jolt/bench/src/benches/blake2.rs @@ -0,0 +1,42 @@ +use std::time::Instant; +use ark_serialize::CanonicalSerialize; + +pub fn blake2_bench(input: Vec) { + + 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()); +} \ No newline at end of file diff --git a/hash/jolt/bench/src/benches/blake3.rs b/hash/jolt/bench/src/benches/blake3.rs new file mode 100644 index 0000000..7cb400e --- /dev/null +++ b/hash/jolt/bench/src/benches/blake3.rs @@ -0,0 +1,42 @@ +use std::time::Instant; +use ark_serialize::CanonicalSerialize; + +pub fn blake3_bench(input: Vec) { + + 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()); +} \ No newline at end of file diff --git a/hash/jolt/bench/src/benches/mod.rs b/hash/jolt/bench/src/benches/mod.rs index 8777137..c31957c 100644 --- a/hash/jolt/bench/src/benches/mod.rs +++ b/hash/jolt/bench/src/benches/mod.rs @@ -1,2 +1,4 @@ pub mod sha2; -pub mod sha3; \ No newline at end of file +pub mod sha3; +pub mod blake3; +pub mod blake2; \ No newline at end of file diff --git a/hash/jolt/bench/src/main.rs b/hash/jolt/bench/src/main.rs index 1b0503d..e6e0395 100644 --- a/hash/jolt/bench/src/main.rs +++ b/hash/jolt/bench/src/main.rs @@ -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 { @@ -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!");