From 1c7f257feadb77676a3f1bf91422eb4de705c333 Mon Sep 17 00:00:00 2001 From: Manish Kumar Date: Fri, 8 Mar 2024 00:24:34 +0530 Subject: [PATCH] blake2 bench added, build.sh and run.sh added --- hash/sp1/bench/blake2/Cargo.toml | 10 ++++ .../blake2/elf/riscv32im-succinct-zkvm-elf | Bin 0 -> 143412 bytes hash/sp1/bench/blake2/src/main.rs | 23 ++++++++++ hash/sp1/bench/build.sh | 9 ++++ hash/sp1/bench/keccak/Cargo.toml | 2 +- .../keccak/elf/riscv32im-succinct-zkvm-elf | Bin 119608 -> 114172 bytes hash/sp1/bench/keccak/src/main.rs | 11 +++-- hash/sp1/bench/run.sh | 15 ++++++ hash/sp1/bench/script/src/benches/blake2.rs | 43 ++++++++++++++++++ hash/sp1/bench/script/src/main.rs | 5 ++ 10 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 hash/sp1/bench/blake2/Cargo.toml create mode 100755 hash/sp1/bench/blake2/elf/riscv32im-succinct-zkvm-elf create mode 100644 hash/sp1/bench/blake2/src/main.rs create mode 100755 hash/sp1/bench/build.sh create mode 100755 hash/sp1/bench/run.sh create mode 100644 hash/sp1/bench/script/src/benches/blake2.rs diff --git a/hash/sp1/bench/blake2/Cargo.toml b/hash/sp1/bench/blake2/Cargo.toml new file mode 100644 index 0000000..31c4ebb --- /dev/null +++ b/hash/sp1/bench/blake2/Cargo.toml @@ -0,0 +1,10 @@ +[workspace] +[package] +version = "0.1.0" +name = "blake2-program" +edition = "2021" + +[dependencies] +sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" } +blake2 = "0.10.6" + diff --git a/hash/sp1/bench/blake2/elf/riscv32im-succinct-zkvm-elf b/hash/sp1/bench/blake2/elf/riscv32im-succinct-zkvm-elf new file mode 100755 index 0000000000000000000000000000000000000000..422ae58de4938a6633498f96706f6c0c9119d168 GIT binary patch literal 143412 zcmeFadwf;Zng74m*=L`Vgxp}uMMp8@gb*XfwyTJCrY)zMKxd|Q7{$x9)oKL1Q>Mk* z&V1V(4!Hmd+Ec`KW@;nit*sT8Ay}<)#1qg~DOON>Q;Y$;VQB^NQuw`}wa+D>^xN0# z``_<1zFv{!>}RjN_FB*7^L(CX@AK`}e{R!StHOT~^=Bo2tvjYpeVl*KZi%=o(R^bx(KNwN zG=9`iG$j2*{Y*bmcafiHneTDj3!=UXDryzSbfQtKM3YvTXi{e?KB5xMGj*a_NBArf zly|61x%Pq)(^O`}M%GFBZ_0A6UNv~B$+Q-k< z-o#|2UHJ{|SKifN%I}(H7vH7k{qdIf+rN0XN^{H`=v3{;T;mO1KI=Wk)a^&Ldg<1Y zk@g!FcyfI3>RIo2x3?;9wU2y^v3)szzc-QVF4$WW#HOkC@8=r5#w7C0(NF1c4(mVV zO-yO;gsg5K=hsd3Yq^JV)qcrcs=vHewJ$6mHFd!R<+ZNZId#ee75J@>WRQ{j2+!|0 zrakJ{CF*)3iTaOvi3aW`QeK`53=XB~+(QPfW39?;Ol@ zj%IDwMB1a}6^TmCHJD#4r86<+!kUHGnbyo&dF|0wKj41ae|MLxi|5v*_8fn3&g{Rq zbvb5=tc%xv(=1sR)@$~AA6%E?-}N}wUNJ?_Q>ubFd9p_B-*2svIdLrF{c}nWet-2_ zvTrM~fSn!Fu99Q({&@Ubau41K?AK9#WS&}I6|f$|?|*Pq`5!ZYx?nNuSnXFN>TXks z`Uah7xL>8~vcA`l^3&*KhwkBJnT)2tz`hDK{>X?^-FrBM2{kQ zJraA-?c=A6$SgWawJ$om-1y%`M}4&_-Yfc}Gk!`1u|3!tYvgQg+6eSV4@O)6GE9GT zXjgN*!8sE{{W;3%k8ZzVw&;%@ynNyj^oMJpGlLzi?}!|F6lHHc_SR!>J@(dPZzJq& zguRWhw-NSMvkuYxzD8wjGroV9>?`Y!FInT}p0}$p@>#h4x&JwI{ry`q{xluLw9c>p zjk4BmZ@O}KmGolT`)*&fKET?m^d$UPC+pieT_q;3QEtpm{~>ITd89NtqcV{j3ZFkP z^%Uk8yUG0idoUCGifaGb zHYJ}A{=h$wZf)hBKcWV2&K>Y3cH-ag=g51je3`r4qgxj@r&i`MdZOx=J?a{`!T4KM znz_mv&h6k>tZmrZ*x-%W;soOSNAcH5or$uR_@wq8 zKid9OH0rHxQ^e_5`mQe3eqDLgyE~S*(L!7-#4B}Id(4lCAI1E zr13=xUnDx@Y?Ochf{jHI4fx~w8^I={98rx=*!_@gw;-a*z11Fou3t?kmE5MYyjB_u$DsivJB|)qQz? z_j~TGo_nk3-s%%|6B3D*k4{KTPEL?Hto-A_gT(VMPj&vc^^pMI7nBiSAWFo>gE;^4 zllQ}qWuiL9y_N-F5sB;J+&iXvtgXzSeJE@HN@rPc&0Fzc$`}=#{WWF$+olERPWw@! zKdLNq^a5oTPtoW^)SH;{y~eB`Eb+@SF~7|8-H!b2tm&3$qNO+L<|A|A=g_&VFUu@0 z-!J+!_=ECy!}*juj48hdvBJ7e`(#3;su`y`Bli|lRr&S)`yi?VK0l7nqNRIT-<)pM zf5*H=F|ScJ)~AYdYS=Og*|J1q@2K|ca?JC7WnycmmCjX@5@q@rxmFNQ9hdQC9^u@> z^;3WJT4x@gZcQHVwOw?4x^4dP!RSt9X7{OJOiX8P>e6P%0Dp7;&ArEh-H_ABO*r10 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

r?#h3Z|A2m%14dh*7vWI|*4*YY!>eq>Tq(xU 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 bZ(ZnJZva0HziartPWLc$Z~TQZp`rVKxi%U5 literal 0 HcmV?d00001 diff --git a/hash/sp1/bench/blake2/src/main.rs b/hash/sp1/bench/blake2/src/main.rs new file mode 100644 index 0000000..fa8ca27 --- /dev/null +++ b/hash/sp1/bench/blake2/src/main.rs @@ -0,0 +1,23 @@ + +#![no_main] +sp1_zkvm::entrypoint!(main); + +//The patched sha2 rust crate https://github.com/sp1-patches/RustCrypto-hashes +use blake2::Digest; +use blake2::Blake2b; +pub fn main() { + + let input = sp1_zkvm::io::read::>(); + +// create a Blake2b512 object + let mut hasher = Blake2b::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/build.sh b/hash/sp1/bench/build.sh new file mode 100755 index 0000000..b5838cf --- /dev/null +++ b/hash/sp1/bench/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash +cd blake2 +cargo prove build +cd ../keccak +cargo prove build +cd ../sha256 +cargo prove build +cd ../script +cargo build --release diff --git a/hash/sp1/bench/keccak/Cargo.toml b/hash/sp1/bench/keccak/Cargo.toml index 2d61e41..970a3be 100644 --- a/hash/sp1/bench/keccak/Cargo.toml +++ b/hash/sp1/bench/keccak/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" } -sha3 = "0.10.8" \ No newline at end of file +tiny-keccak = { git = "https://github.com/succinctlabs/tiny-keccak-private", branch = "patch-v2.0.2", features = ["keccak"] } \ 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 index 9c17edc2b012c2734645477791bd145393a73a9c..846880b94567b2c070bb0bdc75518d5e2f71a9ef 100755 GIT binary patch delta 36772 zcmb__3wRVo)^_z|W)fn6$Uq1ogeH?0+CWtQbq2gs%R{0iGRCZ-oR90Q{zo)7@(`iunp69RUX}aHY zPMtb+>eQ*~%Y>$Fkw5=rZ-|dx*i&WMjIqRhYm!Tcsv8-j!v+eAWlX_I-G<|NRUFwl zjL~5=@QXiYtoSFDjy136SmKZE`q3U46On3TJ#S%b28;NdmqqvUx2lW>y$|LcP?;n0 zK)_-5FmA75p=!py2(XM=bw6_`iZUa>*j^!PYap4P3rNT7og%iiDx{Mywky6z?aZ;* zZt*49SNw5l<|v*Poth^N=&c!$F3-bqBKq4{ zM5>)d^si^U9){asbUh4~9dhwA(LHVzbzhIu>Rh22@0tN8P-knsFuwk~Hg2zGzJ(t! zqMz7k`=!?FWe&TGomk)cOGIjr)uwude8iJBaya9gauaz|@6;>dNQW)hz-_V6V`U)> z=@$X^7oXi`cXT3~qCxMZ(F2^vB=+lT>&GIzJ(}_^SU2zP zQNZu)u*VtrL4P<@1phJ_7OgcTuZN5DX6>PN-LTrvgWoNel}FT}aVYmh%F5oL!@kK> z`SpX6_gOs+aYw}wZ%E#v6%PA!Q@vrW#zuMY{gqmq{`(+o4DQc#r8IsB%uk*DFISx@ zHL5dtjp|hU^>b#p`#RGL`#J}X>+4J_>Fex2uP^w0!SBmE#Uke1mphY{SZ9h7>#**R zbwsGX4ih^v)W=#e81)Axvcpb-(R0bVC`qMtwH9yzZ_m{w)nc|MAUlM zFkeG?#EA;;PgF+_zS^xe1ecA?^`DvcpNLd6w&**Ixrh1IwnjztFYHpAs&s)7eY7Zi z88UrpQ}*}q#oD6sC_?YIGT+H9EH641hD0akT__Um(RviGrwI0Svn4oCmm)bdoub>b z&rd;_M?q$@EpXV#69Lf^Xa8LYu+5kf$UAZ>9N<<=u}+Nnx^!|G=zo^p>SUN6&2Kw1 z;O=xB197C`=#L`>hc*ljn-a@yHGa4_&^g4&n�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 delta 41982 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 diff --git a/hash/sp1/bench/keccak/src/main.rs b/hash/sp1/bench/keccak/src/main.rs index b7fd57e..da0a147 100644 --- a/hash/sp1/bench/keccak/src/main.rs +++ b/hash/sp1/bench/keccak/src/main.rs @@ -1,20 +1,21 @@ #![no_main] sp1_zkvm::entrypoint!(main); -use sha3::{Digest, Keccak256}; - +use tiny_keccak::{Hasher, Keccak}; pub fn main() { let input = sp1_zkvm::io::read::>(); // create a keccak object - let mut hasher = Keccak256::new(); + let mut hasher = Keccak::v256(); // write input message - hasher.update(input); + hasher.update(&input); // read hash digest - let result: [u8;32] = hasher.finalize().into(); + let mut result: [u8;32] = [0;32]; + + hasher.finalize(&mut result); sp1_zkvm::io::write(&result); } diff --git a/hash/sp1/bench/run.sh b/hash/sp1/bench/run.sh new file mode 100755 index 0000000..d39a51f --- /dev/null +++ b/hash/sp1/bench/run.sh @@ -0,0 +1,15 @@ +#!/bin/bash +if [ -z ${ZKBENCH_HASH_TYPE} ]; then +ZKBENCH_HASH_TYPE="sha256" +fi + +if [ -z ${ZKBENCH_INPUT_SIZE_BYTES} ]; then +ZKBENCH_INPUT_SIZE_BYTES=1024 +fi +cd script +echo "Running benchmarks with the following configurations:" +echo "HASH = $ZKBENCH_HASH_TYPE" +echo "Input Size (Bytes) = $ZKBENCH_INPUT_SIZE_BYTES" + +# Run the benchmarks +./target/release/bench-script $ZKBENCH_HASH_TYPE $ZKBENCH_INPUT_SIZE_BYTES \ No newline at end of file diff --git a/hash/sp1/bench/script/src/benches/blake2.rs b/hash/sp1/bench/script/src/benches/blake2.rs new file mode 100644 index 0000000..622e24a --- /dev/null +++ b/hash/sp1/bench/script/src/benches/blake2.rs @@ -0,0 +1,43 @@ + +use sp1_core::{SP1Prover, SP1Stdin, SP1Verifier}; +use rand::Rng; +use hex::encode; + +const BLAKE2_ELF: &[u8] = include_bytes!("../../../blake2/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 blake2_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(BLAKE2_ELF, stdin).expect("proving failed"); + let t1 = t0.elapsed(); + // Read output. + let hash_bytes = proof.stdout.read::<[u8;64]>(); + let hash = encode(hash_bytes); + println!("hash: {}", hash); + + // Verify proof. + let t2 = std::time::Instant::now(); + SP1Verifier::verify(BLAKE2_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 index 267dc58..146de3f 100644 --- a/hash/sp1/bench/script/src/main.rs +++ b/hash/sp1/bench/script/src/main.rs @@ -30,6 +30,11 @@ fn main() { let _ = keccak_benchmark(size); } + "blake2" => { + println!("Running blake2 benchmark: "); + let _ = keccak_benchmark(size); + } + _ => { println!("Wrong Benchmark Name!"); }