From ae2bdc52bc488d8aec2cc2bc3dda5eebc6da64bd Mon Sep 17 00:00:00 2001 From: ravish-oo Date: Wed, 4 Feb 2026 02:35:38 -0800 Subject: [PATCH] Opoch - a STARK/FRI proof-of-computation for sequential SHA-256 hash chains --- .github/workflows/benchmarks.yml | 36 +- opoch/Cargo.lock | 638 +++++++++++++++++++++++++++++++ opoch/Cargo.toml | 16 + opoch/benches/bench.rs | 162 ++++++++ opoch/src/lib.rs | 1 + 5 files changed, 851 insertions(+), 2 deletions(-) create mode 100644 opoch/Cargo.lock create mode 100644 opoch/Cargo.toml create mode 100644 opoch/benches/bench.rs create mode 100644 opoch/src/lib.rs diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index ca9cef5..6a0373c 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -15,6 +15,8 @@ on: - risc-zero/host/benches/bench.rs - noir/benches/bench.rs - noir/Cargo.lock + - opoch/Cargo.lock + - opoch/benches/bench.rs env: AWS_REGION: us-east-1 @@ -116,6 +118,36 @@ jobs: with: path: .benchmarks/ + opoch: + runs-on: ${{ matrix.runner }} + strategy: + matrix: + runner: ['ubuntu-16-shared', 'ubuntu-latest-64-cores'] + needs: start-runner + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + + - uses: Swatinem/rust-cache@v2 + + - name: Run OPOCH benchmarks + working-directory: ./opoch + env: + BENCHY_OUTPUT_DIR: "../.benchmarks/${{ matrix.runner }}" + run: | + cargo bench + + - name: Upload .benchmarks as artifact + uses: actions/upload-artifact@v3 + with: + path: .benchmarks/ + risc_zero: runs-on: ${{ matrix.runner }} strategy: @@ -234,7 +266,7 @@ jobs: commit: runs-on: ubuntu-latest - needs: [polylang, miden, risc_zero, noir] + needs: [polylang, miden, opoch, risc_zero, noir] steps: - name: Checkout code uses: actions/checkout@v2 @@ -261,7 +293,7 @@ jobs: clean-up: runs-on: ubuntu-latest - needs: [polylang, miden, risc_zero, noir] + needs: [polylang, miden, opoch, risc_zero, noir] if: always() steps: - name: Configure AWS credentials diff --git a/opoch/Cargo.lock b/opoch/Cargo.lock new file mode 100644 index 0000000..45b7813 --- /dev/null +++ b/opoch/Cargo.lock @@ -0,0 +1,638 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "benchy" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a02b4df38b8de5ea77a5caee888d4dfaa50044b01ad3609f14bcbe93d4d609f3" +dependencies = [ + "benchy-macros", + "memory-stats", + "nix", + "serde", + "serde_json", +] + +[[package]] +name = "benchy-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24c27b215b0291aee9ce4167bca78bf1ecbaea93dae3020b9542c45843f0eda4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "cc" +version = "1.2.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memory-stats" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "opoch-bench" +version = "0.1.0" +dependencies = [ + "benchy", + "opoch-poc-sha", + "serde_json", + "zstd", +] + +[[package]] +name = "opoch-poc-sha" +version = "1.0.0" +source = "git+https://github.com/chetannothingness/opoch-hash.git#20b273a619b81958ba71db3fdae3da372bc1760d" +dependencies = [ + "console_error_panic_hook", + "hex", + "rand", + "rayon", + "serde", + "serde_json", + "sha2", + "wasm-bindgen", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[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 0.2.17", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "zerocopy" +version = "0.8.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57cf3aa6855b23711ee9852dfc97dfaa51c45feaba5b645d0c777414d494a961" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a616990af1a287837c4fe6596ad77ef57948f787e46ce28e166facc0cc1cb75" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/opoch/Cargo.toml b/opoch/Cargo.toml new file mode 100644 index 0000000..6c9c6bc --- /dev/null +++ b/opoch/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "opoch-bench" +version = "0.1.0" +edition = "2021" + +[dependencies] +opoch-poc-sha = { git = "https://github.com/chetannothingness/opoch-hash.git", package = "opoch-poc-sha" } +serde_json = "1.0" + +[dev-dependencies] +benchy = "0.1.1" +zstd = "0.13" + +[[bench]] +harness = false +name = "bench" diff --git a/opoch/benches/bench.rs b/opoch/benches/bench.rs new file mode 100644 index 0000000..d329a90 --- /dev/null +++ b/opoch/benches/bench.rs @@ -0,0 +1,162 @@ +use benchy::{benchmark, BenchmarkRun}; +use opoch_poc_sha::{ + segment::{SegmentProver, SegmentConfig}, + aggregation::{AggregationProver, AggregationConfig}, + proof::{OpochProof, ProofHeader, compute_params_hash}, + fri::{FriConfig, FriVerifier}, + sha256::Sha256, + transcript::Transcript, +}; + +/// FRI configuration for benchmarks (128-bit security) +fn benchmark_fri_config() -> FriConfig { + FriConfig { + num_queries: 68, + blowup_factor: 8, + max_degree: 65536, + } +} + +/// Generate a SHA-256 hash chain proof +fn generate_proof_for_n(n: u64) -> Vec { + let input = b"OPOCH zkbench benchmark input"; + let d0 = Sha256::hash(input); + + // Determine segment parameters + let segment_length = if n <= 64 { n as usize } else { 64 }; + let num_segments = ((n as usize) + segment_length - 1) / segment_length; + + let fri_config = benchmark_fri_config(); + + let segment_config = SegmentConfig { + segment_length, + fri_config: fri_config.clone(), + }; + + let segment_prover = SegmentProver::new(segment_config); + + // Generate segment proofs + let mut segment_proofs = Vec::with_capacity(num_segments); + let mut current_hash = d0; + + for i in 0..num_segments { + let proof = segment_prover.prove(i as u32, ¤t_hash); + current_hash = proof.end_hash; + segment_proofs.push(proof); + } + + let y = current_hash; + + // Aggregate proofs + let agg_config = AggregationConfig { + max_children: num_segments + 1, + fri_config: fri_config.clone(), + }; + + let agg_prover = AggregationProver::new(agg_config); + let l1_proof = agg_prover.aggregate_segments(&segment_proofs); + let final_proof = agg_prover.aggregate_level1(&[l1_proof]); + + // Build header + let actual_n = (num_segments * segment_length) as u64; + let params_hash = compute_params_hash(actual_n, segment_length as u64); + let header = ProofHeader::new(actual_n, segment_length as u64, d0, y, params_hash); + + let proof = OpochProof { + header, + final_proof, + }; + + proof.serialize() +} + +/// Verify a proof +fn verify_proof(input: &[u8], proof_bytes: &[u8]) -> bool { + let proof = match OpochProof::deserialize(proof_bytes) { + Some(p) => p, + None => return false, + }; + + // Verify magic and version + if &proof.header.magic != b"OPSH" || proof.header.version != 1 { + return false; + } + + // Verify d0 matches input + let computed_d0 = Sha256::hash(input); + if proof.header.d0 != computed_d0 { + return false; + } + + // Verify chain linkage + if proof.final_proof.chain_start != proof.header.d0 { + return false; + } + if proof.final_proof.chain_end != proof.header.y { + return false; + } + + // Verify aggregation level + if proof.final_proof.level != 2 { + return false; + } + + // Reconstruct transcript and verify FRI proof + let mut transcript = Transcript::new(); + transcript.append_commitment(&proof.final_proof.children_root); + transcript.append(&proof.final_proof.chain_start); + transcript.append(&proof.final_proof.chain_end); + let _alpha = transcript.challenge_aggregation(); + + let fri_config = benchmark_fri_config(); + let fri_verifier = FriVerifier::new(fri_config); + fri_verifier.verify(&proof.final_proof.fri_proof, &mut transcript) +} + +/// SHA-256 Hash Chain Proving (matches other frameworks' pattern) +/// OPOCH proves N iterations of: h_{i+1} = SHA256(h_i) +#[benchmark("SHA256 Hash Chain", [ + ("N=64", 64u64), + ("N=256", 256u64), + ("N=1024", 1024u64), + ("N=4096", 4096u64), +])] +fn sha256_hash_chain(b: &mut BenchmarkRun, n: u64) { + // Benchmark proving (same pattern as other frameworks) + let proof_bytes = b.run(|| { + generate_proof_for_n(n) + }); + + b.log("proof_size_bytes", proof_bytes.len()); + b.log( + "compressed_proof_size_bytes", + zstd::encode_all(&proof_bytes[..], 21).unwrap().len(), + ); + b.log("n_iterations", n as usize); +} + +/// Verification benchmark (OPOCH-specific - shows our fast verification) +#[benchmark("SHA256 Chain Verify", [ + ("N=64", 64u64), + ("N=1024", 1024u64), + ("N=4096", 4096u64), +])] +fn sha256_chain_verify(b: &mut BenchmarkRun, n: u64) { + // Setup: generate proof (not timed) + let proof_bytes = generate_proof_for_n(n); + let input = b"OPOCH zkbench benchmark input"; + + // Benchmark verification only + let _valid = b.run(|| { + verify_proof(input, &proof_bytes) + }); + + b.log("proof_size_bytes", proof_bytes.len()); + b.log("n_iterations", n as usize); +} + +benchy::main!( + "opoch", + sha256_hash_chain, + sha256_chain_verify, +); diff --git a/opoch/src/lib.rs b/opoch/src/lib.rs new file mode 100644 index 0000000..e803bb2 --- /dev/null +++ b/opoch/src/lib.rs @@ -0,0 +1 @@ +pub use opoch_poc_sha::*;