From ad841ce04d7afc37a021e0fadb13f8792518ee2b Mon Sep 17 00:00:00 2001 From: Manish Kumar Date: Mon, 18 Dec 2023 23:56:55 +0530 Subject: [PATCH] poseidon2 benchmark over bn128(merkle) and baby_bear --- hash/risc0/bench/.vscode/settings.json | 5 + hash/risc0/bench/Cargo.lock | 510 +++++++++++++++++- hash/risc0/bench/Cargo.toml | 6 +- hash/risc0/bench/methods/guest/Cargo.lock | 495 ++++++++++++++++- hash/risc0/bench/methods/guest/Cargo.toml | 4 +- .../guest/src/bin/poseidon2_babybear.rs | 42 ++ .../methods/guest/src/bin/poseidon2_bn128.rs | 42 ++ hash/risc0/bench/run.sh | 16 +- hash/risc0/bench/src/benches/mod.rs | 4 +- .../bench/src/benches/poseidon2_babybear.rs | 105 ++++ .../bench/src/benches/poseidon2_bn128.rs | 97 ++++ hash/risc0/bench/src/main.rs | 28 +- 12 files changed, 1328 insertions(+), 26 deletions(-) create mode 100644 hash/risc0/bench/.vscode/settings.json create mode 100644 hash/risc0/bench/methods/guest/src/bin/poseidon2_babybear.rs create mode 100644 hash/risc0/bench/methods/guest/src/bin/poseidon2_bn128.rs create mode 100644 hash/risc0/bench/src/benches/poseidon2_babybear.rs create mode 100644 hash/risc0/bench/src/benches/poseidon2_bn128.rs diff --git a/hash/risc0/bench/.vscode/settings.json b/hash/risc0/bench/.vscode/settings.json new file mode 100644 index 0000000..4545fa6 --- /dev/null +++ b/hash/risc0/bench/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "rust-analyzer.linkedProjects": [ + "./methods/guest/Cargo.toml" + ] +} \ No newline at end of file diff --git a/hash/risc0/bench/Cargo.lock b/hash/risc0/bench/Cargo.lock index a61040b..e8cd0fd 100644 --- a/hash/risc0/bench/Cargo.lock +++ b/hash/risc0/bench/Cargo.lock @@ -32,6 +32,82 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[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" @@ -72,11 +148,15 @@ checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" name = "benchmark" version = "0.1.0" dependencies = [ + "ark-ff", + "ark-serialize", + "hex", "methods", "rand", "risc0-zkvm", "serde", "sha2 0.10.6", + "zkhash", ] [[package]] @@ -100,6 +180,18 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2" version = "0.10.6" @@ -109,6 +201,17 @@ dependencies = [ "digest", ] +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -118,6 +221,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "ff 0.12.1", + "group 0.12.1", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bonsai-sdk" version = "0.5.1" @@ -152,9 +268,15 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.5.0" @@ -217,6 +339,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 = "core-foundation" version = "0.9.4" @@ -242,6 +370,38 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -252,6 +412,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -319,6 +490,28 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -355,6 +548,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures-channel" version = "0.3.29" @@ -430,6 +629,29 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "memuse", + "rand_core", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core", + "subtle", +] + [[package]] name = "h2" version = "0.3.22" @@ -449,6 +671,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core", + "rayon", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -579,6 +824,15 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -603,11 +857,37 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jubjub" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" +dependencies = [ + "bitvec", + "bls12_381", + "ff 0.12.1", + "group 0.12.1", + "rand_core", + "subtle", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -639,6 +919,21 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memuse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" + [[package]] name = "methods" version = "0.1.0" @@ -696,6 +991,17 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-derive" version = "0.4.1" @@ -704,7 +1010,17 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", ] [[package]] @@ -764,7 +1080,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -785,6 +1101,45 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.0", + "group 0.13.0", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + [[package]] name = "paste" version = "1.0.14" @@ -838,7 +1193,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.39", ] [[package]] @@ -868,7 +1223,7 @@ checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.11.0", "log", "multimap", "once_cell", @@ -877,7 +1232,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn", + "syn 2.0.39", "tempfile", "which", ] @@ -889,10 +1244,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -922,6 +1277,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -952,6 +1313,26 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -1177,6 +1558,15 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.21" @@ -1254,7 +1644,7 @@ checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1301,6 +1691,16 @@ dependencies = [ "digest", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "slab" version = "0.4.9" @@ -1330,12 +1730,35 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.39" @@ -1368,6 +1791,12 @@ dependencies = [ "libc", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.8.1" @@ -1398,7 +1827,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1481,7 +1910,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1585,7 +2014,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.39", "wasm-bindgen-shared", ] @@ -1619,7 +2048,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1749,3 +2178,58 @@ dependencies = [ "cfg-if", "windows-sys", ] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "git+https://github.com/HorizenLabs/poseidon2.git#bb476b9ca38198cf5092487283c8b8c5d4317c4e" +dependencies = [ + "ark-ff", + "ark-std", + "bitvec", + "blake2", + "bls12_381", + "byteorder", + "cfg-if", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand", + "serde", + "sha2 0.10.8", + "sha3", + "subtle", +] diff --git a/hash/risc0/bench/Cargo.toml b/hash/risc0/bench/Cargo.toml index 176fdde..8d484c5 100644 --- a/hash/risc0/bench/Cargo.toml +++ b/hash/risc0/bench/Cargo.toml @@ -28,4 +28,8 @@ 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 +methods = { workspace = true } +zkhash = { git = "https://github.com/HorizenLabs/poseidon2.git"} +ark-ff = "0.4.2" +hex = "0.4.3" +ark-serialize = "0.4" \ No newline at end of file diff --git a/hash/risc0/bench/methods/guest/Cargo.lock b/hash/risc0/bench/methods/guest/Cargo.lock index d98b978..7469794 100644 --- a/hash/risc0/bench/methods/guest/Cargo.lock +++ b/hash/risc0/bench/methods/guest/Cargo.lock @@ -8,6 +8,70 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + [[package]] name = "arrayref" version = "0.3.7" @@ -26,6 +90,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2" version = "0.10.6" @@ -35,6 +111,17 @@ dependencies = [ "digest", ] +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + [[package]] name = "blake3" version = "1.5.0" @@ -57,6 +144,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "ff 0.12.1", + "group 0.12.1", + "pairing", + "rand_core", + "subtle", +] + [[package]] name = "bytemuck" version = "1.14.0" @@ -74,9 +174,15 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cc" version = "1.0.83" @@ -113,6 +219,38 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -123,6 +261,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -141,12 +290,46 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "elf" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6e7d85896690fe195447717af8eceae0593ac2196fd42fe88c184e904406ce" +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "generic-array" version = "0.14.7" @@ -168,12 +351,81 @@ dependencies = [ "wasi", ] +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "memuse", + "rand_core", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core", + "subtle", +] + +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core", + "rayon", +] + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "jubjub" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" +dependencies = [ + "bitvec", + "bls12_381", + "ff 0.12.1", + "group 0.12.1", + "rand_core", + "subtle", +] + [[package]] name = "keccak" version = "0.1.4" @@ -183,6 +435,15 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] + [[package]] name = "libc" version = "0.2.150" @@ -201,15 +462,43 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memuse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" + [[package]] name = "method" version = "0.1.0" dependencies = [ + "ark-serialize", "blake3", "risc0-zkp", "risc0-zkvm", "sha2 0.10.6", "sha3", + "zkhash", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", ] [[package]] @@ -220,7 +509,17 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", ] [[package]] @@ -232,6 +531,45 @@ dependencies = [ "autocfg", ] +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.0", + "group 0.13.0", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + [[package]] name = "paste" version = "1.0.14" @@ -244,6 +582,12 @@ version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.69" @@ -262,11 +606,61 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] [[package]] name = "risc0-binfmt" @@ -388,6 +782,15 @@ dependencies = [ "paste", ] +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "semver" version = "1.0.20" @@ -411,7 +814,7 @@ checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -445,12 +848,35 @@ dependencies = [ "keccak", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.39" @@ -462,6 +888,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tracing" version = "0.1.40" @@ -481,7 +913,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -513,3 +945,58 @@ name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "git+https://github.com/HorizenLabs/poseidon2.git#bb476b9ca38198cf5092487283c8b8c5d4317c4e" +dependencies = [ + "ark-ff", + "ark-std", + "bitvec", + "blake2", + "bls12_381", + "byteorder", + "cfg-if", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand", + "serde", + "sha2 0.10.8", + "sha3", + "subtle", +] diff --git a/hash/risc0/bench/methods/guest/Cargo.toml b/hash/risc0/bench/methods/guest/Cargo.toml index 4f8e376..7ea1c24 100644 --- a/hash/risc0/bench/methods/guest/Cargo.toml +++ b/hash/risc0/bench/methods/guest/Cargo.toml @@ -11,4 +11,6 @@ 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" \ No newline at end of file +blake3 = "1.5.0" +zkhash = { git = "https://github.com/HorizenLabs/poseidon2.git"} +ark-serialize = "0.4" \ No newline at end of file diff --git a/hash/risc0/bench/methods/guest/src/bin/poseidon2_babybear.rs b/hash/risc0/bench/methods/guest/src/bin/poseidon2_babybear.rs new file mode 100644 index 0000000..58928eb --- /dev/null +++ b/hash/risc0/bench/methods/guest/src/bin/poseidon2_babybear.rs @@ -0,0 +1,42 @@ +#![no_main] +#![allow(non_snake_case)] +use risc0_zkvm::{guest::env/* , sha::Digest*/}; +// use sha3::{Digest as _, Keccak256}; +use zkhash::poseidon2::poseidon2; +use zkhash::poseidon2::poseidon2_instance_babybear::{POSEIDON2_BABYBEAR_16_PARAMS/* , POSEIDON2_BABYBEAR_24_PARAMS*/}; +use zkhash::fields::babybear::FpBabyBear; +use ark_serialize::{CanonicalSerialize, CanonicalDeserialize}; + +risc0_zkvm::guest::entry!(main); + +pub fn main() { + + let data: Vec> = env::read(); + let cycles1 = env::get_cycle_count(); + let mut hash_data: Vec = Vec::new(); + for i in 0..data.len() { + let a_uncompressed = FpBabyBear::deserialize_uncompressed(&**data.get(i).unwrap()).unwrap(); + hash_data.push(a_uncompressed); + } + let cycles2 = env::get_cycle_count(); + + let permutation = poseidon2::Poseidon2::new(&POSEIDON2_BABYBEAR_16_PARAMS); + let perm: Vec = permutation.permutation(&hash_data); + + let cycles4 = env::get_cycle_count(); + + let mut perm_seralised: Vec> = Vec::new(); + for i in 0..data.len() { + let mut temp: Vec = Vec::new(); + perm.get(i).unwrap().serialize_uncompressed(&mut temp).unwrap(); + perm_seralised.push(temp); + } + let cycles6 = env::get_cycle_count(); + + env::commit(&perm_seralised); + + eprintln!("number of cycles for input builder: {:?}", cycles2 - cycles1); + eprintln!("number of cycles for hash permutation builder: {:?}", cycles4 - cycles2); + eprintln!("number of cycles for permutation seralisation: {:?}", cycles6 - cycles4); + +} diff --git a/hash/risc0/bench/methods/guest/src/bin/poseidon2_bn128.rs b/hash/risc0/bench/methods/guest/src/bin/poseidon2_bn128.rs new file mode 100644 index 0000000..d83669e --- /dev/null +++ b/hash/risc0/bench/methods/guest/src/bin/poseidon2_bn128.rs @@ -0,0 +1,42 @@ +#![no_main] +use risc0_zkvm::{guest::env/* , sha::Digest*/}; +// use sha3::{Digest as _, Keccak256}; +use zkhash::poseidon2::poseidon2; +use zkhash::poseidon2::poseidon2_instance_bn256::POSEIDON2_BN256_PARAMS; +use zkhash::merkle_tree::merkle_tree_fp::MerkleTree; +use zkhash::fields::bn256::FpBN256; +use ark_serialize::{CanonicalSerialize, CanonicalDeserialize}; + +risc0_zkvm::guest::entry!(main); + +pub fn main() { + + let data: Vec> = env::read(); + let cycles1 = env::get_cycle_count(); + let mut hash_data: Vec = Vec::new(); + for i in 0..data.len() { + let a_uncompressed = FpBN256::deserialize_uncompressed(&**data.get(i).unwrap()).unwrap(); + hash_data.push(a_uncompressed); + } + let cycles2 = env::get_cycle_count(); + + let permutation = poseidon2::Poseidon2::new(&POSEIDON2_BN256_PARAMS); + let mut merkle_tree = MerkleTree::new(permutation.clone()); + let cycles4 = env::get_cycle_count(); + let hash_final = merkle_tree.accumulate(&hash_data); + let cycles5 = env::get_cycle_count(); + + + let mut hash_bytes: Vec = Vec::new(); + hash_final.serialize_uncompressed(&mut hash_bytes).unwrap(); + + let cycles6 = env::get_cycle_count(); + + env::commit(&hash_bytes); + + eprintln!("number of cycles for input builder: {:?}", cycles2 - cycles1); + eprintln!("number of cycles for hash builder: {:?}", cycles4 - cycles2); + eprintln!("number of cycles for hash calculation: {:?}", cycles5 - cycles4); + eprintln!("number of cycles for hash serealisation: {:?}", cycles6 - cycles5); + +} diff --git a/hash/risc0/bench/run.sh b/hash/risc0/bench/run.sh index a8a4e62..e51695a 100755 --- a/hash/risc0/bench/run.sh +++ b/hash/risc0/bench/run.sh @@ -15,11 +15,23 @@ if [ -z ${ZKBENCH_INPUT_SIZE_KB} ]; then ZKBENCH_INPUT_SIZE_KB=1024 fi +if [ -z ${ZKBENCH_TREE_DEPTH} ]; then +ZKBENCH_TREE_DEPTH=4 +fi + + echo "Running benchmarks with the following configurations:" echo "HASH = $ZKBENCH_HASH_TYPE" -echo "WHICH = $ZKBENCH_WHICH" +# 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 +# Check if the environment variable is set to "poseidon2_bn128" +if [ "$ZKBENCH_HASH_TYPE" == "poseidon2_bn128" ]; then + # echo "Running Poseidon2 benchmark over bn128 field" + CARGO_BUILD_JOBS=$ZKBENCH_NTHREADS cargo run $ZKBENCH_HASH_TYPE $ZKBENCH_TREE_DEPTH +else + CARGO_BUILD_JOBS=$ZKBENCH_NTHREADS cargo run $ZKBENCH_HASH_TYPE $ZKBENCH_INPUT_SIZE_KB + +fi \ No newline at end of file diff --git a/hash/risc0/bench/src/benches/mod.rs b/hash/risc0/bench/src/benches/mod.rs index fbc1943..d3382cf 100644 --- a/hash/risc0/bench/src/benches/mod.rs +++ b/hash/risc0/bench/src/benches/mod.rs @@ -1,4 +1,6 @@ pub mod sha256; pub mod keccak; pub mod blake2b; -pub mod blake3; \ No newline at end of file +pub mod blake3; +pub mod poseidon2_bn128; +pub mod poseidon2_babybear; \ No newline at end of file diff --git a/hash/risc0/bench/src/benches/poseidon2_babybear.rs b/hash/risc0/bench/src/benches/poseidon2_babybear.rs new file mode 100644 index 0000000..f8c6558 --- /dev/null +++ b/hash/risc0/bench/src/benches/poseidon2_babybear.rs @@ -0,0 +1,105 @@ +#![allow(non_snake_case)] +use methods::{ + POSEIDON2_BABYBEAR_ELF, POSEIDON2_BABYBEAR_ID +}; +use risc0_zkvm::{default_prover, ExecutorEnv}; +use zkhash::{fields::{babybear::FpBabyBear, utils::random_scalar}/* , poseidon2::poseidon2_instance_bn256::POSEIDON2_BN256_PARAMS*/}; +// use zkhash::poseidon2::poseidon2::Poseidon2; +// use std::convert::TryFrom; +use std::time::Instant; +// use zkhash::merkle_tree::merkle_tree_fp::MerkleTree; +// use std::convert::TryInto; +// use hex::encode_to_slice; +use ark_serialize::{CanonicalSerialize, CanonicalDeserialize}; + + +pub fn poseidon2_babybear_bench(mtDepth: usize) { + + type Scalar = FpBabyBear; + + let mut input_scalar: Vec> = Vec::new(); + let number_of_leaves: u32 = 1 << mtDepth; + for _ in 0..number_of_leaves { + let mut uncompressed_bytes = Vec::new(); + let a: Scalar = random_scalar(); + a.serialize_uncompressed(&mut uncompressed_bytes).unwrap(); + input_scalar.push(uncompressed_bytes); + } + + let env = ExecutorEnv::builder().write(&input_scalar).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, POSEIDON2_BABYBEAR_ELF).unwrap(); + let elapsed_time = start_time.elapsed(); + + // For example: + let output: Vec> = receipt.journal.decode().unwrap(); + + let mut output_deseralised: Vec = Vec::new(); + + for i in 0..output.len() { + output_deseralised.push(Scalar::deserialize_uncompressed(&**output.get(i).unwrap()).unwrap()); + } + + eprintln!("size: {:?}", output_deseralised); + // let hash_final = FpBabyBear::deserialize_uncompressed(&*output).unwrap(); + + // verify your receipt + receipt.verify(POSEIDON2_BABYBEAR_ID).unwrap(); + + + eprintln!("Total time: {:?}", elapsed_time); + // eprintln!("Hash: {:?}", hash_final); + + + + + + // let input2:[Scalar;16] = [Scalar::from(1), Scalar::from(2), Scalar::from(3), Scalar::from(4),Scalar::from(5), Scalar::from(6), Scalar::from(7), Scalar::from(8),Scalar::from(9), Scalar::from(10), Scalar::from(11), Scalar::from(12), Scalar::from(13), Scalar::from(14), Scalar::from(15), Scalar::from(16)]; + // let hash = merkle_tree.accumulate(&input2); + + // let hash_string = hash.0.to_string(); + // // eprintln!("merkle hash: {:?}",hex::encode(hash_string)); + // eprintln!("merkle hash: {:?}", hash_string); + + // let x = hash.0.0; + // eprintln!("from: {:x}{:x}{:x}{:x}", x[0],x[1], x[2], x[3]); + // eprintln!("scalar: {:?}", Scalar::from(4)); + + // let a = Scalar::from(4); + // let mut uncompressed_bytes = Vec::new(); + // a.serialize_uncompressed(&mut uncompressed_bytes).unwrap(); + // eprintln!("compress: {:?}", uncompressed_bytes); + + // let a_uncompressed = Scalar::deserialize_uncompressed(&*uncompressed_bytes).unwrap(); + // eprintln!("uncompress: {:?}", a_uncompressed); + + // let t = poseidon2.get_t(); + // let input1: Vec = (0..t).map(|_| random_scalar()).collect(); + // let perm = poseidon2.permutation(&input1); + // eprintln!("output: {:?}", perm); + + // 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, POSEIDON2_BN128_ELF).unwrap(); + // let elapsed_time = start_time.elapsed(); + + // // For example: + // let _output: sha::Digest = receipt.journal.decode().unwrap(); + + // // verify your receipt + // receipt.verify(POSEIDON2_BN128_ID).unwrap(); + + + // eprintln!("Total time: {:?}", elapsed_time); + // eprintln!("Hash: {:?}", _output); +} \ No newline at end of file diff --git a/hash/risc0/bench/src/benches/poseidon2_bn128.rs b/hash/risc0/bench/src/benches/poseidon2_bn128.rs new file mode 100644 index 0000000..db28ed6 --- /dev/null +++ b/hash/risc0/bench/src/benches/poseidon2_bn128.rs @@ -0,0 +1,97 @@ +use methods::{ + POSEIDON2_BN128_ELF, POSEIDON2_BN128_ID +}; +use risc0_zkvm::{default_prover, ExecutorEnv}; +use zkhash::{fields::{bn256::FpBN256, utils::random_scalar}/* , poseidon2::poseidon2_instance_bn256::POSEIDON2_BN256_PARAMS*/}; +// use zkhash::poseidon2::poseidon2::Poseidon2; +// use std::convert::TryFrom; +use std::time::Instant; +// use zkhash::merkle_tree::merkle_tree_fp::MerkleTree; +// use std::convert::TryInto; +// use hex::encode_to_slice; +use ark_serialize::{CanonicalSerialize, CanonicalDeserialize}; + + +pub fn poseidon2_bn128_bench(mt_depth: usize) { + + type Scalar = FpBN256; + + let mut input_scalar: Vec> = Vec::new(); + let number_of_leaves: u32 = 1 << mt_depth; + for _ in 0..number_of_leaves { + let mut uncompressed_bytes = Vec::new(); + let a: Scalar = random_scalar(); + a.serialize_uncompressed(&mut uncompressed_bytes).unwrap(); + input_scalar.push(uncompressed_bytes); + } + + let env = ExecutorEnv::builder().write(&input_scalar).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, POSEIDON2_BN128_ELF).unwrap(); + let elapsed_time = start_time.elapsed(); + + // For example: + let output: Vec = receipt.journal.decode().unwrap(); + + let hash_final = Scalar::deserialize_uncompressed(&*output).unwrap(); + + // verify your receipt + receipt.verify(POSEIDON2_BN128_ID).unwrap(); + + + eprintln!("Total time: {:?}", elapsed_time); + eprintln!("Hash: {:?}", hash_final); + + + + + + // let input2:[Scalar;16] = [Scalar::from(1), Scalar::from(2), Scalar::from(3), Scalar::from(4),Scalar::from(5), Scalar::from(6), Scalar::from(7), Scalar::from(8),Scalar::from(9), Scalar::from(10), Scalar::from(11), Scalar::from(12), Scalar::from(13), Scalar::from(14), Scalar::from(15), Scalar::from(16)]; + // let hash = merkle_tree.accumulate(&input2); + + // let hash_string = hash.0.to_string(); + // // eprintln!("merkle hash: {:?}",hex::encode(hash_string)); + // eprintln!("merkle hash: {:?}", hash_string); + + // let x = hash.0.0; + // eprintln!("from: {:x}{:x}{:x}{:x}", x[0],x[1], x[2], x[3]); + // eprintln!("scalar: {:?}", Scalar::from(4)); + + // let a = Scalar::from(4); + // let mut uncompressed_bytes = Vec::new(); + // a.serialize_uncompressed(&mut uncompressed_bytes).unwrap(); + // eprintln!("compress: {:?}", uncompressed_bytes); + + // let a_uncompressed = Scalar::deserialize_uncompressed(&*uncompressed_bytes).unwrap(); + // eprintln!("uncompress: {:?}", a_uncompressed); + + // let t = poseidon2.get_t(); + // let input1: Vec = (0..t).map(|_| random_scalar()).collect(); + // let perm = poseidon2.permutation(&input1); + // eprintln!("output: {:?}", perm); + + // 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, POSEIDON2_BN128_ELF).unwrap(); + // let elapsed_time = start_time.elapsed(); + + // // For example: + // let _output: sha::Digest = receipt.journal.decode().unwrap(); + + // // verify your receipt + // receipt.verify(POSEIDON2_BN128_ID).unwrap(); + + + // 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 243a0e0..266a65f 100644 --- a/hash/risc0/bench/src/main.rs +++ b/hash/risc0/bench/src/main.rs @@ -4,6 +4,8 @@ use benches::{ keccak::keccak_bench, blake2b::blake2b_bench, blake3::blake3_bench, + poseidon2_bn128::poseidon2_bn128_bench, + poseidon2_babybear::poseidon2_babybear_bench, }; use rand::Rng; @@ -23,33 +25,51 @@ fn main() { let hash_type = &args[1]; let size_kb = args[2].parse::().unwrap(); - eprintln!("data size(bytes): {:?}", size_kb); - let input = generate_bytes(size_kb); - match hash_type.as_str() { "sha256" => { println!("SHA256 Benchmarking: "); + eprintln!("data size(bytes): {:?}", size_kb); + let input = generate_bytes(size_kb); sha_bench(input.clone()); } "keccak" => { println!("KECCAK Benchmarking: "); + eprintln!("data size(bytes): {:?}", size_kb); + let input = generate_bytes(size_kb); keccak_bench(input.clone()); } "blake2b" => { println!("Blake2b Benchmarking: "); + eprintln!("data size(bytes): {:?}", size_kb); + let input = generate_bytes(size_kb); blake2b_bench(input.clone()); } "blake3" => { println!("Blake3 Benchmarking: "); + eprintln!("data size(bytes): {:?}", size_kb); + let input = generate_bytes(size_kb); blake3_bench(input.clone()); } + + "poseidon2_bn128" => { + println!("Poseidon2 Benchmarking on the BN128 field: "); + eprintln!("Tree Depth: {:?}", size_kb); + poseidon2_bn128_bench(size_kb); + } + + "poseidon2_babybear" => { + println!("Poseidon2 Benchmarking on the BabyBear field: "); + eprintln!("number of inputs {:?}", size_kb); + poseidon2_babybear_bench(size_kb); + } + _ => { println!("Wrong Benchmark Name!"); } } - + println!("All Done!"); }