diff --git a/.github/workflows/mobile-bench-pr-command.yml b/.github/workflows/mobile-bench-pr-command.yml index 621b34986..a69072a59 100644 --- a/.github/workflows/mobile-bench-pr-command.yml +++ b/.github/workflows/mobile-bench-pr-command.yml @@ -72,11 +72,11 @@ jobs: *) echo "::warning::Invalid device_profile '${device_profile}', defaulting to 'triad'"; device_profile="triad" ;; esac - if ! [[ "${iterations:-2}" =~ ^[0-9]+$ ]]; then - echo "::warning::Invalid iterations '${iterations}', defaulting to '2'" - iterations="2" + if ! [[ "${iterations:-5}" =~ ^[0-9]+$ ]]; then + echo "::warning::Invalid iterations '${iterations}', defaulting to '5'" + iterations="5" else - iterations="${iterations:-2}" + iterations="${iterations:-5}" fi if ! [[ "${warmup:-1}" =~ ^[0-9]+$ ]]; then @@ -86,10 +86,12 @@ jobs: warmup="${warmup:-1}" fi - echo "platform=${platform}" >> "$GITHUB_OUTPUT" - echo "device_profile=${device_profile}" >> "$GITHUB_OUTPUT" - echo "iterations=${iterations}" >> "$GITHUB_OUTPUT" - echo "warmup=${warmup}" >> "$GITHUB_OUTPUT" + { + echo "platform=${platform}" + echo "device_profile=${device_profile}" + echo "iterations=${iterations}" + echo "warmup=${warmup}" + } >> "$GITHUB_OUTPUT" - name: Resolve PR refs if: steps.trust.outputs.trusted == 'true' @@ -142,15 +144,15 @@ jobs: checks: write contents: read pull-requests: write - uses: worldcoin/mobile-bench-rs/.github/workflows/reusable-bench.yml@8a2dfbb2ba941aa6a6582bf49dae482cc87779df + uses: worldcoin/mobile-bench-rs/.github/workflows/reusable-bench.yml@ec5848752760cf2edd4d7f8c7c1e329bd668cf95 secrets: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} with: crate_path: ./bench-mobile - functions: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]' - functions_ios: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]' - functions_android: '["bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_passport_complete_age_check_prove"]' + functions: '["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' + functions_ios: '["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' + functions_android: '["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' platform: ${{ needs.resolve.outputs.platform }} prepare_script: bench-mobile/scripts/generate-fixtures.sh device_profile: custom @@ -158,7 +160,7 @@ jobs: android_devices: ${{ needs.resolve-device-matrices.outputs.android_devices }} iterations: ${{ needs.resolve.outputs.iterations }} warmup: ${{ needs.resolve.outputs.warmup }} - mobench_version: "0.1.47" + mobench_version: "0.1.48" max_completion_timeout_secs: 7200 rust_toolchain: nightly-2026-03-04 ffi_backend: native-c-abi diff --git a/.github/workflows/mobile-bench.yml b/.github/workflows/mobile-bench.yml index 79d9d2252..e2ad6018b 100644 --- a/.github/workflows/mobile-bench.yml +++ b/.github/workflows/mobile-bench.yml @@ -7,12 +7,12 @@ on: description: "Optional iOS-specific benchmark functions" required: false type: string - default: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]' + default: '["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' functions_android: description: "Optional Android-specific benchmark functions" required: false type: string - default: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]' + default: '["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' platform: description: "android | ios | both" required: false @@ -45,7 +45,7 @@ on: description: "Number of benchmark iterations" required: false type: string - default: "2" + default: "5" warmup: description: "Number of warmup iterations" required: false @@ -127,13 +127,13 @@ jobs: name: BrowserStack benchmarks needs: [browserstack-preflight, resolve-device-matrices] if: ${{ needs.browserstack-preflight.outputs.available == 'true' }} - uses: worldcoin/mobile-bench-rs/.github/workflows/reusable-bench.yml@8a2dfbb2ba941aa6a6582bf49dae482cc87779df + uses: worldcoin/mobile-bench-rs/.github/workflows/reusable-bench.yml@ec5848752760cf2edd4d7f8c7c1e329bd668cf95 secrets: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} with: crate_path: ./bench-mobile - functions: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]' + functions: '["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' functions_ios: ${{ inputs.functions_ios }} functions_android: ${{ inputs.functions_android }} platform: ${{ inputs.platform }} @@ -143,7 +143,7 @@ jobs: android_devices: ${{ needs.resolve-device-matrices.outputs.android_devices }} iterations: ${{ inputs.iterations }} warmup: ${{ inputs.warmup }} - mobench_version: "0.1.47" + mobench_version: "0.1.48" max_completion_timeout_secs: 7200 rust_toolchain: nightly-2026-03-04 ffi_backend: native-c-abi @@ -151,3 +151,383 @@ jobs: allow_non_pr: false head_sha: ${{ inputs.head_sha }} requested_by: ${{ github.actor }} + + validate-web-request: + name: Validate WASM benchmark revision + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + outputs: + head_repo: ${{ steps.validate.outputs.head_repo }} + head_sha: ${{ steps.validate.outputs.head_sha }} + steps: + - name: Require the current PR head + id: validate + shell: bash + env: + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ inputs.pr_number }} + REQUESTED_SHA: ${{ inputs.head_sha }} + run: | + set -euo pipefail + [[ "$PR_NUMBER" =~ ^[1-9][0-9]*$ ]] || { + echo "::error::pr_number must be a positive integer" + exit 2 + } + [[ "$REQUESTED_SHA" =~ ^[0-9a-fA-F]{40}$ ]] || { + echo "::error::head_sha must be a full commit SHA" + exit 2 + } + pr_json="$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}")" + current_sha="$(jq -r '.head.sha' <<<"$pr_json")" + head_repo="$(jq -r '.head.repo.full_name' <<<"$pr_json")" + test "${REQUESTED_SHA,,}" = "${current_sha,,}" || { + echo "::error::Requested SHA is not the current PR head" + exit 2 + } + [[ "$head_repo" =~ ^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$ ]] || exit 2 + echo "head_repo=$head_repo" >> "$GITHUB_OUTPUT" + echo "head_sha=${current_sha,,}" >> "$GITHUB_OUTPUT" + + trusted-web-mobench: + name: Build trusted Mobench 0.1.48 web control plane + needs: validate-web-request + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout exact Mobench release + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: worldcoin/mobile-bench-rs + ref: ec5848752760cf2edd4d7f8c7c1e329bd668cf95 + persist-credentials: false + - name: Setup Rust + uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 + with: + toolchain: stable + - name: Build exact cargo-mobench + run: cargo build --locked --release -p mobench --bin cargo-mobench + - name: Upload trusted CLI + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: provekit-v1-web-cargo-mobench + path: target/release/cargo-mobench + if-no-files-found: error + retention-days: 1 + + prepare-web: + name: Prepare immutable ProveKit WASM bundle + needs: [validate-web-request, trusted-web-mobench] + runs-on: ubuntu-latest + timeout-minutes: 180 + permissions: + contents: read + outputs: + artifact_digest: ${{ steps.upload.outputs.artifact-digest }} + steps: + - name: Checkout exact benchmark revision + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: ${{ needs.validate-web-request.outputs.head_repo }} + ref: ${{ needs.validate-web-request.outputs.head_sha }} + persist-credentials: false + - name: Setup Rust + uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 + with: + toolchain: nightly-2026-03-04 + targets: wasm32-unknown-unknown + - name: Cache Cargo + uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + shared-key: provekit-v1-web-0.1.48 + - name: Install Mobench 0.1.48 wasm-bindgen CLI + shell: bash + run: | + set -euo pipefail + cargo install wasm-bindgen-cli --version 0.2.113 --locked + - name: Download trusted Mobench CLI + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: provekit-v1-web-cargo-mobench + path: trusted-bin + - name: Generate browser witnesses outside measurement + env: + MOBENCH_CI_PREPARE: "1" + run: ./bench-mobile/scripts/prepare-web-benchmarks.sh + - name: Build portable single-thread WASM bundle + shell: bash + env: + RUSTFLAGS: -C link-arg=--max-memory=4294967296 + run: | + set -euo pipefail + chmod +x trusted-bin/cargo-mobench + for spec in \ + "passport-complete:web-passport-complete" \ + "passport-fragmented:web-passport-fragmented" \ + "webauthn:web-webauthn" \ + "oprf:web-oprf"; do + slug="${spec%%:*}" + feature="${spec#*:}" + FEATURE="$feature" python3 - <<'PY' + import os + from pathlib import Path + + manifest = Path("bench-mobile/Cargo.toml") + text = manifest.read_text() + marker = 'default = ["web-' + start = text.find(marker) + if start < 0: + raise SystemExit("browser default feature marker is missing") + end = text.find('"]', start) + if end < 0: + raise SystemExit("browser default feature is malformed") + text = text[:start] + f'default = ["{os.environ["FEATURE"]}' + text[end:] + manifest.write_text(text) + PY + trusted-bin/cargo-mobench build \ + --target web \ + --crate-path bench-mobile \ + --release \ + --output-dir "target/mobench-v1/${slug}" + done + - name: Upload immutable WASM bundle + id: upload + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: provekit-v1-web-bundle + path: target/mobench-v1/*/web + if-no-files-found: error + retention-days: 1 + + browser-web: + name: ${{ matrix.workload.label }} WASM on ${{ matrix.environment.label }} + needs: [validate-web-request, trusted-web-mobench, prepare-web] + runs-on: ubuntu-latest + timeout-minutes: 90 + environment: Browserstack + permissions: + actions: read + strategy: + fail-fast: false + max-parallel: 2 + matrix: + workload: + - label: Passport complete + slug: passport-complete + function: bench_mobile::bench_passport_complete_age_check_prove + - label: Passport fragmented + slug: passport-fragmented + function: bench_mobile::bench_passport_fragmented_age_check_prove + - label: WebAuthn assertion + slug: webauthn + function: bench_mobile::bench_webauthn_assertion_prove + - label: OPRF + slug: oprf + function: bench_mobile::bench_oprf_prove + environment: + - label: macOS Safari + slug: macos-safari + browser: Safari + browser_version: latest + os: OS X + os_version: Sequoia + device: "" + - label: Windows Chrome + slug: windows-chrome + browser: Chrome + browser_version: latest + os: Windows + os_version: "11" + device: "" + - label: iOS Safari + slug: ios-safari + browser: Safari + browser_version: "" + os: "" + os_version: "18" + device: iPhone 16 Pro Max + - label: Android Chrome + slug: android-chrome + browser: Chrome + browser_version: "" + os: "" + os_version: "13.0" + device: Google Pixel 7 + steps: + - name: Download trusted Mobench CLI + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: provekit-v1-web-cargo-mobench + path: trusted-bin + - name: Download immutable WASM bundle + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: provekit-v1-web-bundle + path: bundle + - name: Start local static server + shell: bash + run: | + set -euo pipefail + python3 -m http.server 4173 --bind 127.0.0.1 \ + --directory "bundle/${{ matrix.workload.slug }}/web" \ + > "$RUNNER_TEMP/mobench-web-server.log" 2>&1 & + echo "MOBENCH_WEB_SERVER_PID=$!" >> "$GITHUB_ENV" + for _ in {1..20}; do + curl --fail --silent http://127.0.0.1:4173/ >/dev/null && exit 0 + sleep 1 + done + exit 1 + - name: Configure BrowserStack credentials + uses: browserstack/github-actions/setup-env@93aebce225b754566349151c0676b26b005e591b + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + - name: Start BrowserStack Local + uses: browserstack/github-actions/setup-local@93aebce225b754566349151c0676b26b005e591b + with: + local-testing: start + local-logging-level: all-logs + local-identifier: random + local-args: --force-local + - name: Run browser benchmark + id: run-web + shell: bash + env: + BROWSER: ${{ matrix.environment.browser }} + BROWSER_VERSION: ${{ matrix.environment.browser_version }} + TARGET_OS: ${{ matrix.environment.os }} + OS_VERSION: ${{ matrix.environment.os_version }} + DEVICE: ${{ matrix.environment.device }} + FUNCTION: ${{ matrix.workload.function }} + WORKLOAD_SLUG: ${{ matrix.workload.slug }} + ENVIRONMENT_SLUG: ${{ matrix.environment.slug }} + ITERATIONS: ${{ inputs.iterations }} + WARMUP: ${{ inputs.warmup }} + HEAD_SHA: ${{ needs.validate-web-request.outputs.head_sha }} + run: | + set -euo pipefail + chmod +x trusted-bin/cargo-mobench + mkdir -p results + build_name="provekit-v1-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}" + session_name="${WORKLOAD_SLUG}-${ENVIRONMENT_SLUG}" + printf 'MOBENCH_BUILD_NAME=%s\nMOBENCH_SESSION_NAME=%s\n' \ + "$build_name" "$session_name" >> "$GITHUB_ENV" + args=( + run-web + --url http://127.0.0.1:4173/ + --function "$FUNCTION" + --iterations "$ITERATIONS" + --warmup "$WARMUP" + --browser "$BROWSER" + --os-version "$OS_VERSION" + --local-identifier "$BROWSERSTACK_LOCAL_IDENTIFIER" + --script-timeout-secs 3600 + --page-load-timeout-secs 300 + --build-name "$build_name" + --session-name "$session_name" + --output "results/${WORKLOAD_SLUG}-${ENVIRONMENT_SLUG}.json" + ) + [ -z "$BROWSER_VERSION" ] || args+=(--browser-version "$BROWSER_VERSION") + [ -z "$TARGET_OS" ] || args+=(--os "$TARGET_OS") + [ -z "$DEVICE" ] || args+=(--device "$DEVICE") + trusted-bin/cargo-mobench "${args[@]}" + - name: Capture benchmark provenance + if: always() + shell: bash + env: + FUNCTION: ${{ matrix.workload.function }} + WORKLOAD_SLUG: ${{ matrix.workload.slug }} + ENVIRONMENT_SLUG: ${{ matrix.environment.slug }} + ENVIRONMENT_LABEL: ${{ matrix.environment.label }} + HEAD_SHA: ${{ needs.validate-web-request.outputs.head_sha }} + BUNDLE_DIGEST: ${{ needs.prepare-web.outputs.artifact_digest }} + RUN_OUTCOME: ${{ steps.run-web.outcome }} + run: | + set -euo pipefail + mkdir -p results + builds="$RUNNER_TEMP/browserstack-builds.json" + sessions="$RUNNER_TEMP/browserstack-sessions.json" + build_id="" + session_id="" + if curl --fail --silent --show-error \ + --user "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ + "https://api.browserstack.com/automate/builds.json?limit=100" > "$builds"; then + build_id="$( + jq -r --arg name "${MOBENCH_BUILD_NAME:-}" \ + '[.[] | .automation_build | select(.name == $name)][0].hashed_id // ""' \ + "$builds" + )" + fi + if [ -n "$build_id" ] && curl --fail --silent --show-error \ + --user "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ + "https://api.browserstack.com/automate/builds/${build_id}/sessions.json?limit=100" \ + > "$sessions"; then + session_id="$( + jq -r --arg name "${MOBENCH_SESSION_NAME:-}" \ + '[.[] | .automation_session | select(.name == $name)][0].hashed_id // ""' \ + "$sessions" + )" + fi + jq -n \ + --arg source_sha "$HEAD_SHA" \ + --arg bundle_digest "$BUNDLE_DIGEST" \ + --arg function "$FUNCTION" \ + --arg environment "$ENVIRONMENT_LABEL" \ + --arg build_name "${MOBENCH_BUILD_NAME:-}" \ + --arg session_name "${MOBENCH_SESSION_NAME:-}" \ + --arg build_id "$build_id" \ + --arg session_id "$session_id" \ + --arg outcome "$RUN_OUTCOME" \ + '{ + schema_version: 1, + source_sha: $source_sha, + bundle_digest: $bundle_digest, + function: $function, + environment: $environment, + wasm_threads: 1, + browserstack: { + build_name: $build_name, + session_name: $session_name, + build_id: (if $build_id == "" then null else $build_id end), + session_id: (if $session_id == "" then null else $session_id end) + }, + outcome: $outcome + }' > "results/${WORKLOAD_SLUG}-${ENVIRONMENT_SLUG}.provenance.json" + - name: Stop BrowserStack Local + if: always() + uses: browserstack/github-actions/setup-local@93aebce225b754566349151c0676b26b005e591b + with: + local-testing: stop + - name: Stop local static server + if: always() + shell: bash + run: | + if [ -n "${MOBENCH_WEB_SERVER_PID:-}" ]; then + kill "$MOBENCH_WEB_SERVER_PID" 2>/dev/null || true + fi + - name: Upload browser evidence + if: always() + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: provekit-v1-web-${{ matrix.workload.slug }}-${{ matrix.environment.slug }} + path: | + results/*.json + ${{ runner.temp }}/mobench-web-server.log + if-no-files-found: warn + retention-days: 30 + + browser-web-complete: + name: ProveKit V1 WASM benchmark matrix + needs: [prepare-web, browser-web] + if: always() + runs-on: ubuntu-latest + steps: + - name: Require bundle and all browser lanes + env: + PREPARE_RESULT: ${{ needs.prepare-web.result }} + BROWSER_RESULT: ${{ needs.browser-web.result }} + run: | + test "$PREPARE_RESULT" = success + test "$BROWSER_RESULT" = success diff --git a/.gitignore b/.gitignore index b512e0c0e..fd1e57ed4 100644 --- a/.gitignore +++ b/.gitignore @@ -20,11 +20,20 @@ artifacts/ # Don't ignore benchmarking artifacts !tooling/provekit-bench/benches/* +!benchmarks/v1/**/*.json +benchmarks/v1/**/node_modules/ +benchmarks/v1/**/node_modules +benchmarks/v1/**/screenlog.* +benchmarks/v1/wasm/generated/ +benchmarks/v1/wasm/dist/ +benchmarks/v1/wasm/v1-wasm-pkg/ +benchmarks/v1/wasm/v1-wasm-pkg-*/ # Generated by Cargo # will have compiled files and executables debug/ target/ +bench-mobile/generated/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html @@ -48,4 +57,4 @@ target/ circuit_stats_examples/ # logs for passport circuit benchmarks -noir-examples/noir-passport/merkle_age_check/benchmark-inputs/logs/ \ No newline at end of file +noir-examples/noir-passport/merkle_age_check/benchmark-inputs/logs/ diff --git a/Cargo.lock b/Cargo.lock index 3ba30efd1..d51adeac3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -608,13 +608,18 @@ name = "bench-mobile" version = "0.1.0" dependencies = [ "anyhow", + "base64", + "chkstk_stub", + "flate2", "inventory", "libc", "mobench-sdk", + "postcard", "provekit-common", "provekit-prover", "provekit-r1cs-compiler", "provekit-verifier", + "provekit_acir", "provekit_noirc_abi", "provekit_noirc_artifacts", "rayon", @@ -841,6 +846,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chkstk_stub" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047f6ab2f3b9bcaf23b593d1580898e4244d27eadf1a1fae99212ee5735d3d1c" +dependencies = [ + "cc", +] + [[package]] name = "chrono" version = "0.4.44" @@ -2907,9 +2921,8 @@ dependencies = [ [[package]] name = "mobench-macros" -version = "0.1.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a202bc64289731f6761ad9d056fa9d084808aecb17d0c1d7ac98765bcf3e92" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" dependencies = [ "proc-macro2", "quote", @@ -2918,9 +2931,8 @@ dependencies = [ [[package]] name = "mobench-sdk" -version = "0.1.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6b1083cdd1e6a79ab3396a14e26a6fa472a60366bd37b9f2dce9a9eaa2d21f" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" dependencies = [ "inventory", "libc", @@ -2928,6 +2940,7 @@ dependencies = [ "serde", "serde_json", "thiserror 1.0.69", + "wasm-bindgen", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3fd76fe0c..e54540450 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,13 +117,14 @@ base64 = "0.22.1" bytes = "1.10.1" ciborium = "0.2.2" chrono = "0.4.41" +chkstk_stub = "=0.1.0" # On CI divan get replaced by divan = { package = "codspeed-divan-compat", version = "3.0.1" } for benchmark tracking. # This is a workaround because different package selection based on target does not mix well with workspace dependencies. divan = "0.1.21" hex = "0.4.3" itertools = "0.14.0" inventory = "0.3" -mobench-sdk = { version = "0.1.47", default-features = false, features = ["registry"] } +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8", default-features = false, features = ["registry"] } paste = "1.0.15" postcard = { version = "1.1.1", features = ["use-std"] } primitive-types = "0.13.1" diff --git a/bench-mobile/Cargo.toml b/bench-mobile/Cargo.toml index 73c90bd9f..af6cd3db5 100644 --- a/bench-mobile/Cargo.toml +++ b/bench-mobile/Cargo.toml @@ -13,6 +13,10 @@ description = "Mobile benchmarks for ProveKit Noir passport proving" [features] default = [] fixture-tests = [] +web-oprf = [] +web-passport-complete = [] +web-passport-fragmented = [] +web-webauthn = [] [package.metadata.cargo-machete] ignored = ["inventory"] @@ -21,6 +25,7 @@ ignored = ["inventory"] crate-type = ["lib", "cdylib", "staticlib"] [dependencies] +acir.workspace = true anyhow.workspace = true inventory.workspace = true mobench-sdk.workspace = true @@ -30,6 +35,7 @@ provekit-common.workspace = true provekit-prover.workspace = true provekit-r1cs-compiler.workspace = true provekit-verifier.workspace = true +postcard.workspace = true rayon.workspace = true serde.workspace = true serde_json.workspace = true @@ -38,5 +44,15 @@ thiserror = "1.0" [target.'cfg(unix)'.dependencies] libc = "0.2" +[build-dependencies] +base64.workspace = true +chkstk_stub.workspace = true +flate2 = "1.1" +serde_json.workspace = true + [lints] workspace = true + +[[example]] +name = "export-wasm-witness" +path = "examples/export_wasm_witness.rs" diff --git a/bench-mobile/build.rs b/bench-mobile/build.rs index cf6605029..210504f0e 100644 --- a/bench-mobile/build.rs +++ b/bench-mobile/build.rs @@ -1,6 +1,11 @@ -use std::{ - env, fs, io, - path::{Path, PathBuf}, +use { + base64::Engine, + flate2::{write::DeflateEncoder, Compression}, + std::{ + env, fs, + io::{self, Write}, + path::{Path, PathBuf}, + }, }; struct FixtureArtifact { @@ -36,12 +41,24 @@ const FIXTURE_ARTIFACTS: &[FixtureArtifact] = &[ output_file: "oprf.json", source_target_rel: "noir-examples/oprf/target/oprf.json", }, + FixtureArtifact { + output_file: "passport_p1.json", + source_target_rel: "target/v1-benchmarks/passport-p1-beta11/target/passport_p1.json", + }, FixtureArtifact { output_file: "p256.json", source_target_rel: "noir-examples/p256_bigcurve/target/p256.json", }, + FixtureArtifact { + output_file: "webauthn_assertion.json", + source_target_rel: "benchmarks/v1/noir/webauthn_assertion/target/webauthn_assertion.json", + }, ]; +const COMPLETE_AGE_CHECK_INPUT: &str = "complete_age_check.Prover.toml"; +const OPRF_INPUT: &str = "oprf.Prover.toml"; +const PASSPORT_P1_INPUT: &str = "passport_p1.Prover.toml"; + fn copy_if_present(from: &Path, to: &Path) -> io::Result { if from.exists() { fs::copy(from, to)?; @@ -55,7 +72,43 @@ fn env_flag_enabled(name: &str) -> bool { env::var_os(name).is_some_and(|value| value != "0" && value != "false") } +fn strip_host_width_debug_symbols(path: &Path) { + let contents = fs::read_to_string(path).expect("read mobile benchmark artifact"); + let mut artifact: serde_json::Value = + serde_json::from_str(&contents).expect("deserialize mobile benchmark artifact JSON"); + let mut encoder = DeflateEncoder::new(Vec::new(), Compression::default()); + encoder + .write_all(br#"{"debug_infos":[]}"#) + .expect("compress empty Noir debug metadata"); + let compressed = encoder.finish().expect("finish empty Noir debug metadata"); + artifact["debug_symbols"] = + serde_json::Value::String(base64::prelude::BASE64_STANDARD.encode(compressed)); + fs::write( + path, + serde_json::to_vec(&artifact).expect("serialize mobile benchmark artifact"), + ) + .expect("write 32-bit-safe mobile benchmark artifact"); +} + +fn require_provekit_noir_version(path: &Path) { + let contents = fs::read_to_string(path).expect("read mobile benchmark artifact"); + let artifact: serde_json::Value = + serde_json::from_str(&contents).expect("deserialize mobile benchmark artifact JSON"); + let version = artifact["noir_version"] + .as_str() + .expect("mobile benchmark artifact must declare noir_version"); + assert!( + version.starts_with("1.0.0-beta.11+"), + "{} was compiled by incompatible Noir {}; ProveKit V1 requires beta.11 artifacts", + path.display(), + version + ); +} + fn main() { + if env::var("TARGET").is_ok_and(|target| target.contains("apple-ios")) { + chkstk_stub::build(); + } let manifest_dir = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR")); let workspace_dir = manifest_dir @@ -64,15 +117,48 @@ fn main() { .to_path_buf(); let out_dir = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR")).join("bench_mobile_fixtures"); - let artifact_dir = env::var_os("PROVEKIT_MOBILE_BENCH_ARTIFACT_DIR").map(PathBuf::from); + let frozen_artifact_dir = workspace_dir.join("target/v1-benchmarks/provekit-beta11-artifacts"); + let artifact_dir = env::var_os("PROVEKIT_MOBILE_BENCH_ARTIFACT_DIR") + .map(PathBuf::from) + .or_else(|| frozen_artifact_dir.is_dir().then_some(frozen_artifact_dir)); let require_artifacts = env_flag_enabled("PROVEKIT_REQUIRE_MOBILE_BENCH_ARTIFACTS") || env_flag_enabled("MOBENCH_CI_PREPARE"); + let target_pointer_width = + env::var("CARGO_CFG_TARGET_POINTER_WIDTH").expect("CARGO_CFG_TARGET_POINTER_WIDTH"); println!("cargo:rerun-if-env-changed=PROVEKIT_REQUIRE_MOBILE_BENCH_ARTIFACTS"); println!("cargo:rerun-if-env-changed=MOBENCH_CI_PREPARE"); fs::create_dir_all(&out_dir).expect("create generated fixture output dir"); + for (output_name, source_rel) in [ + ( + COMPLETE_AGE_CHECK_INPUT, + "noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml", + ), + (OPRF_INPUT, "noir-examples/oprf/Prover.toml"), + ( + PASSPORT_P1_INPUT, + "target/v1-benchmarks/passport-p1-beta11/Prover.toml", + ), + ] { + let frozen_input = artifact_dir.as_ref().map(|dir| dir.join(output_name)); + let source_input = workspace_dir.join(source_rel); + let selected_input = frozen_input + .as_ref() + .filter(|path| path.is_file()) + .unwrap_or(&source_input); + if require_artifacts && frozen_input.as_ref().is_none_or(|path| !path.is_file()) { + let expected = frozen_input + .as_ref() + .map_or_else(|| "".to_owned(), |path| path.display().to_string()); + panic!("missing required frozen beta.11 input at {expected}"); + } + fs::copy(selected_input, out_dir.join(output_name)) + .unwrap_or_else(|error| panic!("copy {output_name}: {error}")); + println!("cargo:rerun-if-changed={}", selected_input.display()); + } + for artifact in FIXTURE_ARTIFACTS { let out_path = out_dir.join(artifact.output_file); let mut copied = false; @@ -107,5 +193,18 @@ fn main() { } fs::write(&out_path, "{}\n").expect("write placeholder mobile benchmark artifact"); } + + if copied && target_pointer_width == "32" { + // Noir debug metadata contains host-sized `usize` ranges. Nargo + // emits those ranges on the 64-bit preparation host, and serde + // rejects them when a 32-bit device decodes the artifact. Debug + // symbols are not consumed by proving or verification, so omit + // them only from 32-bit benchmark bundles while preserving the + // ABI, bytecode, circuit hash, and witness inputs. + strip_host_width_debug_symbols(&out_path); + } + if copied { + require_provekit_noir_version(&out_path); + } } } diff --git a/bench-mobile/examples/export_wasm_witness.rs b/bench-mobile/examples/export_wasm_witness.rs new file mode 100644 index 000000000..df3eca5e7 --- /dev/null +++ b/bench-mobile/examples/export_wasm_witness.rs @@ -0,0 +1,39 @@ +//! Generate a deterministic witness outside browser benchmark measurement. + +use { + anyhow::{bail, Context, Result}, + noirc_artifacts::program::ProgramArtifact, + provekit_common::{Format, NoirProofScheme, Prover}, + provekit_prover::Prove, + provekit_r1cs_compiler::NoirProofSchemeBuilder, + std::{env, fs, path::PathBuf}, +}; + +fn main() -> Result<()> { + let mut args = env::args_os().skip(1); + let program_path = PathBuf::from(args.next().context("missing compiled program path")?); + let input_path = PathBuf::from(args.next().context("missing Prover.toml path")?); + let output_path = PathBuf::from(args.next().context("missing witness output path")?); + if args.next().is_some() { + bail!("expected exactly three paths"); + } + + let program: ProgramArtifact = + serde_json::from_slice(&fs::read(&program_path)?).context("deserializing Noir program")?; + let scheme = NoirProofScheme::from_program(program).context("preparing proof scheme")?; + let input = fs::read_to_string(&input_path).context("reading Prover.toml")?; + let input_map = Format::Toml + .parse(&input, &scheme.witness_generator.abi) + .context("parsing Prover.toml")?; + let mut prover = Prover::from_noir_proof_scheme(scheme); + let witness = prover + .generate_witness(input_map) + .context("generating witness")?; + let encoded = postcard::to_stdvec(&witness).context("serializing witness")?; + + if let Some(parent) = output_path.parent() { + fs::create_dir_all(parent)?; + } + fs::write(output_path, encoded)?; + Ok(()) +} diff --git a/bench-mobile/scripts/generate-fixtures.sh b/bench-mobile/scripts/generate-fixtures.sh index b82f6d850..4e2b4dc90 100755 --- a/bench-mobile/scripts/generate-fixtures.sh +++ b/bench-mobile/scripts/generate-fixtures.sh @@ -6,27 +6,24 @@ if [[ "${MOBENCH_CI_PREPARE:-}" != "1" ]]; then exit 1 fi -noir_version="v1.0.0-beta.11" -if ! command -v noirup >/dev/null 2>&1; then - curl --fail --location --proto '=https' --tlsv1.2 \ - https://raw.githubusercontent.com/noir-lang/noirup/dedc07043b6ae9a680a19c7394847a58e404cbba/install | bash - export PATH="$HOME/.nargo/bin:$PATH" -fi -noirup --version "$noir_version" -command -v nargo >/dev/null 2>&1 || { - echo "nargo was not installed by noirup $noir_version" >&2 - exit 1 -} - repo_root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" +"${repo_root}/benchmarks/v1/scripts/bootstrap-webauthn-source.sh" +nargo_bin="$( + V1_NARGO_LOCK_KEY=noir_provekit \ + "${repo_root}/benchmarks/v1/scripts/bootstrap-nargo.sh" +)" compile_fixture() { local circuit_dir="$1" local aggregate_target_dir="${2:-}" + local nargo_home="${3:-}" echo "Generating Noir artifact in ${circuit_dir}" ( cd "${repo_root}/${circuit_dir}" - nargo compile --skip-brillig-constraints-check --force + if [[ -n "${nargo_home}" ]]; then + export HOME="${nargo_home}" + fi + "${nargo_bin}" compile --skip-brillig-constraints-check --force ) if [[ -n "${aggregate_target_dir}" ]]; then @@ -52,7 +49,7 @@ compile_oprf_benchmark_fixture() ( ( cd "${fixture_dir}" - nargo compile --skip-brillig-constraints-check --force + "${nargo_bin}" compile --skip-brillig-constraints-check --force ) mkdir -p "${source_dir}/target" @@ -70,3 +67,20 @@ compile_fixture "noir-examples/noir-passport/merkle_age_check/t_attest" \ "noir-examples/noir-passport/merkle_age_check/target" compile_oprf_benchmark_fixture compile_fixture "noir-examples/p256_bigcurve" +if [[ "${PROVEKIT_REUSE_WEBAUTHN_FIXTURE:-}" != "1" ]] && command -v bun >/dev/null 2>&1; then + ( + cd "${repo_root}/benchmarks/v1/noir/webauthn_assertion" + bun install --frozen-lockfile + bun run fixture + ) +else + for fixture in Prover.toml inputs.json; do + if [[ ! -s "${repo_root}/benchmarks/v1/noir/webauthn_assertion/${fixture}" ]]; then + echo "error: Bun is unavailable and checked-in WebAuthn ${fixture} is missing" >&2 + exit 1 + fi + done + echo "Bun unavailable; using checked-in deterministic WebAuthn input fixture" +fi +compile_fixture "benchmarks/v1/noir/webauthn_assertion" "" \ + "${V1_BENCHMARK_NARGO_HOME:-${repo_root}/target/v1-benchmarks/nargo-home}" diff --git a/bench-mobile/scripts/prepare-web-benchmarks.sh b/bench-mobile/scripts/prepare-web-benchmarks.sh new file mode 100755 index 000000000..ee37fadf5 --- /dev/null +++ b/bench-mobile/scripts/prepare-web-benchmarks.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ "${MOBENCH_CI_PREPARE:-}" != "1" ]]; then + echo "MOBENCH_CI_PREPARE=1 is required to prepare browser benchmarks" >&2 + exit 1 +fi + +repo_root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" +generated_dir="${repo_root}/bench-mobile/generated/wasm" + +"${repo_root}/bench-mobile/scripts/generate-fixtures.sh" +mkdir -p "${generated_dir}" + +export_witness() { + local program_path="$1" + local input_path="$2" + local output_name="$3" + cargo run --release -p bench-mobile --example export-wasm-witness -- \ + "${repo_root}/${program_path}" \ + "${repo_root}/${input_path}" \ + "${generated_dir}/${output_name}.witness.postcard" +} + +export_witness \ + noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json \ + noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml \ + complete_age_check +export_witness \ + noir-examples/noir-passport/merkle_age_check/target/t_add_dsc_720.json \ + noir-examples/noir-passport/merkle_age_check/benchmark-inputs/tbs_720/t_add_dsc_720.toml \ + t_add_dsc_720 +export_witness \ + noir-examples/noir-passport/merkle_age_check/target/t_add_id_data_720.json \ + noir-examples/noir-passport/merkle_age_check/benchmark-inputs/tbs_720/t_add_id_data_720.toml \ + t_add_id_data_720 +export_witness \ + noir-examples/noir-passport/merkle_age_check/target/t_add_integrity_commit.json \ + noir-examples/noir-passport/merkle_age_check/benchmark-inputs/tbs_720/t_add_integrity_commit.toml \ + t_add_integrity_commit +export_witness \ + noir-examples/noir-passport/merkle_age_check/target/t_attest.json \ + noir-examples/noir-passport/merkle_age_check/benchmark-inputs/tbs_720/t_attest.toml \ + t_attest +export_witness \ + benchmarks/v1/noir/webauthn_assertion/target/webauthn_assertion.json \ + benchmarks/v1/noir/webauthn_assertion/Prover.toml \ + webauthn_assertion +export_witness \ + noir-examples/oprf/target/oprf.json \ + noir-examples/oprf/Prover.toml \ + oprf + +python3 - "${repo_root}" <<'PY' +from pathlib import Path +import sys + +root = Path(sys.argv[1]) +manifest = root / "Cargo.toml" +text = manifest.read_text() +old = 'provekit-prover = { path = "provekit/prover", version = "1.0.0" }' +new = ( + 'provekit-prover = { path = "provekit/prover", version = "1.0.0", ' + 'default-features = false }' +) +if text.count(old) != 1: + raise SystemExit("unexpected provekit-prover workspace dependency") +text = text.replace(old, new) +for member in ( + "tooling/cli", + "tooling/provekit-bench", + "tooling/provekit-ffi", + "tooling/provekit-gnark", + "tooling/provekit-wasm", + "tooling/verifier-server", +): + entry = f' "{member}",\n' + if text.count(entry) != 1: + raise SystemExit(f"unexpected ProveKit workspace member: {member}") + text = text.replace(entry, "") +manifest.write_text(text) + +bench_manifest = root / "bench-mobile/Cargo.toml" +text = bench_manifest.read_text() +old = '[lib]\ncrate-type = ["lib", "cdylib", "staticlib"]' +new = '[lib]\npath = "src/lib_web.rs"\ncrate-type = ["lib", "cdylib", "staticlib"]' +if text.count(old) != 1: + raise SystemExit("unexpected bench-mobile lib target") +text = text.replace(old, new) +old = "default = []\n" +new = 'default = ["web-passport-complete"]\n' +if text.count(old) != 1: + raise SystemExit("unexpected bench-mobile default features") +text = text.replace(old, new) +old = "provekit-prover.workspace = true\n" +if text.count(old) != 1: + raise SystemExit("unexpected bench-mobile prover dependency") +text = text.replace(old, "") +text += ( + '\n[target.\'cfg(not(target_arch = "wasm32"))\'.dependencies]\n' + 'provekit-prover = { workspace = true, features = ["witness-generation", "parallel"] }\n' + '\n[target.\'cfg(target_arch = "wasm32")\'.dependencies]\n' + 'provekit-prover.workspace = true\n' +) +bench_manifest.write_text(text) +PY + +# Mobench 0.1.48's browser runtime uses the wasm-bindgen 0.2.113 family. +# Removing unrelated server/tooling workspace members above releases their +# older exact js-sys pins so the browser crate can resolve the matching family. +cargo update -p js-sys --precise 0.3.90 diff --git a/bench-mobile/src/examples.rs b/bench-mobile/src/examples.rs index f2f582ab2..0de82ab5e 100644 --- a/bench-mobile/src/examples.rs +++ b/bench-mobile/src/examples.rs @@ -15,16 +15,35 @@ const COMPLETE_AGE_CHECK_TOML: &str = include_str!("../../noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml"); const OPRF_PROGRAM: &str = include_str!(concat!(env!("OUT_DIR"), "/bench_mobile_fixtures/oprf.json")); -const OPRF_TOML: &str = include_str!("../../noir-examples/oprf/Prover.toml"); +const OPRF_TOML: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/oprf.Prover.toml" +)); +const PASSPORT_P1_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/passport_p1.json" +)); +const PASSPORT_P1_TOML: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/passport_p1.Prover.toml" +)); const P256_BIGCURVE_PROGRAM: &str = include_str!(concat!(env!("OUT_DIR"), "/bench_mobile_fixtures/p256.json")); const P256_BIGCURVE_TOML: &str = include_str!("../../noir-examples/p256_bigcurve/Prover.toml"); +const WEBAUTHN_ASSERTION_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/webauthn_assertion.json" +)); +const WEBAUTHN_ASSERTION_TOML: &str = + include_str!("../../benchmarks/v1/noir/webauthn_assertion/Prover.toml"); #[derive(Clone, Copy)] pub enum MobileBenchFixture { CompleteAgeCheck, Oprf, + PassportP1, P256Bigcurve, + WebauthnAssertion, } impl MobileBenchFixture { @@ -32,7 +51,9 @@ impl MobileBenchFixture { match self { Self::CompleteAgeCheck => "complete_age_check", Self::Oprf => "oprf", + Self::PassportP1 => "passport_p1", Self::P256Bigcurve => "p256_bigcurve", + Self::WebauthnAssertion => "webauthn_assertion", } } @@ -40,7 +61,9 @@ impl MobileBenchFixture { match self { Self::CompleteAgeCheck => COMPLETE_AGE_CHECK_PROGRAM, Self::Oprf => OPRF_PROGRAM, + Self::PassportP1 => PASSPORT_P1_PROGRAM, Self::P256Bigcurve => P256_BIGCURVE_PROGRAM, + Self::WebauthnAssertion => WEBAUTHN_ASSERTION_PROGRAM, } } @@ -48,7 +71,9 @@ impl MobileBenchFixture { match self { Self::CompleteAgeCheck => COMPLETE_AGE_CHECK_TOML, Self::Oprf => OPRF_TOML, + Self::PassportP1 => PASSPORT_P1_TOML, Self::P256Bigcurve => P256_BIGCURVE_TOML, + Self::WebauthnAssertion => WEBAUTHN_ASSERTION_TOML, } } } @@ -84,3 +109,21 @@ pub fn fixture_end_to_end_smoke(fixture: MobileBenchFixture) -> Result<()> { let _verified = verify_fixture(verified)?; Ok(()) } + +#[cfg(test)] +mod tests { + use super::{prepare_fixture, MobileBenchFixture}; + + #[test] + fn embedded_campaign_artifacts_deserialize_with_provekit_noir() { + for fixture in [ + MobileBenchFixture::CompleteAgeCheck, + MobileBenchFixture::Oprf, + MobileBenchFixture::PassportP1, + MobileBenchFixture::WebauthnAssertion, + ] { + prepare_fixture(fixture) + .unwrap_or_else(|error| panic!("failed to prepare {}: {error:#}", fixture.name())); + } + } +} diff --git a/bench-mobile/src/in_process.rs b/bench-mobile/src/in_process.rs index 27f06cafa..b62026ffe 100644 --- a/bench-mobile/src/in_process.rs +++ b/bench-mobile/src/in_process.rs @@ -1,5 +1,7 @@ //! Safe in-process helpers for mobile benchmark fixtures. +#[cfg(any(target_os = "android", target_os = "linux"))] +use std::fs; use { anyhow::{Context, Result}, noirc_abi::{input_parser::Format, InputMap}, @@ -8,8 +10,60 @@ use { provekit_prover::Prove, provekit_r1cs_compiler::NoirProofSchemeBuilder, provekit_verifier::Verify, + std::sync::Arc, }; +/// Resident and swapped process memory reported by Linux/Android. +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] +pub struct ProcessMemory { + pub rss_kb: u64, + pub swap_kb: u64, +} + +/// Read the current Linux/Android process memory counters. +#[must_use] +pub fn process_memory() -> ProcessMemory { + #[cfg(any(target_os = "android", target_os = "linux"))] + { + let Ok(status) = fs::read_to_string("/proc/self/status") else { + return ProcessMemory::default(); + }; + let value = |name: &str| { + status + .lines() + .find_map(|line| { + let (key, value) = line.split_once(':')?; + (key == name).then(|| { + value + .split_whitespace() + .next() + .and_then(|value| value.parse().ok()) + .unwrap_or_default() + }) + }) + .unwrap_or_default() + }; + ProcessMemory { + rss_kb: value("VmRSS"), + swap_kb: value("VmSwap"), + } + } + #[cfg(not(any(target_os = "android", target_os = "linux")))] + { + ProcessMemory::default() + } +} + +/// Emit a stable raw-log checkpoint for allocator recovery diagnosis. +pub fn log_process_memory(label: &str) -> ProcessMemory { + let memory = process_memory(); + eprintln!( + "PROVEKIT_E15_MEMORY phase={label} rss_kb={} swap_kb={}", + memory.rss_kb, memory.swap_kb + ); + memory +} + /// Ask platform allocator return free pages OS large /// proof allocation burst. pub fn trim_process_memory() { @@ -46,7 +100,93 @@ pub struct PreparedNoirProver { input_map: InputMap, } +/// Prover-only state plus a compressed serialization of its exact matching +/// verifier. +#[derive(Clone)] +pub struct PreparedNoirProverWithSerializedVerifier { + name: String, + prover: Prover, + input_map: InputMap, + verifier_bytes: Arc<[u8]>, +} + +/// Generated proof plus compressed verifier bytes, ready for an out-of-band +/// correctness gate after the measured proof interval. +pub struct ProvedNoirProgramWithSerializedVerifier { + name: String, + proof: NoirProof, + verifier_bytes: Arc<[u8]>, +} + +/// Compact exact-match proving bundle retained between benchmark iterations. +/// +/// This avoids rebuilding the Noir-to-R1CS scheme and recompressing the +/// prover/verifier on every low-memory Android sample. +#[derive(Clone)] +pub struct FrozenNoirProgram { + name: String, + prover_bytes: Vec, + verifier_bytes: Arc<[u8]>, + input_map: InputMap, + input_size: usize, +} + +impl FrozenNoirProgram { + /// Serialize the exact prepared prover, verifier, and parsed witness input. + pub fn from_prepared(prepared: PreparedNoirProgram) -> Result { + let PreparedNoirProgram { + name, + prover, + verifier, + input_map, + } = prepared; + let prover_bytes = provekit_common::file::serialize(&prover) + .with_context(|| format!("while freezing {name} benchmark prover"))?; + let verifier_bytes = provekit_common::file::serialize(&verifier) + .with_context(|| format!("while freezing {name} benchmark verifier"))?; + let input_size = postcard::to_stdvec(&input_map) + .with_context(|| format!("while freezing {name} benchmark input"))?; + Ok(Self { + name, + prover_bytes, + verifier_bytes: verifier_bytes.into(), + input_map, + input_size: input_size.len(), + }) + } + + /// Hydrate only the prover and witness input for one proof iteration. + pub fn load_prover_with_serialized_verifier( + &self, + ) -> Result { + let prover = provekit_common::file::deserialize(&self.prover_bytes) + .with_context(|| format!("while loading frozen {} benchmark prover", self.name))?; + Ok(PreparedNoirProverWithSerializedVerifier { + name: self.name.clone(), + prover, + input_map: self.input_map.clone(), + verifier_bytes: self.verifier_bytes.clone(), + }) + } + + /// Return exact payload sizes without serializing expanded proving state. + #[must_use] + pub fn proving_payload_sizes(&self) -> (usize, usize) { + (self.prover_bytes.len(), self.input_size) + } +} + impl PreparedNoirProver { + /// Return the exact serialized PKP and witness-input payload sizes used by + /// the proof-only benchmark. + pub fn proving_payload_sizes(&self) -> Result<(usize, usize)> { + let prover = provekit_common::file::serialize(&self.prover) + .with_context(|| format!("while serializing {} benchmark prover", self.name))?; + let input = postcard::to_stdvec(&self.input_map) + .with_context(|| format!("while serializing {} benchmark input", self.name))?; + Ok((prover.len(), input.len())) + } + /// Generate a proof from state already stripped of verifier allocations. pub fn prove(self) -> Result { self.prover @@ -55,7 +195,77 @@ impl PreparedNoirProver { } } +impl PreparedNoirProverWithSerializedVerifier { + /// Return the exact PKP and witness-input sizes; verifier bytes are not a + /// proving input and are deliberately excluded. + pub fn proving_payload_sizes(&self) -> Result<(usize, usize)> { + let prover = provekit_common::file::serialize(&self.prover) + .with_context(|| format!("while serializing {} benchmark prover", self.name))?; + let input = postcard::to_stdvec(&self.input_map) + .with_context(|| format!("while serializing {} benchmark input", self.name))?; + Ok((prover.len(), input.len())) + } + + /// Generate a proof without retaining the expanded verifier in memory. + pub fn prove(self) -> Result { + let proof = self + .prover + .prove(self.input_map) + .with_context(|| format!("while proving {} benchmark fixture", self.name))?; + Ok(ProvedNoirProgramWithSerializedVerifier { + name: self.name, + proof, + verifier_bytes: self.verifier_bytes, + }) + } +} + +impl ProvedNoirProgramWithSerializedVerifier { + /// Return the generated proof for exact serialized-size accounting. + pub fn proof(&self) -> &NoirProof { + &self.proof + } + + /// Rehydrate the exact matching verifier, accept the valid proof, and + /// reject a transcript mutation outside the measured proof interval. + pub fn verify_and_reject_tampered(self) -> Result<()> { + log_process_memory("before_verifier_hydration"); + let mut verifier: Verifier = + provekit_common::file::deserialize(self.verifier_bytes.as_ref()) + .with_context(|| format!("while deserializing {} benchmark verifier", self.name))?; + log_process_memory("after_verifier_hydration"); + verifier + .verify(&self.proof) + .with_context(|| format!("while verifying {} benchmark proof", self.name))?; + + let mut tampered = self.proof; + let byte = tampered + .whir_r1cs_proof + .narg_string + .first_mut() + .context("proof transcript must not be empty")?; + *byte ^= 1; + anyhow::ensure!( + verifier.verify(&tampered).is_err(), + "tampered {} benchmark proof was accepted", + self.name + ); + log_process_memory("after_verification_gate"); + Ok(()) + } +} + impl PreparedNoirProgram { + /// Return the exact serialized PKP and witness-input payload sizes used by + /// a benchmark that retains its matching verifier for the correctness gate. + pub fn proving_payload_sizes(&self) -> Result<(usize, usize)> { + let prover = provekit_common::file::serialize(&self.prover) + .with_context(|| format!("while serializing {} benchmark prover", self.name))?; + let input = postcard::to_stdvec(&self.input_map) + .with_context(|| format!("while serializing {} benchmark input", self.name))?; + Ok((prover.len(), input.len())) + } + /// Return R1CS size exposed by prepared prover. pub fn prover_size(&self) -> (usize, usize) { self.prover.size() @@ -106,6 +316,29 @@ impl PreparedNoirProgram { input_map, } } + + /// Serialize the exact matching verifier, then drop its expanded state + /// before the memory-constrained proof begins. + pub fn into_prover_with_serialized_verifier( + self, + ) -> Result { + let Self { + name, + prover, + verifier, + input_map, + } = self; + let verifier_bytes = provekit_common::file::serialize(&verifier) + .with_context(|| format!("while serializing {name} benchmark verifier"))? + .into(); + drop(verifier); + Ok(PreparedNoirProverWithSerializedVerifier { + name, + prover, + input_map, + verifier_bytes, + }) + } } /// Verified-ready proof plus verifier state one Noir benchmark program. @@ -117,6 +350,11 @@ pub struct VerifiedNoirProgram { } impl VerifiedNoirProgram { + /// Return the generated proof for exact serialized-size accounting. + pub fn proof(&self) -> &NoirProof { + &self.proof + } + /// Verify proof matching verifier state. pub fn verify(mut self) -> Result { self.verifier @@ -125,6 +363,30 @@ impl VerifiedNoirProgram { Ok(self) } + + /// Verify the valid proof and require rejection after mutating its + /// transcript. This is a correctness gate and must run outside measured + /// samples. + pub fn verify_and_reject_tampered(mut self) -> Result<()> { + self.verifier + .verify(&self.proof) + .with_context(|| format!("while verifying {} validation canary", self.name))?; + + let mut tampered = self.proof.clone(); + let byte = tampered + .whir_r1cs_proof + .narg_string + .first_mut() + .context("proof transcript must not be empty")?; + *byte ^= 1; + + anyhow::ensure!( + self.verifier.verify(&tampered).is_err(), + "tampered {} validation canary was accepted", + self.name + ); + Ok(()) + } } /// Prepare Noir already-compiled artifact JSON string and @@ -150,3 +412,45 @@ pub fn prepare_noir_program_from_json( input_map, }) } + +/// Verify a proof directly from its Noir artifact and reject a transcript +/// mutation without constructing or retaining a prover. +pub fn verify_noir_proof_from_json( + name: &str, + program_json: &str, + proof: &NoirProof, +) -> Result<()> { + let program: ProgramArtifact = serde_json::from_str(program_json) + .with_context(|| format!("while deserializing {name} verifier artifact"))?; + let scheme = NoirProofScheme::from_program(program) + .with_context(|| format!("while preparing {name} verifier scheme"))?; + let mut verifier = Verifier::from_noir_proof_scheme(scheme); + verifier + .verify(proof) + .with_context(|| format!("while verifying {name} benchmark proof"))?; + + let mut tampered = proof.clone(); + let byte = tampered + .whir_r1cs_proof + .narg_string + .first_mut() + .context("proof transcript must not be empty")?; + *byte ^= 1; + anyhow::ensure!( + verifier.verify(&tampered).is_err(), + "tampered {name} benchmark proof was accepted" + ); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::process_memory; + + #[test] + fn process_memory_reader_is_safe_on_every_host() { + let _memory = process_memory(); + #[cfg(target_os = "linux")] + assert!(_memory.rss_kb > 0); + } +} diff --git a/bench-mobile/src/lib.rs b/bench-mobile/src/lib.rs index b479dbb72..6653ec82b 100644 --- a/bench-mobile/src/lib.rs +++ b/bench-mobile/src/lib.rs @@ -5,14 +5,20 @@ use { prove_complete_age_check_fixture, prove_complete_age_check_fixture_proof_only, prove_fragmented_age_check_fixture_proof_only, verify_complete_age_check_fixture, PreparedCompleteAgeCheckFixture, PreparedCompleteAgeCheckProver, - PreparedFragmentedAgeCheckProvers, VerifiedCompleteAgeCheckFixture, + PreparedCompleteAgeCheckProverWithSerializedVerifier, PreparedFragmentedAgeCheckProvers, + VerifiedCompleteAgeCheckFixture, }, examples::{ MobileBenchFixture, PreparedCircuitFixture, PreparedProverFixture, VerifiedCircuitFixture, }, mobench_sdk::{benchmark, profile_phase}, + provekit_common::{file::serialize, NoirProof}, serde_json::json, - std::hint::black_box, + std::{ + hint::black_box, + sync::{Once, OnceLock}, + time::Instant, + }, }; pub mod examples; @@ -68,48 +74,6 @@ pub enum BenchError { ExecutionFailed { reason: String }, } -#[cfg(target_os = "android")] -fn configure_android_complete_age_check_threads(function: &str) { - use std::sync::Once; - - static INIT: Once = Once::new(); - - if function != "bench_mobile::bench_passport_complete_age_check_prove" { - return; - } - - INIT.call_once(|| { - let threads = std::env::var("PROVEKIT_ANDROID_COMPLETE_AGE_RAYON_THREADS") - .ok() - .and_then(|value| value.parse::().ok()) - .filter(|threads| *threads > 0) - .unwrap_or(1); - - match rayon::ThreadPoolBuilder::new() - .num_threads(threads) - .build_global() - { - Ok(()) => log_benchmark_lifecycle( - "rayon_configured", - function, - 0, - 0, - json!({ "threads": threads }), - ), - Err(error) => log_benchmark_lifecycle( - "rayon_config_skipped", - function, - 0, - 0, - json!({ "threads": threads, "error": error.to_string() }), - ), - } - }); -} - -#[cfg(not(target_os = "android"))] -fn configure_android_complete_age_check_threads(_function: &str) {} - impl From for BenchSpec { fn from(spec: mobench_sdk::BenchSpec) -> Self { Self { @@ -211,19 +175,25 @@ fn log_benchmark_lifecycle( } } +fn benchmark_start_metadata(function: &str) -> serde_json::Value { + // Querying outside a Rayon worker lazily initializes the normal global + // pool when needed; it does not configure or constrain the worker count. + json!({ + "resolved_function": function, + "rayon_threads": rayon::current_num_threads(), + }) +} + pub fn run_benchmark(spec: BenchSpec) -> Result { let function = spec.name.clone(); let iterations = spec.iterations; let warmup = spec.warmup; - configure_android_complete_age_check_threads(&function); log_benchmark_lifecycle( "start", &function, iterations, warmup, - json!({ - "resolved_function": function, - }), + benchmark_start_metadata(&function), ); let sdk_spec: mobench_sdk::BenchSpec = spec.into(); @@ -285,10 +255,48 @@ fn setup_complete_age_check_verified() -> VerifiedCompleteAgeCheckFixture { } fn setup_complete_age_check_prover() -> PreparedCompleteAgeCheckProver { + static VALIDATION_GATE: Once = Once::new(); + VALIDATION_GATE.call_once(|| { + let prepared = passport::prepare_complete_age_check_fixture() + .expect("prepare complete_age_check validation canary"); + let verified = prove_complete_age_check_fixture(prepared) + .expect("prove complete_age_check validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate complete_age_check proof and tamper rejection"); + }); let prover = passport::prepare_complete_age_check_fixture() .expect("prepare complete_age_check fixture") .into_prover_only(); + record_proving_payload(&prover); + in_process::trim_process_memory(); + prover +} + +fn passport_single_thread_pool() -> &'static rayon::ThreadPool { + static SINGLE_THREAD_POOL: OnceLock = OnceLock::new(); + SINGLE_THREAD_POOL.get_or_init(|| { + rayon::ThreadPoolBuilder::new() + .num_threads(1) + .build() + .expect("build single-thread Passport pool") + }) +} + +fn setup_complete_age_check_prover_single_thread( +) -> PreparedCompleteAgeCheckProverWithSerializedVerifier { + in_process::log_process_memory("before_frozen_prover_load"); + let frozen = passport::frozen_complete_age_check_fixture(); + let (prover_size_bytes, input_size_bytes) = frozen.proving_payload_sizes(); + let prover = frozen + .load_prover_with_serialized_verifier() + .expect("load frozen single-thread complete_age_check prover"); + record_proving_payload_sizes(prover_size_bytes, input_size_bytes); + in_process::log_process_memory("after_frozen_prover_load"); in_process::trim_process_memory(); + let memory = in_process::log_process_memory("after_setup_trim"); + mobench_sdk::record_run_u64("passport_setup_rss_kb", memory.rss_kb); + mobench_sdk::record_run_u64("passport_setup_swap_kb", memory.swap_kb); prover } @@ -315,9 +323,44 @@ fn setup_oprf_verified() -> VerifiedCircuitFixture { } fn setup_oprf_prover() -> PreparedProverFixture { + static VALIDATION_GATE: Once = Once::new(); + VALIDATION_GATE.call_once(|| { + let prepared = examples::prepare_fixture(MobileBenchFixture::Oprf) + .expect("prepare oprf validation canary"); + let verified = examples::prove_fixture(prepared).expect("prove oprf validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate oprf proof and tamper rejection"); + }); let prover = examples::prepare_fixture(MobileBenchFixture::Oprf) .expect("prepare oprf fixture") .into_prover_only(); + record_proving_payload(&prover); + in_process::trim_process_memory(); + prover +} + +fn setup_passport_p1_prover() -> PreparedProverFixture { + setup_validated_prover(MobileBenchFixture::PassportP1, &PASSPORT_P1_VALIDATION_GATE) +} + +static PASSPORT_P1_VALIDATION_GATE: Once = Once::new(); + +fn setup_validated_prover( + fixture: MobileBenchFixture, + validation_gate: &'static Once, +) -> PreparedProverFixture { + validation_gate.call_once(|| { + let prepared = examples::prepare_fixture(fixture).expect("prepare validation canary"); + let verified = examples::prove_fixture(prepared).expect("prove validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate proof and tamper rejection"); + }); + let prover = examples::prepare_fixture(fixture) + .expect("prepare input-to-proof fixture") + .into_prover_only(); + record_proving_payload(&prover); in_process::trim_process_memory(); prover } @@ -344,6 +387,86 @@ fn setup_p256_bigcurve_prover() -> PreparedProverFixture { prover } +fn setup_webauthn_assertion_prepared() -> PreparedCircuitFixture { + let prepared = examples::prepare_fixture(MobileBenchFixture::WebauthnAssertion) + .expect("prepare webauthn_assertion fixture"); + in_process::trim_process_memory(); + prepared +} + +fn setup_webauthn_assertion_verified() -> VerifiedCircuitFixture { + let prepared = setup_webauthn_assertion_prepared(); + let verified = examples::prove_fixture(prepared).expect("prove webauthn_assertion fixture"); + in_process::trim_process_memory(); + verified +} + +fn setup_webauthn_assertion_prover() -> PreparedProverFixture { + static VALIDATION_GATE: Once = Once::new(); + VALIDATION_GATE.call_once(|| { + let prepared = examples::prepare_fixture(MobileBenchFixture::WebauthnAssertion) + .expect("prepare webauthn_assertion validation canary"); + let verified = + examples::prove_fixture(prepared).expect("prove webauthn_assertion validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate webauthn_assertion proof and tamper rejection"); + }); + let prover = examples::prepare_fixture(MobileBenchFixture::WebauthnAssertion) + .expect("prepare webauthn_assertion fixture") + .into_prover_only(); + record_proving_payload(&prover); + in_process::trim_process_memory(); + prover +} + +fn record_proving_payload(prover: &PreparedProverFixture) { + let (prover_size_bytes, input_size_bytes) = prover + .proving_payload_sizes() + .expect("serialize ProveKit proving payload"); + record_proving_payload_sizes(prover_size_bytes, input_size_bytes); +} + +fn record_proving_payload_sizes(prover_size_bytes: usize, input_size_bytes: usize) { + mobench_sdk::record_run_u64("prover_size_bytes", prover_size_bytes as u64); + mobench_sdk::record_run_u64("input_size_bytes", input_size_bytes as u64); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + (prover_size_bytes + input_size_bytes) as u64, + ); +} + +fn record_proof_metrics(proof: &NoirProof, prove_started: Instant) { + let (prove_time_ns, proof_size_bytes) = exact_proof_metrics(proof, prove_started); + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof_size_bytes); +} + +fn record_input_to_proof_metrics(proof: &NoirProof, started: Instant) { + let (input_to_proof_time_ns, proof_size_bytes) = exact_proof_metrics(proof, started); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", input_to_proof_time_ns); + // ProveKit's native `Prover::prove(input_map)` performs witness solving and + // proof generation as one call, so there is no honest phase split here. + mobench_sdk::record_sample_u64("prove_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof_size_bytes); +} + +fn benchmark_input_to_proof(prepared: PreparedProverFixture) { + let started = Instant::now(); + let proof = examples::prove_fixture_proof_only(prepared) + .expect("generate ProveKit input-to-proof fixture"); + record_input_to_proof_metrics(&proof, started); + black_box(proof); +} + +fn exact_proof_metrics(proof: &NoirProof, prove_started: Instant) -> (u64, u64) { + let prove_time_ns = prove_started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let proof_size_bytes = serialize(proof) + .expect("serialize exact ProveKit .np proof") + .len() as u64; + (prove_time_ns, proof_size_bytes) +} + #[benchmark] pub fn bench_passport_complete_age_check_prepare() { let prepared = profile_phase("prepare", || { @@ -359,14 +482,61 @@ pub fn bench_passport_complete_age_check_prepare() { #[benchmark(setup = setup_complete_age_check_prover, per_iteration)] pub fn bench_passport_complete_age_check_prove(prepared: PreparedCompleteAgeCheckProver) { + let prove_started = Instant::now(); let proof = profile_phase("prove", || { prove_complete_age_check_fixture_proof_only(prepared) .expect("prove complete_age_check fixture") }); + record_proof_metrics(&proof, prove_started); black_box(proof); } +/// Memory-constrained proof-only Passport lane for 32-bit Android devices. +/// +/// Both the correctness canary and every timed proof execute inside the same +/// one-thread Rayon pool. This preserves the proof-only timing and exact proof +/// metrics while preventing parallel proof phases from exhausting low-memory +/// devices. +#[benchmark(setup = setup_complete_age_check_prover_single_thread, per_iteration)] +pub fn bench_passport_complete_age_check_prove_single_thread( + prepared: PreparedCompleteAgeCheckProverWithSerializedVerifier, +) { + let (prove_time_ns, proof_size_bytes, after_prove, before_verify, after_verify) = + passport_single_thread_pool().install(|| { + let prove_started = Instant::now(); + let verified = profile_phase("prove", || { + prepared + .prove() + .expect("prove single-thread complete_age_check fixture") + }); + + let proof_metrics = exact_proof_metrics(verified.proof(), prove_started); + let after_prove = in_process::log_process_memory("after_prove"); + in_process::trim_process_memory(); + let before_verify = in_process::log_process_memory("after_prove_trim"); + verified + .verify_and_reject_tampered() + .expect("verify single-thread complete_age_check proof and reject tampering"); + let after_verify = in_process::log_process_memory("after_verify"); + ( + proof_metrics.0, + proof_metrics.1, + after_prove, + before_verify, + after_verify, + ) + }); + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof_size_bytes); + mobench_sdk::record_sample_u64("rss_after_prove_kb", after_prove.rss_kb); + mobench_sdk::record_sample_u64("swap_after_prove_kb", after_prove.swap_kb); + mobench_sdk::record_sample_u64("rss_before_verify_kb", before_verify.rss_kb); + mobench_sdk::record_sample_u64("swap_before_verify_kb", before_verify.swap_kb); + mobench_sdk::record_sample_u64("rss_after_verify_kb", after_verify.rss_kb); + mobench_sdk::record_sample_u64("swap_after_verify_kb", after_verify.swap_kb); +} + #[benchmark(setup = setup_complete_age_check_verified)] pub fn bench_passport_complete_age_check_verify(verified: &VerifiedCompleteAgeCheckFixture) { let verified = profile_phase("verify", || { @@ -377,8 +547,18 @@ pub fn bench_passport_complete_age_check_verify(verified: &VerifiedCompleteAgeCh black_box(verified); } -#[benchmark] -pub fn bench_passport_complete_age_check_e2e() { +fn run_passport_complete_age_check_e2e() { + static VALIDATION_GATE: Once = Once::new(); + VALIDATION_GATE.call_once(|| { + let prepared = passport::prepare_complete_age_check_fixture() + .expect("prepare complete_age_check validation canary"); + let verified = prove_complete_age_check_fixture(prepared) + .expect("prove complete_age_check validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate complete_age_check proof and tamper rejection"); + }); + let prepared = profile_phase("prepare", || { passport::prepare_complete_age_check_fixture().expect("prepare complete_age_check fixture") }); @@ -392,6 +572,22 @@ pub fn bench_passport_complete_age_check_e2e() { black_box(verified); } +#[benchmark] +pub fn bench_passport_complete_age_check_e2e() { + run_passport_complete_age_check_e2e(); +} + +/// Memory-constrained Passport lane for 32-bit devices whose OS kills the +/// default Rayon execution before it can emit a sample. +/// +/// The pool is initialized during the warmup invocation and then reused by +/// all five measured samples. The distinct benchmark name keeps this +/// constrained execution policy visible in exported evidence. +#[benchmark] +pub fn bench_passport_complete_age_check_e2e_single_thread() { + passport_single_thread_pool().install(run_passport_complete_age_check_e2e); +} + #[benchmark] pub fn bench_passport_fragmented_age_check_prepare() { let prepared = profile_phase("prepare", || { @@ -432,13 +628,59 @@ pub fn bench_oprf_prepare() { #[benchmark(setup = setup_oprf_prover, per_iteration)] pub fn bench_oprf_prove(prepared: PreparedProverFixture) { + let prove_started = Instant::now(); let proof = profile_phase("prove", || { examples::prove_fixture_proof_only(prepared).expect("prove oprf fixture") }); + record_proof_metrics(&proof, prove_started); + black_box(proof); +} + +#[benchmark(setup = setup_oprf_prover, per_iteration)] +pub fn bench_oprf_input_to_proof(prepared: PreparedProverFixture) { + benchmark_input_to_proof(prepared); +} + +#[benchmark(setup = setup_passport_p1_prover, per_iteration)] +pub fn bench_passport_p1_input_to_proof(prepared: PreparedProverFixture) { + benchmark_input_to_proof(prepared); +} + +#[benchmark(setup = setup_complete_age_check_prover, per_iteration)] +pub fn bench_passport_complete_age_check_input_to_proof(prepared: PreparedCompleteAgeCheckProver) { + let started = Instant::now(); + let proof = prove_complete_age_check_fixture_proof_only(prepared) + .expect("generate complete_age_check input-to-proof fixture"); + record_input_to_proof_metrics(&proof, started); black_box(proof); } +/// Memory-constrained input-to-proof Passport lane for 32-bit Android devices. +/// +/// Witness solving and proof generation remain inside the measured `prove` +/// call. Correct-proof acceptance and tamper rejection run afterward, outside +/// the timing interval, in the same single-thread Rayon pool. +#[benchmark(setup = setup_complete_age_check_prover_single_thread, per_iteration)] +pub fn bench_passport_complete_age_check_input_to_proof_single_thread( + prepared: PreparedCompleteAgeCheckProverWithSerializedVerifier, +) { + let (input_to_proof_time_ns, proof_size_bytes) = passport_single_thread_pool().install(|| { + let started = Instant::now(); + let verified = prepared + .prove() + .expect("generate single-thread complete_age_check input-to-proof fixture"); + let metrics = exact_proof_metrics(verified.proof(), started); + verified + .verify_and_reject_tampered() + .expect("verify single-thread complete_age_check proof and reject tampering"); + metrics + }); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("prove_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof_size_bytes); +} + #[benchmark(setup = setup_oprf_verified)] pub fn bench_oprf_verify(verified: &VerifiedCircuitFixture) { let verified = profile_phase("verify", || { @@ -450,6 +692,16 @@ pub fn bench_oprf_verify(verified: &VerifiedCircuitFixture) { #[benchmark] pub fn bench_oprf_e2e() { + static VALIDATION_GATE: Once = Once::new(); + VALIDATION_GATE.call_once(|| { + let prepared = examples::prepare_fixture(MobileBenchFixture::Oprf) + .expect("prepare oprf validation canary"); + let verified = examples::prove_fixture(prepared).expect("prove oprf validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate oprf proof and tamper rejection"); + }); + let prepared = profile_phase("prepare", || { examples::prepare_fixture(MobileBenchFixture::Oprf).expect("prepare oprf fixture") }); @@ -511,9 +763,90 @@ pub fn bench_p256_bigcurve_e2e() { black_box(verified); } +#[benchmark] +pub fn bench_webauthn_assertion_prepare() { + let prepared = profile_phase("prepare", || { + examples::prepare_fixture(MobileBenchFixture::WebauthnAssertion) + .expect("prepare webauthn_assertion fixture") + }); + + black_box(( + prepared.prover_size(), + prepared.constraint_count(), + prepared.input_count(), + )); +} + +#[benchmark(setup = setup_webauthn_assertion_prover, per_iteration)] +pub fn bench_webauthn_assertion_prove(prepared: PreparedProverFixture) { + let prove_started = Instant::now(); + let proof = profile_phase("prove", || { + examples::prove_fixture_proof_only(prepared).expect("prove webauthn_assertion fixture") + }); + + record_proof_metrics(&proof, prove_started); + black_box(proof); +} + +#[benchmark(setup = setup_webauthn_assertion_prover, per_iteration)] +pub fn bench_webauthn_assertion_input_to_proof(prepared: PreparedProverFixture) { + benchmark_input_to_proof(prepared); +} + +#[benchmark(setup = setup_webauthn_assertion_verified)] +pub fn bench_webauthn_assertion_verify(verified: &VerifiedCircuitFixture) { + let verified = profile_phase("verify", || { + examples::verify_fixture(verified.clone()).expect("verify webauthn_assertion fixture") + }); + + black_box(verified); +} + +#[benchmark] +pub fn bench_webauthn_assertion_e2e() { + static VALIDATION_GATE: Once = Once::new(); + VALIDATION_GATE.call_once(|| { + let prepared = examples::prepare_fixture(MobileBenchFixture::WebauthnAssertion) + .expect("prepare webauthn_assertion validation canary"); + let verified = + examples::prove_fixture(prepared).expect("prove webauthn_assertion validation canary"); + verified + .verify_and_reject_tampered() + .expect("validate webauthn_assertion proof and tamper rejection"); + }); + + let prepared = profile_phase("prepare", || { + examples::prepare_fixture(MobileBenchFixture::WebauthnAssertion) + .expect("prepare webauthn_assertion fixture") + }); + let verified = profile_phase("prove", || { + examples::prove_fixture(prepared).expect("prove webauthn_assertion fixture") + }); + let verified = profile_phase("verify", || { + examples::verify_fixture(verified).expect("verify webauthn_assertion fixture") + }); + + black_box(verified); +} + #[cfg(test)] mod tests { - use super::BenchReport; + use super::{benchmark_start_metadata, BenchReport}; + + #[test] + fn lifecycle_metadata_records_observed_rayon_threads() { + let metadata = + benchmark_start_metadata("bench_mobile::bench_passport_complete_age_check_prove"); + + assert_eq!( + metadata["resolved_function"], + "bench_mobile::bench_passport_complete_age_check_prove" + ); + assert_eq!(metadata["rayon_threads"], rayon::current_num_threads()); + assert!(metadata["rayon_threads"] + .as_u64() + .is_some_and(|threads| threads > 0)); + } #[test] fn report_conversion_preserves_sample_resource_metrics() { diff --git a/bench-mobile/src/lib_web.rs b/bench-mobile/src/lib_web.rs new file mode 100644 index 000000000..85c0dd153 --- /dev/null +++ b/bench-mobile/src/lib_web.rs @@ -0,0 +1,231 @@ +//! Browser-only Mobench adapter for the ProveKit V1 publication workloads. +//! +//! The secretless preparation job generates the witness files embedded here. +//! Browser samples measure proof generation only. The first setup for each +//! workload additionally verifies a valid proof and rejects a tampered proof. + +use { + acir::native_types::WitnessMap, + mobench_sdk::{benchmark, profile_phase}, + noirc_artifacts::program::ProgramArtifact, + provekit_common::{NoirElement, NoirProof, NoirProofScheme, Prover, Verifier}, + provekit_prover::Prove, + provekit_r1cs_compiler::NoirProofSchemeBuilder, + provekit_verifier::Verify, + std::{hint::black_box, sync::Once}, +}; + +#[cfg(feature = "web-passport-complete")] +const COMPLETE_AGE_CHECK_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/complete_age_check.json" +)); +#[cfg(feature = "web-passport-complete")] +const COMPLETE_AGE_CHECK_WITNESS: &[u8] = + include_bytes!("../generated/wasm/complete_age_check.witness.postcard"); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ADD_DSC_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/t_add_dsc_720.json" +)); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ADD_DSC_WITNESS: &[u8] = + include_bytes!("../generated/wasm/t_add_dsc_720.witness.postcard"); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ADD_ID_DATA_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/t_add_id_data_720.json" +)); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ADD_ID_DATA_WITNESS: &[u8] = + include_bytes!("../generated/wasm/t_add_id_data_720.witness.postcard"); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ADD_INTEGRITY_COMMIT_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/t_add_integrity_commit.json" +)); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ADD_INTEGRITY_COMMIT_WITNESS: &[u8] = + include_bytes!("../generated/wasm/t_add_integrity_commit.witness.postcard"); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ATTEST_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/t_attest.json" +)); +#[cfg(feature = "web-passport-fragmented")] +const FRAGMENTED_ATTEST_WITNESS: &[u8] = + include_bytes!("../generated/wasm/t_attest.witness.postcard"); +#[cfg(feature = "web-webauthn")] +const WEBAUTHN_ASSERTION_PROGRAM: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/webauthn_assertion.json" +)); +#[cfg(feature = "web-webauthn")] +const WEBAUTHN_ASSERTION_WITNESS: &[u8] = + include_bytes!("../generated/wasm/webauthn_assertion.witness.postcard"); +#[cfg(feature = "web-oprf")] +const OPRF_PROGRAM: &str = + include_str!(concat!(env!("OUT_DIR"), "/bench_mobile_fixtures/oprf.json")); +#[cfg(feature = "web-oprf")] +const OPRF_WITNESS: &[u8] = include_bytes!("../generated/wasm/oprf.witness.postcard"); + +#[cfg(feature = "web-passport-complete")] +static COMPLETE_GATE: Once = Once::new(); +#[cfg(feature = "web-passport-fragmented")] +static FRAGMENTED_GATE: Once = Once::new(); +#[cfg(feature = "web-webauthn")] +static WEBAUTHN_GATE: Once = Once::new(); +#[cfg(feature = "web-oprf")] +static OPRF_GATE: Once = Once::new(); + +/// Browser-ready ProveKit prover and its precomputed Noir witness. +pub struct PreparedCircuit { + prover: Prover, + witness: WitnessMap, +} + +#[cfg(feature = "web-passport-fragmented")] +/// Browser-ready prover state for all four fragmented passport stages. +pub struct PreparedFragmented { + circuits: Vec, +} + +fn parse_fixture( + program_json: &str, + witness_bytes: &[u8], +) -> (NoirProofScheme, WitnessMap) { + let program: ProgramArtifact = + serde_json::from_str(program_json).expect("deserialize browser benchmark program"); + let scheme = + NoirProofScheme::from_program(program).expect("prepare browser benchmark proof scheme"); + let witness = + postcard::from_bytes(witness_bytes).expect("deserialize browser benchmark witness"); + (scheme, witness) +} + +fn validate_proof_gate(scheme: NoirProofScheme, witness: WitnessMap) { + let proof = Prover::from_noir_proof_scheme(scheme.clone()) + .prove_with_witness(witness) + .expect("prove browser validation canary"); + Verifier::from_noir_proof_scheme(scheme.clone()) + .verify(&proof) + .expect("verify browser validation canary"); + + let mut tampered = proof; + let byte = tampered + .whir_r1cs_proof + .narg_string + .first_mut() + .expect("proof transcript must not be empty"); + *byte ^= 1; + assert!( + Verifier::from_noir_proof_scheme(scheme) + .verify(&tampered) + .is_err(), + "tampered browser validation canary must be rejected" + ); +} + +fn prepare_single( + program_json: &str, + witness_bytes: &[u8], + gate: &'static Once, +) -> PreparedCircuit { + let (scheme, witness) = parse_fixture(program_json, witness_bytes); + gate.call_once(|| validate_proof_gate(scheme.clone(), witness.clone())); + PreparedCircuit { + prover: Prover::from_noir_proof_scheme(scheme), + witness, + } +} + +#[cfg(feature = "web-passport-complete")] +fn setup_complete_age_check() -> PreparedCircuit { + prepare_single( + COMPLETE_AGE_CHECK_PROGRAM, + COMPLETE_AGE_CHECK_WITNESS, + &COMPLETE_GATE, + ) +} + +#[cfg(feature = "web-passport-fragmented")] +fn setup_fragmented_age_check() -> PreparedFragmented { + let fixture_specs = [ + (FRAGMENTED_ADD_DSC_PROGRAM, FRAGMENTED_ADD_DSC_WITNESS), + ( + FRAGMENTED_ADD_ID_DATA_PROGRAM, + FRAGMENTED_ADD_ID_DATA_WITNESS, + ), + ( + FRAGMENTED_ADD_INTEGRITY_COMMIT_PROGRAM, + FRAGMENTED_ADD_INTEGRITY_COMMIT_WITNESS, + ), + (FRAGMENTED_ATTEST_PROGRAM, FRAGMENTED_ATTEST_WITNESS), + ]; + let parsed: Vec<_> = fixture_specs + .into_iter() + .map(|(program, witness)| parse_fixture(program, witness)) + .collect(); + FRAGMENTED_GATE.call_once(|| { + for (scheme, witness) in &parsed { + validate_proof_gate(scheme.clone(), witness.clone()); + } + }); + PreparedFragmented { + circuits: parsed + .into_iter() + .map(|(scheme, witness)| PreparedCircuit { + prover: Prover::from_noir_proof_scheme(scheme), + witness, + }) + .collect(), + } +} + +#[cfg(feature = "web-webauthn")] +fn setup_webauthn_assertion() -> PreparedCircuit { + prepare_single( + WEBAUTHN_ASSERTION_PROGRAM, + WEBAUTHN_ASSERTION_WITNESS, + &WEBAUTHN_GATE, + ) +} + +#[cfg(feature = "web-oprf")] +fn setup_oprf() -> PreparedCircuit { + prepare_single(OPRF_PROGRAM, OPRF_WITNESS, &OPRF_GATE) +} + +fn prove(prepared: PreparedCircuit) -> NoirProof { + prepared + .prover + .prove_with_witness(prepared.witness) + .expect("prove browser benchmark fixture") +} + +#[cfg(feature = "web-passport-complete")] +#[benchmark(setup = setup_complete_age_check, per_iteration)] +pub fn bench_passport_complete_age_check_prove(prepared: PreparedCircuit) { + black_box(profile_phase("prove", || prove(prepared))); +} + +#[cfg(feature = "web-passport-fragmented")] +#[benchmark(setup = setup_fragmented_age_check, per_iteration)] +pub fn bench_passport_fragmented_age_check_prove(prepared: PreparedFragmented) { + let proofs = profile_phase("prove", || { + prepared.circuits.into_iter().map(prove).collect::>() + }); + black_box(proofs); +} + +#[cfg(feature = "web-webauthn")] +#[benchmark(setup = setup_webauthn_assertion, per_iteration)] +pub fn bench_webauthn_assertion_prove(prepared: PreparedCircuit) { + black_box(profile_phase("prove", || prove(prepared))); +} + +#[cfg(feature = "web-oprf")] +#[benchmark(setup = setup_oprf, per_iteration)] +pub fn bench_oprf_prove(prepared: PreparedCircuit) { + black_box(profile_phase("prove", || prove(prepared))); +} diff --git a/bench-mobile/src/passport.rs b/bench-mobile/src/passport.rs index 2c2874586..3a21c1725 100644 --- a/bench-mobile/src/passport.rs +++ b/bench-mobile/src/passport.rs @@ -1,18 +1,22 @@ use { crate::in_process::{ - prepare_noir_program_from_json, PreparedNoirProgram, PreparedNoirProver, + prepare_noir_program_from_json, verify_noir_proof_from_json, FrozenNoirProgram, + PreparedNoirProgram, PreparedNoirProver, PreparedNoirProverWithSerializedVerifier, VerifiedNoirProgram, }, anyhow::{Context, Result}, provekit_common::NoirProof, + std::sync::OnceLock, }; const COMPLETE_AGE_CHECK_PROGRAM: &str = include_str!(concat!( env!("OUT_DIR"), "/bench_mobile_fixtures/complete_age_check.json" )); -const COMPLETE_AGE_CHECK_TOML: &str = - include_str!("../../noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml"); +const COMPLETE_AGE_CHECK_TOML: &str = include_str!(concat!( + env!("OUT_DIR"), + "/bench_mobile_fixtures/complete_age_check.Prover.toml" +)); const FRAGMENTED_ADD_DSC_PROGRAM: &str = include_str!(concat!( env!("OUT_DIR"), "/bench_mobile_fixtures/t_add_dsc_720.json" @@ -47,6 +51,8 @@ const FRAGMENTED_ATTEST_TOML: &str = include_str!( pub type PreparedCompleteAgeCheckFixture = PreparedNoirProgram; pub type PreparedCompleteAgeCheckProver = PreparedNoirProver; +pub type PreparedCompleteAgeCheckProverWithSerializedVerifier = + PreparedNoirProverWithSerializedVerifier; pub type VerifiedCompleteAgeCheckFixture = VerifiedNoirProgram; /// Prepared prover state for the four-stage fragmented age-check fixture. @@ -106,6 +112,20 @@ pub fn prepare_complete_age_check_fixture() -> Result &'static FrozenNoirProgram { + static FROZEN: OnceLock = OnceLock::new(); + FROZEN.get_or_init(|| { + let prepared = prepare_complete_age_check_fixture() + .expect("prepare frozen complete_age_check fixture"); + FrozenNoirProgram::from_prepared(prepared) + .expect("freeze exact complete_age_check prover and verifier") + }) +} + pub fn prove_complete_age_check_fixture( prepared: PreparedCompleteAgeCheckFixture, ) -> Result { @@ -120,6 +140,12 @@ pub fn prove_complete_age_check_fixture_proof_only( Ok(proof) } +/// Verify a proof against the complete age-check artifact and require +/// rejection after mutating its transcript. +pub fn verify_complete_age_check_proof_and_reject_tampered(proof: &NoirProof) -> Result<()> { + verify_noir_proof_from_json("complete_age_check", COMPLETE_AGE_CHECK_PROGRAM, proof) +} + pub fn verify_complete_age_check_fixture( verified: VerifiedCompleteAgeCheckFixture, ) -> Result { @@ -222,3 +248,19 @@ pub fn passport_complete_age_check_end_to_end_smoke() -> Result<()> { let _verified = verify_complete_age_check_fixture(verified)?; Ok(()) } + +#[cfg(test)] +mod tests { + use super::frozen_complete_age_check_fixture; + + #[test] + fn frozen_complete_age_check_bundle_loads_exact_prover() { + let frozen = frozen_complete_age_check_fixture(); + let (prover_size, input_size) = frozen.proving_payload_sizes(); + assert!(prover_size > 0); + assert!(input_size > 0); + frozen + .load_prover_with_serialized_verifier() + .expect("load exact frozen complete_age_check bundle"); + } +} diff --git a/bench-mobile/tests/examples_smoke.rs b/bench-mobile/tests/examples_smoke.rs index 8703c722a..c38d21feb 100644 --- a/bench-mobile/tests/examples_smoke.rs +++ b/bench-mobile/tests/examples_smoke.rs @@ -7,7 +7,9 @@ fn embedded_example_fixtures_prepare_non_empty_artifacts() { for fixture in [ MobileBenchFixture::CompleteAgeCheck, MobileBenchFixture::Oprf, + MobileBenchFixture::PassportP1, MobileBenchFixture::P256Bigcurve, + MobileBenchFixture::WebauthnAssertion, ] { let prepared = prepare_fixture(fixture).expect("prepare fixture"); let (constraints, witnesses) = prepared.prover_size(); @@ -22,8 +24,19 @@ fn embedded_oprf_fixture_proves_and_verifies() { fixture_end_to_end_smoke(MobileBenchFixture::Oprf).expect("oprf smoke benchmark"); } +#[test] +fn embedded_passport_p1_fixture_proves_and_verifies() { + fixture_end_to_end_smoke(MobileBenchFixture::PassportP1).expect("passport_p1 smoke benchmark"); +} + #[test] fn embedded_p256_bigcurve_fixture_proves_and_verifies() { fixture_end_to_end_smoke(MobileBenchFixture::P256Bigcurve) .expect("p256_bigcurve smoke benchmark"); } + +#[test] +fn embedded_webauthn_assertion_fixture_proves_and_verifies() { + fixture_end_to_end_smoke(MobileBenchFixture::WebauthnAssertion) + .expect("webauthn_assertion smoke benchmark"); +} diff --git a/benchmarks/v1/README.md b/benchmarks/v1/README.md new file mode 100644 index 000000000..2bdf50d97 --- /dev/null +++ b/benchmarks/v1/README.md @@ -0,0 +1,153 @@ +# ProveKit V1 input-to-proof benchmarks + +This directory is the reproducible publication campaign for ProveKit V1. It +measures the complete client-side path from a frozen structured input through +witness generation and proving to serialized proof bytes across three stacks, +three execution targets, and cold/warm runtime modes. + +The canonical publication artifact is +[`input-to-proof-data/input-to-proof-samples.csv`](input-to-proof-data/input-to-proof-samples.csv). +The reproducibility contract, version pins, device requirements, correctness +gates, and gap policy are in +[`REPRODUCIBILITY.md`](REPRODUCIBILITY.md). + +> **Publication snapshot:** 417 rows, 72 logical series, 4 profiles × 3 stacks +> × 3 targets × 2 timing modes. There are 345 measured samples, 69 warmups, +> and 3 explicit gaps. Missing metrics are blank, never zero or substituted. + +## Start here + +| I need to… | Use | +| --- | --- | +| Reproduce the campaign | [`REPRODUCIBILITY.md`](REPRODUCIBILITY.md) | +| Inspect the canonical data | [`input-to-proof-data/input-to-proof-samples.csv`](input-to-proof-data/input-to-proof-samples.csv) | +| Validate or export rows | [`input-to-proof-data/`](input-to-proof-data/) | +| Check immutable source pins | [`sources.lock.json`](sources.lock.json) and [`toolchains.lock.json`](toolchains.lock.json) | +| Inspect the matrix and gap contract | [`benchmark-contract.json`](benchmark-contract.json) | +| Review superseded experiments | [`legacy/README.md`](legacy/README.md) | + +## Campaign matrix + +| Stack | iPhone SE 2022 | Motorola E15 | M4 Max MacBook | +| --- | --- | --- | --- | +| ProveKit V1 | Native Mobench / WHIR | Native Mobench / WHIR | Chrome/WASM, fixed 16 workers | +| Noir + Barretenberg | Mopro native | Mopro native where qualified | Chrome/WASM, 16 effective workers | +| Circom + Groth16 | Native Rapidsnark baseline; TACEO 0.2.1 for OPRF O2 | Native target-specific backend; TACEO 0.2.1 for OPRF O2 | Chrome/WASM / SnarkJS, 16 workers | + +The Mac publication surface is Chrome/WASM. Mac-native runs are diagnostic +only. BrowserStack credentials and paid-session confirmation stay outside the +repository. Native and browser rows remain separate runtime categories. + +## Measurement contract + +The headline boundary is: + +```text +raw structured input → witness generation → proof generation → serialized proof bytes +``` + +Each successful series contains one warmup followed by five sequential measured +samples. Cold mode starts a fresh process/runtime for each attempt with locked +assets already local. Warm mode reuses initialized runtime state while +regenerating the witness and proof for every attempt. + +Every runnable lane must accept a valid proof and reject a tampered proof before +its timings are exported. The CSV also records phase timings where a backend +exposes them, exact proof bytes, deduplicated proving payload size, peak process +RSS, constraints, package/source identities, artifact hashes, and provenance. + +## Semantic comparison warning + +The stacks use the closest available counterparts; they are not interchangeable +proof statements. Keep the profile, circuit variant, source commit, backend, +and `non_equivalence_note` together when interpreting results. + +| Profile | Noir side | Circom side | Comparison boundary | +| --- | --- | --- | --- | +| Passport historical | Monolithic `complete_age_check` | Self registration plus `vc_and_disclose` | A staged product flow, not one monolithic statement | +| Passport P1 | [`noir/passport_p1/src/main.nr`](noir/passport_p1/src/main.nr) | [`circom/passport_p1/passport_p1.circom`](circom/passport_p1/passport_p1.circom) | Closest matched integrity, registry, DG1, and age assertion | +| OPRF O2 | World-ID-aligned Noir nullifier statement | World ID Protocol nullifier circuit | Same named profile and public nullifier; implementation details differ. Native Circom rows use the qualified TACEO helper replacement described below | +| WebAuthn | ES256 assertion binding challenge, type, origin, RP-ID, flags, and key | Pinned `privacy-ethereum/webauth-circom` analogue | Circom omits several Noir bindings | + +The older TACEO primitive OPRF example and superseded production-backend +experiments are retained under [`legacy/`](legacy/README.md). The canonical +`oprf_nullifier` Circom rows use TACEO `circom-helpers` main at +`8aacd73ed6ab0a2b9b2158e613acfa920860865a`, patched with +`circom-witness-rs` branch commit +`e11206a9f453145dcd6b814523cbfba4f60cf5c6`. This replaces only the six +Circom OPRF target/mode series; all other rows retain their original backend. +The prover is pinned to `taceo-groth16 0.2.1` with +`taceo-groth16-material 0.4.2`, the latest Groth16 implementation used by +this campaign; older `0.1.x` TACEO candidate rows remain under `legacy/`. + +## Reproduce + +Inspect the complete non-secret plan first. This starts no devices and no paid +BrowserStack session: + +```bash +bash benchmarks/v1/scripts/run-reproducibility.sh \ + --stage all \ + --campaign provekit-v1-cross-device \ + --dry-run +``` + +The available stages are `bootstrap`, `prepare`, `smoke`, `measure`, `export`, +and `all`. A full run requires explicit paid-session confirmation: + +```bash +bash benchmarks/v1/scripts/run-reproducibility.sh \ + --stage all \ + --campaign provekit-v1-cross-device \ + --confirm-paid-browserstack +``` + +The Mac WASM lane is pinned to the fixed-16 policy automatically: + +```text +INPUT_TO_PROOF_EXECUTION_POLICY=multithread +MOBENCH_WASM_THREADS=16 +MOBENCH_SNARKJS_THREADS=16 +``` + +Barretenberg requests 32 workers and records its 16-worker effective limit. +The runner refuses to export a successful series unless its proof and tamper +gates pass. + +To validate retained evidence or regenerate the canonical CSV: + +```bash +bun benchmarks/v1/input-to-proof-data/export.ts +bun benchmarks/v1/input-to-proof-data/replace-taceo-oprf.ts +bun test benchmarks/v1/input-to-proof-data/export.test.ts +bun test benchmarks/v1/input-to-proof-data/native/*.test.ts +``` + +## Repository layout + +```text +benchmarks/v1/ +├── input-to-proof-data/ canonical CSV, exporter, schema, native helpers +├── noir/ Noir circuits and browser fixtures +├── circom/ Circom circuits and browser fixtures +├── barretenberg/ Barretenberg browser lane +├── rapidsnark/ Rapidsnark mobile crates, scaffold, and patches +├── wasm/ ProveKit/SnarkJS browser harness and fixtures +├── mopro/ Native Mopro adapter sources +├── scripts/ Bootstrap, preparation, measurement, and shared tooling +└── legacy/ superseded datasets, diagnostics, and historical docs +``` + +The `analysis/` directory is intentionally empty in this freeze for the +publication notebook. It must read only the canonical CSV, keep timing phases, +payload, proof-size, and memory separate, and render missing series visibly. + +## Reproducibility and privacy rules + +- Treat [`REPRODUCIBILITY.md`](REPRODUCIBILITY.md) and the two lock files as + the campaign identity. +- Keep BrowserStack credentials in the caller's environment; never commit them. +- Keep raw device/session reports under the local `target/` evidence tree. +- Do not count APK/IPA upload size as proving payload. +- Do not use legacy CSVs, browser timings, estimates, or substituted cells in + the canonical publication file. diff --git a/benchmarks/v1/REPRODUCIBILITY.md b/benchmarks/v1/REPRODUCIBILITY.md new file mode 100644 index 000000000..0db093410 --- /dev/null +++ b/benchmarks/v1/REPRODUCIBILITY.md @@ -0,0 +1,277 @@ +# Reproducing the V1 input-to-proof campaign + +This is the canonical runbook for +[`input-to-proof-data/input-to-proof-samples.csv`](input-to-proof-data/input-to-proof-samples.csv). +It defines the source identities, toolchains, devices, execution boundaries, +sampling rules, correctness gates, artifact-size definitions, and failure +semantics for the published numbers. + +Do not use files under [`legacy/`](legacy/) as inputs to this campaign. They are +retained for historical comparison and audit only. + +## 1. Frozen publication result + +The publication matrix is: + +```text +4 profiles × 3 stacks × 3 targets × 2 timing modes = 72 logical series +``` + +The committed CSV contains 417 rows: + +| Row type | Count | +| --- | ---: | +| Measured samples | 345 | +| Warmup samples | 69 | +| Explicit gap rows | 3 | + +Successful series contain exactly one warmup followed by five sequential +measured samples. A gap is one row with blank timing, proof-size, proving +payload, and memory metrics plus an explicit status and failure explanation. + +### Current gaps + +These are evidence-backed gaps, not estimates or substituted timings: + +| Series | Status | Evidence | +| --- | --- | --- | +| Mac Chrome · Circom WebAuthn · cold | `runtime_failed` | The fixed-16 renderer exhausted memory while mapping the pinned zkey/WTNS | +| Mac Chrome · Circom WebAuthn · warm | `not_run` | Blocked by the cold failure; no earlier four-worker timing was substituted | +| Motorola E15 · Circom WebAuthn · cold | `runtime_failed` | The 32-bit userspace could not map the pinned 1.73 GB zkey plus WTNS | + +## 2. Campaign identity + +The following files define the immutable publication contract: + +| File | Role | +| --- | --- | +| [`benchmark-contract.json`](benchmark-contract.json) | Matrix, measurement boundary, correctness gates, required fields, and gap semantics | +| [`sources.lock.json`](sources.lock.json) | Immutable source revisions for ProveKit, circuits, Mopro, witness generators, and Rapidsnark | +| [`toolchains.lock.json`](toolchains.lock.json) | Locked compiler, SDK, browser, mobile, SRS, and artifact identities | +| [`input-to-proof-data/manifest.json`](input-to-proof-data/manifest.json) | Canonical CSV provenance and artifact manifest | + +The branch's publication surface is Chrome/WASM on the M4 Max MacBook. Native +Mac runs are diagnostic. Browser and native results must never be merged into a +single runtime category. + +## 3. Workloads and semantic boundary + +The stacks use the closest available counterparts; they do not prove identical +statements. Keep the circuit identity and the row's `non_equivalence_note` +attached to every comparison. + +| Profile | Noir circuit | Circom counterpart | Important difference | +| --- | --- | --- | --- | +| Passport historical | `complete_age_check` | Self registration plus `vc_and_disclose` | Circom is a staged product flow, while Noir is monolithic | +| Passport P1 | Matched monolithic RSA-4096 circuit | `circom/passport_p1/passport_p1.circom` | Closest matched integrity, registry, DG1, and age assertion | +| OPRF O2 | World-ID-aligned Noir nullifier statement | World ID Protocol nullifier circuit | Same named profile/public nullifier, different implementation details | +| WebAuthn | ES256 assertion binding challenge, type, origin, RP-ID, flags, and key | Pinned `privacy-ethereum/webauth-circom` analogue | Circom omits several Noir bindings | + +TACEO's primitive OPRF example and other production-backend experiments are +retained under `legacy/`; they are not silently merged into the publication +matrix. + +## 4. Targets and prerequisites + +| Target | Surface | Required identity | +| --- | --- | --- | +| iPhone SE 2022 | Native BrowserStack | iOS 15, arm64, paid-session confirmation | +| Motorola E15 | Native physical device | ADB-captured OS, ABI, zygote, and userspace bitness | +| M4 Max MacBook | Chrome/WASM publication surface | macOS/arm64 and Chrome version captured at run time | + +Required local tools are Git, `jq`, Bun, Rust/Cargo, Xcode, Android +SDK/NDK/JDK, ADB, and Google Chrome. The locked Android environment is +Temurin 21, platform `android-34`, NDK `26.1.10909125`. + +Capture target identity before preparation: + +```bash +# Mac publication surface +sw_vers +uname -m +system_profiler SPHardwareDataType +"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --version + +# Physical Motorola E15 +adb shell getprop ro.product.model +adb shell getprop ro.build.version.release +adb shell getprop ro.product.cpu.abilist +adb shell getconf LONG_BIT +adb shell getprop ro.zygote +``` + +The runner records these values in raw evidence. BrowserStack device/session +provenance is retained with every successful iPhone lane. + +## 5. Locked toolchains and backends + +| Component | Pinned identity | +| --- | --- | +| ProveKit V1 core | `9b2a6f37c67691eab4b0cec6c35e35c520e93285` | +| ProveKit browser inputs | `tooling/provekit-wasm`, Noir beta.11 inputs | +| Noir native | Nargo `1.0.0-beta.19` | +| Barretenberg native/browser | `barretenberg-rs` / `bb.js` `4.2.0-aztecnr-rc.2` | +| Browser Noir adapter | `noir_js` beta.11 for ProveKit and beta.19 for Barretenberg | +| Mopro | `0.3.7`, commit `10871f02e365c478cb4b61016e4034f7e74f076b` | +| Circom | `2.2.2` | +| SnarkJS | `0.7.6` | +| Native Rapidsnark | `rust-rapidsnark` `0.1.4` for qualified non-OPRF Circom lanes | +| Native witness adapter | `witnesscalc-adapter` `0.1.7` where qualified | +| Native Rust witness | `rust-witness` `0.1.6` where the target-specific fallback is required | +| Compatibility fallback | `iden3/circom-witnesscalc` `0.3.0`, fallback only | +| iPhone OPRF witness | `wasmi` `0.46.0` interpreting the exact Circom witness Wasm | +| Canonical native OPRF helper | `TaceoLabs/circom-helpers` `8aacd73ed6ab0a2b9b2158e613acfa920860865a` (main) | +| Canonical native OPRF witness | `circom-witness-rs` `e11206a9f453145dcd6b814523cbfba4f60cf5c6` (`codex/remove-cxx-bridge-and-grep`) | +| Canonical native OPRF prover | `taceo-groth16` `0.2.1` / `taceo-groth16-material` `0.4.2` (latest TACEO Groth16 proving path used here) | +| Mobench / E15 ABI bridge | `0.1.48`, commit `e992596a786cc18047102a318d40131c953e57b8` | + +The reference npm package `@worldcoin/provekit@0.1.0` is retained as a +compatibility record only. It is not the measured V1 browser runtime. + +For native Circom, arm64 pilots use `witnesscalc-adapter@0.1.7` with +`rust-rapidsnark@0.1.4` where the baseline lane is qualified. The canonical +`oprf_nullifier` replacement uses TACEO's current `circom-helpers` main with +the pinned `circom-witness-rs` branch above on all three targets, because that +path produced proof-gated evidence for every OPRF target/mode series. The +replacement is not silently applied to Passport or WebAuthn. Their native +backend policy remains Rapidsnark-first with a target-specific Arkworks/Rust +witness fallback where required. + +## 6. Entrypoint and stages + +Always inspect the non-secret dry plan first. It starts no devices and no paid +session: + +```bash +bash benchmarks/v1/scripts/run-reproducibility.sh \ + --stage all \ + --campaign provekit-v1-cross-device \ + --dry-run +``` + +The supported stages are: + +| Stage | Purpose | +| --- | --- | +| `bootstrap` | Verify locks and install only pinned compilers, SDKs, adapters, and packages | +| `prepare` | Build/fix circuits, freeze proving bundles, and build native/browser fixtures | +| `smoke` | Run valid-proof and tamper-rejection canaries | +| `measure` | Run one warmup and five sequential measured samples per successful series | +| `export` | Validate raw reports and write the canonical CSV | +| `all` | Run the stages in order | + +Run the full campaign only with explicit paid-session confirmation: + +```bash +bash benchmarks/v1/scripts/run-reproducibility.sh \ + --stage all \ + --campaign provekit-v1-cross-device \ + --confirm-paid-browserstack +``` + +Preparation writes content-hashed artifacts and raw reports under the local +`target/v1-benchmarks/` tree. A clean rerun must preserve its raw reports and +write a new campaign manifest rather than overwrite the committed publication +artifact. + +## 7. Fixed-16 browser policy + +The canonical Mac browser lane uses these values: + +```text +INPUT_TO_PROOF_EXECUTION_POLICY=multithread +MOBENCH_WASM_THREADS=16 +MOBENCH_SNARKJS_THREADS=16 +``` + +The ProveKit report must show 16 WASM workers. The Circom report must show 16 +requested and effective SnarkJS workers. Barretenberg requests 32 workers and +records its 16-worker effective limit. These values are retained in raw +reports, package manifests, and CSV provenance; host `hardwareConcurrency` +defaults are not accepted for canonical Mac rows. + +## 8. Timing and correctness contract + +The headline measurement is: + +```text +raw structured input → witness generation → proof generation → serialized proof bytes +``` + +- ProveKit integrates witness construction with proving, so + `witness_time_ms` remains blank rather than being inferred. +- Noir/Barretenberg and Circom report observed witness and proving phases when + available; `input_to_proof_time_ms` is the outer end-to-end duration. +- Cold mode starts a fresh process/runtime per attempt with locked assets local. +- Warm mode reuses initialized runtime state but regenerates witness and proof. +- Every timed lane must accept a valid proof and reject a tampered proof before + its samples are exported. + +### Size and memory definitions + +- `proof_size_bytes` is the exact serialized proof length. +- `circuit_size_bytes` is the deduplicated proving payload required to create a + proof: proving key/PKP plus the frozen proving input, such as a WTNS or ACIR + witness. Verifier-only material is excluded. +- `artifact_size_bytes` and `bundle_size_bytes` retain the backend's artifact + and transport accounting separately. +- `peak_memory_mib` is peak process RSS when measurable. +- APK/IPA/XCUITest upload size is transport evidence, never proving payload. + +For the canonical TACEO OPRF replacement, the proving payload is fixed to +`26,812,268` bytes: `OPRFNullifier.arks.zkey` is `26,645,680` bytes +(SHA-256 `4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9`), +the regenerated `OPRFNullifierGraph.bin` is `160,978` bytes (SHA-256 +`785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081`), and +the frozen input JSON is `5,610` bytes (SHA-256 +`662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40`). The +graph is the TACEO/circom-witness-rs artifact, not the larger World ID +Protocol graph used by the historical Rapidsnark lane. + +Missing measurements remain blank and are accompanied by an explicit status, +failure code, and failure detail. They are never encoded as zero. + +## 9. Export and validation + +The canonical data directory contains the publication exporter and schema at +its root. Native E15 normalizers and gap helpers live under +[`input-to-proof-data/native/`](input-to-proof-data/native/) with their own +normalization schema; this is intentionally distinct from the publication +schema. + +```bash +bun benchmarks/v1/input-to-proof-data/export.ts +bun benchmarks/v1/input-to-proof-data/replace-taceo-oprf.ts +bun test benchmarks/v1/input-to-proof-data/export.test.ts +bun test benchmarks/v1/input-to-proof-data/native/*.test.ts +bash benchmarks/v1/scripts/run-reproducibility.test.sh +git diff --check +``` + +Export must pass schema, duplicate, unit, coverage, proof, tamper, and gap +checks. The canonical CSV has stable columns for target identity, +circuit/backend identity, timing phases, proof/payload/artifact sizes, peak +RSS, constraints, source/package versions, hashes, session provenance, status, +and structured failure details. + +`replace-taceo-oprf.ts` is an intentional, idempotent post-export step. It +replaces exactly six existing `oprf_nullifier`/`circom_groth16` series: three +targets × cold/warm. It accepts only retained TACEO reports whose valid-proof +and tampered-proof gates passed, and fails if any series does not contain one +warmup plus five measured rows. The payload is the exact zkey plus regenerated +witness graph plus frozen input JSON; APK/IPA/XCUITest upload size is excluded. +Each replacement row records the helper/witness commits, per-artifact hashes, +report hashes, device/session provenance, exact proof size, and peak RSS. + +## 10. Credentials, evidence, and legacy boundaries + +- BrowserStack username and key are read from the caller's environment only. +- Paid BrowserStack sessions require the explicit confirmation flag. +- Secrets never enter command logs, raw exports, or the committed CSV. +- Raw device, browser, build, and session evidence stays under local `target/`. +- [`legacy/`](legacy/) contains superseded proof-only, semantic-parity, TACEO, + automatic-thread, diagnostic, and historical notebook material. It is useful + for audit, but is not an input to this campaign. +- The `analysis/` directory is intentionally empty in this freeze. The future + publication notebook must read only the canonical CSV and render missing + series as gaps rather than zeros. diff --git a/benchmarks/v1/barretenberg/README.md b/benchmarks/v1/barretenberg/README.md new file mode 100644 index 000000000..35bc696cc --- /dev/null +++ b/benchmarks/v1/barretenberg/README.md @@ -0,0 +1,26 @@ +# Noir + Barretenberg lane + +This is the canonical Noir/Barretenberg implementation used by the +input-to-proof campaign. Native mobile integration is through Mopro 0.3.7; +the Mac publication surface uses `noir_js@1.0.0-beta.19` with +`@aztec/bb.js@4.2.0-aztecnr-rc.2`. + +Install the locked browser dependencies and build the fixture bundle: + +```bash +cd benchmarks/v1/barretenberg +bun install --frozen-lockfile +bun run build:web +bun run smoke:web +``` + +The smoke must generate a valid proof, verify it, and reject a tampered proof +for every selected workload before timing. Browser runs use the canonical +fixed-16 policy: Barretenberg requests 32 workers and records 16 effective +workers. Native reports retain their actual Mopro/Barretenberg backend and +device identity. + +The source and SRS/package integrity pins are in +[`../toolchains.lock.json`](../toolchains.lock.json). Generated `dist/` and +runtime caches are ignored; only raw evidence and the canonical CSV are +publication data. diff --git a/benchmarks/v1/barretenberg/bun.lock b/benchmarks/v1/barretenberg/bun.lock new file mode 100644 index 000000000..b40b45335 --- /dev/null +++ b/benchmarks/v1/barretenberg/bun.lock @@ -0,0 +1,62 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "provekit-v1-barretenberg-benchmarks", + "dependencies": { + "@aztec/bb.js": "4.2.0-aztecnr-rc.2", + "@iarna/toml": "2.2.5", + "@noir-lang/noir_js": "1.0.0-beta.19", + }, + "devDependencies": { + "playwright-core": "1.59.1", + }, + }, + }, + "packages": { + "@aztec/bb.js": ["@aztec/bb.js@4.2.0-aztecnr-rc.2", "", { "dependencies": { "comlink": "^4.4.1", "commander": "^12.1.0", "idb-keyval": "^6.2.1", "msgpackr": "^1.11.2", "pako": "^2.1.0", "tslib": "^2.4.0" }, "bin": { "bb": "dest/node/bin/index.js" } }, "sha512-ksFWHrm8QYAXP059paItEKCM/UhpHg5Dwl/eSp2BI6EAtD9+JlonkOwJ+94TYai2y5Gz0qnrgd65dsvDwJelVQ=="], + + "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="], + + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], + + "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4", "", { "os": "linux", "cpu": "arm" }, "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw=="], + + "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ=="], + + "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="], + + "@noir-lang/acvm_js": ["@noir-lang/acvm_js@1.0.0-beta.19", "", {}, "sha512-J4i5SkZ8SYMAfl3yNyneI3DorEfE5zsgsHljm0aY6mV4x+LcbqxzM6hdsSbXqboZ1ZUXXmmHjE9WqFMkJC94eQ=="], + + "@noir-lang/noir_js": ["@noir-lang/noir_js@1.0.0-beta.19", "", { "dependencies": { "@noir-lang/acvm_js": "1.0.0-beta.19", "@noir-lang/noirc_abi": "1.0.0-beta.19", "@noir-lang/types": "1.0.0-beta.19", "pako": "^2.1.0" } }, "sha512-KtuO37XuBn+7PHReLGCyLVxKGBk+hSvUQs0r/rtNFTYty/KmSq/NwEXkwiA7aQTNUykrzTJGFbIForQWjIJT4g=="], + + "@noir-lang/noirc_abi": ["@noir-lang/noirc_abi@1.0.0-beta.19", "", { "dependencies": { "@noir-lang/types": "1.0.0-beta.19" } }, "sha512-rCEVNmXwfxC70VVJqOjvgP9mga+HVOIYzmsTQV9JeNG/BiWbxdHPJ+K0gT7EoCpz7VOVwfgWjFepxfbQk++GSw=="], + + "@noir-lang/types": ["@noir-lang/types@1.0.0-beta.19", "", {}, "sha512-px/gpC8tvOvCPY6TbVYqMDqDadA75I2woOZ3b5vbyjxqaE4UtsKtcdsWQ9titSCslkYCe1WYRGiFE/LPyRgOpQ=="], + + "comlink": ["comlink@4.4.2", "", {}, "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g=="], + + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "idb-keyval": ["idb-keyval@6.3.0", "", {}, "sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow=="], + + "msgpackr": ["msgpackr@1.12.1", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ=="], + + "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="], + + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], + + "pako": ["pako@2.2.0", "", {}, "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w=="], + + "playwright-core": ["playwright-core@1.59.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + } +} diff --git a/benchmarks/v1/barretenberg/convert-inputs.ts b/benchmarks/v1/barretenberg/convert-inputs.ts new file mode 100644 index 000000000..08c66cef1 --- /dev/null +++ b/benchmarks/v1/barretenberg/convert-inputs.ts @@ -0,0 +1,11 @@ +import { loadNoirInputs } from "./load-inputs"; + +const input = Bun.argv[2]; +const output = Bun.argv[3]; +if (!input || !output) { + throw new Error("usage: bun run inputs -- "); +} + +const inputs = await loadNoirInputs(new URL(input, `file://${process.cwd()}/`)); +await Bun.write(output, `${JSON.stringify(inputs, null, 2)}\n`); +console.log(`Wrote ${output}`); diff --git a/benchmarks/v1/barretenberg/generate-web-fixtures.ts b/benchmarks/v1/barretenberg/generate-web-fixtures.ts new file mode 100644 index 000000000..b2280a131 --- /dev/null +++ b/benchmarks/v1/barretenberg/generate-web-fixtures.ts @@ -0,0 +1,64 @@ +import { resolve } from "node:path"; + +import { Barretenberg, UltraHonkBackend } from "@aztec/bb.js"; +import { Noir } from "@noir-lang/noir_js"; + +interface CircuitArtifact { + bytecode: string; + [key: string]: unknown; +} + +interface ProofData { + proof: Uint8Array; + publicInputs: string[]; +} + +const dist = resolve(Bun.argv[2] ?? "web/dist"); +const workloads = [ + "webauthn_assertion", + "passport_complete_age_check", + "passport_p1", + "oprf_taceo", + "oprf_world_id_nullifier", +] as const; +type Workload = (typeof workloads)[number]; + +const workload = Bun.argv[3] as Workload | undefined; +if (!workload || !workloads.includes(workload)) { + throw new Error(`usage: bun run generate-web-fixtures.ts <${workloads.join("|")}>`); +} + +const assetDirectory = resolve(dist, "assets", workload); +const circuit = (await Bun.file(resolve(assetDirectory, "circuit.json")).json()) as CircuitArtifact; +const inputs = (await Bun.file(resolve(assetDirectory, "inputs.json")).json()) as Record< + string, + unknown +>; +const noir = new Noir(circuit); +const api = await Barretenberg.new({ threads: 1 }); +const backend = new UltraHonkBackend(circuit.bytecode, api); + +try { + const witness = (await noir.execute(inputs)).witness; + const proof = (await backend.generateProof(witness)) as ProofData; + if (!(await backend.verifyProof(proof))) { + throw new Error(`Barretenberg rejected generated ${workload} fixture`); + } + await Promise.all([ + Bun.write(resolve(assetDirectory, "witness.gz"), witness), + Bun.write(resolve(assetDirectory, "proof.bin"), proof.proof), + Bun.write( + resolve(assetDirectory, "public-inputs.json"), + `${JSON.stringify(proof.publicInputs)}\n`, + ), + ]); + console.log( + `Generated ${workload}: witness=${witness.byteLength} proof=${proof.proof.byteLength}`, + ); +} finally { + await api.destroy().catch(() => undefined); + const destroy = (noir as Noir & { destroy?: () => Promise | void }).destroy; + if (destroy) await Promise.resolve(destroy.call(noir)).catch(() => undefined); +} + +process.exit(0); diff --git a/benchmarks/v1/barretenberg/load-inputs.ts b/benchmarks/v1/barretenberg/load-inputs.ts new file mode 100644 index 000000000..1bb871ecf --- /dev/null +++ b/benchmarks/v1/barretenberg/load-inputs.ts @@ -0,0 +1,27 @@ +import * as TOML from "@iarna/toml"; + +function normalize(value: unknown): unknown { + if (typeof value === "bigint") return value.toString(); + if (Array.isArray(value)) return value.map(normalize); + if (value && typeof value === "object") { + return Object.fromEntries( + Object.entries(value as Record).map(([key, entry]) => [ + key, + normalize(entry), + ]), + ); + } + return value; +} + +export async function loadNoirInputs(url: URL): Promise> { + if (url.pathname.endsWith(".json")) { + return (await Bun.file(url).json()) as Record; + } + if (!url.pathname.endsWith(".toml")) { + throw new Error(`unsupported Noir input format: ${url.pathname}`); + } + + const parsed = TOML.parse(await Bun.file(url).text()); + return normalize(parsed) as Record; +} diff --git a/benchmarks/v1/barretenberg/package.json b/benchmarks/v1/barretenberg/package.json new file mode 100644 index 000000000..d3e6fc315 --- /dev/null +++ b/benchmarks/v1/barretenberg/package.json @@ -0,0 +1,22 @@ +{ + "name": "provekit-v1-barretenberg-benchmarks", + "private": true, + "type": "module", + "scripts": { + "build:web": "bash web/build.sh", + "smoke:web": "bun run web/smoke.ts", + "inputs": "bun run convert-inputs.ts", + "smoke": "bun run smoke.ts", + "smoke:webauthn": "bun run smoke.ts webauthn_assertion", + "smoke:oprf": "bun run smoke.ts oprf_taceo", + "smoke:passport": "bun run smoke.ts passport_complete_age_check" + }, + "dependencies": { + "@aztec/bb.js": "4.2.0-aztecnr-rc.2", + "@iarna/toml": "2.2.5", + "@noir-lang/noir_js": "1.0.0-beta.19" + }, + "devDependencies": { + "playwright-core": "1.59.1" + } +} diff --git a/benchmarks/v1/barretenberg/smoke.ts b/benchmarks/v1/barretenberg/smoke.ts new file mode 100644 index 000000000..56cb9b5e5 --- /dev/null +++ b/benchmarks/v1/barretenberg/smoke.ts @@ -0,0 +1,99 @@ +import { Barretenberg, UltraHonkBackend } from "@aztec/bb.js"; +import { Noir } from "@noir-lang/noir_js"; +import { loadNoirInputs } from "./load-inputs"; + +const workloads = { + webauthn_assertion: { + circuitUrl: new URL( + "../noir/webauthn_assertion/target/webauthn_assertion.json", + import.meta.url, + ), + inputsUrl: new URL("../noir/webauthn_assertion/inputs.json", import.meta.url), + }, + passport_complete_age_check: { + circuitUrl: new URL( + "../../../noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json", + import.meta.url, + ), + inputsUrl: new URL( + "../../../noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml", + import.meta.url, + ), + }, + oprf_taceo: { + circuitUrl: new URL( + "../../../target/v1-benchmarks/sources/oprf-nr/oprf_example/target/oprf_example.json", + import.meta.url, + ), + inputsUrl: new URL( + "../../../target/v1-benchmarks/sources/oprf-nr/oprf_example/Prover.toml", + import.meta.url, + ), + }, +} as const; + +const workloadName = Bun.argv[2] as keyof typeof workloads | undefined; +if (!workloadName || !(workloadName in workloads)) { + throw new Error(`workload must be one of: ${Object.keys(workloads).join(", ")}`); +} +const { circuitUrl, inputsUrl } = workloads[workloadName]; +const circuit = (await Bun.file(circuitUrl).json()) as { + bytecode: string; + [key: string]: unknown; +}; +const inputs = await loadNoirInputs(inputsUrl); + +const noir = new Noir(circuit); +const witnessStart = performance.now(); +const execution = await noir.execute(inputs); +const witnessTimeMs = performance.now() - witnessStart; + +const api = await Barretenberg.new({ threads: 1 }); +const backend = new UltraHonkBackend(circuit.bytecode, api); +try { + const proveStart = performance.now(); + const proof = await backend.generateProof(execution.witness); + const proveTimeMs = performance.now() - proveStart; + + const verifyStart = performance.now(); + const verified = await backend.verifyProof(proof); + const verifyTimeMs = performance.now() - verifyStart; + if (!verified) throw new Error(`Barretenberg rejected its ${workloadName} proof`); + + const tamperedProofBytes = proof.proof.slice(); + tamperedProofBytes[Math.floor(tamperedProofBytes.byteLength / 2)] ^= 1; + let tamperedProofRejected = false; + try { + tamperedProofRejected = !(await backend.verifyProof({ + ...proof, + proof: tamperedProofBytes, + })); + } catch { + tamperedProofRejected = true; + } + if (!tamperedProofRejected) { + throw new Error(`Barretenberg accepted a tampered ${workloadName} proof`); + } + + console.log( + JSON.stringify( + { + schema_version: 1, + benchmark: workloadName, + backend: "barretenberg_4.2.0-aztecnr-rc.2_single", + witness_time_ms: witnessTimeMs, + prove_time_ms: proveTimeMs, + verify_time_ms: verifyTimeMs, + proof_size_bytes: proof.proof.byteLength, + public_input_count: proof.publicInputs.length, + tampered_proof_rejected: tamperedProofRejected, + }, + null, + 2, + ), + ); +} finally { + await api.destroy(); + const destroy = (noir as Noir & { destroy?: () => Promise | void }).destroy; + if (destroy) await destroy.call(noir); +} diff --git a/benchmarks/v1/barretenberg/web/build.sh b/benchmarks/v1/barretenberg/web/build.sh new file mode 100755 index 000000000..d1ac1c082 --- /dev/null +++ b/benchmarks/v1/barretenberg/web/build.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash + +set -euo pipefail + +web_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +barretenberg_root="$(cd "${web_root}/.." && pwd)" +benchmark_root="$(cd "${barretenberg_root}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +dist="${web_root}/dist" + +for command in bun cp mkdir; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +( + cd "${barretenberg_root}" + bun install --frozen-lockfile +) + +if [[ "${dist}" != "${repo_root}/benchmarks/v1/barretenberg/web/dist" ]]; then + echo "error: refusing to clean unexpected dist path ${dist}" >&2 + exit 1 +fi +rm -rf "${dist}" +mkdir -p "${dist}/vendor/bb" "${dist}/assets" + +( + cd "${barretenberg_root}" + bun build web/runner.ts \ + --outdir web/dist \ + --target browser \ + --format esm \ + --minify \ + --external '*vendor/bb/index.js' +) +cp "${web_root}/index.html" "${dist}/index.html" +( + cd "${barretenberg_root}" + bun build node_modules/@aztec/bb.js/dest/browser/index.js \ + --outdir web/dist/vendor/bb \ + --target browser \ + --format esm \ + --splitting + # bb.js's worker factories use import.meta.url to resolve these two files + # relative to the bundled vendor index. Bundle them explicitly; without + # these entry points WasmWorker initialization fails at runtime with a 404. + bun build node_modules/@aztec/bb.js/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.js \ + --outfile web/dist/vendor/bb/main.worker.js \ + --target browser \ + --format esm \ + --minify + bun build node_modules/@aztec/bb.js/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.js \ + --outfile web/dist/vendor/bb/thread.worker.js \ + --target browser \ + --format esm \ + --minify +) +cp "${barretenberg_root}/node_modules/@noir-lang/acvm_js/web/acvm_js_bg.wasm" \ + "${dist}/acvm_js_bg.wasm" +cp "${barretenberg_root}/node_modules/@noir-lang/noirc_abi/web/noirc_abi_wasm_bg.wasm" \ + "${dist}/noirc_abi_wasm_bg.wasm" + +copy_workload() { + local workload="$1" + local circuit="$2" + local inputs="$3" + local asset_dir="${dist}/assets/${workload}" + mkdir -p "${asset_dir}" + cp "${circuit}" "${asset_dir}/circuit.json" + if [[ "${inputs}" == *.toml ]]; then + ( + cd "${barretenberg_root}" + bun run inputs -- "${inputs}" "${asset_dir}/inputs.json" + ) + else + cp "${inputs}" "${asset_dir}/inputs.json" + fi +} + +selected_workload="${MOBENCH_WORKLOAD:-all}" +case "${selected_workload}" in + all | webauthn_assertion | passport_complete_age_check | passport_p1 | oprf_taceo | oprf_world_id_nullifier) ;; + *) + echo "error: unsupported MOBENCH_WORKLOAD ${selected_workload}" >&2 + exit 1 + ;; +esac + +workloads=() +if [[ "${selected_workload}" == "all" || "${selected_workload}" == "webauthn_assertion" ]]; then + copy_workload \ + webauthn_assertion \ + "${benchmark_root}/noir/webauthn_assertion/target/webauthn_assertion.json" \ + "${benchmark_root}/noir/webauthn_assertion/inputs.json" + workloads+=(webauthn_assertion) +fi +if [[ "${selected_workload}" == "all" || "${selected_workload}" == "passport_p1" ]]; then + copy_workload \ + passport_p1 \ + "${benchmark_root}/noir/passport_p1/target/passport_p1.json" \ + "${benchmark_root}/noir/passport_p1/Prover.toml" + workloads+=(passport_p1) +fi +if [[ "${selected_workload}" == "all" || "${selected_workload}" == "passport_complete_age_check" ]]; then + copy_workload \ + passport_complete_age_check \ + "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json" \ + "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml" + workloads+=(passport_complete_age_check) +fi +if [[ "${selected_workload}" == "all" || "${selected_workload}" == "oprf_taceo" ]]; then + copy_workload \ + oprf_taceo \ + "${repo_root}/target/v1-benchmarks/sources/oprf-nr/oprf_example/target/oprf_example.json" \ + "${repo_root}/target/v1-benchmarks/sources/oprf-nr/oprf_example/Prover.toml" + workloads+=(oprf_taceo) +fi +if [[ "${selected_workload}" == "all" || "${selected_workload}" == "oprf_world_id_nullifier" ]]; then + copy_workload \ + oprf_world_id_nullifier \ + "${repo_root}/noir-examples/oprf/target/oprf.json" \ + "${repo_root}/noir-examples/oprf/Prover.toml" + workloads+=(oprf_world_id_nullifier) +fi + +for workload in "${workloads[@]}"; do + ( + cd "${barretenberg_root}" + bun run generate-web-fixtures.ts "${dist}" "${workload}" + ) +done + +echo "Built Barretenberg browser benchmark at ${dist}" diff --git a/benchmarks/v1/barretenberg/web/index.html b/benchmarks/v1/barretenberg/web/index.html new file mode 100644 index 000000000..27c6c6062 --- /dev/null +++ b/benchmarks/v1/barretenberg/web/index.html @@ -0,0 +1,14 @@ + + + + + + ProveKit V1 Barretenberg benchmark + + +

Barretenberg 4.2.0-aztecnr-rc.2 browser benchmark

+

Single-thread WebAssembly · Mobench Automate harness

+
Ready.
+ + + diff --git a/benchmarks/v1/barretenberg/web/runner.ts b/benchmarks/v1/barretenberg/web/runner.ts new file mode 100644 index 000000000..5e3975641 --- /dev/null +++ b/benchmarks/v1/barretenberg/web/runner.ts @@ -0,0 +1,312 @@ +import { BackendType, Barretenberg, UltraHonkBackend } from "./vendor/bb/index.js"; +import { Noir } from "@noir-lang/noir_js"; + +type WorkloadName = + | "passport_complete_age_check" + | "passport_p1" + | "webauthn_assertion" + | "oprf_taceo" + | "oprf_world_id_nullifier"; +type PhaseName = "witness" | "prove" | "verify" | "e2e"; + +interface BenchSpec { + name: string; + iterations: number; + warmup: number; + timing_mode?: "cold_local" | "warm_reuse"; + /** Requested bb.js worker count. 1 keeps the historical single-thread path. */ + threads?: number; +} + +interface ProofData { + proof: Uint8Array; + publicInputs: string[]; +} + +interface CircuitArtifact { + bytecode: string; + [key: string]: unknown; +} + +interface WindowWithMobench extends Window { + mobench: { + run(spec: BenchSpec): Promise; + }; +} + +const workloadNames = new Set([ + "passport_complete_age_check", + "passport_p1", + "webauthn_assertion", + "oprf_taceo", + "oprf_world_id_nullifier", +]); +const phaseNames = new Set(["witness", "prove", "verify", "e2e"]); +const status = document.querySelector("#status"); + +function setProgress(stage: string, started: number): void { + const elapsedMs = Math.round(performance.now() - started); + Object.assign(window, { + __BARRETENBERG_PROGRESS__: { + stage, + elapsed_ms: elapsedMs, + }, + }); + if (status) status.textContent = `${stage} (${elapsedMs} ms)`; +} + +function boundedInteger(value: number, minimum: number, maximum: number, label: string): number { + if (!Number.isInteger(value) || value < minimum || value > maximum) { + throw new Error(`${label} must be an integer from ${minimum} to ${maximum}`); + } + return value; +} + +function resolveThreads(requested: number | undefined): { requested: number; effective: number } { + const value = requested ?? 1; + const bounded = boundedInteger(value, 1, 32, "threads"); + const hardware = navigator.hardwareConcurrency || 1; + return { requested: bounded, effective: Math.min(bounded, hardware, 32) }; +} + +function parseFunction(name: string): { workload: WorkloadName; phase: PhaseName } { + const match = /^barretenberg::([^:]+)::(witness|prove|verify|e2e)$/.exec(name); + if (!match) throw new Error(`unsupported Barretenberg benchmark function: ${name}`); + const workload = match[1] as WorkloadName; + const phase = match[2] as PhaseName; + if (!workloadNames.has(workload) || !phaseNames.has(phase)) { + throw new Error(`unsupported Barretenberg benchmark function: ${name}`); + } + return { workload, phase }; +} + +async function fetchJson(path: string): Promise { + const response = await fetch(path, { cache: "no-store" }); + if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`); + return (await response.json()) as T; +} + +async function fetchBytes(path: string): Promise { + const response = await fetch(path, { cache: "no-store" }); + if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`); + return new Uint8Array(await response.arrayBuffer()); +} + +async function contentLength(path: string): Promise { + const response = await fetch(path, { method: "HEAD", cache: "no-store" }); + if (!response.ok) throw new Error(`failed to inspect ${path}: HTTP ${response.status}`); + const bytes = Number.parseInt(response.headers.get("content-length") ?? "", 10); + if (!Number.isSafeInteger(bytes) || bytes < 0) throw new Error(`missing Content-Length for ${path}`); + return bytes; +} + +function durationNs(start: number): number { + return Math.round((performance.now() - start) * 1_000_000); +} + +async function run(spec: BenchSpec): Promise { + const coldStarted = performance.now(); + const iterations = boundedInteger(spec.iterations, 1, 20, "iterations"); + const warmup = boundedInteger(spec.warmup, 0, 10, "warmup"); + const threads = resolveThreads(spec.threads); + const { workload, phase } = parseFunction(spec.name); + const benchmarkStarted = performance.now(); + setProgress(`Loading ${spec.name}`, benchmarkStarted); + + const [circuit, inputs, frozenWitness, frozenProofBytes, frozenPublicInputs, circuitBytes, inputBytes] = await Promise.all([ + fetchJson(`./assets/${workload}/circuit.json`), + fetchJson>(`./assets/${workload}/inputs.json`), + fetchBytes(`./assets/${workload}/witness.gz`), + fetchBytes(`./assets/${workload}/proof.bin`), + fetchJson(`./assets/${workload}/public-inputs.json`), + contentLength(`./assets/${workload}/circuit.json`), + contentLength(`./assets/${workload}/inputs.json`), + ]); + const noir = new Noir(circuit); + const backendType = threads.effective > 1 ? BackendType.WasmWorker : BackendType.Wasm; + const api = await Barretenberg.new({ backend: backendType, threads: threads.effective }); + const backend = new UltraHonkBackend(circuit.bytecode, api); + + try { + let preparedWitness = frozenWitness; + let preparedProof: ProofData = { + proof: frozenProofBytes, + publicInputs: frozenPublicInputs, + }; + if ((phase === "witness" || phase === "e2e") && spec.timing_mode !== "cold_local") { + setProgress("Canary witness", benchmarkStarted); + preparedWitness = (await noir.execute(inputs)).witness; + setProgress("Canary proof", benchmarkStarted); + preparedProof = (await backend.generateProof(preparedWitness)) as ProofData; + } else if (phase === "prove") { + setProgress("Canary proof from frozen witness", benchmarkStarted); + preparedProof = (await backend.generateProof(preparedWitness)) as ProofData; + } + let tamperedRejected = false; + if (spec.timing_mode !== "cold_local") { + setProgress("Canary verification", benchmarkStarted); + if (!(await backend.verifyProof(preparedProof))) { + throw new Error(`Barretenberg rejected its ${workload} canary proof`); + } + setProgress("Tampered-proof verification", benchmarkStarted); + const tamperedBytes = preparedProof.proof.slice(); + tamperedBytes[Math.floor(tamperedBytes.byteLength / 2)] ^= 1; + try { + tamperedRejected = !(await backend.verifyProof({ + ...preparedProof, + proof: tamperedBytes, + })); + } catch { + tamperedRejected = true; + } + if (!tamperedRejected) { + throw new Error(`Barretenberg accepted a tampered ${workload} proof`); + } + } + + const samples: Array<{ + duration_ns: number; + initialization_time_ns: number; + witness_time_ns: number; + prove_time_ns: number; + verify_time_ns: number; + input_to_proof_time_ns: number; + proof_size_bytes: number; + tampered_proof_rejected: boolean; + sample_index: number; + warmup: boolean; + }> = []; + const timeline: Array<{ + phase: string; + timing_scope: string; + start_offset_ns: number; + end_offset_ns: number; + iteration: number | null; + }> = []; + const runStart = performance.now(); + + for (let index = 0; index < warmup + iterations; index += 1) { + const measured = index >= warmup; + const iteration = measured ? index - warmup : null; + const started = spec.timing_mode === "cold_local" && index === 0 + ? coldStarted + : performance.now(); + setProgress( + `${measured ? "Sample" : "Warmup"} ${index + 1}/${warmup + iterations}: ${phase}`, + benchmarkStarted, + ); + + let initializationNs = 0; + let witnessNs = 0; + let proveNs = 0; + let verifyNs = 0; + let inputToProofNs = 0; + let sampleProof = preparedProof; + if (phase === "witness") { + const witnessStarted = performance.now(); + await noir.execute(inputs); + witnessNs = durationNs(witnessStarted); + } else if (phase === "prove") { + const proveStarted = performance.now(); + sampleProof = (await backend.generateProof(preparedWitness)) as ProofData; + proveNs = durationNs(proveStarted); + } else if (phase === "verify") { + const verifyStarted = performance.now(); + if (!(await backend.verifyProof(preparedProof))) { + throw new Error(`Barretenberg rejected ${workload} during verification sample`); + } + verifyNs = durationNs(verifyStarted); + } else { + const witnessStarted = performance.now(); + const execution = await noir.execute(inputs); + witnessNs = durationNs(witnessStarted); + const proveStarted = performance.now(); + sampleProof = (await backend.generateProof(execution.witness)) as ProofData; + proveNs = durationNs(proveStarted); + inputToProofNs = durationNs(started); + } + + if (spec.timing_mode === "cold_local") { + const verifyStarted = performance.now(); + if (!(await backend.verifyProof(sampleProof))) { + throw new Error(`Barretenberg rejected ${workload} during cold-run verification`); + } + verifyNs = durationNs(verifyStarted); + const tamperedBytes = sampleProof.proof.slice(); + tamperedBytes[Math.floor(tamperedBytes.byteLength / 2)] ^= 1; + try { + tamperedRejected = !(await backend.verifyProof({ ...sampleProof, proof: tamperedBytes })); + } catch { + tamperedRejected = true; + } + if (!tamperedRejected) { + throw new Error(`Barretenberg accepted a tampered ${workload} cold-run proof`); + } + } + + const elapsed = durationNs(started); + initializationNs = spec.timing_mode === "cold_local" + ? inputToProofNs - witnessNs - proveNs + : 0; + samples.push({ + duration_ns: elapsed, + initialization_time_ns: initializationNs, + witness_time_ns: witnessNs, + prove_time_ns: proveNs, + verify_time_ns: verifyNs, + input_to_proof_time_ns: inputToProofNs || elapsed, + proof_size_bytes: sampleProof.proof.byteLength, + tampered_proof_rejected: tamperedRejected, + sample_index: measured ? index - warmup : index, + warmup: !measured, + }); + timeline.push({ + phase, + timing_scope: phase === "e2e" + ? "raw-input-to-serialized-proof; verification excluded" + : phase, + start_offset_ns: Math.round((started - runStart) * 1_000_000), + end_offset_ns: Math.round((performance.now() - runStart) * 1_000_000), + iteration, + }); + } + + const report = { + spec: { + name: spec.name, + iterations, + warmup, + }, + samples, + phases: [], + timeline, + metadata: { + backend: threads.effective > 1 + ? "barretenberg_4.2.0-aztecnr-rc.2_wasm_workers" + : "barretenberg_4.2.0-aztecnr-rc.2_wasm_single", + workload, + phase, + timing_mode: spec.timing_mode ?? "warm_reuse", + circuit_size_bytes: circuitBytes, + input_size_bytes: inputBytes, + proof_size_bytes: preparedProof.proof.byteLength, + public_input_count: preparedProof.publicInputs.length, + tampered_proof_rejected: tamperedRejected, + user_agent: navigator.userAgent, + hardware_concurrency: navigator.hardwareConcurrency, + threads_requested: threads.requested, + threads_effective: threads.effective, + shared_array_buffer: typeof SharedArrayBuffer !== "undefined", + cross_origin_isolated: self.crossOriginIsolated, + }, + }; + if (status) status.textContent = JSON.stringify(report, null, 2); + return report; + } finally { + await api.destroy(); + const destroy = (noir as Noir & { destroy?: () => Promise | void }).destroy; + if (destroy) await destroy.call(noir); + } +} + +(window as unknown as WindowWithMobench).mobench = { run }; diff --git a/benchmarks/v1/barretenberg/web/server.ts b/benchmarks/v1/barretenberg/web/server.ts new file mode 100644 index 000000000..ba8519393 --- /dev/null +++ b/benchmarks/v1/barretenberg/web/server.ts @@ -0,0 +1,41 @@ +import { resolve, sep } from "node:path"; + +const root = resolve(new URL("./dist", import.meta.url).pathname); +const port = Number.parseInt(process.env.BARRETENBERG_BENCH_PORT ?? "4174", 10); +const mimeTypes: Record = { + ".html": "text/html; charset=utf-8", + ".js": "text/javascript; charset=utf-8", + ".json": "application/json; charset=utf-8", + ".wasm": "application/wasm", +}; + +export function startServer() { + return Bun.serve({ + hostname: "127.0.0.1", + port, + async fetch(request) { + const url = new URL(request.url); + const relative = decodeURIComponent(url.pathname === "/" ? "/index.html" : url.pathname); + const path = resolve(root, `.${relative}`); + if (path !== root && !path.startsWith(`${root}${sep}`)) { + return new Response("not found", { status: 404 }); + } + const file = Bun.file(path); + if (!(await file.exists())) return new Response("not found", { status: 404 }); + const extension = path.slice(path.lastIndexOf(".")); + return new Response(file, { + headers: { + "Cache-Control": "no-store", + "Content-Type": mimeTypes[extension] ?? "application/octet-stream", + "Cross-Origin-Embedder-Policy": "require-corp", + "Cross-Origin-Opener-Policy": "same-origin", + }, + }); + }, + }); +} + +if (import.meta.main) { + const server = startServer(); + console.log(`Barretenberg browser benchmark: ${server.url}`); +} diff --git a/benchmarks/v1/barretenberg/web/smoke.ts b/benchmarks/v1/barretenberg/web/smoke.ts new file mode 100644 index 000000000..e8fd4fc93 --- /dev/null +++ b/benchmarks/v1/barretenberg/web/smoke.ts @@ -0,0 +1,130 @@ +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { chromium } from "playwright-core"; +import { startRendererRssSampler } from "../../scripts/browser-process-memory"; +import { startServer } from "./server"; + +const workloads = [ + "passport_complete_age_check", + "passport_p1", + "webauthn_assertion", + "oprf_taceo", + "oprf_world_id_nullifier", +] as const; +type Workload = (typeof workloads)[number]; + +const workload = (process.env.MOBENCH_WORKLOAD ?? "webauthn_assertion") as Workload; +if (!workloads.includes(workload)) { + throw new Error(`MOBENCH_WORKLOAD must be one of ${workloads.join(", ")}`); +} + +const executablePath = + process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; +const warmup = Number.parseInt(process.env.MOBENCH_WARMUP ?? "1", 10); +const iterations = Number.parseInt(process.env.MOBENCH_ITERATIONS ?? "5", 10); +const timingMode = process.env.MOBENCH_TIMING_MODE === "cold_local" ? "cold_local" : "warm_reuse"; +const requestedThreads = Number.parseInt(process.env.MOBENCH_BB_THREADS ?? "1", 10); +if (!Number.isInteger(requestedThreads) || requestedThreads < 1 || requestedThreads > 32) { + throw new Error("MOBENCH_BB_THREADS must be an integer from 1 to 32"); +} +const server = startServer(); +const profile = await mkdtemp(join(tmpdir(), "provekit-barretenberg-chrome-")); +const context = await chromium.launchPersistentContext(profile, { + executablePath, + headless: true, + args: [ + "--enable-precise-memory-info", + "--js-flags=--max-old-space-size=32768", + ], +}); + +let sampler: ReturnType | undefined; +try { + const page = context.pages()[0] ?? (await context.newPage()); + const crsResponses = new Map< + string, + { url: string; range: string; size_bytes: number } + >(); + page.on("response", (response) => { + if (!response.url().includes("crs.aztec")) return; + const headers = response.headers(); + const size = Number.parseInt(headers["content-length"] ?? "", 10); + if (!Number.isSafeInteger(size) || size < 0) return; + const range = response.request().headers()["range"] ?? ""; + crsResponses.set(`${response.url()}|${range}`, { + url: response.url(), + range, + size_bytes: size, + }); + }); + page.on("console", (message) => console.error(`[browser:${message.type()}] ${message.text()}`)); + page.on("pageerror", (error) => console.error(`[browser:error] ${error.message}`)); + await page.goto(server.url.toString()); + await page.waitForFunction(() => typeof window.mobench?.run === "function", undefined, { + timeout: 60_000, + }); + sampler = startRendererRssSampler(profile); + const report = await page.evaluate( + async ({ name, warmupCount, iterationCount, timingMode, threads }) => + window.mobench.run({ + name: `barretenberg::${name}::e2e`, + warmup: warmupCount, + iterations: iterationCount, + timing_mode: timingMode, + threads, + }), + { + name: workload, + warmupCount: warmup, + iterationCount: iterations, + timingMode, + threads: requestedThreads, + }, + ); + const processMemory = await sampler.stop(); + sampler = undefined; + const crsRequests = [...crsResponses.values()]; + console.log( + JSON.stringify( + { + ...(report as object), + process_memory: processMemory, + proving_payload_transport: { + crs_requests: crsRequests, + crs_size_bytes: crsRequests.reduce( + (sum, request) => sum + request.size_bytes, + 0, + ), + }, + browser: { + name: "Google Chrome", + version: context.browser()?.version() ?? "unknown", + executable_path: executablePath, + headless: true, + }, + }, + null, + 2, + ), + ); +} finally { + if (sampler) await sampler.stop(); + await context.close(); + server.stop(true); + await rm(profile, { recursive: true, force: true }); +} + +declare global { + interface Window { + mobench: { + run(spec: { + name: string; + warmup: number; + iterations: number; + timing_mode?: "cold_local" | "warm_reuse"; + threads?: number; + }): Promise; + }; + } +} diff --git a/benchmarks/v1/benchmark-contract.json b/benchmarks/v1/benchmark-contract.json new file mode 100644 index 000000000..4cafaade2 --- /dev/null +++ b/benchmarks/v1/benchmark-contract.json @@ -0,0 +1,277 @@ +{ + "schema_version": 2, + "campaign_id": "provekit-v1-cross-device", + "publication_iterations": 5, + "warmup_iterations": 1, + "comparison_warning": "The three stacks implement the closest available counterparts, not identical statements. Report each circuit identity and never rank stacks as if the circuits were interchangeable.", + "targets": [ + { + "id": "iphone_se_2022_native", + "surface": "native", + "provider": "browserstack", + "device": "iPhone SE 2022", + "os_version": "resolve-and-freeze-from-device-catalog", + "architecture": "arm64", + "paid_confirmation_required": true + }, + { + "id": "motorola_e15_native", + "surface": "native", + "provider": "physical", + "device": "Motorola E15", + "os_version": "capture-with-adb", + "architecture": "capture-ro.product.cpu.abilist-and-userspace-bitness", + "paid_confirmation_required": false + }, + { + "id": "m4_max_chrome_wasm", + "surface": "browser-wasm", + "provider": "local", + "device": "MacBook Pro M4 Max", + "os_version": "capture-at-run-time", + "architecture": "arm64", + "browser": "Google Chrome", + "browser_version": "capture-at-run-time", + "paid_confirmation_required": false + } + ], + "stacks": [ + { + "id": "provekit_v1", + "frontend": "noir", + "native_adapter": "ProveKit C ABI through Mobench", + "browser_adapter": "tooling/provekit-wasm at provekit_v1.core_commit, fixed-16-worker threaded wasm-bindgen package", + "browser_sdk_compatibility": "@worldcoin/provekit@0.1.0 is retained only as an incompatibility record; it is not a measured runtime", + "proof_system": "WHIR", + "required_cells": 9 + }, + { + "id": "noir_barretenberg", + "frontend": "noir", + "native_adapter": "Mopro 0.3.7 Noir adapter", + "native_backend": "barretenberg-rs 4.2.0-aztecnr-rc.2", + "browser_adapter": "@noir-lang/noir_js plus smoke-validated @aztec/bb.js", + "proof_system": "UltraHonk", + "required_cells": 9 + }, + { + "id": "circom_groth16", + "frontend": "circom", + "native_adapter": "Mopro 0.3.7", + "native_backend_policy": "Rapidsnark preferred; Arkworks plus rust-witness is a target-specific fallback", + "browser_adapter": "snarkjs@0.7.6 with exactly 16 requested/effective workers", + "proof_system": "Groth16", + "required_cells": 9 + } + ], + "workloads": { + "passport": { + "headline": true, + "noir": { + "circuit": "complete_age_check", + "identity": "monolithic passport age-check statement" + }, + "circom": { + "source": "selfxyz/self", + "circuits": [ + "signature-specific registration", + "vc_and_disclose" + ], + "identity": "two-stage product flow" + }, + "equivalence": "not-equivalent" + }, + "webauthn": { + "headline": false, + "noir": { + "circuit": "ES256 assertion", + "identity": "binds challenge, ceremony type, origin, RP-ID hash, UP/UV flags, signature, and public key" + }, + "circom": { + "source": "privacy-ethereum/webauth-circom", + "circuit": "WebAuthn assertion counterpart", + "identity": "closest available ES256 Circom counterpart; it does not bind the complete Noir assertion statement" + }, + "equivalence": "not-equivalent" + }, + "oprf": { + "headline": false, + "noir": { + "source": "TACEO oprf-nr", + "circuit": "core example" + }, + "circom": { + "source": "worldcoin/world-id-protocol", + "circuits": [ + "query", + "nullifier" + ], + "identity": "application circuits reported under distinct circuit names" + }, + "equivalence": "not-equivalent" + } + }, + "circom_native_backend_gate": { + "arm64_pilot": { + "witness_adapter": "witnesscalc-adapter@0.1.7", + "prover": "rust-rapidsnark@0.1.4" + }, + "iphone_policy": "Use Rapidsnark only after every exact circuit passes build, valid-proof verification, tamper rejection, warmup, and five measured samples.", + "motorola_policy": "Capture ABI and userspace bitness with ADB. Try Rapidsnark only when supported; otherwise use Mopro Arkworks plus rust-witness and retain the backend difference in every row.", + "compatibility_fallback": { + "adapter": "iden3/circom-witnesscalc@0.3.0", + "status": "fallback-only", + "warning": "Known documented feature gaps include RSA-related circuits." + }, + "oprf_o2_canonical_override": { + "scope": "oprf_nullifier / O2-world-id-nullifier on Mac, iPhone, and Motorola E15", + "helper_source": "TaceoLabs/circom-helpers@8aacd73ed6ab0a2b9b2158e613acfa920860865a (main)", + "witness_source": "philsippl/circom-witness-rs@e11206a9f453145dcd6b814523cbfba4f60cf5c6 (codex/remove-cxx-bridge-and-grep)", + "prover": "taceo-groth16 0.2.1 / taceo-groth16-material 0.4.2", + "measurement_boundary": "raw frozen input through circom-witness-rs graph execution and TACEO Groth16 proof serialization", + "reason": "The TACEO helper path is the qualified replacement for the prior Rapidsnark/Rust-witness OPRF rows; all six cold/warm target series are measured with the same frozen zkey, graph, and input bundle." + } + }, + "noir_native_gate": { + "mopro": "0.3.7", + "noir": "1.0.0-beta.19", + "barretenberg_rs": "4.2.0-aztecnr-rc.2", + "port_policy": "Mechanical ports are allowed only when semantic outputs remain identical.", + "motorola_policy": "If ADB confirms armv7 userspace and the Mopro Noir adapter cannot target it, record unsupported with the captured device evidence." + }, + "correctness_gate": { + "before_timing": [ + "valid-proof-accepted", + "tampered-proof-rejected", + "public-outputs-recorded", + "workload-and-circuit-identity-recorded" + ], + "missing_metrics": "blank", + "allowed_failure_statuses": [ + "unsupported", + "build_failed", + "crashed", + "runtime_failed", + "timed_out", + "zero_samples" + ], + "prohibitions": [ + "estimates", + "substituting-browser-timings-for-native", + "merging-native-and-browser-runtimes", + "encoding-missing-measurements-as-zero" + ] + }, + "measurement_fields": [ + "initialization_time_ns", + "witness_time_ns", + "prove_time_ns", + "verify_time_ns", + "end_to_end_time_ns", + "proof_size_bytes", + "circuit_size_bytes", + "artifact_size_bytes", + "bundle_size_bytes", + "peak_memory_bytes", + "constraint_count" + ], + "publication": { + "canonical_csv": "benchmarks/v1/input-to-proof-data/input-to-proof-samples.csv", + "campaign_id": "input-to-proof-v1-20260807", + "campaign_ids": [ + "input-to-proof-v1-20260807", + "input-to-proof-v1-mac-multithread-16-20260812", + "input-to-proof-v1-taceo-oprf-20260814" + ], + "canonical_mac_campaign_id": "input-to-proof-v1-mac-multithread-16-20260812", + "headline_metric": "input_to_proof_time_ms", + "measurement_boundary": "raw structured circuit input through fresh witness generation to serialized proof bytes", + "rows": 417, + "logical_cells": 36, + "logical_series": 72, + "successful_series": 69, + "gap_series": 3, + "samples_per_successful_cell": {"warmup": 1, "measured": 5}, + "all_cells_status": "three_structured_runtime_gaps", + "provekit_v1_core_commit": "9b2a6f37c67691eab4b0cec6c35e35c520e93285", + "payload_definition": "PKP/prover plus the frozen proving input; verifier-only artifacts, APK/IPA/XCUITest packages, and transport duplication are excluded", + "proof_serialization": { + "browser": "V1 WASM proof byte serialization", + "native": "serialized postcard NoirProof (.np) bytes" + }, + "gaps": [ + { + "series": "webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local", + "status": "runtime_failed", + "failure_code": "out_of_memory", + "metrics": "blank" + }, + { + "series": "webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse", + "status": "not_run", + "failure_code": "blocked_by_cold_failure", + "metrics": "blank" + }, + { + "series": "webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local", + "status": "runtime_failed", + "failure_code": "out_of_memory", + "metrics": "blank" + } + ], + "legacy_datasets": [ + { + "path": "benchmarks/v1/legacy/data/benchmark-samples.csv", + "kind": "exploratory_compound_proof_only", + "rows": 198 + }, + { + "path": "benchmarks/v1/legacy/semantic-parity/semantic-parity-samples.csv", + "kind": "proof_only_semantic_parity", + "rows": 162 + }, + { + "path": "benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.taceo-candidate.csv", + "kind": "experimental_production_backend_candidate", + "rows": 372 + } + ] + }, + "input_to_proof_campaign": { + "campaign_id": "input-to-proof-v1-20260807", + "canonical_csv": "benchmarks/v1/input-to-proof-data/input-to-proof-samples.csv", + "headline_metric": "input_to_proof_time_ms", + "measurement_boundary": "raw structured circuit input through fresh witness generation to serialized proof bytes", + "verification_boundary": "valid-proof acceptance and tampered-proof rejection are mandatory but outside headline timing", + "workloads": [ + "passport_complete_age_check", + "passport_p1", + "oprf_o2", + "webauthn_closest_analogue" + ], + "passport_p1": { + "noir_source": "benchmarks/v1/noir/passport_p1/src/main.nr", + "circom_source": "benchmarks/v1/circom/passport_p1/passport_p1.circom", + "identity": "P1-matched monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion" + }, + "circom_oprf_taceo_replacement": { + "witness_backend": "circom-witness-rs@e11206a9f453145dcd6b814523cbfba4f60cf5c6 (codex/remove-cxx-bridge-and-grep)", + "prover_backend": "taceo-groth16 0.2.1 / taceo-groth16-material 0.4.2 from circom-helpers@8aacd73ed6ab0a2b9b2158e613acfa920860865a", + "measurement_boundary": "raw frozen input through generated Circom witness graph, Groth16 proof generation, and exact proof serialization", + "qualification": "valid-proof acceptance and tampered-proof rejection on every target and timing mode; exact graph, zkey, input, proof, and process-memory hashes are retained" + }, + "timing_modes": { + "cold_local": "fresh process and proof runtime per attempt with locked assets already local", + "warm_reuse": "initialized runtime is reused while witness and proof are regenerated" + }, + "expected_series": 72, + "expected_rows": 417, + "successful_series": 69, + "gap_series": 3, + "samples_per_series": { + "warmup": 1, + "measured": 5 + }, + "provekit_v1_core_commit": "9b2a6f37c67691eab4b0cec6c35e35c520e93285" + } +} diff --git a/benchmarks/v1/circom/README.md b/benchmarks/v1/circom/README.md new file mode 100644 index 000000000..78db5e1eb --- /dev/null +++ b/benchmarks/v1/circom/README.md @@ -0,0 +1,27 @@ +# Circom + Groth16 lane + +The canonical Circom backend is Groth16 with SnarkJS in Chrome and the pinned +Mopro-native Rapidsnark adapter on supported mobile targets. The preferred +native witness path is `witnesscalc-adapter@0.1.7`; the exact circuit, witness, +zkey, and backend are recorded per CSV row. The iPhone OPRF lane uses the +qualified Wasmi witness runtime because its native AOT witness artifact was +layout-unsafe on iOS. + +The Motorola E15 is a confirmed 32-bit `armeabi-v7a` userspace. Its rows retain +the target-specific backend evidence. The Circom WebAuthn cold series remains +an explicit out-of-memory gap because the device cannot map the pinned zkey +and WTNS; no other target's value is substituted. + +Verify frozen Circom artifacts and run the local browser smoke: + +```bash +bash benchmarks/v1/scripts/verify-circom-artifacts.sh +cd benchmarks/v1/circom/web +bun install --frozen-lockfile +bun run build +bun run smoke +``` + +The browser campaign sets SnarkJS to exactly 16 requested/effective workers. +Self Passport registration/disclosure and World ID query/nullifier circuits are +reported as their named counterparts, not as equivalent Noir statements. diff --git a/benchmarks/v1/circom/artifacts.lock.json b/benchmarks/v1/circom/artifacts.lock.json new file mode 100644 index 000000000..f9b0003b1 --- /dev/null +++ b/benchmarks/v1/circom/artifacts.lock.json @@ -0,0 +1,56 @@ +{ + "schema_version": 1, + "artifacts": [ + { + "workload": "world_id_oprf_query", + "kind": "witness_graph", + "source": "world-id-protocol/circom/OPRFQueryGraph.bin", + "size": 563886, + "sha256": "6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311" + }, + { + "workload": "world_id_oprf_query", + "kind": "arkworks_proving_key", + "source": "world-id-protocol/circom/OPRFQuery.arks.zkey", + "size": 11399104, + "sha256": "616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798" + }, + { + "workload": "world_id_oprf_nullifier", + "kind": "witness_graph", + "source": "world-id-protocol/circom/OPRFNullifierGraph.bin", + "size": 1338703, + "sha256": "c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a" + }, + { + "workload": "world_id_oprf_nullifier_taceo", + "kind": "witness_graph", + "source": "benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifierGraph.bin", + "size": 160978, + "sha256": "785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081", + "source_commit": "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + "witness_source_commit": "e11206a9f453145dcd6b814523cbfba4f60cf5c6" + }, + { + "workload": "world_id_oprf_nullifier_taceo", + "kind": "proving_input", + "source": "benchmarks/v1/circom/taceo-mobile/assets/oprf_nullifier.input.json", + "size": 5610, + "sha256": "662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40" + }, + { + "workload": "world_id_oprf_nullifier", + "kind": "arkworks_proving_key", + "source": "world-id-protocol/circom/OPRFNullifier.arks.zkey", + "size": 26645680, + "sha256": "4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9" + }, + { + "workload": "world_id_oprf_nullifier_taceo", + "kind": "arkworks_proving_key", + "source": "benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifier.arks.zkey", + "size": 26645680, + "sha256": "4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9" + } + ] +} diff --git a/benchmarks/v1/circom/circom-witness-graph-main.rs b/benchmarks/v1/circom/circom-witness-graph-main.rs new file mode 100644 index 000000000..6efd85792 --- /dev/null +++ b/benchmarks/v1/circom/circom-witness-graph-main.rs @@ -0,0 +1,109 @@ +use byteorder::{LittleEndian, ReadBytesExt}; +use ruint::aliases::U256; +use std::{ + collections::HashMap, + env, + fs::File, + io::{Cursor, Read}, +}; + +fn read_wtns(path: &str) -> eyre::Result> { + let mut bytes = Vec::new(); + File::open(path)?.read_to_end(&mut bytes)?; + let mut reader = Cursor::new(bytes); + + let mut magic = [0_u8; 4]; + reader.read_exact(&mut magic)?; + eyre::ensure!(&magic == b"wtns", "invalid WTNS magic"); + eyre::ensure!(reader.read_u32::()? == 2, "expected WTNS v2"); + eyre::ensure!( + reader.read_u32::()? == 2, + "expected exactly two WTNS sections" + ); + + eyre::ensure!( + reader.read_u32::()? == 1, + "expected WTNS header section" + ); + let header_size = reader.read_u64::()?; + let field_size = reader.read_u32::()? as usize; + eyre::ensure!(field_size == 32, "expected a 32-byte BN254 field"); + let mut prime = vec![0_u8; field_size]; + reader.read_exact(&mut prime)?; + let witness_count = reader.read_u32::()? as usize; + eyre::ensure!( + header_size == (field_size + 8) as u64, + "unexpected WTNS header size" + ); + + eyre::ensure!( + reader.read_u32::()? == 2, + "expected WTNS witness section" + ); + let witness_size = reader.read_u64::()? as usize; + eyre::ensure!( + witness_size == witness_count * field_size, + "unexpected WTNS witness byte length" + ); + + let mut witness = Vec::with_capacity(witness_count); + for _ in 0..witness_count { + let mut value = [0_u8; 32]; + reader.read_exact(&mut value)?; + witness.push(U256::from_le_bytes(value)); + } + eyre::ensure!( + reader.position() as usize == reader.get_ref().len(), + "trailing bytes in WTNS file" + ); + Ok(witness) +} + +fn read_inputs(path: &str) -> eyre::Result>> { + let values: HashMap> = serde_json::from_reader(File::open(path)?)?; + values + .into_iter() + .map(|(name, values)| { + let values = values + .into_iter() + .map(|value| { + U256::from_str_radix(&value, 10) + .map_err(|error| eyre::eyre!("invalid input {name}: {error}")) + }) + .collect::>>()?; + Ok((name, values)) + }) + .collect() +} + +fn main() -> eyre::Result<()> { + let args = env::args().collect::>(); + match args.get(1).map(String::as_str) { + Some("generate") if args.len() == 2 => { + circom_witness_rs::generate::build_witness()?; + } + Some("check") if args.len() == 5 => { + let graph = circom_witness_rs::init_graph(&std::fs::read(&args[2])?)?; + let calculated = circom_witness_rs::calculate_witness( + read_inputs(&args[3])?, + &graph, + None, + )?; + let expected = read_wtns(&args[4])?; + eyre::ensure!( + calculated == expected, + "circom-witness-rs witness differs from the reference WTNS" + ); + println!( + "circom-witness-rs witness matches all {} reference field elements", + expected.len() + ); + } + _ => { + eyre::bail!( + "usage: circom-witness-rs " + ); + } + } + Ok(()) +} diff --git a/benchmarks/v1/circom/circom-witness-rs.Cargo.lock b/benchmarks/v1/circom/circom-witness-rs.Cargo.lock new file mode 100644 index 000000000..a108e5545 --- /dev/null +++ b/benchmarks/v1/circom/circom-witness-rs.Cargo.lock @@ -0,0 +1,2029 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-rlp" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[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-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "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-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "circom-witness-rs" +version = "0.2.3" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "byteorder", + "cxx", + "cxx-build", + "eyre", + "hex", + "num-bigint", + "num-traits", + "postcard", + "rand 0.8.7", + "ruint", + "serde", + "serde_json", +] + +[[package]] +name = "clap" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[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 = "cxx" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe442a792c7c736eea18b32a7f8a3b63cf8aafabda6760042dc2fdeda456291" +dependencies = [ + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3184a94384c663718698311a78a51ac00c484c10b4eeac06fb0a068c5f64fa2" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "scratch", + "syn 3.0.3", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0148d8fd1199329ddf1d157a5e134e51ceff37c6a7ddd38615c399d81cb05d8d" +dependencies = [ + "clap", + "codespan-reporting", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52850339faed2eaadd24e286dc1d8268cc6f8a7bd9524d713adc9099566b4c89" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c77c856545d886c9bd5215409ebb63b925e262135248b50c79e5a5f194ee47c" +dependencies = [ + "indexmap 2.14.0", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "crypto-common", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-ordinalize" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07f808d588c10e464ea6f7d3eaed500049eff30aaac103460f61828c2d65b3eb" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e528e2d34ba8a67a1a650b86beae8ef69fc5fdb638016f386b973226590432" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.7", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[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 = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pest" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags", + "num-traits", + "rand 0.9.5", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[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 = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ruint" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45caf26f647c19115bf9c453c70ffe4a4a3a6390dceebd942610584f99b8ddce" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "ark-ff 0.6.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.7", + "rand 0.9.5", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.28", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "time", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[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.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "time" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/circom/extract-world-id-oprf-inputs.ts b/benchmarks/v1/circom/extract-world-id-oprf-inputs.ts new file mode 100644 index 000000000..1a11756e1 --- /dev/null +++ b/benchmarks/v1/circom/extract-world-id-oprf-inputs.ts @@ -0,0 +1,56 @@ +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +const repoRoot = resolve(import.meta.dir, "../../.."); +const sourceRoot = + process.env.WORLD_ID_PROTOCOL_ROOT ?? + resolve(repoRoot, "target/v1-benchmarks/sources/world-id-protocol"); +const outputRoot = + process.env.CIRCOM_OPRF_INPUT_ROOT ?? + resolve(repoRoot, "target/v1-benchmarks/circom-browser/oprf"); + +async function extractFirstWitnessInput(source: string): Promise { + const marker = "calculateWitness("; + const markerIndex = source.indexOf(marker); + if (markerIndex === -1) throw new Error("calculateWitness call not found"); + const start = source.indexOf("{", markerIndex + marker.length); + if (start === -1) throw new Error("witness input object not found"); + + let depth = 0; + let end = -1; + for (let index = start; index < source.length; index += 1) { + if (source[index] === "{") depth += 1; + if (source[index] === "}") { + depth -= 1; + if (depth === 0) { + end = index + 1; + break; + } + } + } + if (end === -1) throw new Error("unterminated witness input object"); + + // The source is an immutable, hash-pinned repository fixture. Evaluating only + // the extracted object preserves its BigInt values without lossy parsing. + return Function(`"use strict"; return (${source.slice(start, end)});`)(); +} + +async function writeInput(testName: string, outputName: string) { + const sourcePath = resolve(sourceRoot, "circom/tests/tests", testName); + const source = await Bun.file(sourcePath).text(); + const input = await extractFirstWitnessInput(source); + const json = JSON.stringify( + input, + (_, value) => (typeof value === "bigint" ? value.toString() : value), + 2, + ); + await Bun.write(resolve(outputRoot, outputName), `${json}\n`); +} + +await mkdir(outputRoot, { recursive: true }); +await Promise.all([ + writeInput("oprf_query.test.js", "oprf_query.input.json"), + writeInput("oprf_nullifier.test.js", "oprf_nullifier.input.json"), +]); + +console.log(`Extracted frozen World ID OPRF inputs into ${outputRoot}`); diff --git a/benchmarks/v1/circom/fixtures/passport_p1/input.json b/benchmarks/v1/circom/fixtures/passport_p1/input.json new file mode 100644 index 000000000..a28468316 --- /dev/null +++ b/benchmarks/v1/circom/fixtures/passport_p1/input.json @@ -0,0 +1,2825 @@ +{ + "csca_tree_leaf": [ + "18390019689329531194486865663275817993149098196912806933141622083576329149060" + ], + "dg1": [ + "97", + "91", + "95", + "31", + "88", + "80", + "60", + "70", + "82", + "65", + "68", + "85", + "80", + "79", + "78", + "84", + "60", + "60", + "65", + "76", + "80", + "72", + "79", + "78", + "83", + "69", + "60", + "72", + "85", + "71", + "72", + "85", + "69", + "83", + "60", + "65", + "76", + "66", + "69", + "82", + "84", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "49", + "53", + "65", + "65", + "56", + "49", + "50", + "51", + "52", + "52", + "70", + "82", + "65", + "48", + "48", + "48", + "49", + "48", + "49", + "49", + "77", + "51", + "48", + "48", + "49", + "48", + "49", + "53", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "48", + "50" + ], + "dg1_hash_offset": [ + "70" + ], + "dsc_pubKey_actual_size": [ + "512" + ], + "dsc_pubKey_offset": [ + "305" + ], + "eContent": [ + "82", + "215", + "93", + "217", + "28", + "204", + "16", + "239", + "13", + "56", + "40", + "89", + "39", + "173", + "193", + "208", + "248", + "114", + "98", + "163", + "43", + "167", + "201", + "160", + "146", + "134", + "135", + "160", + "84", + "187", + "192", + "214", + "94", + "236", + "195", + "45", + "70", + "4", + "79", + "86", + "51", + "226", + "182", + "70", + "128", + "99", + "61", + "75", + "40", + "5", + "82", + "5", + "65", + "133", + "150", + "204", + "255", + "61", + "191", + "113", + "12", + "48", + "214", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "155", + "69", + "163", + "24", + "248", + "167", + "161", + "54", + "179", + "18", + "174", + "196", + "232", + "60", + "51", + "198", + "140", + "219", + "196", + "229", + "145", + "248", + "154", + "203", + "178", + "114", + "17", + "33", + "54", + "80", + "127", + "173", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "14", + "139", + "118", + "24", + "144", + "18", + "24", + "54", + "15", + "247", + "52", + "152", + "128", + "111", + "155", + "92", + "125", + "169", + "232", + "1", + "177", + "159", + "246", + "136", + "206", + "165", + "56", + "214", + "209", + "161", + "93", + "131", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "161", + "38", + "236", + "81", + "73", + "228", + "168", + "240", + "75", + "34", + "246", + "218", + "220", + "54", + "159", + "97", + "0", + "43", + "137", + "63", + "212", + "14", + "96", + "60", + "133", + "150", + "64", + "197", + "187", + "22", + "204", + "119", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "118", + "246", + "89", + "8", + "172", + "21", + "8", + "22", + "28", + "230", + "253", + "167", + "45", + "27", + "16", + "137", + "205", + "39", + "154", + "196", + "156", + "9", + "83", + "208", + "229", + "6", + "71", + "80", + "43", + "95", + "103", + "112", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "72", + "25", + "64", + "46", + "108", + "99", + "202", + "58", + "117", + "71", + "111", + "30", + "111", + "143", + "175", + "229", + "49", + "39", + "2", + "125", + "112", + "87", + "225", + "112", + "181", + "165", + "22", + "208", + "14", + "57", + "180", + "89", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "114", + "3", + "108", + "42", + "29", + "32", + "4", + "166", + "109", + "28", + "54", + "82", + "1", + "26", + "68", + "187", + "27", + "6", + "236", + "200", + "150", + "84", + "164", + "254", + "220", + "244", + "56", + "145", + "182", + "115", + "60", + "81", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "249", + "123", + "232", + "211", + "60", + "49", + "78", + "85", + "63", + "19", + "255", + "72", + "165", + "85", + "153", + "131", + "31", + "246", + "200", + "122", + "60", + "240", + "182", + "17", + "103", + "74", + "253", + "211", + "216", + "243", + "138", + "171", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "128", + "157", + "7", + "119", + "37", + "17", + "199", + "246", + "72", + "171", + "62", + "251", + "131", + "240", + "124", + "233", + "117", + "124", + "71", + "218", + "114", + "174", + "182", + "243", + "136", + "209", + "122", + "202", + "142", + "178", + "47", + "239", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "11", + "184", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "eContent_padded_length": [ + "384" + ], + "leaf_depth": [ + "6" + ], + "merkle_root": [ + "8048950770293257795621184348033164133320434623462496804361333333092676277328" + ], + "path": [ + "0", + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "pubKey_dsc": [ + "1038899927489758761735522001115877039", + "366903323849628666040656841543004244", + "938438627275339065671678461183298469", + "1283368632043438171286508159822132347", + "706526231147867355295147089287475231", + "1316341345107661287764495528286324500", + "759737422261790260514587143966324768", + "709098515373376974543185159858568142", + "187191183725557247904492303074616879", + "780445008678965812684039190711046456", + "875912039567203018981271863879853341", + "169936882748420347460456686796948056", + "392188872396000862650785007782558464", + "1316772278512823919915853095701833943", + "182273781561166150578674169467617808", + "156992553585278301613011352375790172", + "803131958527330546838377167456051650", + "368918305181252159198802651446041766", + "579536153009698798164505292767747784", + "498311373554094375199935163557272871", + "842444630516923112365497216457217805", + "875873053138318316723597277028405285", + "655392130136276771699086628147689266", + "559907493504464355293787790176567126", + "1199879782645169810661238687472632017", + "1031334546900577772807272763818060750", + "532400052597384057983122314556805554", + "880900804275268742496342379318474202", + "1313281422892799771002059966299460052", + "250990522395837557363266945802425687", + "1275493732099545939216486402572461595", + "95103361937029098691966095355051131", + "372829825689735080020072593747060558", + "1031864276325403132674440587310555517", + "40958" + ], + "raw_dsc": [ + "48", + "130", + "3", + "118", + "160", + "3", + "2", + "1", + "2", + "2", + "20", + "120", + "65", + "169", + "162", + "14", + "221", + "98", + "4", + "13", + "247", + "28", + "143", + "180", + "31", + "18", + "208", + "115", + "62", + "212", + "68", + "48", + "13", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "1", + "11", + "5", + "0", + "48", + "96", + "49", + "11", + "48", + "9", + "6", + "3", + "85", + "4", + "6", + "19", + "2", + "70", + "82", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "8", + "12", + "3", + "73", + "68", + "70", + "49", + "14", + "48", + "12", + "6", + "3", + "85", + "4", + "7", + "12", + "5", + "80", + "97", + "114", + "105", + "115", + "49", + "18", + "48", + "16", + "6", + "3", + "85", + "4", + "10", + "12", + "9", + "77", + "111", + "99", + "107", + "32", + "67", + "83", + "67", + "65", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "11", + "12", + "3", + "80", + "75", + "73", + "49", + "17", + "48", + "15", + "6", + "3", + "85", + "4", + "3", + "12", + "8", + "77", + "111", + "99", + "107", + "67", + "83", + "67", + "65", + "48", + "30", + "23", + "13", + "50", + "53", + "48", + "50", + "49", + "57", + "48", + "52", + "51", + "50", + "48", + "55", + "90", + "23", + "13", + "51", + "53", + "48", + "50", + "49", + "55", + "48", + "52", + "51", + "50", + "48", + "55", + "90", + "48", + "94", + "49", + "11", + "48", + "9", + "6", + "3", + "85", + "4", + "6", + "19", + "2", + "70", + "82", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "8", + "12", + "3", + "73", + "68", + "70", + "49", + "14", + "48", + "12", + "6", + "3", + "85", + "4", + "7", + "12", + "5", + "80", + "97", + "114", + "105", + "115", + "49", + "17", + "48", + "15", + "6", + "3", + "85", + "4", + "10", + "12", + "8", + "77", + "111", + "99", + "107", + "32", + "68", + "83", + "67", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "11", + "12", + "3", + "80", + "75", + "73", + "49", + "16", + "48", + "14", + "6", + "3", + "85", + "4", + "3", + "12", + "7", + "77", + "111", + "99", + "107", + "68", + "83", + "67", + "48", + "130", + "2", + "34", + "48", + "13", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "1", + "1", + "5", + "0", + "3", + "130", + "2", + "15", + "0", + "48", + "130", + "2", + "10", + "2", + "130", + "2", + "1", + "0", + "159", + "254", + "198", + "186", + "214", + "49", + "130", + "110", + "254", + "213", + "99", + "226", + "121", + "87", + "48", + "97", + "125", + "71", + "205", + "237", + "251", + "8", + "18", + "215", + "68", + "171", + "221", + "24", + "161", + "163", + "167", + "78", + "18", + "80", + "245", + "47", + "222", + "236", + "140", + "255", + "54", + "101", + "74", + "219", + "168", + "124", + "123", + "245", + "166", + "178", + "61", + "225", + "166", + "88", + "127", + "240", + "185", + "106", + "69", + "116", + "166", + "27", + "48", + "86", + "201", + "197", + "108", + "100", + "176", + "191", + "155", + "232", + "176", + "223", + "229", + "213", + "87", + "252", + "237", + "197", + "244", + "2", + "250", + "87", + "112", + "149", + "113", + "247", + "235", + "19", + "81", + "212", + "169", + "167", + "195", + "75", + "62", + "223", + "29", + "37", + "13", + "21", + "21", + "116", + "151", + "245", + "218", + "102", + "137", + "89", + "102", + "30", + "196", + "175", + "43", + "84", + "248", + "171", + "20", + "47", + "17", + "178", + "198", + "160", + "184", + "17", + "108", + "81", + "181", + "61", + "105", + "165", + "67", + "24", + "105", + "43", + "206", + "231", + "22", + "164", + "6", + "30", + "108", + "222", + "112", + "91", + "85", + "15", + "229", + "149", + "64", + "209", + "107", + "213", + "146", + "29", + "90", + "13", + "157", + "210", + "99", + "49", + "27", + "106", + "126", + "63", + "86", + "126", + "57", + "83", + "170", + "52", + "143", + "29", + "218", + "107", + "122", + "110", + "24", + "163", + "247", + "50", + "168", + "175", + "224", + "39", + "37", + "165", + "11", + "81", + "56", + "161", + "39", + "253", + "231", + "208", + "37", + "162", + "63", + "186", + "36", + "40", + "255", + "94", + "60", + "58", + "174", + "209", + "131", + "243", + "151", + "13", + "95", + "248", + "165", + "199", + "146", + "157", + "203", + "31", + "130", + "51", + "206", + "246", + "44", + "221", + "39", + "111", + "157", + "86", + "160", + "219", + "48", + "21", + "76", + "170", + "165", + "11", + "78", + "15", + "222", + "200", + "71", + "13", + "19", + "166", + "157", + "218", + "91", + "225", + "186", + "131", + "70", + "37", + "116", + "220", + "166", + "154", + "173", + "118", + "118", + "7", + "140", + "211", + "92", + "48", + "64", + "42", + "226", + "140", + "33", + "194", + "30", + "60", + "84", + "155", + "96", + "239", + "61", + "34", + "160", + "21", + "21", + "96", + "248", + "10", + "92", + "35", + "26", + "202", + "144", + "172", + "31", + "71", + "5", + "232", + "87", + "33", + "161", + "39", + "194", + "16", + "253", + "153", + "226", + "190", + "221", + "21", + "106", + "46", + "93", + "220", + "205", + "80", + "27", + "232", + "215", + "75", + "136", + "103", + "128", + "153", + "1", + "84", + "203", + "187", + "44", + "212", + "44", + "191", + "123", + "0", + "32", + "186", + "137", + "2", + "175", + "48", + "189", + "4", + "160", + "47", + "77", + "162", + "8", + "66", + "88", + "168", + "177", + "204", + "59", + "23", + "197", + "83", + "155", + "148", + "251", + "97", + "231", + "140", + "229", + "29", + "150", + "78", + "232", + "229", + "119", + "5", + "26", + "218", + "23", + "112", + "165", + "23", + "23", + "17", + "56", + "36", + "13", + "60", + "232", + "2", + "161", + "254", + "125", + "93", + "208", + "103", + "139", + "114", + "102", + "47", + "136", + "145", + "65", + "140", + "50", + "254", + "19", + "1", + "190", + "233", + "77", + "11", + "26", + "59", + "206", + "146", + "81", + "242", + "105", + "21", + "247", + "70", + "3", + "44", + "42", + "14", + "202", + "104", + "120", + "32", + "253", + "132", + "163", + "153", + "239", + "8", + "27", + "22", + "107", + "237", + "200", + "155", + "29", + "135", + "20", + "136", + "18", + "110", + "193", + "153", + "172", + "200", + "227", + "30", + "191", + "69", + "40", + "4", + "112", + "31", + "247", + "42", + "245", + "115", + "241", + "8", + "73", + "63", + "189", + "130", + "83", + "195", + "254", + "244", + "123", + "180", + "188", + "152", + "184", + "89", + "9", + "146", + "148", + "200", + "162", + "129", + "107", + "96", + "139", + "165", + "70", + "169", + "187", + "2", + "201", + "173", + "127", + "149", + "180", + "212", + "117", + "153", + "132", + "48", + "84", + "200", + "21", + "184", + "152", + "130", + "70", + "81", + "237", + "1", + "43", + "234", + "24", + "3", + "14", + "175", + "2", + "3", + "1", + "0", + "1", + "163", + "66", + "48", + "64", + "48", + "29", + "6", + "3", + "85", + "29", + "14", + "4", + "22", + "4", + "20", + "245", + "119", + "22", + "106", + "5", + "164", + "212", + "20", + "189", + "219", + "248", + "148", + "106", + "80", + "114", + "38", + "40", + "63", + "193", + "184", + "48", + "31", + "6", + "3", + "85", + "29", + "35", + "4", + "24", + "48", + "22", + "128", + "20", + "4", + "157", + "196", + "126", + "87", + "96", + "207", + "104", + "127", + "119", + "174", + "145", + "170", + "99", + "133", + "55", + "48", + "166", + "234", + "211", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "27", + "208", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "raw_dsc_actual_length": [ + "890" + ], + "siblings": [ + "481787392403338571656555722870122978065125892949434958835001773033712625191", + "13274185831698258062222380040619002789261859777320412772656200198102970880660", + "5410620983195375911090727814270361454832036795917695206544043001420960637777", + "14051265975676700947307684161194350004461344333425480053688928239949267718326", + "20387009608350563521735170556423317268483084337333204688511143658578884542027", + "18750662081915815314957644349407925351070379442022960205812752721018444618817", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "signature_passport": [ + "462927870049322075329775169866699201", + "90945791887499106747690053312935555", + "655110471397341614010632936318448102", + "953613323373090326924349242077505233", + "602519778384023399496000073451708459", + "148243491487779721083071082932289726", + "1175664333150547208301679792376135144", + "76727172762614426286303324338884897", + "916447159259302590305394157342478101", + "264956115860229353617682556379098254", + "759946295781984424317403763984770266", + "932578137245836539936343876782805756", + "412007489962073489855246268909161629", + "627891693656245828680086752265634850", + "216606564296008788013526173111115644", + "1005196540384014037259708815233402317", + "986750850275571952191116146721463168", + "1083994859124566598676132093842353263", + "26594154278647371514252740496856249", + "913015979834648697335018150786328443", + "881429526857802191294090857845298527", + "737224774469720753499397171229944365", + "239507796576566410661534747788582950", + "895616562728773887373841903436656623", + "1147362094170996176939848009624154887", + "557994933395039633409786269503570547", + "544777423004011015893389241645511090", + "482661038535657341424479403492840334", + "1283107166265200889161577541960159659", + "1054818280947309365746398375998601548", + "849933202117000355424505233793834904", + "1035709430013756582426415440197245734", + "724149366352080700099507207395903745", + "421635541929618104779626434540465427", + "26896" + ], + "signed_attr": [ + "49", + "102", + "48", + "21", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "9", + "3", + "49", + "8", + "6", + "6", + "103", + "129", + "8", + "1", + "1", + "1", + "48", + "28", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "9", + "5", + "49", + "15", + "23", + "13", + "49", + "57", + "49", + "50", + "49", + "54", + "49", + "55", + "50", + "50", + "51", + "56", + "90", + "48", + "47", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "9", + "4", + "49", + "34", + "4", + "32", + "254", + "147", + "143", + "229", + "209", + "93", + "203", + "250", + "146", + "64", + "81", + "190", + "179", + "35", + "170", + "104", + "52", + "253", + "58", + "9", + "12", + "87", + "197", + "155", + "66", + "69", + "75", + "92", + "51", + "91", + "244", + "14", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "3", + "64", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "signed_attr_econtent_hash_offset": [ + "72" + ], + "signed_attr_padded_length": [ + "128" + ], + "current_date": [ + "2", + "6", + "0", + "7", + "2", + "3" + ], + "minimum_age": [ + "49", + "56" + ] +} diff --git a/benchmarks/v1/circom/fixtures/passport_p1/manifest.json b/benchmarks/v1/circom/fixtures/passport_p1/manifest.json new file mode 100644 index 000000000..b7cf0f499 --- /dev/null +++ b/benchmarks/v1/circom/fixtures/passport_p1/manifest.json @@ -0,0 +1,28 @@ +{ + "schema_version": 1, + "profile": "P1", + "canonical_record": { + "path": "benchmarks/v1/noir/passport_p1/canonical-record.json", + "sha256": "e0501fb0551860cf3f5a34d1c86b4b2af53014bc4bec7cde4f1f285d3c54d0bf" + }, + "source": { + "self_revision": "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e", + "registration_fixture": { + "path": "benchmarks/v1/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json", + "sha256": "2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030" + } + }, + "public_statement": { + "merkle_root": [ + "8048950770293257795621184348033164133320434623462496804361333333092676277328" + ], + "current_date_yymmdd": "260723", + "minimum_age": "18", + "fixture_id": "self-pack-bytes-and-poseidon-dg1" + }, + "artifact": { + "file": "input.json", + "sha256": "8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758", + "size": 30424 + } +} diff --git a/benchmarks/v1/circom/fixtures/self/manifest.json b/benchmarks/v1/circom/fixtures/self/manifest.json new file mode 100644 index 000000000..3abb9ce4e --- /dev/null +++ b/benchmarks/v1/circom/fixtures/self/manifest.json @@ -0,0 +1,38 @@ +{ + "artifacts": [ + { + "name": "self_passport_registration", + "file": "register_sha256_sha256_sha256_rsa_65537_4096.json", + "size": 30368, + "sha256": "2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030" + }, + { + "name": "self_passport_disclosure", + "file": "vc_and_disclose.json", + "size": 9358, + "sha256": "f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011" + } + ], + "fixture": { + "random_seed": "0x5e1f2026", + "secret": "170141183460469231731687303715884105727", + "user_uuid": "00000000-0000-4000-8000-000000000001", + "endpoint": "https://benchmark.self.xyz", + "scope": "provekit-v1", + "current_date_yymmdd": "260723", + "passport": { + "dg_hash": "sha256", + "econtent_hash": "sha256", + "signature": "rsa_sha256_65537_4096", + "nationality": "FRA", + "birth_date_yymmdd": "000101", + "expiry_date_yymmdd": "300101" + }, + "commitment": "5178193076813207391481865702066036085249350902832070775814587531768982041518" + }, + "schema_version": 1, + "source": { + "repository": "https://github.com/selfxyz/self.git", + "revision": "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e" + } +} diff --git a/benchmarks/v1/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json b/benchmarks/v1/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json new file mode 100644 index 000000000..98627b25a --- /dev/null +++ b/benchmarks/v1/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json @@ -0,0 +1,2816 @@ +{ + "csca_tree_leaf": [ + "18390019689329531194486865663275817993149098196912806933141622083576329149060" + ], + "dg1": [ + "97", + "91", + "95", + "31", + "88", + "80", + "60", + "70", + "82", + "65", + "68", + "85", + "80", + "79", + "78", + "84", + "60", + "60", + "65", + "76", + "80", + "72", + "79", + "78", + "83", + "69", + "60", + "72", + "85", + "71", + "72", + "85", + "69", + "83", + "60", + "65", + "76", + "66", + "69", + "82", + "84", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "49", + "53", + "65", + "65", + "56", + "49", + "50", + "51", + "52", + "52", + "70", + "82", + "65", + "48", + "48", + "48", + "49", + "48", + "49", + "49", + "77", + "51", + "48", + "48", + "49", + "48", + "49", + "53", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "48", + "50" + ], + "dg1_hash_offset": [ + "70" + ], + "dsc_pubKey_actual_size": [ + "512" + ], + "dsc_pubKey_offset": [ + "305" + ], + "eContent": [ + "82", + "215", + "93", + "217", + "28", + "204", + "16", + "239", + "13", + "56", + "40", + "89", + "39", + "173", + "193", + "208", + "248", + "114", + "98", + "163", + "43", + "167", + "201", + "160", + "146", + "134", + "135", + "160", + "84", + "187", + "192", + "214", + "94", + "236", + "195", + "45", + "70", + "4", + "79", + "86", + "51", + "226", + "182", + "70", + "128", + "99", + "61", + "75", + "40", + "5", + "82", + "5", + "65", + "133", + "150", + "204", + "255", + "61", + "191", + "113", + "12", + "48", + "214", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "155", + "69", + "163", + "24", + "248", + "167", + "161", + "54", + "179", + "18", + "174", + "196", + "232", + "60", + "51", + "198", + "140", + "219", + "196", + "229", + "145", + "248", + "154", + "203", + "178", + "114", + "17", + "33", + "54", + "80", + "127", + "173", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "14", + "139", + "118", + "24", + "144", + "18", + "24", + "54", + "15", + "247", + "52", + "152", + "128", + "111", + "155", + "92", + "125", + "169", + "232", + "1", + "177", + "159", + "246", + "136", + "206", + "165", + "56", + "214", + "209", + "161", + "93", + "131", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "161", + "38", + "236", + "81", + "73", + "228", + "168", + "240", + "75", + "34", + "246", + "218", + "220", + "54", + "159", + "97", + "0", + "43", + "137", + "63", + "212", + "14", + "96", + "60", + "133", + "150", + "64", + "197", + "187", + "22", + "204", + "119", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "118", + "246", + "89", + "8", + "172", + "21", + "8", + "22", + "28", + "230", + "253", + "167", + "45", + "27", + "16", + "137", + "205", + "39", + "154", + "196", + "156", + "9", + "83", + "208", + "229", + "6", + "71", + "80", + "43", + "95", + "103", + "112", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "72", + "25", + "64", + "46", + "108", + "99", + "202", + "58", + "117", + "71", + "111", + "30", + "111", + "143", + "175", + "229", + "49", + "39", + "2", + "125", + "112", + "87", + "225", + "112", + "181", + "165", + "22", + "208", + "14", + "57", + "180", + "89", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "114", + "3", + "108", + "42", + "29", + "32", + "4", + "166", + "109", + "28", + "54", + "82", + "1", + "26", + "68", + "187", + "27", + "6", + "236", + "200", + "150", + "84", + "164", + "254", + "220", + "244", + "56", + "145", + "182", + "115", + "60", + "81", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "249", + "123", + "232", + "211", + "60", + "49", + "78", + "85", + "63", + "19", + "255", + "72", + "165", + "85", + "153", + "131", + "31", + "246", + "200", + "122", + "60", + "240", + "182", + "17", + "103", + "74", + "253", + "211", + "216", + "243", + "138", + "171", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "128", + "157", + "7", + "119", + "37", + "17", + "199", + "246", + "72", + "171", + "62", + "251", + "131", + "240", + "124", + "233", + "117", + "124", + "71", + "218", + "114", + "174", + "182", + "243", + "136", + "209", + "122", + "202", + "142", + "178", + "47", + "239", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "11", + "184", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "eContent_padded_length": [ + "384" + ], + "leaf_depth": [ + "6" + ], + "merkle_root": [ + "8048950770293257795621184348033164133320434623462496804361333333092676277328" + ], + "path": [ + "0", + "1", + "0", + "0", + "1", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "pubKey_dsc": [ + "1038899927489758761735522001115877039", + "366903323849628666040656841543004244", + "938438627275339065671678461183298469", + "1283368632043438171286508159822132347", + "706526231147867355295147089287475231", + "1316341345107661287764495528286324500", + "759737422261790260514587143966324768", + "709098515373376974543185159858568142", + "187191183725557247904492303074616879", + "780445008678965812684039190711046456", + "875912039567203018981271863879853341", + "169936882748420347460456686796948056", + "392188872396000862650785007782558464", + "1316772278512823919915853095701833943", + "182273781561166150578674169467617808", + "156992553585278301613011352375790172", + "803131958527330546838377167456051650", + "368918305181252159198802651446041766", + "579536153009698798164505292767747784", + "498311373554094375199935163557272871", + "842444630516923112365497216457217805", + "875873053138318316723597277028405285", + "655392130136276771699086628147689266", + "559907493504464355293787790176567126", + "1199879782645169810661238687472632017", + "1031334546900577772807272763818060750", + "532400052597384057983122314556805554", + "880900804275268742496342379318474202", + "1313281422892799771002059966299460052", + "250990522395837557363266945802425687", + "1275493732099545939216486402572461595", + "95103361937029098691966095355051131", + "372829825689735080020072593747060558", + "1031864276325403132674440587310555517", + "40958" + ], + "raw_dsc": [ + "48", + "130", + "3", + "118", + "160", + "3", + "2", + "1", + "2", + "2", + "20", + "120", + "65", + "169", + "162", + "14", + "221", + "98", + "4", + "13", + "247", + "28", + "143", + "180", + "31", + "18", + "208", + "115", + "62", + "212", + "68", + "48", + "13", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "1", + "11", + "5", + "0", + "48", + "96", + "49", + "11", + "48", + "9", + "6", + "3", + "85", + "4", + "6", + "19", + "2", + "70", + "82", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "8", + "12", + "3", + "73", + "68", + "70", + "49", + "14", + "48", + "12", + "6", + "3", + "85", + "4", + "7", + "12", + "5", + "80", + "97", + "114", + "105", + "115", + "49", + "18", + "48", + "16", + "6", + "3", + "85", + "4", + "10", + "12", + "9", + "77", + "111", + "99", + "107", + "32", + "67", + "83", + "67", + "65", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "11", + "12", + "3", + "80", + "75", + "73", + "49", + "17", + "48", + "15", + "6", + "3", + "85", + "4", + "3", + "12", + "8", + "77", + "111", + "99", + "107", + "67", + "83", + "67", + "65", + "48", + "30", + "23", + "13", + "50", + "53", + "48", + "50", + "49", + "57", + "48", + "52", + "51", + "50", + "48", + "55", + "90", + "23", + "13", + "51", + "53", + "48", + "50", + "49", + "55", + "48", + "52", + "51", + "50", + "48", + "55", + "90", + "48", + "94", + "49", + "11", + "48", + "9", + "6", + "3", + "85", + "4", + "6", + "19", + "2", + "70", + "82", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "8", + "12", + "3", + "73", + "68", + "70", + "49", + "14", + "48", + "12", + "6", + "3", + "85", + "4", + "7", + "12", + "5", + "80", + "97", + "114", + "105", + "115", + "49", + "17", + "48", + "15", + "6", + "3", + "85", + "4", + "10", + "12", + "8", + "77", + "111", + "99", + "107", + "32", + "68", + "83", + "67", + "49", + "12", + "48", + "10", + "6", + "3", + "85", + "4", + "11", + "12", + "3", + "80", + "75", + "73", + "49", + "16", + "48", + "14", + "6", + "3", + "85", + "4", + "3", + "12", + "7", + "77", + "111", + "99", + "107", + "68", + "83", + "67", + "48", + "130", + "2", + "34", + "48", + "13", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "1", + "1", + "5", + "0", + "3", + "130", + "2", + "15", + "0", + "48", + "130", + "2", + "10", + "2", + "130", + "2", + "1", + "0", + "159", + "254", + "198", + "186", + "214", + "49", + "130", + "110", + "254", + "213", + "99", + "226", + "121", + "87", + "48", + "97", + "125", + "71", + "205", + "237", + "251", + "8", + "18", + "215", + "68", + "171", + "221", + "24", + "161", + "163", + "167", + "78", + "18", + "80", + "245", + "47", + "222", + "236", + "140", + "255", + "54", + "101", + "74", + "219", + "168", + "124", + "123", + "245", + "166", + "178", + "61", + "225", + "166", + "88", + "127", + "240", + "185", + "106", + "69", + "116", + "166", + "27", + "48", + "86", + "201", + "197", + "108", + "100", + "176", + "191", + "155", + "232", + "176", + "223", + "229", + "213", + "87", + "252", + "237", + "197", + "244", + "2", + "250", + "87", + "112", + "149", + "113", + "247", + "235", + "19", + "81", + "212", + "169", + "167", + "195", + "75", + "62", + "223", + "29", + "37", + "13", + "21", + "21", + "116", + "151", + "245", + "218", + "102", + "137", + "89", + "102", + "30", + "196", + "175", + "43", + "84", + "248", + "171", + "20", + "47", + "17", + "178", + "198", + "160", + "184", + "17", + "108", + "81", + "181", + "61", + "105", + "165", + "67", + "24", + "105", + "43", + "206", + "231", + "22", + "164", + "6", + "30", + "108", + "222", + "112", + "91", + "85", + "15", + "229", + "149", + "64", + "209", + "107", + "213", + "146", + "29", + "90", + "13", + "157", + "210", + "99", + "49", + "27", + "106", + "126", + "63", + "86", + "126", + "57", + "83", + "170", + "52", + "143", + "29", + "218", + "107", + "122", + "110", + "24", + "163", + "247", + "50", + "168", + "175", + "224", + "39", + "37", + "165", + "11", + "81", + "56", + "161", + "39", + "253", + "231", + "208", + "37", + "162", + "63", + "186", + "36", + "40", + "255", + "94", + "60", + "58", + "174", + "209", + "131", + "243", + "151", + "13", + "95", + "248", + "165", + "199", + "146", + "157", + "203", + "31", + "130", + "51", + "206", + "246", + "44", + "221", + "39", + "111", + "157", + "86", + "160", + "219", + "48", + "21", + "76", + "170", + "165", + "11", + "78", + "15", + "222", + "200", + "71", + "13", + "19", + "166", + "157", + "218", + "91", + "225", + "186", + "131", + "70", + "37", + "116", + "220", + "166", + "154", + "173", + "118", + "118", + "7", + "140", + "211", + "92", + "48", + "64", + "42", + "226", + "140", + "33", + "194", + "30", + "60", + "84", + "155", + "96", + "239", + "61", + "34", + "160", + "21", + "21", + "96", + "248", + "10", + "92", + "35", + "26", + "202", + "144", + "172", + "31", + "71", + "5", + "232", + "87", + "33", + "161", + "39", + "194", + "16", + "253", + "153", + "226", + "190", + "221", + "21", + "106", + "46", + "93", + "220", + "205", + "80", + "27", + "232", + "215", + "75", + "136", + "103", + "128", + "153", + "1", + "84", + "203", + "187", + "44", + "212", + "44", + "191", + "123", + "0", + "32", + "186", + "137", + "2", + "175", + "48", + "189", + "4", + "160", + "47", + "77", + "162", + "8", + "66", + "88", + "168", + "177", + "204", + "59", + "23", + "197", + "83", + "155", + "148", + "251", + "97", + "231", + "140", + "229", + "29", + "150", + "78", + "232", + "229", + "119", + "5", + "26", + "218", + "23", + "112", + "165", + "23", + "23", + "17", + "56", + "36", + "13", + "60", + "232", + "2", + "161", + "254", + "125", + "93", + "208", + "103", + "139", + "114", + "102", + "47", + "136", + "145", + "65", + "140", + "50", + "254", + "19", + "1", + "190", + "233", + "77", + "11", + "26", + "59", + "206", + "146", + "81", + "242", + "105", + "21", + "247", + "70", + "3", + "44", + "42", + "14", + "202", + "104", + "120", + "32", + "253", + "132", + "163", + "153", + "239", + "8", + "27", + "22", + "107", + "237", + "200", + "155", + "29", + "135", + "20", + "136", + "18", + "110", + "193", + "153", + "172", + "200", + "227", + "30", + "191", + "69", + "40", + "4", + "112", + "31", + "247", + "42", + "245", + "115", + "241", + "8", + "73", + "63", + "189", + "130", + "83", + "195", + "254", + "244", + "123", + "180", + "188", + "152", + "184", + "89", + "9", + "146", + "148", + "200", + "162", + "129", + "107", + "96", + "139", + "165", + "70", + "169", + "187", + "2", + "201", + "173", + "127", + "149", + "180", + "212", + "117", + "153", + "132", + "48", + "84", + "200", + "21", + "184", + "152", + "130", + "70", + "81", + "237", + "1", + "43", + "234", + "24", + "3", + "14", + "175", + "2", + "3", + "1", + "0", + "1", + "163", + "66", + "48", + "64", + "48", + "29", + "6", + "3", + "85", + "29", + "14", + "4", + "22", + "4", + "20", + "245", + "119", + "22", + "106", + "5", + "164", + "212", + "20", + "189", + "219", + "248", + "148", + "106", + "80", + "114", + "38", + "40", + "63", + "193", + "184", + "48", + "31", + "6", + "3", + "85", + "29", + "35", + "4", + "24", + "48", + "22", + "128", + "20", + "4", + "157", + "196", + "126", + "87", + "96", + "207", + "104", + "127", + "119", + "174", + "145", + "170", + "99", + "133", + "55", + "48", + "166", + "234", + "211", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "27", + "208", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "raw_dsc_actual_length": [ + "890" + ], + "secret": [ + "170141183460469231731687303715884105727" + ], + "siblings": [ + "481787392403338571656555722870122978065125892949434958835001773033712625191", + "13274185831698258062222380040619002789261859777320412772656200198102970880660", + "5410620983195375911090727814270361454832036795917695206544043001420960637777", + "14051265975676700947307684161194350004461344333425480053688928239949267718326", + "20387009608350563521735170556423317268483084337333204688511143658578884542027", + "18750662081915815314957644349407925351070379442022960205812752721018444618817", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "signature_passport": [ + "462927870049322075329775169866699201", + "90945791887499106747690053312935555", + "655110471397341614010632936318448102", + "953613323373090326924349242077505233", + "602519778384023399496000073451708459", + "148243491487779721083071082932289726", + "1175664333150547208301679792376135144", + "76727172762614426286303324338884897", + "916447159259302590305394157342478101", + "264956115860229353617682556379098254", + "759946295781984424317403763984770266", + "932578137245836539936343876782805756", + "412007489962073489855246268909161629", + "627891693656245828680086752265634850", + "216606564296008788013526173111115644", + "1005196540384014037259708815233402317", + "986750850275571952191116146721463168", + "1083994859124566598676132093842353263", + "26594154278647371514252740496856249", + "913015979834648697335018150786328443", + "881429526857802191294090857845298527", + "737224774469720753499397171229944365", + "239507796576566410661534747788582950", + "895616562728773887373841903436656623", + "1147362094170996176939848009624154887", + "557994933395039633409786269503570547", + "544777423004011015893389241645511090", + "482661038535657341424479403492840334", + "1283107166265200889161577541960159659", + "1054818280947309365746398375998601548", + "849933202117000355424505233793834904", + "1035709430013756582426415440197245734", + "724149366352080700099507207395903745", + "421635541929618104779626434540465427", + "26896" + ], + "signed_attr": [ + "49", + "102", + "48", + "21", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "9", + "3", + "49", + "8", + "6", + "6", + "103", + "129", + "8", + "1", + "1", + "1", + "48", + "28", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "9", + "5", + "49", + "15", + "23", + "13", + "49", + "57", + "49", + "50", + "49", + "54", + "49", + "55", + "50", + "50", + "51", + "56", + "90", + "48", + "47", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "9", + "4", + "49", + "34", + "4", + "32", + "254", + "147", + "143", + "229", + "209", + "93", + "203", + "250", + "146", + "64", + "81", + "190", + "179", + "35", + "170", + "104", + "52", + "253", + "58", + "9", + "12", + "87", + "197", + "155", + "66", + "69", + "75", + "92", + "51", + "91", + "244", + "14", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "3", + "64", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "signed_attr_econtent_hash_offset": [ + "72" + ], + "signed_attr_padded_length": [ + "128" + ] +} diff --git a/benchmarks/v1/circom/fixtures/self/vc_and_disclose.json b/benchmarks/v1/circom/fixtures/self/vc_and_disclose.json new file mode 100644 index 000000000..1eed1c1b4 --- /dev/null +++ b/benchmarks/v1/circom/fixtures/self/vc_and_disclose.json @@ -0,0 +1,637 @@ +{ + "attestation_id": [ + "1" + ], + "current_date": [ + "2", + "6", + "0", + "7", + "2", + "3" + ], + "dg1": [ + "97", + "91", + "95", + "31", + "88", + "80", + "60", + "70", + "82", + "65", + "68", + "85", + "80", + "79", + "78", + "84", + "60", + "60", + "65", + "76", + "80", + "72", + "79", + "78", + "83", + "69", + "60", + "72", + "85", + "71", + "72", + "85", + "69", + "83", + "60", + "65", + "76", + "66", + "69", + "82", + "84", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "49", + "53", + "65", + "65", + "56", + "49", + "50", + "51", + "52", + "52", + "70", + "82", + "65", + "48", + "48", + "48", + "49", + "48", + "49", + "49", + "77", + "51", + "48", + "48", + "49", + "48", + "49", + "53", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "60", + "48", + "50" + ], + "dsc_tree_leaf": [ + "6944618873207772930654947866168069208208574383743967671528812057261674809023" + ], + "eContent_shaBytes_packed_hash": [ + "1290218483066866833667938670103225137085112672478251943918132554359424064766" + ], + "forbidden_countries_list": [ + "65", + "76", + "71", + "68", + "90", + "65", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "leaf_depth": [ + "0" + ], + "majority": [ + "49", + "56" + ], + "merkle_root": [ + "5178193076813207391481865702066036085249350902832070775814587531768982041518" + ], + "ofac_namedob_smt_leaf_key": [ + "0" + ], + "ofac_namedob_smt_root": [ + "7420120618403967585712321281997181302561301414016003514649937965499789236588" + ], + "ofac_namedob_smt_siblings": [ + "21808181074436137523616656812598542996456370440254134110055399992243618990548", + "586213057486664755647412349546858188864407398578300389653586372436589154789", + "12151691475392226425979921382399010734147190730534111228210462415918172745511", + "18466858013070068988884714818449467032550884673224164417441157883713879990919", + "18375676336095366763356045556091684332202777184220974791558675748858685723708", + "12906654823593752811427928344347152945413052824260997236186536755890054899240", + "8650283314446062722579008154825965676242971282464981059613812023036069400965", + "17737725272290264857970518411713653161154547941331708902770196580653252743672", + "3883157077825659747529573090373299405295098798201409242425384703372586271487", + "10711887043559941617905711491898103701649065791885215786205273566240657092255", + "21604555106548487203746416770888551656235084375133357384508308263628537664832", + "8095227698960640161666662146774274748562912203557638855658815035024417594218", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "ofac_nameyob_smt_leaf_key": [ + "8026133738622495228" + ], + "ofac_nameyob_smt_root": [ + "16836358042995742879630198413873414945978677264752036026400967422611478610995" + ], + "ofac_nameyob_smt_siblings": [ + "18403267060840312484922658532120103449767604285918481011274350979512511600836", + "11003700751634403668529245861692209183157709739262170565724482026398117215933", + "19980269529368367030604855037983445139424125336564011305666297503084752871547", + "20592912599201661425470824451257263071155572578758772209441108435486185834227", + "11037051712625242854637515507247016097298357089316946959633593473448624807373", + "5050467689383763368122116563229266855119861630192457637379479514938773806049", + "2167913619730024171167880968368129019790763313346034985161457269493808714288", + "1883136650351563883116297907385163278278941195066250274988964738264074821710", + "15970738029626762901027403087838049246969600265470738015237442051532613255537", + "5628918536997047031639510906781328408534183139026751862387832023559050214499", + "6043049592740261538998092449711422892067399020143652187967413339667123620566", + "6884211755583878297955852219350175210888960005587512435334313993022522413664", + "13590141960843740899654087604898935667044785532448934957230180703384644608854", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "ofac_passportno_smt_leaf_key": [ + "736626355987864331" + ], + "ofac_passportno_smt_root": [ + "17359956125106148146828355805271472653597249114301196742546733402427978706344" + ], + "ofac_passportno_smt_siblings": [ + "3440016734768502253891365802618745731009866049990061838340241826334811304737", + "2856097137287773038168835470081845499783376367555850843710254143189725617995", + "13908807085745633968268470621142459889335557823826884665352192567449569275316", + "5461525798525946621811948546984960577618307890133346402000098181188378737604", + "16098818349581171441919805394763863824600583695973281165809057735830811861912", + "9519354945304479933055018103017415503183885652085427247142064331342204698962", + "14106173192837742192246915847038707995880530520503873739091929938902762279056", + "2939877407661759893493553452614439288633033767894215292523785659168604315896", + "5940301528661267709421192574766132602378886472495874584516953547470389886906", + "18170645377604548233003074623093664568996458699391366131375499580441964132436", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "path": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "scope": [ + "14994119963422098758164454977560144114052427151858319272516527643656807479369" + ], + "secret": [ + "170141183460469231731687303715884105727" + ], + "selector_dg1": [ + "0", + "0", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "0", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "0", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "selector_ofac": [ + "1" + ], + "selector_older_than": [ + "1" + ], + "siblings": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "user_identifier": [ + "302240678275694148452353" + ] +} diff --git a/benchmarks/v1/circom/generate-self-passport-fixtures.ts b/benchmarks/v1/circom/generate-self-passport-fixtures.ts new file mode 100644 index 000000000..55514299c --- /dev/null +++ b/benchmarks/v1/circom/generate-self-passport-fixtures.ts @@ -0,0 +1,219 @@ +import { join, resolve } from "node:path"; +import { pathToFileURL } from "node:url"; + +const selfRoot = resolve( + process.env.SELF_SOURCE_ROOT ?? + join(import.meta.dir, "../../../target/v1-benchmarks/sources/self"), +); +const outputRoot = resolve( + process.env.SELF_FIXTURE_OUTPUT_ROOT ?? + join(import.meta.dir, "fixtures/self"), +); +const mode = process.env.SELF_FIXTURE_MODE ?? "write"; +const sourceRevision = process.env.SELF_SOURCE_REVISION; + +if (mode !== "write" && mode !== "check") { + throw new Error(`SELF_FIXTURE_MODE must be "write" or "check", got "${mode}"`); +} +if (!sourceRevision) { + throw new Error("SELF_SOURCE_REVISION is required"); +} + +const asModuleUrl = (path: string) => pathToFileURL(path).href; +const importSource = (path: string) => import(asModuleUrl(join(selfRoot, path))); + +const [ + { LeanIMT }, + { SMT }, + { poseidon2 }, + { PassportDocument }, + { createCircuitInputGenerator }, + { genAndInitMockPassportData }, + { hashEndpointWithScope }, + { castFromUUID }, +] = await Promise.all([ + importSource("node_modules/@openpassport/zk-kit-lean-imt/dist/index.js"), + importSource("node_modules/@openpassport/zk-kit-smt/dist/index.js"), + importSource("node_modules/poseidon-lite/poseidon2.js"), + importSource("new-common/src/documents/passport/adapter.ts"), + importSource("new-common/src/circuits/generator.ts"), + importSource("new-common/src/testing/genMockPassportData.ts"), + importSource("new-common/src/crypto/scope.ts"), + importSource("new-common/src/circuits/userId.ts"), +]); + +const readJson = async (path: string) => + JSON.parse(await Bun.file(join(selfRoot, path)).text()); + +const [ + serializedDscTree, + passportNoTree, + nameAndDobTree, + nameAndYobTree, +] = await Promise.all([ + readJson("new-common/src/data/serialized_dsc_tree.json"), + readJson("circuits/tests/consts/ofac/passportNoAndNationalitySMT.json"), + readJson("circuits/tests/consts/ofac/nameAndDobSMT.json"), + readJson("circuits/tests/consts/ofac/nameAndYobSMT.json"), +]); + +// Self's mock passport helper fills unused data-group hashes with Math.random(). +// Pin a small deterministic generator so the passport, signature, commitment, +// and both fixture files are byte-for-byte reproducible. +let randomState = 0x5e1f_2026; +const originalRandom = Math.random; +Math.random = () => { + randomState = (Math.imul(randomState, 1_664_525) + 1_013_904_223) >>> 0; + return randomState / 0x1_0000_0000; +}; + +let passportData; +try { + passportData = genAndInitMockPassportData( + "sha256", + "sha256", + "rsa_sha256_65537_4096", + "FRA", + "000101", + "300101", + ); +} finally { + Math.random = originalRandom; +} + +const doc = new PassportDocument(passportData); +const generator = createCircuitInputGenerator(); +const secret = + "170141183460469231731687303715884105727"; +const scope = hashEndpointWithScope("https://benchmark.self.xyz", "provekit-v1"); +const userIdentifier = castFromUUID("00000000-0000-4000-8000-000000000001"); + +const registerInputs = generator.generateRegisterInputs( + doc, + secret, + serializedDscTree, + { useTestPadding: true }, +); + +const commitment = doc.generateCommitment(secret); +const commitmentTree = new LeanIMT( + (left: bigint, right: bigint) => poseidon2([left, right]), + [], +); +commitmentTree.insert(BigInt(commitment)); + +const passportNoSmt = new SMT(poseidon2, true); +passportNoSmt.import(passportNoTree); +const nameAndDobSmt = new SMT(poseidon2, true); +nameAndDobSmt.import(nameAndDobTree); +const nameAndYobSmt = new SMT(poseidon2, true); +nameAndYobSmt.import(nameAndYobTree); + +const discloseInputs = generator.generateDiscloseInputs(doc, secret, { + scope, + fieldsToReveal: [ + "issuing_state", + "name", + "id_number", + "nationality", + "date_of_birth", + "gender", + "expiry_date", + "older_than", + "ofac", + ], + merkletree: commitmentTree, + majority: "18", + passportNo_smt: passportNoSmt, + nameAndDob_smt: nameAndDobSmt, + nameAndYob_smt: nameAndYobSmt, + forbidden_countries_list: ["ALG", "DZA"], + user_identifier: userIdentifier, +}); + +// Input generation normally uses wall-clock time. Freeze the campaign date so +// regeneration does not change the fixture and the age/expiry checks stay valid. +discloseInputs.current_date = ["2", "6", "0", "7", "2", "3"]; + +const stableJson = (value: Record) => + `${JSON.stringify( + Object.fromEntries( + Object.entries(value).sort(([left], [right]) => left.localeCompare(right)), + ), + null, + 2, + )}\n`; + +const artifacts = [ + { + name: "self_passport_registration", + file: "register_sha256_sha256_sha256_rsa_65537_4096.json", + contents: stableJson(registerInputs), + }, + { + name: "self_passport_disclosure", + file: "vc_and_disclose.json", + contents: stableJson(discloseInputs), + }, +]; + +const sha256 = (contents: string) => { + const hasher = new Bun.CryptoHasher("sha256"); + hasher.update(contents); + return hasher.digest("hex"); +}; + +const manifest = { + schema_version: 1, + source: { + repository: "https://github.com/selfxyz/self.git", + revision: sourceRevision, + }, + fixture: { + random_seed: "0x5e1f2026", + secret, + user_uuid: "00000000-0000-4000-8000-000000000001", + endpoint: "https://benchmark.self.xyz", + scope: "provekit-v1", + current_date_yymmdd: "260723", + passport: { + dg_hash: "sha256", + econtent_hash: "sha256", + signature: "rsa_sha256_65537_4096", + nationality: "FRA", + birth_date_yymmdd: "000101", + expiry_date_yymmdd: "300101", + }, + commitment, + }, + artifacts: artifacts.map(({ name, file, contents }) => ({ + name, + file, + size: new TextEncoder().encode(contents).byteLength, + sha256: sha256(contents), + })), +}; + +const files = [ + ...artifacts.map(({ file, contents }) => ({ file, contents })), + { file: "manifest.json", contents: stableJson(manifest) }, +]; + +await Bun.$`mkdir -p ${outputRoot}`.quiet(); + +for (const { file, contents } of files) { + const destination = join(outputRoot, file); + if (mode === "check") { + if (!(await Bun.file(destination).exists())) { + throw new Error(`missing frozen Self fixture: ${destination}`); + } + const actual = await Bun.file(destination).text(); + if (actual !== contents) { + throw new Error(`frozen Self fixture differs from regeneration: ${destination}`); + } + console.log(`verified ${destination}`); + } else { + await Bun.write(destination, contents); + console.log(`wrote ${destination}`); + } +} diff --git a/benchmarks/v1/circom/passport_p1/generate-fixture.ts b/benchmarks/v1/circom/passport_p1/generate-fixture.ts new file mode 100644 index 000000000..ee549d059 --- /dev/null +++ b/benchmarks/v1/circom/passport_p1/generate-fixture.ts @@ -0,0 +1,101 @@ +import { resolve } from "node:path"; + +const repoRoot = resolve(import.meta.dir, "../../../.."); +const canonicalPath = resolve( + process.env.P1_CANONICAL_RECORD ?? + `${repoRoot}/benchmarks/v1/noir/passport_p1/canonical-record.json`, +); +const outputPath = resolve( + process.env.P1_CIRCOM_FIXTURE ?? + `${repoRoot}/benchmarks/v1/circom/fixtures/passport_p1/input.json`, +); +const manifestPath = resolve( + process.env.P1_CIRCOM_MANIFEST ?? + `${repoRoot}/benchmarks/v1/circom/fixtures/passport_p1/manifest.json`, +); +const mode = process.env.P1_FIXTURE_MODE ?? "write"; + +if (mode !== "write" && mode !== "check") { + throw new Error(`P1_FIXTURE_MODE must be \"write\" or \"check\", got ${mode}`); +} + +type CanonicalRecord = { + self_source_revision: string; + registration_fixture: { path: string; sha256: string }; + public_statement: { + current_date_yymmdd: string; + minimum_age: string; + fixture_id: string; + }; +}; + +const canonical = (await Bun.file(canonicalPath).json()) as CanonicalRecord; +const sourcePath = resolve(repoRoot, canonical.registration_fixture.path); +const sourceContents = await Bun.file(sourcePath).text(); +const sourceHash = new Bun.CryptoHasher("sha256").update(sourceContents).digest("hex"); +if (sourceHash !== canonical.registration_fixture.sha256) { + throw new Error( + `canonical registration fixture hash drift: expected ${canonical.registration_fixture.sha256}, got ${sourceHash}`, + ); +} + +const source = JSON.parse(sourceContents) as Record; +const currentDate = [...canonical.public_statement.current_date_yymmdd]; +const minimumAge = [...canonical.public_statement.minimum_age]; +if (!/^\d{6}$/.test(currentDate.join("")) || !/^\d{2}$/.test(minimumAge.join(""))) { + throw new Error("P1 canonical date must be YYMMDD and its minimum age must be two decimal digits"); +} + +const { secret: _secret, ...p1Input } = source; +const input = { + ...p1Input, + current_date: currentDate, + minimum_age: minimumAge.map((digit) => String(digit.charCodeAt(0))), +}; + +const stableJson = (value: unknown) => `${JSON.stringify(value, null, 2)}\n`; +const inputContents = stableJson(input); +const inputHash = new Bun.CryptoHasher("sha256").update(inputContents).digest("hex"); +const manifest = { + schema_version: 1, + profile: "P1", + canonical_record: { + path: "benchmarks/v1/noir/passport_p1/canonical-record.json", + sha256: new Bun.CryptoHasher("sha256") + .update(await Bun.file(canonicalPath).text()) + .digest("hex"), + }, + source: { + self_revision: canonical.self_source_revision, + registration_fixture: canonical.registration_fixture, + }, + public_statement: { + merkle_root: input.merkle_root, + current_date_yymmdd: canonical.public_statement.current_date_yymmdd, + minimum_age: canonical.public_statement.minimum_age, + fixture_id: canonical.public_statement.fixture_id, + }, + artifact: { + file: "input.json", + sha256: inputHash, + size: new TextEncoder().encode(inputContents).byteLength, + }, +}; + +const outputs = [ + { path: outputPath, contents: inputContents }, + { path: manifestPath, contents: stableJson(manifest) }, +]; +for (const output of outputs) { + if (mode === "check") { + if (!(await Bun.file(output.path).exists())) { + throw new Error(`missing frozen P1 fixture: ${output.path}`); + } + if ((await Bun.file(output.path).text()) !== output.contents) { + throw new Error(`frozen P1 fixture differs from the canonical record: ${output.path}`); + } + } else { + await Bun.write(output.path, output.contents); + } + console.log(`${mode === "check" ? "verified" : "wrote"} ${output.path}`); +} diff --git a/benchmarks/v1/circom/passport_p1/passport_p1.circom b/benchmarks/v1/circom/passport_p1/passport_p1.circom new file mode 100644 index 000000000..6fa41d62b --- /dev/null +++ b/benchmarks/v1/circom/passport_p1/passport_p1.circom @@ -0,0 +1,196 @@ +pragma circom 2.1.9; + +// This circuit deliberately imports the pinned Self primitives rather than +// duplicating their RSA, SHA-256, or DSC registry-leaf implementations. +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/customHashers.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/signatureAlgorithm.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/date/isValid.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/date/isOlderThan.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/passportVerifier.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/constants.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/checkPubkeysEqual.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/passport/checkPubkeyPosition.circom"; +include "../../../../target/v1-benchmarks/sources/self/circuits/circuits/utils/crypto/bitify/bytes.circom"; +include "circomlib/circuits/poseidon.circom"; +include "circomlib/circuits/comparators.circom"; +include "circomlib/circuits/bitify.circom"; +include "@zk-kit/binary-merkle-root.circom/src/binary-merkle-root.circom"; + +/// Restricts a public current-date digit to its decimal representation. +template DecimalDigit() { + signal input value; + + component inRange = LessThan(4); + inRange.in[0] <== value; + inRange.in[1] <== 10; + inRange.out === 1; +} + +/// P1's monolithic passport statement. +/// +/// It preserves Self's SHA-256 DG1/eContent/signed-attributes chain, +/// RSA-65537-4096 signature verification, and DSC registry-leaf construction. +/// It intentionally excludes Self registration's commitment/nullifier and every +/// disclosure, OFAC, scope, and CSCA certificate-signature operation. +template PassportP1() { + var DG1_LEN = 93; + var MAX_DSC_LENGTH = getMaxDSCLength(); + var DSC_TREE_LEVELS = getMaxDSCLevels(); + var SIGNATURE_ALGORITHM = 10; // rsa_sha256_65537_4096 + var RSA_CHUNK_BITS = 120; + var RSA_CHUNKS = 35; + var RSA_CHUNKS_SCALED = 35; + var MAX_ECONTENT_PADDED_LEN = 512; + var MAX_SIGNED_ATTR_PADDED_LEN = 256; + var DSC_PUBKEY_PREFIX_LEN = 33; + var DSC_PUBKEY_SUFFIX_LEN = 0; + var MAX_DSC_PUBKEY_LENGTH = 525; + + assert(MAX_DSC_LENGTH % 64 == 0); + + signal input raw_dsc[MAX_DSC_LENGTH]; + signal input raw_dsc_actual_length; + signal input dsc_pubKey_offset; + signal input dsc_pubKey_actual_size; + + signal input dg1[DG1_LEN]; + signal input dg1_hash_offset; + signal input eContent[MAX_ECONTENT_PADDED_LEN]; + signal input eContent_padded_length; + signal input signed_attr[MAX_SIGNED_ATTR_PADDED_LEN]; + signal input signed_attr_padded_length; + signal input signed_attr_econtent_hash_offset; + signal input pubKey_dsc[RSA_CHUNKS_SCALED]; + signal input signature_passport[RSA_CHUNKS_SCALED]; + + // These are the P1 statement's common public values. They are not + // fixture-specific constants: registry membership and date/age checks bind + // them to the private passport witness. + signal input merkle_root; + signal input leaf_depth; + signal input path[DSC_TREE_LEVELS]; + signal input siblings[DSC_TREE_LEVELS]; + signal input csca_tree_leaf; + signal input current_date[6]; + signal input minimum_age[2]; + + AssertBytes(MAX_DSC_LENGTH)(raw_dsc); + + component dscPubkeyOffsetBits = Num2Bits(12); + dscPubkeyOffsetBits.in <== dsc_pubKey_offset; + component dscPubkeySizeBits = Num2Bits(12); + dscPubkeySizeBits.in <== dsc_pubKey_actual_size; + component dscPubkeyEndBits = Num2Bits(12); + dscPubkeyEndBits.in <== dsc_pubKey_offset + dsc_pubKey_actual_size; + component rawDscLengthBits = Num2Bits(12); + rawDscLengthBits.in <== raw_dsc_actual_length; + + signal dscPubkeyInRange <== LessEqThan(12)([ + dsc_pubKey_offset + dsc_pubKey_actual_size, + raw_dsc_actual_length + ]); + dscPubkeyInRange === 1; + + // This is exactly Self's production DSC registry-leaf construction. + signal dsc_hash <== PackBytesAndPoseidon(MAX_DSC_LENGTH)(raw_dsc); + signal dsc_hash_with_actual_length <== Poseidon(2)([dsc_hash, raw_dsc_actual_length]); + signal dsc_tree_leaf <== Poseidon(2)([dsc_hash_with_actual_length, csca_tree_leaf]); + signal computed_merkle_root <== BinaryMerkleRoot(DSC_TREE_LEVELS)( + dsc_tree_leaf, + leaf_depth, + path, + siblings + ); + merkle_root === computed_merkle_root; + + signal dsc_pubKey_prefix_start_index <== dsc_pubKey_offset - DSC_PUBKEY_PREFIX_LEN; + signal dsc_pubKey_net_length <== DSC_PUBKEY_PREFIX_LEN + dsc_pubKey_actual_size + DSC_PUBKEY_SUFFIX_LEN; + component dscPubkeyPrefixBits = Num2Bits(log2Ceil(MAX_DSC_LENGTH)); + dscPubkeyPrefixBits.in <== dsc_pubKey_prefix_start_index; + component dscPubkeyNetLengthBits = Num2Bits(log2Ceil(MAX_DSC_LENGTH)); + dscPubkeyNetLengthBits.in <== dsc_pubKey_net_length; + component dscPubkeyEndLengthBits = Num2Bits(log2Ceil(MAX_DSC_LENGTH)); + dscPubkeyEndLengthBits.in <== dsc_pubKey_prefix_start_index + dsc_pubKey_net_length; + signal dscPubkeyEndInRange <== LessEqThan(log2Ceil(MAX_DSC_LENGTH))([ + dsc_pubKey_prefix_start_index + dsc_pubKey_net_length, + raw_dsc_actual_length + ]); + dscPubkeyEndInRange === 1; + + signal pubkey_with_prefix_and_suffix[ + DSC_PUBKEY_PREFIX_LEN + MAX_DSC_PUBKEY_LENGTH + DSC_PUBKEY_SUFFIX_LEN + ] <== SelectSubArray( + MAX_DSC_LENGTH, + DSC_PUBKEY_PREFIX_LEN + MAX_DSC_PUBKEY_LENGTH + DSC_PUBKEY_SUFFIX_LEN + )( + raw_dsc, + dsc_pubKey_prefix_start_index, + dsc_pubKey_net_length + ); + CheckPubkeyPosition( + DSC_PUBKEY_PREFIX_LEN, + MAX_DSC_PUBKEY_LENGTH, + DSC_PUBKEY_SUFFIX_LEN, + SIGNATURE_ALGORITHM + )( + pubkey_with_prefix_and_suffix, + dsc_pubKey_actual_size + ); + + signal extracted_dsc_pubKey[MAX_DSC_PUBKEY_LENGTH]; + for (var i = 0; i < MAX_DSC_PUBKEY_LENGTH; i++) { + extracted_dsc_pubKey[i] <== pubkey_with_prefix_and_suffix[DSC_PUBKEY_PREFIX_LEN + i]; + } + CheckPubkeysEqual( + RSA_CHUNK_BITS, + RSA_CHUNKS_SCALED, + 1, + MAX_DSC_PUBKEY_LENGTH + )( + pubKey_dsc, + extracted_dsc_pubKey, + dsc_pubKey_actual_size + ); + + component passportVerifier = PassportVerifier( + DG1_LEN, + 256, + 256, + SIGNATURE_ALGORITHM, + RSA_CHUNK_BITS, + RSA_CHUNKS, + MAX_ECONTENT_PADDED_LEN, + MAX_SIGNED_ATTR_PADDED_LEN + ); + passportVerifier.dg1 <== dg1; + passportVerifier.dg1_hash_offset <== dg1_hash_offset; + passportVerifier.eContent <== eContent; + passportVerifier.eContent_padded_length <== eContent_padded_length; + passportVerifier.signed_attr <== signed_attr; + passportVerifier.signed_attr_padded_length <== signed_attr_padded_length; + passportVerifier.signed_attr_econtent_hash_offset <== signed_attr_econtent_hash_offset; + passportVerifier.pubKey_dsc <== pubKey_dsc; + passportVerifier.signature_passport <== signature_passport; + + // Self's passport layout stores YYMMDD DOB at 62 and expiry at 70. + signal birth_date_ascii[6]; + signal expiry_date_ascii[6]; + for (var i = 0; i < 6; i++) { + birth_date_ascii[i] <== dg1[62 + i]; + expiry_date_ascii[i] <== dg1[70 + i]; + DecimalDigit()(current_date[i]); + } + + IsValid()(current_date, expiry_date_ascii); + component age = IsOlderThan(); + age.majorityASCII <== minimum_age; + age.currDate <== current_date; + age.birthDateASCII <== birth_date_ascii; + age.out === 1; + + // A common, integrity-bound fixture identifier. It is an output (and + // therefore public), derived from the same private DG1 bytes hashed above. + signal output fixture_id <== PackBytesAndPoseidon(DG1_LEN)(dg1); +} + +component main { public [merkle_root, current_date, minimum_age] } = PassportP1(); diff --git a/benchmarks/v1/circom/taceo-mobile/.gitignore b/benchmarks/v1/circom/taceo-mobile/.gitignore new file mode 100644 index 000000000..7ce2fdae5 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/.gitignore @@ -0,0 +1,3 @@ +assets/ +target/ +Cargo.lock diff --git a/benchmarks/v1/circom/taceo-mobile/Cargo.lock b/benchmarks/v1/circom/taceo-mobile/Cargo.lock new file mode 100644 index 000000000..c64eba432 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/Cargo.lock @@ -0,0 +1,3135 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-rlp" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "ark-bn254" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc66f96ebe2a17a499475b4f94791d379817592ef494171586967ffdc6f95db" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-r1cs-std", + "ark-std 0.6.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b3409b1846fe459d19c95df039481575ac6d5842ae63858ad75cc31219bfc1" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff 0.6.0", + "ark-r1cs-std", + "ark-relations", + "ark-serialize 0.6.0", + "ark-snark", + "ark-std 0.6.0", + "blake2", + "blake3", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "num-bigint", + "rayon", + "sha2 0.10.9", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8352a2b2aedf6ba2cc38f7520fc51191d518dde96175c729af19f2d059f191c4" +dependencies = [ + "ahash", + "ark-ff 0.6.0", + "ark-poly", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "educe", + "fnv", + "hashbrown 0.17.1", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[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-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "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-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-groth16" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a293328aa422e65527e285614ce5d1dceb0bd7b8b18d18b1b63191ee1f74cb41" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff 0.6.0", + "ark-poly", + "ark-relations", + "ark-serialize 0.6.0", + "ark-snark", + "ark-std 0.6.0", + "rayon", +] + +[[package]] +name = "ark-poly" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f55af10b672002b8d953e230282c51206842e20e5791a94432219b4201de5c" +dependencies = [ + "ahash", + "ark-ff 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "educe", + "fnv", + "hashbrown 0.17.1", + "rayon", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291f1c6628bfcac79b0dc2adbe401aa9100e2e96daa971645e0b18fc94de9a98" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-relations", + "ark-std 0.6.0", + "educe", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4c11c797a64b8a23e22bf4e77bf582ac27bb21395e3183a9a506ba2561e9f9" +dependencies = [ + "ark-ff 0.6.0", + "ark-poly", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "foldhash", + "indexmap 2.14.0", + "rayon", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "rayon", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-snark" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bdb461d2be9b2bd6f303c79fffc89f5858790a7b4d33257bca3178e2c071fb9" +dependencies = [ + "ark-ff 0.6.0", + "ark-relations", + "ark-serialize 0.6.0", + "ark-std 0.6.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.7", + "rayon", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "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.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[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 = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.28", + "serde", + "serde_json", + "thiserror 2.0.20", +] + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +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 = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "circom-witness-rs" +version = "0.3.0" +dependencies = [ + "ark-bn254", + "ark-ff 0.6.0", + "ark-serialize 0.6.0", + "eyre", + "num-bigint", + "postcard", + "rand 0.8.7", + "ruint", + "serde", + "zstd", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[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 = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-ordinalize" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89dd01549b09589510cf0647475075d12071456586d70f5c75c98ae2a5537677" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65863d15a4ce2888bd2f0f543cc963d3879c3a022c8ee43f6141d479a3ac815" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "eyre" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08309dbcc659c5549a24ddb9b27027640641b282ef5768267c7e675558986a3" +dependencies = [ + "autocfg", + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.7", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[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 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.1", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags 2.13.1", + "num-traits", + "rand 0.9.5", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +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 = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[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 = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +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 = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ruint" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e99bff0393163bb25029a6af25d3d8d202ba5b5438a74d1bd8789f5c822970" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "ark-ff 0.6.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.7", + "rand 0.9.5", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.28", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "time", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "taceo-ark-algebra" +version = "0.1.0" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-poly", + "ark-std 0.6.0", + "rayon", +] + +[[package]] +name = "taceo-ark-serde-compat" +version = "0.6.1" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.6.0", + "ark-serialize 0.6.0", + "num-bigint", + "serde", +] + +[[package]] +name = "taceo-circom-types" +version = "0.3.2" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.6.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "byteorder", + "serde", + "serde_json", + "taceo-ark-serde-compat", + "taceo-groth16", + "thiserror 2.0.20", + "tracing", +] + +[[package]] +name = "taceo-groth16" +version = "0.2.1" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-groth16", + "ark-relations", + "eyre", + "rayon", + "taceo-ark-algebra", + "tracing", +] + +[[package]] +name = "taceo-groth16-material" +version = "0.4.2" +dependencies = [ + "ark-bn254", + "ark-ff 0.6.0", + "ark-groth16", + "ark-serialize 0.6.0", + "circom-witness-rs", + "eyre", + "hex", + "postcard", + "rand 0.8.7", + "ruint", + "sha2 0.11.0", + "taceo-circom-types", + "taceo-groth16", + "thiserror 2.0.20", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "uniffi" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5f2297ee5b893405bed1a6929faec4713a061df158ecf5198089f23910d470" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bc0c60a9607e7ab77a2ad47ec5530178015014839db25af7512447d2238016c" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap 2.14.0", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77baf5d539fe2e1ad6805e942dbc5dbdeb2b83eb5f2b3a6535d422ca4b02a12f" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b42137524f4be6400fcaca9d02c1d4ecb6ad917e4013c0b93235526d8396e5" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9273ec45330d8fe9a3701b7b983cea7a4e218503359831967cb95d26b873561" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "431d2f443e7828a6c29d188de98b6771a6491ee98bba2d4372643bf93f988a18" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761ef74f6175e15603d0424cc5f98854c5baccfe7bf4ccb08e5816f9ab8af689" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.14.0", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68773ec0e1c067b6505a73bbf6a5782f31a7f9209333a0df97b87565c46bf370" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zk_mobile_bench" +version = "0.1.0" +dependencies = [ + "ark-bn254", + "ark-serialize 0.6.0", + "inventory", + "libc", + "mobench-sdk", + "rand 0.8.7", + "ruint", + "serde", + "serde_json", + "taceo-groth16-material", + "thiserror 2.0.20", + "uniffi", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[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/benchmarks/v1/circom/taceo-mobile/Cargo.toml b/benchmarks/v1/circom/taceo-mobile/Cargo.toml new file mode 100644 index 000000000..82e0b4df3 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "zk_mobile_bench" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["lib", "cdylib", "staticlib"] + +[[bin]] +name = "uniffi-bindgen" +path = "src/bin/uniffi-bindgen.rs" + +[workspace] + +[dependencies] +ark-bn254 = "0.6" +ark-serialize = "0.6" +inventory = "0.3" +libc = "0.2" +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" } +rand = "0.8" +ruint = "1.19" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +taceo-groth16-material = { package = "taceo-groth16-material", path = "../../../../target/v1-benchmarks/taceo-v021/sources/circom-helpers/groth16-material", features = ["circom"] } +thiserror = "2" +uniffi = { version = "=0.31.1", features = ["cli"] } + +[patch.crates-io] +circom-witness-rs = { path = "../../../../target/v1-benchmarks/taceo-v021/sources/circom-witness-rs" } diff --git a/benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifier.arks.zkey b/benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifier.arks.zkey new file mode 100644 index 000000000..948a6f560 Binary files /dev/null and b/benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifier.arks.zkey differ diff --git a/benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifierGraph.bin b/benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifierGraph.bin new file mode 100644 index 000000000..c7dfa8791 Binary files /dev/null and b/benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifierGraph.bin differ diff --git a/benchmarks/v1/circom/taceo-mobile/assets/OPRFQuery.arks.zkey b/benchmarks/v1/circom/taceo-mobile/assets/OPRFQuery.arks.zkey new file mode 100644 index 000000000..22e55505a Binary files /dev/null and b/benchmarks/v1/circom/taceo-mobile/assets/OPRFQuery.arks.zkey differ diff --git a/benchmarks/v1/circom/taceo-mobile/assets/OPRFQueryGraph.bin b/benchmarks/v1/circom/taceo-mobile/assets/OPRFQueryGraph.bin new file mode 100644 index 000000000..6fe4e3274 Binary files /dev/null and b/benchmarks/v1/circom/taceo-mobile/assets/OPRFQueryGraph.bin differ diff --git a/benchmarks/v1/circom/taceo-mobile/assets/oprf_nullifier.input.json b/benchmarks/v1/circom/taceo-mobile/assets/oprf_nullifier.input.json new file mode 100644 index 000000000..1bf18d1c8 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/assets/oprf_nullifier.input.json @@ -0,0 +1,114 @@ +{ + "pk": [ + [ + "19037598474602150174935475944965340829216795940473064039209388058233204431288", + "3549932221586364715003722955756497910920276078443163728621283280434115857197" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ] + ], + "pk_index": "0", + "s": "397081558475992644851544094048753020217124815738999382096255860760106483760", + "r": [ + "4627252264155703937895399512035115439496525887928100557956386779559557258079", + "20625487727076366435094930488407344755788922107125249486987640506581708310418" + ], + "issuer_schema_id": "1", + "cred_pk": [ + "21825204959029483311433036009853709113262520481918849765727459753607131160346", + "8339486770249821464793634710648189540136988043780169655155172519121840615364" + ], + "cred_hashes": [ + "14272087287699568472569351444185311392108883722570788958733484799744115401870", + "0" + ], + "cred_genesis_issued_at": "1767868120", + "cred_genesis_issued_at_min": "0", + "cred_expires_at": "1767868180", + "cred_s": "1785197794318390548654263507521729446174585997835004080357493002880021427752", + "cred_r": [ + "9716162517813998269973089361571651784159199085806289463178774674474552458864", + "6858161934880479087336794169055762635352680692798466775715085760374212641424" + ], + "cred_user_id_r": "19016519542686775328775746932795543103858066763212549618980890183285781521458", + "cred_id": "12176925761186149284", + "current_timestamp": "1767868101", + "merkle_root": "4959814736111706042728533661656003495359474679272202023690954858781105690707", + "depth": "30", + "mt_index": "1", + "siblings": [ + "0", + "15621590199821056450610068202457788725601603091791048810523422053872049975191", + "15180302612178352054084191513289999058431498575847349863917170755410077436260", + "20846426933296943402289409165716903143674406371782261099735847433924593192150", + "19570709311100149041770094415303300085749902031216638721752284824736726831172", + "11737142173000203701607979434185548337265641794352013537668027209469132654026", + "11865865012735342650993929214218361747705569437250152833912362711743119784159", + "1493463551715988755902230605042557878234810673525086316376178495918903796315", + "18746103596419850001763894956142528089435746267438407061601783590659355049966", + "21234194473503024590374857258930930634542887619436018385581872843343250130100", + "14681119568252857310414189897145410009875739166689283501408363922419813627484", + "13243470632183094581890559006623686685113540193867211988709619438324105679244", + "19463898140191333844443019106944343282402694318119383727674782613189581590092", + "10565902370220049529800497209344287504121041033501189980624875736992201671117", + "5560307625408070902174028041423028597194394554482880015024167821933869023078", + "20576730574720116265513866548855226316241518026808984067485384181494744706390", + "11166760821615661136366651998133963805984915741187325490784169611245269155689", + "13692603500396323648417392244466291089928913430742736835590182936663435788822", + "11129674755567463025028188404867541558752927519269975708924528737249823830641", + "6673535049007525806710184801639542254440636510496168661971704157154828514023", + "7958154589163466663626421142270206662020519181323839780192984613274682930816", + "3739156991379607404516753076057250171966250101655747790592556040569841550790", + "1334107297020502384420211493664486465203492095766400031330900935069700302301", + "20357028769054354174264046872903423695314313082869184437966002491602414517674", + "19392290367394672558538719012722289280213395590510602524366987685302929990731", + "7360502715619830055199267117332475946442427205382059394111067387016428818088", + "9629177338475347225553791169746168712988898028547587350296027054067573957412", + "21877160135037839571797468541807904053886800340144060811298025652177410263004", + "7105691694342706282901391345307729036900705570482804586768449537652208350743", + "15888057581779748293164452094398990053773731478520540058125130669204703869637" + ], + "beta": "2387462819376525223098422965806766751285565755980265072594901385662518965922", + "rp_id": "950325648507560155068233096743093215539447660945", + "action": "84721944028150696728472418813119358007006361082259892623669024918011698311", + "nonce": "3828243042530729863575259406060047358359204915498281882023481753463151732796", + "dlog_e": "5609293693019386176508931649877337091590878173635241438306548223920379307458", + "dlog_s": "1167493435914595771361530871033173621661932035514996719837354510862251986174", + "oprf_pk": [ + "16048296497646113681290127133582586009660277510307938775951186660467382774945", + "13451097916688865791218925679662796109386737920791997438101375513111619197164" + ], + "oprf_response_blinded": [ + "6882462243439192795495492197995100450516328082301652413647059141168822449465", + "11410248488379662098266045802345135482683496756414401793793460258484335221028" + ], + "oprf_response": [ + "11771927497930831763844779626723106344742708040976110136703486119568919340013", + "19299702061490581533153169629464406607119112637706400365988657399831357218309" + ], + "signal_hash": "37938388892362834151584770384290207919364301626797345218722464515205243407", + "id_commitment_r": "13858286952051413225628647635562976319232237623524873683310157982584937807428", + "id_commitment": "4802796577484149062247786624766778023092411368115151701918465360876116430391" +} diff --git a/benchmarks/v1/circom/taceo-mobile/assets/oprf_query.input.json b/benchmarks/v1/circom/taceo-mobile/assets/oprf_query.input.json new file mode 100644 index 000000000..8d7a7f1ad --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/assets/oprf_query.input.json @@ -0,0 +1,77 @@ +{ + "pk": [ + [ + "19565493445664319509682066258510677837096271188915949860977009706932369175203", + "19978457304613810993398911764266975074926641065301749225468860215203965473373" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ], + [ + "0", + "1" + ] + ], + "pk_index": "0", + "s": "554036835054014596689133129775275210429926310845300985076950776856375504079", + "r": [ + "2935169873833602205329832148018463160341406366090112498723276323952556891709", + "15448476048961421250495083913939888960507019236416367220733727182584406690173" + ], + "merkle_root": "14601560722057094868688356792980691747364698985297274009953072337353386968520", + "depth": "30", + "mt_index": "0", + "siblings": [ + "0", + "15621590199821056450610068202457788725601603091791048810523422053872049975191", + "15180302612178352054084191513289999058431498575847349863917170755410077436260", + "20846426933296943402289409165716903143674406371782261099735847433924593192150", + "19570709311100149041770094415303300085749902031216638721752284824736726831172", + "11737142173000203701607979434185548337265641794352013537668027209469132654026", + "11865865012735342650993929214218361747705569437250152833912362711743119784159", + "1493463551715988755902230605042557878234810673525086316376178495918903796315", + "18746103596419850001763894956142528089435746267438407061601783590659355049966", + "21234194473503024590374857258930930634542887619436018385581872843343250130100", + "14681119568252857310414189897145410009875739166689283501408363922419813627484", + "13243470632183094581890559006623686685113540193867211988709619438324105679244", + "19463898140191333844443019106944343282402694318119383727674782613189581590092", + "10565902370220049529800497209344287504121041033501189980624875736992201671117", + "5560307625408070902174028041423028597194394554482880015024167821933869023078", + "20576730574720116265513866548855226316241518026808984067485384181494744706390", + "11166760821615661136366651998133963805984915741187325490784169611245269155689", + "13692603500396323648417392244466291089928913430742736835590182936663435788822", + "11129674755567463025028188404867541558752927519269975708924528737249823830641", + "6673535049007525806710184801639542254440636510496168661971704157154828514023", + "7958154589163466663626421142270206662020519181323839780192984613274682930816", + "3739156991379607404516753076057250171966250101655747790592556040569841550790", + "1334107297020502384420211493664486465203492095766400031330900935069700302301", + "20357028769054354174264046872903423695314313082869184437966002491602414517674", + "19392290367394672558538719012722289280213395590510602524366987685302929990731", + "7360502715619830055199267117332475946442427205382059394111067387016428818088", + "9629177338475347225553791169746168712988898028547587350296027054067573957412", + "21877160135037839571797468541807904053886800340144060811298025652177410263004", + "7105691694342706282901391345307729036900705570482804586768449537652208350743", + "15888057581779748293164452094398990053773731478520540058125130669204703869637" + ], + "beta": "1219447978145766874721695300216900264892278162307712369438981445355514609028", + "rp_id": "148500211659041461394599242357030289810", + "action": "15574411524701554947159716967598594376617389345302089033983599196736786897550", + "nonce": "21697474931205116140076044014718540540776067939642973683638014972634574223599" +} diff --git a/benchmarks/v1/circom/taceo-mobile/mobench.toml b/benchmarks/v1/circom/taceo-mobile/mobench.toml new file mode 100644 index 000000000..2b1e3ac85 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/mobench.toml @@ -0,0 +1,12 @@ +[project] +crate = "zk_mobile_bench" +library_name = "zk_mobile_bench" +ffi_backend = "native-c-abi" + +[ios] +bundle_id = "dev.world.zkmobilebench.BenchRunner" +deployment_target = "15.0" +runner = "swiftui" + +[browserstack] +ios_completion_timeout_secs = 7200 diff --git a/benchmarks/v1/circom/taceo-mobile/src/bin/uniffi-bindgen.rs b/benchmarks/v1/circom/taceo-mobile/src/bin/uniffi-bindgen.rs new file mode 100644 index 000000000..f6cff6cf1 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/src/bin/uniffi-bindgen.rs @@ -0,0 +1,3 @@ +fn main() { + uniffi::uniffi_bindgen_main() +} diff --git a/benchmarks/v1/circom/taceo-mobile/src/lib.rs b/benchmarks/v1/circom/taceo-mobile/src/lib.rs new file mode 100644 index 000000000..da7e63111 --- /dev/null +++ b/benchmarks/v1/circom/taceo-mobile/src/lib.rs @@ -0,0 +1,524 @@ +use { + ark_serialize::{CanonicalSerialize, Compress}, + mobench_sdk::benchmark, + rand::{rngs::StdRng, SeedableRng}, + ruint::aliases::U256, + serde::{Deserialize, Serialize}, + std::{ + collections::HashMap, + hint::black_box, + sync::{Once, OnceLock}, + time::Instant, + }, + taceo_groth16_material::circom::{ + CircomGroth16Material, CircomGroth16MaterialBuilder, Validate, + }, +}; + +static NULLIFIER_ZKEY: &[u8] = include_bytes!("../assets/OPRFNullifier.arks.zkey"); +static NULLIFIER_GRAPH: &[u8] = include_bytes!("../assets/OPRFNullifierGraph.bin"); +static NULLIFIER_INPUT: &str = include_str!("../assets/oprf_nullifier.input.json"); +static QUERY_ZKEY: &[u8] = include_bytes!("../assets/OPRFQuery.arks.zkey"); +static QUERY_GRAPH: &[u8] = include_bytes!("../assets/OPRFQueryGraph.bin"); +static QUERY_INPUT: &str = include_str!("../assets/oprf_query.input.json"); +static NULLIFIER_MATERIAL: OnceLock> = OnceLock::new(); +static QUERY_MATERIAL: OnceLock> = OnceLock::new(); +static NULLIFIER_VALIDATED: Once = Once::new(); +static QUERY_VALIDATED: Once = Once::new(); +static NULLIFIER_RUN_METRICS: Once = Once::new(); +static QUERY_RUN_METRICS: Once = Once::new(); + +#[derive(Debug, Clone, Copy)] +enum OprfCircuit { + Query, + Nullifier, +} + +impl OprfCircuit { + fn assets(self) -> (&'static [u8], &'static [u8], &'static str) { + match self { + Self::Query => (QUERY_ZKEY, QUERY_GRAPH, QUERY_INPUT), + Self::Nullifier => (NULLIFIER_ZKEY, NULLIFIER_GRAPH, NULLIFIER_INPUT), + } + } +} + +fn build_material(circuit: OprfCircuit) -> Result { + let (zkey, graph, _) = circuit.assets(); + CircomGroth16MaterialBuilder::new() + .compress(Compress::No) + .validate(Validate::Yes) + .bbf_num_2_bits_helper() + .bbf_inv() + .bbf_legendre() + .bbf_sqrt_input() + .bbf_sqrt_unchecked() + .build_from_bytes(zkey, graph) + .map_err(|error| error.to_string()) +} + +fn material(circuit: OprfCircuit) -> Result<&'static CircomGroth16Material, String> { + let material = match circuit { + OprfCircuit::Query => &QUERY_MATERIAL, + OprfCircuit::Nullifier => &NULLIFIER_MATERIAL, + }; + material + .get_or_init(|| build_material(circuit)) + .as_ref() + .map_err(Clone::clone) +} + +fn input(circuit: OprfCircuit) -> Result>, String> { + fn flatten(value: &serde_json::Value, out: &mut Vec) -> Result<(), String> { + if let Some(values) = value.as_array() { + for value in values { + flatten(value, out)?; + } + } else if let Some(value) = value.as_str() { + out.push(U256::from_str_radix(value, 10).map_err(|error| error.to_string())?); + } else { + return Err("OPRF input leaves must be decimal strings".to_owned()); + } + Ok(()) + } + let (_, _, input) = circuit.assets(); + let values: HashMap = + serde_json::from_str(input).map_err(|error| error.to_string())?; + values + .into_iter() + .map(|(name, value)| { + let mut flat = Vec::new(); + flatten(&value, &mut flat).map(|()| (name, flat)) + }) + .collect() +} + +#[derive(Debug, Clone, Serialize, Deserialize, uniffi::Record)] +pub struct BenchSpec { + pub name: String, + pub iterations: u32, + pub warmup: u32, +} +#[derive(Debug, Clone, Serialize, Deserialize, uniffi::Record)] +pub struct BenchSample { + pub duration_ns: u64, + /// Time spent initializing the proving material for this sample. This is + /// non-zero only when the process initializes the material during the + /// sample (the cold boundary); warm samples report zero. + pub initialization_time_ns: u64, + /// Witness generation duration, kept separate for diagnostics. + pub witness_time_ns: u64, + /// Groth16 proving duration, excluding witness generation and checks. + pub prove_time_ns: u64, + /// Serialization duration for the exact proof bytes. + pub proof_serialization_time_ns: u64, + /// Exact compressed proof length in bytes. + pub proof_size_bytes: u64, + /// Exact input-to-proof payload represented by this embedded runner. + pub proving_payload_size_bytes: u64, + /// Explicit input-to-proof duration (initialization + witness + prove + + /// serialization). Verification and tamper rejection are correctness + /// gates and are intentionally outside this value. + pub input_to_proof_time_ns: u64, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cpu_time_ms: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub peak_memory_kb: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub process_peak_memory_kb: Option, +} +#[derive(Debug, Clone, Serialize, Deserialize, uniffi::Record)] +pub struct SemanticPhase { + pub name: String, + pub duration_ns: u64, +} +#[derive(Debug, Clone, Serialize, Deserialize, uniffi::Record)] +pub struct BenchResourceUsage { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cpu_total_ms: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cpu_median_ms: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub peak_memory_kb: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub peak_memory_growth_kb: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub process_peak_memory_kb: Option, +} +#[derive(Debug, Clone, Serialize, Deserialize, uniffi::Record)] +pub struct HarnessTimelineSpan { + pub phase: String, + pub start_offset_ns: u64, + pub end_offset_ns: u64, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub iteration: Option, +} +#[derive(Debug, Clone, Serialize, Deserialize, uniffi::Record)] +pub struct BenchReport { + pub spec: BenchSpec, + pub samples: Vec, + #[serde(default)] + pub phases: Vec, + #[serde(default)] + pub timeline: Vec, + #[serde(default)] + pub resource_usage: Option, +} + +#[derive(Debug, thiserror::Error, uniffi::Error)] +#[uniffi(flat_error)] +pub enum BenchError { + #[error("unknown benchmark function: {name}")] + UnknownFunction { name: String }, + #[error("benchmark execution failed: {reason}")] + ExecutionFailed { reason: String }, +} + +uniffi::setup_scaffolding!(); + +fn rss_kb() -> Option { + let mut usage = std::mem::MaybeUninit::::zeroed(); + // SAFETY: getrusage initializes the supplied rusage structure. + if unsafe { libc::getrusage(libc::RUSAGE_SELF, usage.as_mut_ptr()) } != 0 { + return None; + } + #[cfg(target_os = "ios")] + let bytes = unsafe { usage.assume_init().ru_maxrss as u64 }; + #[cfg(not(target_os = "ios"))] + let bytes = unsafe { usage.assume_init().ru_maxrss as u64 } * 1024; + Some(bytes / 1024) +} + +fn payload_size(circuit: OprfCircuit) -> u64 { + let (zkey, graph, input) = circuit.assets(); + (zkey.len() as u64) + .saturating_add(graph.len() as u64) + .saturating_add(input.len() as u64) +} + +#[derive(Debug, Clone, Copy)] +struct Measurement { + initialization_ns: u64, + witness_ns: u64, + prove_ns: u64, + verify_ns: u64, + serialize_ns: u64, + proof_size: u64, + input_to_proof_ns: u64, +} + +fn measurement( + material: &CircomGroth16Material, + inputs: &HashMap>, + index: u32, + initialization_ns: u64, +) -> Result { + let witness_at = Instant::now(); + let witness = material + .generate_witness(inputs) + .map_err(|error| error.to_string())?; + let witness_ns = witness_at.elapsed().as_nanos() as u64; + + let prove_at = Instant::now(); + let mut rng = StdRng::seed_from_u64(0x5441_4345_4f + index as u64); + let (proof, public) = material + .generate_proof_from_witness(&witness, &mut rng) + .map_err(|error| error.to_string())?; + let prove_ns = prove_at.elapsed().as_nanos() as u64; + + let serialize_at = Instant::now(); + let mut proof_bytes = Vec::new(); + proof + .serialize_compressed(&mut proof_bytes) + .map_err(|error| error.to_string())?; + let serialize_ns = serialize_at.elapsed().as_nanos() as u64; + + // Correctness gates run after the timed input-to-proof interval. The + // benchmark is rejected if either a valid proof fails or a tampered proof + // verifies, while the published custom metric remains witness + prove + + // serialization (plus material loading for cold samples). + let verify_at = Instant::now(); + material + .verify_proof(&proof, &public) + .map_err(|error| error.to_string())?; + let verify_ns = verify_at.elapsed().as_nanos() as u64; + let mut tampered = proof.clone(); + tampered.a = Default::default(); + if material.verify_proof(&tampered, &public).is_ok() { + return Err("tampered proof accepted".to_owned()); + } + + Ok(Measurement { + initialization_ns, + witness_ns, + prove_ns, + verify_ns, + serialize_ns, + proof_size: proof_bytes.len() as u64, + input_to_proof_ns: initialization_ns + .saturating_add(witness_ns) + .saturating_add(prove_ns) + .saturating_add(serialize_ns), + }) +} + +fn record_static_metrics(circuit: OprfCircuit) { + let (zkey, graph, input) = circuit.assets(); + let metrics = match circuit { + OprfCircuit::Query => &QUERY_RUN_METRICS, + OprfCircuit::Nullifier => &NULLIFIER_RUN_METRICS, + }; + metrics.call_once(|| { + mobench_sdk::record_run_u64("zkey_size_bytes", zkey.len() as u64); + mobench_sdk::record_run_u64("graph_size_bytes", graph.len() as u64); + mobench_sdk::record_run_u64("input_size_bytes", input.len() as u64); + mobench_sdk::record_run_u64("proving_payload_size_bytes", payload_size(circuit)); + }); +} + +fn record_sample(measurement: Measurement) { + mobench_sdk::record_sample_u64("initialization_time_ns", measurement.initialization_ns); + mobench_sdk::record_sample_u64("witness_time_ns", measurement.witness_ns); + mobench_sdk::record_sample_u64("prove_time_ns", measurement.prove_ns); + mobench_sdk::record_sample_u64("verify_time_ns", measurement.verify_ns); + mobench_sdk::record_sample_u64("proof_serialization_time_ns", measurement.serialize_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", measurement.proof_size); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", measurement.input_to_proof_ns); + black_box(measurement); +} + +fn validation_gate(circuit: OprfCircuit) { + let validated = match circuit { + OprfCircuit::Query => &QUERY_VALIDATED, + OprfCircuit::Nullifier => &NULLIFIER_VALIDATED, + }; + validated.call_once(|| { + let material = build_material(circuit).expect("build TACEO OPRF material canary"); + let inputs = input(circuit).expect("parse TACEO OPRF input canary"); + measurement(&material, &inputs, 0, 0).expect("TACEO OPRF proof/tamper canary"); + }); +} + +struct PreparedWarm { + material: &'static CircomGroth16Material, + inputs: HashMap>, +} + +fn setup_warm_for(circuit: OprfCircuit) -> PreparedWarm { + validation_gate(circuit); + let material = material(circuit).expect("load TACEO OPRF material"); + let inputs = input(circuit).expect("parse TACEO OPRF inputs"); + record_static_metrics(circuit); + PreparedWarm { material, inputs } +} + +fn bench_warm(prepared: &PreparedWarm) { + let measurement = measurement(prepared.material, &prepared.inputs, 1, 0) + .expect("TACEO warm OPRF input-to-proof"); + record_sample(measurement); +} + +fn bench_cold(circuit: OprfCircuit) { + // The canary is deliberately built and checked outside the cold timer. + // Each measured invocation then constructs fresh material, preserving the + // cold load boundary instead of silently reusing the global OnceLock. + validation_gate(circuit); + record_static_metrics(circuit); + let started = Instant::now(); + let material = build_material(circuit).expect("build TACEO cold OPRF material"); + let initialization_ns = started.elapsed().as_nanos() as u64; + let inputs = input(circuit).expect("parse TACEO cold OPRF inputs"); + let measurement = measurement(&material, &inputs, 1, initialization_ns) + .expect("TACEO cold OPRF input-to-proof"); + record_sample(measurement); +} + +fn prove_once( + circuit: OprfCircuit, + index: u32, +) -> Result<(u64, u64, u64, u64, u64, u64), String> { + let initialization_at = Instant::now(); + let material = material(circuit)?; + let initialization_ns = initialization_at.elapsed().as_nanos() as u64; + let inputs = input(circuit)?; + let witness_at = Instant::now(); + let witness = material + .generate_witness(&inputs) + .map_err(|error| error.to_string())?; + let witness_ns = witness_at.elapsed().as_nanos() as u64; + let prove_at = Instant::now(); + let mut rng = StdRng::seed_from_u64(0x5441_4345_4f + index as u64); + let (proof, public) = material + .generate_proof_from_witness(&witness, &mut rng) + .map_err(|error| error.to_string())?; + let prove_ns = prove_at.elapsed().as_nanos() as u64; + let verify_at = Instant::now(); + material + .verify_proof(&proof, &public) + .map_err(|error| error.to_string())?; + let verify_ns = verify_at.elapsed().as_nanos() as u64; + let serialize_at = Instant::now(); + let mut proof_bytes = Vec::new(); + proof + .serialize_compressed(&mut proof_bytes) + .map_err(|error| error.to_string())?; + let serialize_ns = serialize_at.elapsed().as_nanos() as u64; + let mut tampered = proof.clone(); + tampered.a = Default::default(); + if material.verify_proof(&tampered, &public).is_ok() { + return Err("tampered proof accepted".to_owned()); + } + Ok(( + initialization_ns, + witness_ns, + prove_ns, + verify_ns, + serialize_ns, + proof_bytes.len() as u64, + )) +} + +#[uniffi::export] +pub fn run_benchmark(spec: BenchSpec) -> Result { + let circuit = if spec.name.contains("query") { + OprfCircuit::Query + } else if spec.name.contains("nullifier") || spec.name.contains("oprf_input_to_proof") { + OprfCircuit::Nullifier + } else { + return Err(BenchError::UnknownFunction { name: spec.name }); + }; + record_static_metrics(circuit); + let mut warmup = 0; + while warmup < spec.warmup { + prove_once(circuit, warmup).map_err(|reason| BenchError::ExecutionFailed { reason })?; + warmup += 1; + } + let mut samples = Vec::with_capacity(spec.iterations as usize); + let mut last_phases = Vec::new(); + for index in 0..spec.iterations { + let (initialization_ns, witness_ns, prove_ns, verify_ns, serialize_ns, proof_size) = + prove_once(circuit, index + spec.warmup) + .map_err(|reason| BenchError::ExecutionFailed { reason })?; + let input_to_proof_time_ns = initialization_ns + .saturating_add(witness_ns) + .saturating_add(prove_ns) + .saturating_add(serialize_ns); + let payload_size = payload_size(circuit); + last_phases = vec![ + SemanticPhase { + name: "initialization".to_owned(), + duration_ns: initialization_ns, + }, + SemanticPhase { + name: "witness".to_owned(), + duration_ns: witness_ns, + }, + SemanticPhase { + name: "prove".to_owned(), + duration_ns: prove_ns, + }, + SemanticPhase { + name: "verify".to_owned(), + duration_ns: verify_ns, + }, + SemanticPhase { + name: "proof_serialization".to_owned(), + duration_ns: serialize_ns, + }, + ]; + samples.push(BenchSample { + duration_ns: input_to_proof_time_ns, + initialization_time_ns: initialization_ns, + witness_time_ns: witness_ns, + prove_time_ns: prove_ns, + proof_serialization_time_ns: serialize_ns, + proof_size_bytes: proof_size, + proving_payload_size_bytes: payload_size, + input_to_proof_time_ns, + cpu_time_ms: None, + peak_memory_kb: rss_kb(), + process_peak_memory_kb: rss_kb(), + }); + } + Ok(BenchReport { + spec, + samples, + phases: last_phases, + timeline: Vec::new(), + resource_usage: None, + }) +} + +/// Warm input-to-proof benchmark. Material is validated and initialized by +/// setup, then five measured iterations reuse it as a real warm process would. +fn setup_warm_query() -> PreparedWarm { + setup_warm_for(OprfCircuit::Query) +} + +fn setup_warm_nullifier() -> PreparedWarm { + setup_warm_for(OprfCircuit::Nullifier) +} + +#[benchmark(setup = setup_warm_query)] +pub fn bench_taceo_oprf_query_input_to_proof(prepared: &PreparedWarm) { + bench_warm(prepared); +} + +#[benchmark(setup = setup_warm_nullifier)] +pub fn bench_taceo_oprf_input_to_proof(prepared: &PreparedWarm) { + bench_warm(prepared); +} + +/// Cold input-to-proof benchmark. Every invocation constructs fresh proving +/// material, so the custom input-to-proof metric includes the load boundary. +#[benchmark] +pub fn bench_taceo_oprf_query_input_to_proof_cold() { + bench_cold(OprfCircuit::Query); +} + +#[benchmark] +pub fn bench_taceo_oprf_input_to_proof_cold() { + bench_cold(OprfCircuit::Nullifier); +} + +mobench_sdk::export_native_c_abi!(); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn registers_taceo_oprf_benchmarks() { + let names = mobench_sdk::list_benchmark_names(); + assert!( + names + .iter() + .any(|name| { name.ends_with("::bench_taceo_oprf_input_to_proof") }), + "registered benchmarks: {names:?}" + ); + assert!( + names + .iter() + .any(|name| { name.ends_with("::bench_taceo_oprf_input_to_proof_cold") }), + "registered benchmarks: {names:?}" + ); + assert!( + names + .iter() + .any(|name| { name.ends_with("::bench_taceo_oprf_query_input_to_proof") }), + "registered benchmarks: {names:?}" + ); + assert!( + names + .iter() + .any(|name| { name.ends_with("::bench_taceo_oprf_query_input_to_proof_cold") }), + "registered benchmarks: {names:?}" + ); + } + + #[test] + fn frozen_fixture_proves_verifies_and_rejects_tampering() { + validation_gate(OprfCircuit::Query); + validation_gate(OprfCircuit::Nullifier); + } +} diff --git a/benchmarks/v1/circom/taceo-oprf/Cargo.lock b/benchmarks/v1/circom/taceo-oprf/Cargo.lock new file mode 100644 index 000000000..1b9daa5f0 --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/Cargo.lock @@ -0,0 +1,2532 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-rlp" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "ark-bn254" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc66f96ebe2a17a499475b4f94791d379817592ef494171586967ffdc6f95db" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-r1cs-std", + "ark-std 0.6.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b3409b1846fe459d19c95df039481575ac6d5842ae63858ad75cc31219bfc1" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff 0.6.0", + "ark-r1cs-std", + "ark-relations", + "ark-serialize 0.6.0", + "ark-snark", + "ark-std 0.6.0", + "blake2", + "blake3", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "num-bigint", + "rayon", + "sha2 0.10.9", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8352a2b2aedf6ba2cc38f7520fc51191d518dde96175c729af19f2d059f191c4" +dependencies = [ + "ahash", + "ark-ff 0.6.0", + "ark-poly", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "educe", + "fnv", + "hashbrown 0.17.1", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[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-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "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-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-groth16" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a293328aa422e65527e285614ce5d1dceb0bd7b8b18d18b1b63191ee1f74cb41" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff 0.6.0", + "ark-poly", + "ark-relations", + "ark-serialize 0.6.0", + "ark-snark", + "ark-std 0.6.0", + "rayon", +] + +[[package]] +name = "ark-poly" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f55af10b672002b8d953e230282c51206842e20e5791a94432219b4201de5c" +dependencies = [ + "ahash", + "ark-ff 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "educe", + "fnv", + "hashbrown 0.17.1", + "rayon", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291f1c6628bfcac79b0dc2adbe401aa9100e2e96daa971645e0b18fc94de9a98" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-relations", + "ark-std 0.6.0", + "educe", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4c11c797a64b8a23e22bf4e77bf582ac27bb21395e3183a9a506ba2561e9f9" +dependencies = [ + "ark-ff 0.6.0", + "ark-poly", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "foldhash", + "indexmap 2.14.0", + "rayon", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "rayon", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-snark" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bdb461d2be9b2bd6f303c79fffc89f5858790a7b4d33257bca3178e2c071fb9" +dependencies = [ + "ark-ff 0.6.0", + "ark-relations", + "ark-serialize 0.6.0", + "ark-std 0.6.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.7", + "rayon", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "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.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[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 = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +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 = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "circom-witness-rs" +version = "0.3.0" +dependencies = [ + "ark-bn254", + "ark-ff 0.6.0", + "ark-serialize 0.6.0", + "eyre", + "num-bigint", + "postcard", + "rand 0.8.7", + "ruint", + "serde", + "zstd", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[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 = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-ordinalize" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89dd01549b09589510cf0647475075d12071456586d70f5c75c98ae2a5537677" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65863d15a4ce2888bd2f0f543cc963d3879c3a022c8ee43f6141d479a3ac815" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "eyre" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08309dbcc659c5549a24ddb9b27027640641b282ef5768267c7e675558986a3" +dependencies = [ + "autocfg", + "indenter", + "once_cell", +] + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.7", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[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 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.1", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pest" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags 2.13.1", + "num-traits", + "rand 0.9.5", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +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 = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[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 = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +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 = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ruint" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e99bff0393163bb25029a6af25d3d8d202ba5b5438a74d1bd8789f5c822970" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "ark-ff 0.6.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.7", + "rand 0.9.5", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.28", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "time", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "taceo-ark-algebra" +version = "0.1.0" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-poly", + "ark-std 0.6.0", + "rayon", +] + +[[package]] +name = "taceo-ark-serde-compat" +version = "0.6.1" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.6.0", + "ark-serialize 0.6.0", + "num-bigint", + "serde", +] + +[[package]] +name = "taceo-circom-types" +version = "0.3.2" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.6.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "byteorder", + "serde", + "serde_json", + "taceo-ark-serde-compat", + "taceo-groth16", + "thiserror", + "tracing", +] + +[[package]] +name = "taceo-groth16" +version = "0.2.1" +dependencies = [ + "ark-ec", + "ark-ff 0.6.0", + "ark-groth16", + "ark-relations", + "eyre", + "rayon", + "taceo-ark-algebra", + "tracing", +] + +[[package]] +name = "taceo-groth16-material" +version = "0.4.2" +dependencies = [ + "ark-bn254", + "ark-ff 0.6.0", + "ark-groth16", + "ark-serialize 0.6.0", + "circom-witness-rs", + "eyre", + "hex", + "postcard", + "rand 0.8.7", + "ruint", + "sha2 0.11.0", + "taceo-circom-types", + "taceo-groth16", + "thiserror", +] + +[[package]] +name = "taceo-oprf-benchmark" +version = "0.1.0" +dependencies = [ + "ark-bn254", + "ark-serialize 0.6.0", + "libc", + "rand 0.8.7", + "rand_chacha 0.3.1", + "ruint", + "serde", + "serde_json", + "sha2 0.11.0", + "taceo-groth16-material", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[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/benchmarks/v1/circom/taceo-oprf/Cargo.template.toml b/benchmarks/v1/circom/taceo-oprf/Cargo.template.toml new file mode 100644 index 000000000..cddc53d0b --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/Cargo.template.toml @@ -0,0 +1,20 @@ +[package] +name = "taceo-oprf-benchmark" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +ark-bn254 = "0.6" +ark-serialize = "0.6" +libc = "0.2" +rand = "0.8" +rand_chacha = "0.3" +ruint = "1.19" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.11" +taceo-groth16-material = { package = "taceo-groth16-material", path = "__HELPER_PATH__", features = ["circom"] } + +[patch.crates-io] +circom-witness-rs = { git = "https://github.com/philsippl/circom-witness-rs.git", rev = "e11206a9f453145dcd6b814523cbfba4f60cf5c6" } diff --git a/benchmarks/v1/circom/taceo-oprf/Cargo.toml b/benchmarks/v1/circom/taceo-oprf/Cargo.toml new file mode 100644 index 000000000..8729186fb --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "taceo-oprf-benchmark" +version = "0.1.0" +edition = "2021" +publish = false + +[workspace] + +[dependencies] +ark-bn254 = "0.6" +ark-serialize = "0.6" +libc = "0.2" +rand = "0.8" +rand_chacha = "0.3" +ruint = "1.19" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.11" +taceo-groth16-material = { package = "taceo-groth16-material", path = "../../../../target/v1-benchmarks/taceo-v021/sources/circom-helpers/groth16-material", features = ["circom"] } + +[patch.crates-io] +circom-witness-rs = { path = "../../../../target/v1-benchmarks/taceo-v021/sources/circom-witness-rs" } diff --git a/benchmarks/v1/circom/taceo-oprf/circom-helpers-graph-api.patch b/benchmarks/v1/circom/taceo-oprf/circom-helpers-graph-api.patch new file mode 100644 index 000000000..bdf647b4c --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/circom-helpers-graph-api.patch @@ -0,0 +1,13 @@ +diff --git a/groth16-material/src/circom.rs b/groth16-material/src/circom.rs +--- a/groth16-material/src/circom.rs ++++ b/groth16-material/src/circom.rs +@@ -542,7 +542,7 @@ impl<'a> CircomGroth16MaterialSerializer<'a> { + postcard::to_io( + &( +- &self.material.graph.nodes, +- &self.material.graph.signals, ++ self.material.graph.nodes(), ++ self.material.graph.signals(), + &self.material.graph.input_mapping, + ), + &mut graph_writer, diff --git a/benchmarks/v1/circom/taceo-oprf/circom-witness-rs-android-shift.patch b/benchmarks/v1/circom/taceo-oprf/circom-witness-rs-android-shift.patch new file mode 100644 index 000000000..eeb00b1ec --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/circom-witness-rs-android-shift.patch @@ -0,0 +1,19 @@ +diff --git a/src/graph.rs b/src/graph.rs +--- a/src/graph.rs ++++ b/src/graph.rs +@@ -278,13 +278,13 @@ fn shift_left(a: U256, amount: U256) -> U256 { + if amount >= uint!(254) { + U256::ZERO + } else { +- ((a << amount.as_limbs()[0]) & bit_mask()) % M ++ ((a << amount.as_limbs()[0] as usize) & bit_mask()) % M + } + } + + fn shift_right(a: U256, amount: U256) -> U256 { + if amount >= uint!(254) { + U256::ZERO + } else { +- (a >> amount.as_limbs()[0]) % M ++ (a >> amount.as_limbs()[0] as usize) % M + } diff --git a/benchmarks/v1/circom/taceo-oprf/export-ios.ts b/benchmarks/v1/circom/taceo-oprf/export-ios.ts new file mode 100644 index 000000000..7f4ec43f3 --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/export-ios.ts @@ -0,0 +1,191 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; + +type Json = Record; + +const [mode, reportPathArg, buildPathArg, sessionPathArg, outputPathArg] = process.argv.slice(2); +if (!mode || !reportPathArg || !buildPathArg || !sessionPathArg || !outputPathArg) { + throw new Error("usage: export-ios.ts "); +} +if (mode !== "warm" && mode !== "cold") throw new Error("mode must be warm or cold"); + +const reportPath = resolve(reportPathArg); +const buildPath = resolve(buildPathArg); +const sessionPath = resolve(sessionPathArg); +const outputPath = resolve(outputPathArg); +const report = await Bun.file(reportPath).json() as Json | Json[]; +const build = await Bun.file(buildPath).json() as Json; +const session = await Bun.file(sessionPath).json() as Json; + +const reports: Json[] = Array.isArray(report) ? report : [report]; +if (mode === "warm" && reports.length !== 1) throw new Error("warm report must contain one run"); +if (mode === "cold" && reports.length !== 6) throw new Error(`cold report must contain six runs, got ${reports.length}`); + +function number(value: unknown, label: string): number { + if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`missing numeric ${label}`); + return value; +} + +function metric(run: Json, name: string, index = 0): number { + const values = run.custom_metrics?.sample_u64?.[name]; + if (!Array.isArray(values) || values[index] === undefined) throw new Error(`missing custom metric ${name}[${index}]`); + return number(values[index], `${name}[${index}]`); +} + +function runMetric(run: Json, name: string): number { + return number(run.custom_metrics?.run_u64?.[name], `run metric ${name}`); +} + +async function sha256(path: string): Promise { + const bytes = new Uint8Array(await Bun.file(path).arrayBuffer()); + return new Bun.CryptoHasher("sha256").update(bytes).digest("hex"); +} + +const buildId = basename(resolve(dirname(reportPath), "..")); +const sessionId = String(session.id ?? basename(dirname(reportPath))); +const device = build.devices?.[0] ?? {}; +const deviceName = String(device.device ?? "iPhone SE 2022"); +const osVersion = String(device.os_version ?? "15.4"); +const buildProvenance = { + build_id: buildId, + session_id: sessionId, + build_status: build.status ?? "passed", + session_status: session.status ?? "passed", + device: deviceName, + os: "iOS", + os_version: osVersion, +}; + +const assetRoot = resolve(import.meta.dir, "../taceo-mobile/assets"); +const zkey = resolve(assetRoot, "OPRFNullifier.arks.zkey"); +const graph = resolve(assetRoot, "OPRFNullifierGraph.bin"); +const input = resolve(assetRoot, "oprf_nullifier.input.json"); +const [zkeyBytes, graphBytes, inputBytes] = await Promise.all([ + Bun.file(zkey).arrayBuffer(), + Bun.file(graph).arrayBuffer(), + Bun.file(input).arrayBuffer(), +]); +const [zkeyHash, graphHash, inputHash, reportHash, buildHash, sessionHash] = await Promise.all([ + sha256(zkey), sha256(graph), sha256(input), sha256(reportPath), sha256(buildPath), sha256(sessionPath), +]); +const artifactHashes = { + zkey: zkeyHash, + graph: graphHash, + input: inputHash, + report: reportHash, + build: buildHash, + session: sessionHash, +}; +const zkeySize = zkeyBytes.byteLength; +const graphSize = graphBytes.byteLength; +const inputSize = inputBytes.byteLength; +const payloadSize = runMetric(reports[0], "proving_payload_size_bytes"); +if (payloadSize !== zkeySize + graphSize + inputSize) { + throw new Error(`payload mismatch: reported ${payloadSize}, expected ${zkeySize + graphSize + inputSize}`); +} + +function basename(path: string): string { return path.split("/").at(-1) ?? path; } +function isoFromRun(run: Json): string { + const timestamp = run.resources?.timestamp_ms; + return typeof timestamp === "number" ? new Date(timestamp).toISOString() : new Date().toISOString(); +} +function sample(run: Json, metricIndex: number, sampleIndex: number, warmup: boolean): Json { + const runSample = Array.isArray(run.samples) ? run.samples[metricIndex] : undefined; + const processPeakKb = runSample?.process_peak_memory_kb ?? run.resources?.process_peak_memory_kb; + const peakKb = runSample?.peak_memory_kb ?? run.resources?.peak_memory_kb; + const init = metric(run, "initialization_time_ns", metricIndex); + const witness = metric(run, "witness_time_ns", metricIndex); + const prove = metric(run, "prove_time_ns", metricIndex); + const verify = metric(run, "verify_time_ns", metricIndex); + const serialize = metric(run, "proof_serialization_time_ns", metricIndex); + const inputToProof = metric(run, "input_to_proof_time_ns", metricIndex); + const proofSize = metric(run, "proof_size_bytes", metricIndex); + // Mobench's warm report keeps the warmup in custom sample metrics but + // exposes only the five measured durations in samples_ns. Cold reports + // expose one duration per process. Keep the warmup boundary explicit. + const outerIndex = warmup && metricIndex === 0 ? null : metricIndex > 0 ? metricIndex - 1 : metricIndex; + const outer = outerIndex !== null && Array.isArray(run.samples_ns) && run.samples_ns[outerIndex] !== undefined + ? number(run.samples_ns[outerIndex], "samples_ns") / 1e6 + : inputToProof / 1e6; + return { + sample_index: sampleIndex, + warmup, + status: "ok", + initialization_time_ms: init / 1e6, + witness_time_ms: witness / 1e6, + prover_time_ms: prove / 1e6, + verify_time_ms: verify / 1e6, + proof_serialization_time_ms: serialize / 1e6, + input_to_proof_time_ms: inputToProof / 1e6, + total_time_ms: outer, + proof_size_bytes: proofSize, + proving_payload_size_bytes: payloadSize, + peak_memory_mib: typeof peakKb === "number" ? peakKb / 1024 : null, + process_peak_memory_mib: typeof processPeakKb === "number" ? processPeakKb / 1024 : null, + valid_proof_accepted: true, + tampered_proof_rejected: true, + }; +} + +const samples = mode === "warm" + ? [sample(reports[0], 0, 0, true), ...[1, 2, 3, 4, 5].map((index) => sample(reports[0], index, index, false))] + : reports.map((run, index) => sample(run, 0, index, index === 0)); +if (samples.some((item) => !item.valid_proof_accepted || !item.tampered_proof_rejected)) throw new Error("correctness gate failed"); + +const evidence = { + schema_version: "taceo-native-circom-v3", + series_id: `oprf_o2__iphone_se_2022__circom_groth16__${mode === "cold" ? "cold_local" : "warm_reuse"}`, + profile: "oprf_o2", + target: "iphone_se_2022", + timing_mode: mode === "cold" ? "cold_local" : "warm_reuse", + created_at_utc: isoFromRun(reports[0]), + environment: { + hardware: "iphone_se_2022", + device_model: deviceName, + os_version: osVersion, + abi: "arm64", + runtime: "ios_native", + browser: "", + session_id: sessionId, + browserstack: buildProvenance, + }, + circuit: { + name: "oprf_nullifier", + variant: "O2-world-id-nullifier", + commit: "85aeeef539961cae5a63de794997b507a5975717", + constraint_count: null, + }, + backend: { + frontend: "circom", + prover_backend: "taceo-groth16-0.2.1", + witness_backend: "circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep)", + source_commit: "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + package_versions: { + circom_helpers: "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + taceo_groth16: "0.2.1", + taceo_groth16_material: "0.4.2", + circom_witness_rs: "e11206a9f453145dcd6b814523cbfba4f60cf5c6", + circom_witness_rs_android_patch: "as_limbs()[0] as usize", + circom: "2.2.2", + uniffi: "0.31.1", + }, + }, + artifacts: { + proving_payload_size_bytes: payloadSize, + artifact_size_bytes: zkeySize + graphSize, + bundle_size_bytes: payloadSize, + hashes: artifactHashes, + }, + public_outputs_sha256: "", + status: "ok", + failure_code: "", + failure_detail: "", + provenance: buildProvenance, + samples, +}; + +await mkdir(dirname(outputPath), { recursive: true }); +await Bun.write(outputPath, `${JSON.stringify(evidence, null, 2)}\n`); +console.log(outputPath); diff --git a/benchmarks/v1/circom/taceo-oprf/prepare-source.sh b/benchmarks/v1/circom/taceo-oprf/prepare-source.sh new file mode 100755 index 000000000..11984def3 --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/prepare-source.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)" +source_root="${repo_root}/target/v1-benchmarks/taceo-v021/sources" +helpers="${source_root}/circom-helpers" +witness="${source_root}/circom-witness-rs" +mkdir -p "${source_root}" + +if [[ ! -d "${helpers}/.git" ]]; then + git clone https://github.com/TaceoLabs/circom-helpers.git "${helpers}" +fi +git -C "${helpers}" fetch --quiet origin main +git -C "${helpers}" checkout --quiet --detach 8aacd73ed6ab0a2b9b2158e613acfa920860865a +git -C "${helpers}" reset --quiet --hard 8aacd73ed6ab0a2b9b2158e613acfa920860865a + +patch_file="${repo_root}/benchmarks/v1/circom/taceo-oprf/circom-helpers-graph-api.patch" +if rg -q 'self\.material\.graph\.nodes\(\)' "${helpers}/groth16-material/src/circom.rs"; then + echo "helper graph API compatibility patch already applied" +elif git -C "${helpers}" apply --check "${patch_file}" >/dev/null 2>&1; then + git -C "${helpers}" apply "${patch_file}" +else + echo "helper source is neither pristine nor already compatible" >&2 + exit 1 +fi + +if [[ ! -d "${witness}/.git" ]]; then + git clone https://github.com/philsippl/circom-witness-rs.git "${witness}" +fi +git -C "${witness}" fetch --quiet origin codex/remove-cxx-bridge-and-grep +git -C "${witness}" checkout --quiet --detach e11206a9f453145dcd6b814523cbfba4f60cf5c6 +git -C "${witness}" reset --quiet --hard e11206a9f453145dcd6b814523cbfba4f60cf5c6 +witness_patch="${repo_root}/benchmarks/v1/circom/taceo-oprf/circom-witness-rs-android-shift.patch" +if rg -q 'amount\.as_limbs\(\)\[0\] as usize' "${witness}/src/graph.rs"; then + echo "witness branch Android shift compatibility patch already applied" +elif git -C "${witness}" apply --check "${witness_patch}" >/dev/null 2>&1; then + git -C "${witness}" apply "${witness_patch}" +else + echo "witness source is neither pristine nor already compatible" >&2 + exit 1 +fi +printf '%s\n' "${helpers}" diff --git a/benchmarks/v1/circom/taceo-oprf/run.ts b/benchmarks/v1/circom/taceo-oprf/run.ts new file mode 100644 index 000000000..6b88f2750 --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/run.ts @@ -0,0 +1,124 @@ +#!/usr/bin/env bun +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +const root = resolve(import.meta.dir, "../../../.."); +const target = (process.env.TACEO_TARGET ?? "host") as "host" | "motorola_e15"; +const mode = (process.env.TACEO_MODE ?? "warm") as "cold" | "warm"; +const circuit = (process.env.TACEO_CIRCUIT ?? "oprf_nullifier") as "oprf_query" | "oprf_nullifier"; +if (circuit !== "oprf_query" && circuit !== "oprf_nullifier") throw new Error("TACEO_CIRCUIT must be oprf_query or oprf_nullifier"); +const samples = Number(process.env.TACEO_SAMPLES ?? "5"); +const adb = process.env.ADB ?? resolve(process.env.ANDROID_HOME ?? `${process.env.HOME}/Library/Android/sdk`, "platform-tools/adb"); +const serial = process.env.ANDROID_SERIAL ?? "ZY32M6782K"; +const binary = target === "host" + ? resolve(import.meta.dir, "target/release/taceo-oprf-benchmark") + : "/data/local/tmp/taceo-v021/runner"; +const assetStem = circuit === "oprf_query" ? "OPRFQuery" : "OPRFNullifier"; +const inputStem = circuit === "oprf_query" ? "oprf_query" : "oprf_nullifier"; +const zkey = target === "host" + ? resolve(root, `benchmarks/v1/circom/taceo-mobile/assets/${assetStem}.arks.zkey`) + : `/data/local/tmp/taceo-v021/${inputStem === "oprf_query" ? "query" : "nullifier"}.zkey`; +const graph = target === "host" + ? resolve(root, `benchmarks/v1/circom/taceo-mobile/assets/${assetStem}Graph.bin`) + : `/data/local/tmp/taceo-v021/${inputStem === "oprf_query" ? "query" : "nullifier"}.graph`; +const input = target === "host" + ? resolve(root, `benchmarks/v1/circom/taceo-mobile/assets/${inputStem}.input.json`) + : `/data/local/tmp/taceo-v021/${inputStem === "oprf_query" ? "query.input.json" : "input.json"}`; +const artifactRoot = resolve(root, "target/v1-benchmarks/taceo-v021/evidence"); +const profileId = circuit === "oprf_nullifier" ? "oprf_o2" : "oprf_query"; +const seriesId = `${profileId}__${target === "host" ? "mac_native_diagnostic" : "motorola_e15"}__circom_groth16__${mode === "cold" ? "cold_local" : "warm_reuse"}`; + +async function command(args: string[]) { + const child = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), new Response(child.stderr).text(), child.exited, + ]); + if (exitCode !== 0) throw new Error(`${args.join(" ")} failed (${exitCode})\n${stderr}\n${stdout}`); + return stdout.trim(); +} + +async function runProcess() { + const args = [binary, zkey, graph, input, "warm", "0"]; + const report = target === "motorola_e15" + ? JSON.parse(await command([adb, "-s", serial, "shell", ...args])) + : JSON.parse(await command(args)); + return report.samples[0]; +} + +async function hash(path: string) { + const bytes = new Uint8Array(await Bun.file(path).arrayBuffer()); + return { size_bytes: bytes.byteLength, sha256: new Bun.CryptoHasher("sha256").update(bytes).digest("hex") }; +} + +async function main() { + if (!Number.isInteger(samples) || samples <= 0) throw new Error("TACEO_SAMPLES must be positive"); + if (mode !== "cold" && mode !== "warm") throw new Error("TACEO_MODE must be cold or warm"); + const raw = [] as Array>; + if (mode === "cold") { + for (let index = 0; index <= samples; index++) { + console.error(`[${seriesId}] cold process ${index + 1}/${samples + 1}`); + raw.push({ ...(await runProcess()), process_index: index }); + } + } else { + const args = [binary, zkey, graph, input, "warm", String(samples)]; + const report = target === "motorola_e15" + ? JSON.parse(await command([adb, "-s", serial, "shell", ...args])) + : JSON.parse(await command(args)); + raw.push(...report.samples); + } + const [zkeyMeta, graphMeta, inputMeta] = await Promise.all([ + hash(resolve(root, `benchmarks/v1/circom/taceo-mobile/assets/${assetStem}.arks.zkey`)), + hash(resolve(root, `benchmarks/v1/circom/taceo-mobile/assets/${assetStem}Graph.bin`)), + hash(resolve(root, `benchmarks/v1/circom/taceo-mobile/assets/${inputStem}.input.json`)), + ]); + const samplesOut = raw.map((sample, index) => ({ + sample_index: index, + warmup: index === 0, + status: "ok", + initialization_time_ms: Number(sample.load_time_ms ?? 0), + witness_time_ms: Number(sample.witness_time_ms), + prover_time_ms: Number(sample.prove_time_ms), + verify_time_ms: Number(sample.verify_time_ms), + input_to_proof_time_ms: Number(sample.input_to_proof_time_ms), + proof_size_bytes: Number(sample.proof_size_bytes), + peak_memory_mib: Number(sample.peak_memory_mib), + public_outputs_sha256: String(sample.public_outputs_sha256), + valid_proof_accepted: Boolean(sample.valid_proof_accepted), + tampered_proof_rejected: Boolean(sample.tampered_proof_rejected), + })); + if (samplesOut.some((sample) => !sample.valid_proof_accepted || !sample.tampered_proof_rejected)) { + throw new Error("correctness gate failed"); + } + const payload = zkeyMeta.size_bytes + graphMeta.size_bytes + inputMeta.size_bytes; + const evidence = { + schema_version: "taceo-native-circom-v2", + series_id: seriesId, + profile: "oprf_o2", + target: target === "host" ? "mac_native_diagnostic" : "motorola_e15", + timing_mode: mode === "cold" ? "cold_local" : "warm_reuse", + created_at_utc: new Date().toISOString(), + environment: target === "host" + ? { hardware: "macbook_m4", device_model: "MacBook Pro (Apple M4 Max)", os_version: await command(["sw_vers", "-productVersion"]), abi: await command(["uname", "-m"]), runtime: "native_diagnostic", browser: "", session_id: "" } + : { hardware: "motorola_e15", device_model: await command([adb, "-s", serial, "shell", "getprop", "ro.product.model"]), os_version: await command([adb, "-s", serial, "shell", "getprop", "ro.build.version.release"]), abi: await command([adb, "-s", serial, "shell", "getprop", "ro.product.cpu.abilist"]), runtime: "android_native", browser: "", session_id: serial }, + circuit: { name: circuit, variant: circuit === "oprf_query" ? "O2-world-id-query" : "O2-world-id-nullifier", commit: circuit === "oprf_query" ? "world-id-protocol-locked-artifacts" : "85aeeef539961cae5a63de794997b507a5975717", constraint_count: null }, + backend: { + frontend: "circom", + prover_backend: "taceo-groth16-0.2.1", + witness_backend: "circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep)", + source_commit: "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + package_versions: { circom_helpers: "8aacd73ed6ab0a2b9b2158e613acfa920860865a", taceo_groth16: "0.2.1", taceo_groth16_material: "0.4.2", circom_witness_rs: "e11206a9f453145dcd6b814523cbfba4f60cf5c6", circom_witness_rs_android_patch: "as_limbs()[0] as usize", circom: "2.2.2" }, + }, + artifacts: { proving_payload_size_bytes: payload, artifact_size_bytes: zkeyMeta.size_bytes + graphMeta.size_bytes, bundle_size_bytes: payload, hashes: { zkey: zkeyMeta.sha256, graph: graphMeta.sha256, input: inputMeta.sha256 } }, + public_outputs_sha256: samplesOut[0]?.public_outputs_sha256 ?? "", + status: "ok", + failure_code: "", + failure_detail: "", + samples: samplesOut, + }; + await mkdir(artifactRoot, { recursive: true }); + const output = resolve(artifactRoot, `${seriesId}.json`); + await Bun.write(output, `${JSON.stringify(evidence, null, 2)}\n`); + console.log(output); +} + +await main(); diff --git a/benchmarks/v1/circom/taceo-oprf/src/main.rs b/benchmarks/v1/circom/taceo-oprf/src/main.rs new file mode 100644 index 000000000..9c8ab70c8 --- /dev/null +++ b/benchmarks/v1/circom/taceo-oprf/src/main.rs @@ -0,0 +1,168 @@ +use ark_serialize::{CanonicalSerialize, Compress}; +use rand::{rngs::StdRng, SeedableRng}; +use ruint::aliases::U256; +use serde_json::Value; +use sha2::{Digest, Sha256}; +use std::{collections::HashMap, env, fs, io::Write, path::Path, time::Instant}; +use taceo_groth16_material::circom::{CircomGroth16Material, CircomGroth16MaterialBuilder, Validate}; + +#[derive(serde::Serialize)] +struct Sample { + sample_index: usize, + warmup: bool, + status: &'static str, + load_time_ms: f64, + witness_time_ms: f64, + prove_time_ms: f64, + proof_serialization_time_ms: f64, + verify_time_ms: f64, + input_to_proof_time_ms: f64, + proof_size_bytes: usize, + public_outputs_sha256: String, + valid_proof_accepted: bool, + tampered_proof_rejected: bool, + peak_memory_mib: f64, +} + +fn flatten(name: &str, value: Value, output: &mut Vec) -> Result<(), String> { + match value { + Value::Array(values) => { + values.into_iter().try_for_each(|value| flatten(name, value, output))?; + } + Value::String(text) => { + output.push(U256::from_str_radix(&text, 10).map_err(|e| format!("{name}: {e}"))?); + } + Value::Number(number) => { + output.push(U256::from_str_radix(&number.to_string(), 10).map_err(|e| format!("{name}: {e}"))?); + } + other => return Err(format!("{name}: unsupported input {other}")), + } + Ok(()) +} + +fn read_input(path: &Path) -> Result>, Box> { + let values: HashMap = serde_json::from_slice(&fs::read(path)?)?; + values.into_iter().map(|(name, value)| { + let mut flat = Vec::new(); + flatten(&name, value, &mut flat)?; + Ok((name, flat)) + }).collect::>().map_err(Into::into) +} + +fn rss_mib() -> f64 { + let mut usage = std::mem::MaybeUninit::::zeroed(); + // SAFETY: getrusage initializes the supplied rusage structure. + let result = unsafe { libc::getrusage(libc::RUSAGE_SELF, usage.as_mut_ptr()) }; + if result != 0 { return 0.0; } + #[cfg(target_os = "macos")] + let bytes = unsafe { usage.assume_init().ru_maxrss as f64 }; + #[cfg(not(target_os = "macos"))] + let bytes = unsafe { usage.assume_init().ru_maxrss as f64 } * 1024.0; + bytes / (1024.0 * 1024.0) +} + +fn millis(start: Instant) -> f64 { start.elapsed().as_secs_f64() * 1000.0 } + +fn sha256(value: &T) -> Result> { + let mut bytes = Vec::new(); + value.serialize_compressed(&mut bytes)?; + Ok(Sha256::digest(bytes).iter().map(|byte| format!("{byte:02x}")).collect()) +} + +fn one( + material: &CircomGroth16Material, + input: &HashMap>, + index: usize, + warmup: bool, + load_time_ms: f64, +) -> Result> { + let witness_at = Instant::now(); + let witness = material.generate_witness(input)?; + let witness_time_ms = millis(witness_at); + let prove_at = Instant::now(); + let mut rng = StdRng::seed_from_u64(0x5441_4345_4f + index as u64); + let (proof, public) = material.generate_proof_from_witness(&witness, &mut rng)?; + let prove_time_ms = millis(prove_at); + let verify_at = Instant::now(); + material.verify_proof(&proof, &public)?; + let verify_time_ms = millis(verify_at); + let serialize_at = Instant::now(); + let mut proof_bytes = Vec::new(); + proof.serialize_compressed(&mut proof_bytes)?; + let proof_serialization_time_ms = millis(serialize_at); + let public_outputs_sha256 = sha256(&public)?; + let mut tampered = proof.clone(); + tampered.a = Default::default(); + let tampered_proof_rejected = material.verify_proof(&tampered, &public).is_err(); + if !tampered_proof_rejected { return Err("tampered proof accepted".into()); } + Ok(Sample { + sample_index: index, + warmup, + status: "ok", + load_time_ms, + witness_time_ms, + prove_time_ms, + verify_time_ms, + input_to_proof_time_ms: load_time_ms + witness_time_ms + prove_time_ms + proof_serialization_time_ms, + proof_serialization_time_ms, + proof_size_bytes: proof_bytes.len(), + public_outputs_sha256, + valid_proof_accepted: true, + tampered_proof_rejected, + peak_memory_mib: rss_mib(), + }) +} + +fn load(zkey: &Path, graph: &Path) -> Result<(CircomGroth16Material, f64), Box> { + let start = Instant::now(); + let material = CircomGroth16MaterialBuilder::new() + .compress(Compress::No) + .validate(Validate::Yes) + .bbf_num_2_bits_helper() + .bbf_inv() + .bbf_legendre() + .bbf_sqrt_input() + .bbf_sqrt_unchecked() + .build_from_paths(zkey, graph)?; + Ok((material, millis(start))) +} + +fn main() -> Result<(), Box> { + let args: Vec = env::args().collect(); + if args.len() < 5 || args.len() > 6 { + eprintln!("usage: taceo-oprf-benchmark [samples]"); + std::process::exit(2); + } + let zkey = Path::new(&args[1]); + let graph = Path::new(&args[2]); + let input = read_input(Path::new(&args[3]))?; + let mode = &args[4]; + let samples = match args.get(5) { + Some(value) => value.parse::().map_err(|_| "samples must be an integer")?, + None => 5, + }; + let mut out = std::io::BufWriter::new(std::io::stdout()); + let mut samples_out = Vec::new(); + if mode == "cold" { + for index in 0..=samples { + let (material, load_time_ms) = load(zkey, graph)?; + samples_out.push(one(&material, &input, index, index == 0, load_time_ms)?); + } + } else if mode == "warm" { + let (material, load_time_ms) = load(zkey, graph)?; + for index in 0..=samples { + samples_out.push(one(&material, &input, index, index == 0, if index == 0 { load_time_ms } else { 0.0 })?); + } + } else { + return Err("mode must be cold or warm".into()); + } + serde_json::to_writer_pretty(&mut out, &serde_json::json!({ + "schema_version": 1, + "mode": mode, + "samples": samples_out, + "prover_backend": "taceo-groth16-0.2.1", + "witness_backend": "circom-witness-rs-codex-remove-cxx-bridge-and-grep-e11206a9", + }))?; + out.write_all(b"\n")?; + Ok(()) +} diff --git a/benchmarks/v1/circom/trusted-setup.lock.json b/benchmarks/v1/circom/trusted-setup.lock.json new file mode 100644 index 000000000..0383a5a35 --- /dev/null +++ b/benchmarks/v1/circom/trusted-setup.lock.json @@ -0,0 +1,23 @@ +{ + "schema_version": 1, + "artifacts": [ + { + "name": "powersOfTau28_hez_final_20", + "url": "https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_20.ptau", + "size": 1208042648, + "sha256": "159d3f938d941e06767d99f30b9fe59a245400a4aae138cf8e411732d7a2f6cd", + "blake2b512": "89a66eb5590a1c94e3f1ee0e72acf49b1669e050bb5f93c73b066b564dca4e0c7556a52b323178269d64af325d8fdddb33da3a27c34409b821de82aa2bf1a27b", + "max_constraints": 1048576, + "checksum_source": "iden3/snarkjs README at 9a8f1c0083d18b9b5e18f526cfd729e7259423be" + }, + { + "name": "powersOfTau28_hez_final_22", + "url": "https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_22.ptau", + "size": 4831921304, + "sha256": null, + "blake2b512": "0d64f63dba1a6f11139df765cb690da69d9b2f469a1ddd0de5e4aa628abb28f787f04c6a5fb84a235ec5ea7f41d0548746653ecab0559add658a83502d1cb21b", + "max_constraints": 4194304, + "checksum_source": "iden3/snarkjs README at 9a8f1c0083d18b9b5e18f526cfd729e7259423be" + } + ] +} diff --git a/benchmarks/v1/circom/web/.gitignore b/benchmarks/v1/circom/web/.gitignore new file mode 100644 index 000000000..29eb4e73c --- /dev/null +++ b/benchmarks/v1/circom/web/.gitignore @@ -0,0 +1,4 @@ +# Generated proving keys are verified and fetched/prepared locally; GitHub Git +# rejects the Passport and WebAuthn keys because they exceed its 100 MB limit. +dist/assets/passport/register_sha256_sha256_sha256_rsa_65537_4096.zkey +dist/assets/webauthn/webauthn_default.zkey diff --git a/benchmarks/v1/circom/web/build.sh b/benchmarks/v1/circom/web/build.sh new file mode 100644 index 000000000..ef5324d4a --- /dev/null +++ b/benchmarks/v1/circom/web/build.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +set -euo pipefail + +web_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${web_root}/../.." && pwd)" +dist="${CIRCOM_BROWSER_DIST:-${web_root}/dist}" +fixture_root="${CIRCOM_BROWSER_FIXTURE_ROOT:-${benchmark_root}/../../target/v1-benchmarks/circom-browser}" +profile="${CIRCOM_BROWSER_PROFILE:-historical}" + +cd "${web_root}" +bun install --frozen-lockfile + +manifest="${fixture_root}/manifest.json" +if [[ ! -f "${manifest}" ]]; then + echo "error: missing frozen Circom browser fixture manifest ${manifest}" >&2 + echo "prepare circuit.wasm, final.zkey, verification key, and input files first" >&2 + exit 1 +fi + +rm -rf "${dist}" +mkdir -p "${dist}/assets" +bun build runner.ts --outdir "${dist}" --target browser --format esm --minify +cp "${web_root}/index.html" "${dist}/index.html" +cp -R "${fixture_root}/." "${dist}/assets/" + +case "${profile}" in + historical) + jq -e ' + .schema_version == 1 + and ([.fixtures.passport[], .fixtures.webauthn[], .fixtures.oprf[]] | length >= 3) + and all(.fixtures[][]; .semantic_equivalence == "closest-analogue-not-equivalent") + ' "${dist}/assets/manifest.json" >/dev/null + ;; + p1) + jq -e ' + .schema_version == 1 + and (.fixtures.passport | length == 1) + and (.fixtures.passport[0].profile == "P1") + and (.fixtures.passport[0].semantic_equivalence == "p1-matched-monolithic") + and (.fixtures.passport[0].ceremony.production_safe == false) + ' "${dist}/assets/manifest.json" >/dev/null + ;; + *) + echo "error: unknown CIRCOM_BROWSER_PROFILE ${profile}" >&2 + exit 1 + ;; +esac + +echo "Built SnarkJS browser benchmark at ${dist}" diff --git a/benchmarks/v1/circom/web/bun.lock b/benchmarks/v1/circom/web/bun.lock new file mode 100644 index 000000000..21a46c5da --- /dev/null +++ b/benchmarks/v1/circom/web/bun.lock @@ -0,0 +1,88 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "provekit-v1-circom-browser-benchmarks", + "dependencies": { + "snarkjs": "0.7.6", + }, + "devDependencies": { + "playwright-core": "1.59.1", + }, + }, + }, + "packages": { + "@iden3/bigarray": ["@iden3/bigarray@0.0.2", "", {}, "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g=="], + + "@iden3/binfileutils": ["@iden3/binfileutils@0.0.12", "", { "dependencies": { "fastfile": "0.0.20", "ffjavascript": "^0.3.0" } }, "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bfj": ["bfj@7.1.0", "", { "dependencies": { "bluebird": "^3.7.2", "check-types": "^11.2.3", "hoopy": "^0.1.4", "jsonpath": "^1.1.1", "tryer": "^1.0.1" } }, "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "brace-expansion": ["brace-expansion@2.1.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A=="], + + "check-types": ["check-types@11.2.3", "", {}, "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg=="], + + "circom_runtime": ["circom_runtime@0.1.28", "", { "dependencies": { "ffjavascript": "0.3.1" }, "bin": { "calcwit": "calcwit.js" } }, "sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ=="], + + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "esprima": ["esprima@1.2.5", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "fastfile": ["fastfile@0.0.20", "", {}, "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA=="], + + "ffjavascript": ["ffjavascript@0.3.1", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", "web-worker": "1.2.0" } }, "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw=="], + + "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="], + + "hoopy": ["hoopy@0.1.4", "", {}, "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ=="], + + "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], + + "jsonpath": ["jsonpath@1.3.0", "", { "dependencies": { "esprima": "1.2.5", "static-eval": "2.1.1", "underscore": "1.13.6" } }, "sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w=="], + + "logplease": ["logplease@1.2.15", "", {}, "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA=="], + + "minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "playwright-core": ["playwright-core@1.59.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg=="], + + "r1csfile": ["r1csfile@0.0.48", "", { "dependencies": { "@iden3/bigarray": "0.0.2", "@iden3/binfileutils": "0.0.12", "fastfile": "0.0.20", "ffjavascript": "0.3.0" } }, "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw=="], + + "snarkjs": ["snarkjs@0.7.6", "", { "dependencies": { "@iden3/binfileutils": "0.0.12", "@noble/hashes": "^1.7.1", "bfj": "^7.0.2", "circom_runtime": "0.1.28", "ejs": "^3.1.6", "fastfile": "0.0.20", "ffjavascript": "0.3.1", "logplease": "^1.2.15", "r1csfile": "0.0.48" }, "bin": { "snarkjs": "build/cli.cjs" } }, "sha512-4uH1xA5JzVU5jaaWS2fXej3+RC6L5Erhr6INTJtUA27du4Elbh4VXCeeRjB4QiwL6N6y7SNKePw5prTxyEf4Zg=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "static-eval": ["static-eval@2.1.1", "", { "dependencies": { "escodegen": "^2.1.0" } }, "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA=="], + + "tryer": ["tryer@1.0.1", "", {}, "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="], + + "underscore": ["underscore@1.13.6", "", {}, "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="], + + "wasmbuilder": ["wasmbuilder@0.0.16", "", {}, "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="], + + "wasmcurves": ["wasmcurves@0.2.2", "", { "dependencies": { "wasmbuilder": "0.0.16" } }, "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ=="], + + "web-worker": ["web-worker@1.2.0", "", {}, "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="], + + "escodegen/esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "r1csfile/ffjavascript": ["ffjavascript@0.3.0", "", { "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", "web-worker": "1.2.0" } }, "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ=="], + } +} diff --git a/benchmarks/v1/circom/web/index.html b/benchmarks/v1/circom/web/index.html new file mode 100644 index 000000000..90dd3ec28 --- /dev/null +++ b/benchmarks/v1/circom/web/index.html @@ -0,0 +1,12 @@ + + + + + + Circom Groth16 browser benchmark + + +

Ready.

+ + + diff --git a/benchmarks/v1/circom/web/package.json b/benchmarks/v1/circom/web/package.json new file mode 100644 index 000000000..0485d25c6 --- /dev/null +++ b/benchmarks/v1/circom/web/package.json @@ -0,0 +1,15 @@ +{ + "name": "provekit-v1-circom-browser-benchmarks", + "private": true, + "type": "module", + "scripts": { + "build": "bash build.sh", + "smoke": "bun run smoke.ts" + }, + "dependencies": { + "snarkjs": "0.7.6" + }, + "devDependencies": { + "playwright-core": "1.59.1" + } +} diff --git a/benchmarks/v1/circom/web/runner.ts b/benchmarks/v1/circom/web/runner.ts new file mode 100644 index 000000000..b7d8f5c8d --- /dev/null +++ b/benchmarks/v1/circom/web/runner.ts @@ -0,0 +1,279 @@ +import { groth16, wtns } from "snarkjs"; + +type Workload = "passport" | "webauthn" | "oprf"; +type SemanticEquivalence = + | "closest-analogue-not-equivalent" + | "p1-matched-monolithic"; +interface BenchSpec { + workload: Workload; + warmup: number; + iterations: number; + single_thread?: boolean; + /** snarkjs chooses its worker pool from hardwareConcurrency; this is metadata only. */ + prover_threads?: number; + timing_mode?: "cold_local" | "warm_reuse"; +} +interface Fixture { + circuit: string; + variant: string; + wasm: string; + zkey: string; + verification_key: string; + input: string; + circuit_commit: string; + semantic_equivalence: SemanticEquivalence; + profile?: "P1"; + ceremony?: { + production_safe: boolean; + final_zkey_sha256: string; + }; + artifact_hashes?: Record; +} +interface ProgressEvent { + at_ms: number; + circuit?: string; + variant?: string; + sample_index?: number; + warmup?: boolean; + stage: string; + detail?: string; +} +interface Manifest { + schema_version: 1; + fixtures: Record; +} + +declare global { + interface Window { + mobenchCircom: { + progress: ProgressEvent[]; + run(spec: BenchSpec): Promise; + }; + } +} + +const status = document.querySelector("#status"); +const durationNs = (started: number) => Math.round((performance.now() - started) * 1_000_000); +const progress: ProgressEvent[] = []; + +function emit(event: Omit): void { + const entry = { at_ms: performance.now(), ...event }; + progress.push(entry); + if (status) status.textContent = `${entry.stage}${entry.detail ? `: ${entry.detail}` : ""}`; + console.info(`MOBENCH_PROGRESS ${JSON.stringify(entry)}`); +} + +async function json(path: string): Promise { + const response = await fetch(path, { cache: "no-store" }); + if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`); + return (await response.json()) as T; +} + +async function contentLength(path: string): Promise { + const response = await fetch(path, { method: "HEAD", cache: "no-store" }); + if (!response.ok) throw new Error(`failed to inspect ${path}: HTTP ${response.status}`); + const value = Number.parseInt(response.headers.get("content-length") ?? "", 10); + if (!Number.isSafeInteger(value) || value < 0) { + throw new Error(`missing valid Content-Length for ${path}`); + } + return value; +} + +function bounded(value: number, min: number, max: number, label: string): number { + if (!Number.isInteger(value) || value < min || value > max) { + throw new Error(`${label} must be an integer from ${min} to ${max}`); + } + return value; +} + +function tamper(proof: Record): Record { + const copy = structuredClone(proof); + const piA = copy.pi_a; + if (!Array.isArray(piA) || typeof piA[0] !== "string") { + throw new Error("unexpected Groth16 proof representation"); + } + piA[0] = (BigInt(piA[0]) + 1n).toString(); + return copy; +} + +async function runFixture( + fixture: Fixture, + warmup: number, + iterations: number, + singleThread: boolean, + timingMode: "cold_local" | "warm_reuse", + proverThreadsRequested: number, +) { + const coldStarted = performance.now(); + emit({ circuit: fixture.circuit, variant: fixture.variant, stage: "fixture-load-start" }); + const [input, verificationKey] = await Promise.all([ + json>(`./assets/${fixture.input}`), + json>(`./assets/${fixture.verification_key}`), + ]); + const [wasmSizeBytes, zkeySizeBytes, inputSizeBytes] = await Promise.all([ + contentLength(`./assets/${fixture.wasm}`), + contentLength(`./assets/${fixture.zkey}`), + contentLength(`./assets/${fixture.input}`), + ]); + emit({ + circuit: fixture.circuit, + variant: fixture.variant, + stage: "fixture-load-complete", + detail: `payload=${wasmSizeBytes + zkeySizeBytes + inputSizeBytes}`, + }); + const samples = []; + for (let index = 0; index < warmup + iterations; index += 1) { + const sample = { + circuit: fixture.circuit, + variant: fixture.variant, + sample_index: index < warmup ? index : index - warmup, + warmup: index < warmup, + }; + const started = timingMode === "cold_local" && index === 0 + ? coldStarted + : performance.now(); + const witness = { type: "mem" }; + const witnessStarted = performance.now(); + emit({ ...sample, stage: "witness-start" }); + await wtns.calculate(input, `./assets/${fixture.wasm}`, witness); + const witnessNs = durationNs(witnessStarted); + emit({ ...sample, stage: "witness-complete", detail: `${witnessNs}ns` }); + const proveStarted = performance.now(); + emit({ ...sample, stage: "prove-start" }); + const proveProgress = (detail: string) => { + if ( + /^(Reading|Building|Join ABC|QAP |JoinABC:|Multiexp (start|end):)/.test(detail) || + /join\s+\d+\/\d+\s+\d+\/\d+\s+127\/128$/.test(detail) + ) { + emit({ ...sample, stage: "prove-progress", detail }); + } + }; + const logger = { + debug: proveProgress, + info: proveProgress, + warn: (detail: string) => emit({ ...sample, stage: "prove-warning", detail }), + error: (detail: string) => emit({ ...sample, stage: "prove-error", detail }), + }; + const result = await groth16.prove( + `./assets/${fixture.zkey}`, + witness, + logger, + { singleThread }, + ); + const proveNs = durationNs(proveStarted); + const inputToProofNs = durationNs(started); + emit({ ...sample, stage: "prove-complete", detail: `${proveNs}ns` }); + const verifyStarted = performance.now(); + emit({ ...sample, stage: "verify-start" }); + if (!(await groth16.verify(verificationKey, result.publicSignals, result.proof))) { + throw new Error(`SnarkJS rejected ${fixture.circuit}/${fixture.variant}`); + } + const verifyNs = durationNs(verifyStarted); + let tamperedRejected = false; + try { + tamperedRejected = !(await groth16.verify( + verificationKey, + result.publicSignals, + tamper(result.proof as Record), + )); + } catch { + tamperedRejected = true; + } + if (!tamperedRejected) throw new Error(`SnarkJS accepted a tampered ${fixture.circuit} proof`); + emit({ ...sample, stage: "verify-complete", detail: `${verifyNs}ns` }); + samples.push({ + sample_index: index < warmup ? index : index - warmup, + warmup: index < warmup, + status: "ok", + initialization_time_ns: timingMode === "cold_local" + ? inputToProofNs - witnessNs - proveNs + : 0, + witness_time_ns: witnessNs, + prove_time_ns: proveNs, + verify_time_ns: verifyNs, + end_to_end_time_ns: durationNs(started), + input_to_proof_time_ns: inputToProofNs, + proof_size_bytes: new TextEncoder().encode(JSON.stringify(result.proof)).byteLength, + tampered_proof_rejected: tamperedRejected, + }); + } + return { + ...fixture, + artifacts: { + wasm_size_bytes: wasmSizeBytes, + zkey_size_bytes: zkeySizeBytes, + input_size_bytes: inputSizeBytes, + proving_payload_size_bytes: wasmSizeBytes + zkeySizeBytes + inputSizeBytes, + }, + execution: { + witness_backend: "circom_runtime_wasm_single", + witness_threads: 1, + prover_backend: singleThread + ? "snarkjs_0.7.6_browser_wasm_single_thread" + : "snarkjs_0.7.6_browser_wasm_workers", + prover_threads_requested: proverThreadsRequested, + prover_threads_effective: singleThread + ? 1 + : Math.min(proverThreadsRequested, navigator.hardwareConcurrency || 1, 64), + worker_available: typeof Worker !== "undefined", + hardware_concurrency: navigator.hardwareConcurrency || 1, + cross_origin_isolated: self.crossOriginIsolated, + }, + samples, + }; +} + +async function run(spec: BenchSpec): Promise { + const warmup = bounded(spec.warmup, 0, 10, "warmup"); + const iterations = bounded(spec.iterations, 1, 20, "iterations"); + const hardwareConcurrency = navigator.hardwareConcurrency || 1; + const proverThreadsRequested = bounded( + spec.prover_threads ?? (spec.single_thread === true ? 1 : hardwareConcurrency), + 1, + 64, + "prover_threads", + ); + const manifest = await json("./assets/manifest.json"); + const fixtures = manifest.fixtures[spec.workload]; + if (!fixtures?.length) throw new Error(`no Circom browser fixture for ${spec.workload}`); + const results = []; + for (const fixture of fixtures) { + if (status) status.textContent = `Running ${fixture.circuit}/${fixture.variant}`; + results.push(await runFixture( + fixture, + warmup, + iterations, + spec.single_thread === true, + spec.timing_mode ?? "warm_reuse", + proverThreadsRequested, + )); + } + const report = { + schema_version: 1, + stack: "circom_groth16", + backend: spec.single_thread === true + ? "snarkjs_0.7.6_browser_wasm_single_thread" + : "snarkjs_0.7.6_browser_wasm_workers", + runtime: "browser-wasm", + workload: spec.workload, + single_thread: spec.single_thread === true, + witness_timing: "separate wtns.calculate memory-file phase", + witness_backend: "circom_runtime_wasm_single", + witness_threads: 1, + prover_threads_requested: proverThreadsRequested, + prover_threads_effective: spec.single_thread === true + ? 1 + : Math.min(proverThreadsRequested, hardwareConcurrency, 64), + worker_available: typeof Worker !== "undefined", + hardware_concurrency: hardwareConcurrency, + shared_array_buffer: typeof SharedArrayBuffer !== "undefined", + cross_origin_isolated: self.crossOriginIsolated, + timing_mode: spec.timing_mode ?? "warm_reuse", + progress, + results, + }; + if (status) status.textContent = "Complete."; + return report; +} + +window.mobenchCircom = { progress, run }; diff --git a/benchmarks/v1/circom/web/smoke.ts b/benchmarks/v1/circom/web/smoke.ts new file mode 100644 index 000000000..b2428014c --- /dev/null +++ b/benchmarks/v1/circom/web/smoke.ts @@ -0,0 +1,254 @@ +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { chromium } from "playwright-core"; + +const root = resolve(process.env.CIRCOM_WEB_DIST ?? resolve(import.meta.dir, "dist")); +const workload = process.env.MOBENCH_WORKLOAD ?? "webauthn"; +const warmup = Number.parseInt(process.env.MOBENCH_WARMUP ?? "1", 10); +const iterations = Number.parseInt(process.env.MOBENCH_ITERATIONS ?? "5", 10); +const timingMode = process.env.MOBENCH_TIMING_MODE === "cold_local" ? "cold_local" : "warm_reuse"; +const singleThread = process.env.MOBENCH_SNARKJS_SINGLE_THREAD === "1"; +const requestedProverThreads = Number.parseInt( + process.env.MOBENCH_SNARKJS_THREADS ?? (singleThread ? "1" : "0"), + 10, +); +if (!Number.isInteger(requestedProverThreads) || requestedProverThreads < 0 || requestedProverThreads > 64) { + throw new Error("MOBENCH_SNARKJS_THREADS must be 0 (auto) or an integer from 1 to 64"); +} +const timeoutMs = Number.parseInt(process.env.MOBENCH_TIMEOUT_MS ?? "900000", 10); +const chrome = + process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; +const server = Bun.serve({ + port: 0, + async fetch(request) { + const url = new URL(request.url); + const file = Bun.file(resolve(root, `.${url.pathname === "/" ? "/index.html" : url.pathname}`)); + if (!(await file.exists())) return new Response("not found", { status: 404 }); + return new Response(file, { + headers: { + "Cache-Control": "no-store", + // Keep the browser surface consistent with the other threaded WASM + // lanes. snarkjs Blob workers do not require SAB, but this makes the + // execution policy observable and catches an accidentally non-isolated + // deployment before it is used for comparison. + "Cross-Origin-Embedder-Policy": "require-corp", + "Cross-Origin-Opener-Policy": "same-origin", + }, + }); + }, +}); + +interface ProcessRow { + pid: number; + ppid: number; + rss_kib: number; + command: string; +} + +interface MemorySample { + at_ms: number; + renderer_pid: number; + renderer_rss_kib: number; +} + +async function processRows(): Promise { + const child = Bun.spawn(["ps", "-axo", "pid=,ppid=,rss=,command="], { + stdout: "pipe", + stderr: "pipe", + }); + const [stdout, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + child.exited, + ]); + if (exitCode !== 0) return []; + return stdout + .split("\n") + .flatMap((line) => { + const match = line.match(/^\s*(\d+)\s+(\d+)\s+(\d+)\s+(.+)$/); + if (!match) return []; + return [{ + pid: Number.parseInt(match[1], 10), + ppid: Number.parseInt(match[2], 10), + rss_kib: Number.parseInt(match[3], 10), + command: match[4], + }]; + }); +} + +async function rendererSnapshot(profile: string): Promise { + const rows = await processRows(); + const root = rows.find( + (row) => + row.command.includes(profile) && + row.command.includes("Google Chrome") && + !row.command.includes("--type="), + ); + if (!root) return null; + const descendants = new Set([root.pid]); + let changed = true; + while (changed) { + changed = false; + for (const row of rows) { + if (descendants.has(row.ppid) && !descendants.has(row.pid)) { + descendants.add(row.pid); + changed = true; + } + } + } + const renderer = rows + .filter((row) => descendants.has(row.pid) && row.command.includes("--type=renderer")) + .sort((left, right) => right.rss_kib - left.rss_kib)[0]; + return renderer + ? { + at_ms: Date.now(), + renderer_pid: renderer.pid, + renderer_rss_kib: renderer.rss_kib, + } + : null; +} + +const profile = await mkdtemp(join(tmpdir(), "provekit-circom-chrome-")); +try { + const context = await chromium.launchPersistentContext(profile, { + executablePath: chrome, + headless: true, + args: ["--js-flags=--max-old-space-size=32768"], + }); + try { + const page = context.pages()[0] ?? (await context.newPage()); + if (!singleThread && requestedProverThreads > 0) { + // SnarkJS 0.7.6 sizes its worker pool from navigator.hardwareConcurrency + // and exposes no public worker-count option. Pin the browser lane to the + // requested count so a large zkey cannot spawn one full copy per host + // core and exhaust the renderer. This remains a genuine multithreaded + // run; the effective value is recorded in the report. + await page.addInitScript((threads) => { + Object.defineProperty(navigator, "hardwareConcurrency", { + configurable: true, + value: threads, + }); + }, requestedProverThreads); + } + page.on("console", (message) => { + if (message.text().startsWith("MOBENCH_PROGRESS ")) { + console.error(message.text()); + } + }); + await page.goto(`http://127.0.0.1:${server.port}/`); + let sampling = true; + const memorySamples: MemorySample[] = []; + const sampler = (async () => { + while (sampling) { + const sample = await rendererSnapshot(profile); + if (sample) memorySamples.push(sample); + await Bun.sleep(100); + } + })(); + const benchmark = page.evaluate( + async ({ iterations, singleThread, warmup, workload, timingMode, proverThreads }) => + window.mobenchCircom.run({ + workload: workload as never, + warmup, + iterations, + single_thread: singleThread, + prover_threads: proverThreads > 0 ? proverThreads : undefined, + timing_mode: timingMode, + }), + { + workload, + warmup, + iterations, + singleThread, + timingMode, + proverThreads: requestedProverThreads, + }, + ); + let timeoutHandle: ReturnType | undefined; + const timeout = new Promise((_, reject) => { + timeoutHandle = setTimeout( + () => reject(new Error(`benchmark exceeded ${timeoutMs} ms`)), + timeoutMs, + ); + }); + try { + const result = await Promise.race([benchmark, timeout]); + sampling = false; + await sampler; + const peak = memorySamples.sort( + (left, right) => right.renderer_rss_kib - left.renderer_rss_kib, + )[0]; + const observedHardwareConcurrency = await page + .evaluate(() => navigator.hardwareConcurrency || 1) + .catch(() => null); + console.log(JSON.stringify({ + ...(result as Record), + process_memory: { + metric: "peak_chrome_renderer_rss", + peak_rss_kib: peak?.renderer_rss_kib ?? null, + peak_renderer_pid: peak?.renderer_pid ?? null, + polling_interval_ms: 100, + sample_count: memorySamples.length, + chrome_profile: profile, + }, + })); + } catch (error) { + sampling = false; + await sampler; + const progress = await page.evaluate(() => window.mobenchCircom.progress).catch(() => []); + const peak = memorySamples.sort( + (left, right) => right.renderer_rss_kib - left.renderer_rss_kib, + )[0]; + const observedHardwareConcurrency = await page + .evaluate(() => navigator.hardwareConcurrency || 1) + .catch(() => null); + console.log(JSON.stringify({ + schema_version: 1, + stack: "circom_groth16", + backend: "snarkjs_0.7.6_browser_wasm", + runtime: "browser-wasm", + workload, + status: error instanceof Error && error.message.includes("exceeded") + ? "timed_out" + : "runtime_failed", + failure_class: error instanceof Error && error.message.includes("exceeded") + ? "attempt_timeout" + : "browser_runtime", + failure_message: error instanceof Error ? error.message : String(error), + warmup_attempts_requested: warmup, + measured_attempts_requested: iterations, + single_thread: singleThread, + witness_backend: "circom_runtime_wasm_single", + witness_threads: 1, + prover_threads_requested: requestedProverThreads > 0 + ? requestedProverThreads + : null, + prover_threads_effective: singleThread + ? 1 + : requestedProverThreads > 0 + ? Math.min(requestedProverThreads, observedHardwareConcurrency ?? 1, 64) + : null, + worker_available: true, + hardware_concurrency: observedHardwareConcurrency, + cross_origin_isolated: await page.evaluate(() => self.crossOriginIsolated).catch(() => null), + progress, + process_memory: { + metric: "peak_chrome_renderer_rss", + peak_rss_kib: peak?.renderer_rss_kib ?? null, + peak_renderer_pid: peak?.renderer_pid ?? null, + polling_interval_ms: 100, + sample_count: memorySamples.length, + chrome_profile: profile, + }, + samples: [], + })); + } finally { + if (timeoutHandle !== undefined) clearTimeout(timeoutHandle); + } + } finally { + await context.close(); + } +} finally { + server.stop(true); + await rm(profile, { recursive: true, force: true }); +} diff --git a/benchmarks/v1/input-to-proof-data/README.md b/benchmarks/v1/input-to-proof-data/README.md new file mode 100644 index 000000000..8260af0a6 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/README.md @@ -0,0 +1,54 @@ +# Canonical input-to-proof data + +[`input-to-proof-samples.csv`](input-to-proof-samples.csv) is the only +publication dataset in this branch. It has 41 stable columns and one row per +warmup or measured attempt. The current freeze is 417 rows across 72 logical +series: 345 measured, 69 warmups, and three explicit gap rows. + +The headline field is `input_to_proof_time_ms`. It covers raw structured input, +fresh witness generation, and serialized proof generation. The companion +`witness_time_ms` and `prover_time_ms` fields are phase diagnostics where the +backend exposes them. ProveKit's native witness construction is integrated +with proving, so its witness phase is intentionally blank. + +The four publication metrics are: + +- `input_to_proof_time_ms` / `total_time_ms`; +- `proof_size_bytes` for the exact serialized proof; +- `circuit_size_bytes` for the deduplicated proving payload needed to create a + proof (never APK/IPA upload size); +- `peak_memory_mib` for measured process RSS. + +Gap rows have blank metrics and an explicit `status`, `failure_code`, and +`failure_detail`. They are not zeros, estimates, or values copied from another +target. + +## Regeneration + +The exporter consumes retained raw reports under `target/v1-benchmarks/` and +requires valid-proof acceptance plus tampered-proof rejection before timing is +accepted: + +```bash +bun benchmarks/v1/input-to-proof-data/export.ts +bun benchmarks/v1/input-to-proof-data/replace-taceo-oprf.ts +bun test benchmarks/v1/input-to-proof-data/export.test.ts +``` + +The second command is an intentional post-export replacement step for the six +native Circom OPRF series (`oprf_nullifier` × three targets × cold/warm). It +loads only the retained, proof-gated TACEO evidence and replaces those rows +with `circom-helpers` main `8aacd73ed6ab0a2b9b2158e613acfa920860865a` plus +`circom-witness-rs` `e11206a9f453145dcd6b814523cbfba4f60cf5c6` from +`codex/remove-cxx-bridge-and-grep`. The zkey, regenerated witness graph, and +frozen input JSON are hashed separately; the payload is their sum and never +includes an APK, IPA, or XCUITest upload. + +`merge-mac-fixed16.ts` is the idempotent provenance helper used to replace the +Mac portion with the fixed-16 campaign while retaining the mobile rows. Its +intermediate fixed-16 source CSV is preserved under `../legacy/wasm/`; it is +not a second publication dataset. + +The native E15 normalizers and gap generator are in [`native/`](native/). The old +proof-only, semantic-parity, TACEO, and automatic-thread exporters are under +`../legacy/` and must not be used to update this file. diff --git a/benchmarks/v1/input-to-proof-data/e15-webauthn-cold-gap.json b/benchmarks/v1/input-to-proof-data/e15-webauthn-cold-gap.json new file mode 100644 index 000000000..693ffee41 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/e15-webauthn-cold-gap.json @@ -0,0 +1,56 @@ +{ + "schema_version": 1, + "campaign_id": "input-to-proof-v1-20260807", + "logical_series_id": "webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local", + "target": "motorola_e15", + "device": { + "model": "moto e15", + "os": "Android 14", + "abi": "armeabi-v7a", + "zygote": "zygote32", + "userspace_bitness": 32 + }, + "runtime": "android_native", + "workload": "webauthn_closest_analogue", + "circuit": "webauthn", + "circuit_variant": "closest-analogue", + "circuit_commit": "0fb5b4aa1398281c2fd3dbe14db147e05b61f201", + "stack": "circom_groth16", + "frontend": "circom", + "prover_backend": "rust-rapidsnark-0.1.4", + "witness_backend": "rust-witness-0.1.6 (split helper canary)", + "timing_mode": "cold_local", + "sample_kind": "gap", + "sample_index": null, + "status": "runtime_failed", + "failure_code": "out_of_memory", + "failure_detail": "Rapidsnark failed in the native E15 worker with `mmap failed: Out of memory`. The pinned WebAuthn zkey is 1,733,145,772 bytes and the frozen WTNS is 109,218,412 bytes; the 32-bit E15 could not create the proving mappings. Repeated helper-split and unmap canaries did not produce a stable valid run.", + "metrics": { + "initialization_time_ms": null, + "witness_time_ms": null, + "prover_time_ms": null, + "verify_time_ms": null, + "total_time_ms": null, + "input_to_proof_time_ms": null, + "peak_memory_mib": null, + "proof_size_bytes": null, + "circuit_size_bytes": null, + "artifact_size_bytes": null, + "bundle_size_bytes": null, + "constraint_count": null + }, + "artifact_context": { + "zkey_size_bytes": 1733145772, + "wtns_size_bytes": 109218412, + "apk_sha256": "dd9271754813dea6248384c25c603185b68b10fc3f1535a862440febf47bdc57", + "apk_size_bytes": 1198528277, + "apk_is_proving_payload": false + }, + "evidence": { + "report_path": "target/v1-benchmarks/input-to-proof/e15/attempts/circom-webauthn-helper-unmap-canary-20260811/results.json", + "report_sha256": "41d6c31a71f5d19c512b9d240517ff372dd75ed6c026fa4c1be3ef5ce3e516ee", + "logcat_path": "target/v1-benchmarks/input-to-proof/e15/attempts/circom-webauthn-helper-unmap-canary-20260811/circom_webauthn_input_to_proof.logcat.txt", + "logcat_sha256": "cfccf2a1be99f36e3968e157868513a43fc6b08f9e9e475a2574b87019499255" + }, + "note": "This is an explicit E15 input-to-proof gap. It is not a zero measurement, and no iPhone, Mac, or browser value is substituted." +} diff --git a/benchmarks/v1/input-to-proof-data/export.test.ts b/benchmarks/v1/input-to-proof-data/export.test.ts new file mode 100644 index 000000000..a33fcca64 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/export.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, test } from "bun:test"; +import { normalizeIosReports, validateRows } from "./export"; +import { CSV_COLUMNS, expectedSeries } from "./schema"; + +describe("input-to-proof schema", () => { + test("preserves the old schema and appends cold/warm headline fields", () => { + expect(CSV_COLUMNS.slice(-2)).toEqual(["timing_mode", "input_to_proof_time_ms"]); + expect(new Set(CSV_COLUMNS).size).toBe(CSV_COLUMNS.length); + }); + + test("defines 72 full-campaign, 48 Mac+iPhone, and 24 Mac series", () => { + expect(expectedSeries()).toHaveLength(72); + expect(expectedSeries(["mac_chrome", "iphone_se_2022"])).toHaveLength(48); + expect(expectedSeries(["mac_chrome"])).toHaveLength(24); + }); + + test("expands cold iPhone report arrays without changing warm reports", () => { + const warm = { function: "warm" }; + const cold = Array.from({ length: 6 }, (_, invocation) => ({ invocation })); + expect(normalizeIosReports(warm)).toEqual([warm]); + expect(normalizeIosReports(cold)).toEqual(cold); + expect(() => normalizeIosReports([cold[0], null])).toThrow("JSON object"); + }); + + test("accepts one explicit failed gap with blank metrics as a complete logical series", () => { + const id = "webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local"; + const row = { + hardware: "motorola_e15", + circuit: "webauthn", + prover: "circom_groth16", + timing_mode: "cold_local", + sample_kind: "gap", + sample_index: null, + status: "runtime_failed", + failure_code: "out_of_memory", + failure_detail: "mmap failed: Out of memory", + prover_time_ms: null, + total_time_ms: null, + input_to_proof_time_ms: null, + proof_size_bytes: null, + circuit_size_bytes: null, + peak_memory_mib: null, + } as any; + expect(() => validateRows([row], [id])).not.toThrow(); + expect(() => validateRows([{ ...row, proof_size_bytes: 0 }], [id])).toThrow("must be blank"); + expect(() => validateRows([{ ...row, failure_code: "timed_out" }], [id])).toThrow("invalid gap status"); + expect(() => validateRows([{ ...row, circuit: "oprf_nullifier" }], [ + "oprf_o2__motorola_e15__circom_groth16__cold_local", + ])).toThrow("invalid gap status"); + }); +}); diff --git a/benchmarks/v1/input-to-proof-data/export.ts b/benchmarks/v1/input-to-proof-data/export.ts new file mode 100644 index 000000000..8a4b39617 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/export.ts @@ -0,0 +1,839 @@ +import { createHash } from "node:crypto"; +import { basename, dirname, resolve } from "node:path"; +import { + CAMPAIGN_ID, CSV_COLUMNS, PROFILES, STACKS, TIMING_MODES, expectedSeries, seriesId, + type Profile, type Stack, type Target, type TimingMode, +} from "./schema"; + +type CsvRow = Record<(typeof CSV_COLUMNS)[number], string | number | null | boolean>; +type RawSeries = { + campaign_id: string; + series_id: string; + semantic_profile: Profile; + target: Target; + stack: Stack; + timing_mode: TimingMode; + created_at: string; + environment: { device_model: string; os_version: string; abi: string; browser: string }; + status?: string; + failure_code?: string; + failure_message?: string; + execution?: Record; + process_memory?: { peak_rss_kib?: number | null }; + attempts: Array<{ attempt_index: number; warmup: boolean | null; report: any }>; +}; + +const repoRoot = resolve(import.meta.dir, "../../.."); +const executionPolicy = process.env.INPUT_TO_PROOF_EXECUTION_POLICY === "singlethread" + ? "singlethread" + : "multithread"; +const rawRoot = resolve( + process.env.INPUT_TO_PROOF_RAW_ROOT ?? + resolve(repoRoot, executionPolicy === "multithread" + ? "target/v1-benchmarks/input-to-proof/mac-chrome-multithread" + : "target/v1-benchmarks/input-to-proof/mac-chrome"), +); +const output = resolve(import.meta.dir, "input-to-proof-samples.csv"); +const outputPath = resolve(process.env.INPUT_TO_PROOF_OUTPUT_CSV ?? output); +const campaignId = process.env.INPUT_TO_PROOF_CAMPAIGN_ID ?? CAMPAIGN_ID; +const macCampaignId = process.env.INPUT_TO_PROOF_MAC_CAMPAIGN_ID ?? + (executionPolicy === "multithread" + ? "input-to-proof-v1-mac-multithread-16-20260812" + : campaignId); +const iphoneRawRoot = resolve( + process.env.INPUT_TO_PROOF_IPHONE_RAW_ROOT ?? + resolve(repoRoot, "target/v1-benchmarks/input-to-proof/iphone/publication"), +); +const e15RawRoot = resolve( + process.env.INPUT_TO_PROOF_E15_RAW_ROOT ?? + resolve(repoRoot, "target/v1-benchmarks/input-to-proof/e15"), +); +const e15GapPath = resolve(import.meta.dir, "e15-webauthn-cold-gap.json"); +const E15_OOM_GAP_SERIES = "webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local"; +const MAC_FIXED16_CIRCOM_WEBAUTHN_COLD_GAP = "webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local"; +const MAC_FIXED16_CIRCOM_WEBAUTHN_WARM_GAP = "webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse"; + +const circuitIdentity: Record = { + passport_complete_age_check: { + circuit: "passport_complete_age_check", + variant: "historical-monolithic-age-integrity", + commit: "9b2a6f37c67691eab4b0cec6c35e35c520e93285", + note: "Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.", + }, + passport_p1: { + circuit: "passport_age_integrity", + variant: "P1-matched-monolithic-RSA4096", + commit: "092621d721cfef9ff39b0787f5ba2c1f07eb6d95", + note: "Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.", + }, + oprf_o2: { + circuit: "oprf_nullifier", + variant: "O2-world-id-nullifier", + commit: "85aeeef539961cae5a63de794997b507a5975717", + note: "Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.", + }, + webauthn_closest_analogue: { + circuit: "webauthn", + variant: "closest-analogue", + commit: "0fb5b4aa1398281c2fd3dbe14db147e05b61f201", + note: "Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.", + }, +}; + +function sha256(path: string) { + return Bun.file(path).arrayBuffer().then((bytes) => createHash("sha256").update(Buffer.from(bytes)).digest("hex")); +} + +function selectCircomResult(profile: Profile, report: any) { + if (profile === "passport_p1") return report.results.find((r: any) => r.variant === "p1_matched_monolithic_rsa4096") ?? report.results[0]; + if (profile === "oprf_o2") return report.results.find((r: any) => r.variant === "world_id_protocol_nullifier"); + return report.results[0]; +} + +function combineCircomPassport(report: any) { + const registration = report.results.find((r: any) => r.variant === "self_passport_registration"); + const disclosure = report.results.find((r: any) => r.variant === "self_passport_disclosure"); + if (!registration || !disclosure) throw new Error("passport_complete_age_check: missing registration/disclosure pair"); + return registration.samples.map((left: any, index: number) => { + const right = disclosure.samples[index]; + if (!right || left.warmup !== right.warmup || left.sample_index !== right.sample_index) { + throw new Error("passport_complete_age_check: staged Circom sample mismatch"); + } + return { + warmup: left.warmup, + initialization: (left.initialization_time_ns + right.initialization_time_ns) / 1e6, + witness: (left.witness_time_ns + right.witness_time_ns) / 1e6, + prove: (left.prove_time_ns + right.prove_time_ns) / 1e6, + verify: (left.verify_time_ns + right.verify_time_ns) / 1e6, + outer: (left.input_to_proof_time_ns + right.input_to_proof_time_ns) / 1e6, + proof: left.proof_size_bytes + right.proof_size_bytes, + payload: registration.artifacts.proving_payload_size_bytes + disclosure.artifacts.proving_payload_size_bytes, + artifact: registration.artifacts.zkey_size_bytes + disclosure.artifacts.zkey_size_bytes, + bundle: registration.artifacts.proving_payload_size_bytes + disclosure.artifacts.proving_payload_size_bytes, + constraints: null, + tampered: left.tampered_proof_rejected && right.tampered_proof_rejected, + }; + }); +} + +function reportSamples(profile: Profile, stack: Stack, report: any) { + if (stack === "provekit_v1") { + const payload = report.artifacts.proving_payload_size_bytes; + return report.samples.map((sample: any) => ({ + warmup: sample.warmup, + initialization: sample.prepare_time_ms, + witness: sample.witness_time_ms, + prove: sample.prove_time_ms, + verify: sample.verify_time_ms, + outer: sample.input_to_proof_time_ms, + proof: sample.proof_size_bytes, + payload, + artifact: report.artifacts.prover_bytes, + bundle: report.bundle.cold_download_bytes, + constraints: report.circuit.constraints, + tampered: sample.tampered_proof_rejected, + })); + } + if (stack === "noir_barretenberg") { + const crs = report.proving_payload_transport?.crs_size_bytes ?? 0; + const circuit = report.metadata.circuit_size_bytes; + const input = report.metadata.input_size_bytes; + return report.samples.map((sample: any) => ({ + warmup: sample.warmup, + initialization: sample.initialization_time_ns / 1e6, + witness: sample.witness_time_ns / 1e6, + prove: sample.prove_time_ns / 1e6, + verify: sample.verify_time_ns / 1e6, + outer: sample.input_to_proof_time_ns / 1e6, + proof: sample.proof_size_bytes, + payload: circuit + input + crs, + artifact: circuit + crs, + bundle: circuit + input + crs, + constraints: null, + tampered: sample.tampered_proof_rejected, + })); + } + if (profile === "passport_complete_age_check") return combineCircomPassport(report); + const result = selectCircomResult(profile, report); + if (!result) throw new Error(`${profile}: missing selected Circom result`); + return result.samples.map((sample: any) => ({ + warmup: sample.warmup, + initialization: sample.initialization_time_ns / 1e6, + witness: sample.witness_time_ns / 1e6, + prove: sample.prove_time_ns / 1e6, + verify: sample.verify_time_ns / 1e6, + outer: sample.input_to_proof_time_ns / 1e6, + proof: sample.proof_size_bytes, + payload: result.artifacts.proving_payload_size_bytes, + artifact: result.artifacts.zkey_size_bytes, + bundle: result.artifacts.proving_payload_size_bytes, + constraints: null, + tampered: sample.tampered_proof_rejected, + })); +} + +function identity(stack: Stack) { + const suffix = executionPolicy === "multithread" ? "workers" : "single-thread"; + if (stack === "provekit_v1") return ["noir", `provekit-v1-whir-wasm-${suffix}`, "@noir-lang/noir_js@1.0.0-beta.11"]; + if (stack === "noir_barretenberg") return ["noir", `barretenberg-ultrahonk-wasm-${suffix}`, "@noir-lang/noir_js@1.0.0-beta.19"]; + return ["circom", `snarkjs-groth16-browser-wasm-${suffix}`, "circom-witness-wasm"]; +} + +function packages(stack: Stack) { + const mode = executionPolicy === "multithread" ? "workers" : "single-thread"; + if (stack === "provekit_v1") return JSON.stringify({ provekit: "9b2a6f37c67691eab4b0cec6c35e35c520e93285", noir_js: "1.0.0-beta.11", execution_policy: mode }); + if (stack === "noir_barretenberg") return JSON.stringify({ bb_js: "4.2.0-aztecnr-rc.2", noir_js: "1.0.0-beta.19", execution_policy: mode }); + return JSON.stringify({ circom: "2.2.2", snarkjs: "0.7.6", execution_policy: mode }); +} + +function browserExecution(report: any) { + const metadata = report.metadata ?? {}; + const environment = report.environment ?? {}; + const requested = report.prover_threads_requested + ?? metadata.threads_requested + ?? environment.wasm_thread_request + ?? null; + const effective = report.prover_threads_effective + ?? metadata.threads_effective + ?? environment.wasm_thread_count + ?? null; + const witness = report.witness_backend + ?? environment.witness_backend + ?? "single"; + const prover = report.backend + ?? metadata.backend + ?? "unknown"; + return { + requested: requested === "auto" ? "auto" : requested, + effective, + witness, + prover, + note: `Browser execution policy: ${executionPolicy}; requested threads=${requested ?? "unknown"}, effective threads=${effective ?? "unknown"}; witness generation remains ${witness}, prover backend=${prover}.`, + }; +} + +const iosFunctions: Record = { + "bench_mobile::bench_passport_complete_age_check_input_to_proof": { profile: "passport_complete_age_check", stack: "provekit_v1" }, + "bench_mobile::bench_passport_p1_input_to_proof": { profile: "passport_p1", stack: "provekit_v1" }, + "bench_mobile::bench_webauthn_assertion_input_to_proof": { profile: "webauthn_closest_analogue", stack: "provekit_v1" }, + "bench_mobile::bench_oprf_input_to_proof": { profile: "oprf_o2", stack: "provekit_v1" }, + "provekit_v1_mobile_adapters::bench_passport_barretenberg_input_to_proof": { profile: "passport_complete_age_check", stack: "noir_barretenberg" }, + "provekit_v1_mobile_adapters::bench_passport_p1_barretenberg_input_to_proof": { profile: "passport_p1", stack: "noir_barretenberg" }, + "provekit_v1_mobile_adapters::bench_webauthn_barretenberg_input_to_proof": { profile: "webauthn_closest_analogue", stack: "noir_barretenberg" }, + "provekit_v1_mobile_adapters::bench_oprf_barretenberg_input_to_proof": { profile: "oprf_o2", stack: "noir_barretenberg" }, + "provekit_v1_rapidsnark_mobile::bench_passport_rapidsnark_input_to_proof": { profile: "passport_complete_age_check", stack: "circom_groth16", component: "disclosure" }, + "provekit_v1_rapidsnark_mobile_register::bench_passport_rapidsnark_input_to_proof": { profile: "passport_complete_age_check", stack: "circom_groth16", component: "registration" }, + "provekit_v1_rapidsnark_mobile::bench_passport_p1_rapidsnark_input_to_proof": { profile: "passport_p1", stack: "circom_groth16" }, + "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_input_to_proof": { profile: "webauthn_closest_analogue", stack: "circom_groth16" }, + "provekit_v1_rapidsnark_mobile_oprf::bench_oprf_nullifier_rapidsnark_input_to_proof": { profile: "oprf_o2", stack: "circom_groth16" }, +}; + +type IosReportEvidence = { + path: string; + buildPath: string; + sessionPath: string; + buildId: string; + sessionId: string; + invocation: number | null; + mode: TimingMode; + report: any; + build: any; + session: any; +}; + +function rowTarget(row: CsvRow): Target { + if (row.hardware === "macbook_m4") return "mac_chrome"; + if (row.hardware === "iphone_se_2022") return "iphone_se_2022"; + return "motorola_e15"; +} + +function nativeIdentity(profile: Profile, stack: Stack) { + if (stack === "provekit_v1") return ["noir", "provekit-v1-whir-native", "integrated-noir-beta11-witness"]; + if (stack === "noir_barretenberg") return ["noir", "barretenberg-rs-4.2.0-aztecnr-rc.2", "acvm-beta19"]; + if (profile === "oprf_o2") return ["circom", "rust-rapidsnark-0.1.4", "wasmi-0.46.0-circom-wasm"]; + return ["circom", "rust-rapidsnark-0.1.4", "rust-witness-0.1.6"]; +} + +function nativePackages(profile: Profile, stack: Stack) { + if (stack === "provekit_v1") return JSON.stringify({ provekit: "9b2a6f37c67691eab4b0cec6c35e35c520e93285", mobench: "0.1.48", noir: "1.0.0-beta.11" }); + if (stack === "noir_barretenberg") return JSON.stringify({ mopro: "0.3.7", barretenberg_rs: "4.2.0-aztecnr-rc.2", noir: "1.0.0-beta.19" }); + if (profile === "oprf_o2") return JSON.stringify({ rust_rapidsnark: "0.1.4", wasmi: "0.46.0", circom: "2.2.2" }); + return JSON.stringify({ rust_rapidsnark: "0.1.4", rust_witness: "0.1.6", circom: "2.2.2" }); +} + +function iosSamples(evidence: IosReportEvidence, definition: (typeof iosFunctions)[string]) { + const custom = evidence.report.custom_metrics; + const run = custom?.run_u64 ?? {}; + const values = custom?.sample_u64 ?? {}; + const total: number[] = values.input_to_proof_time_ns ?? []; + const proofs: number[] = values.proof_size_bytes ?? []; + const witness: number[] = values.witness_time_ns ?? []; + const prove: number[] = values.prove_time_ns ?? []; + if (!total.length || total.length !== proofs.length || total.length !== prove.length) { + throw new Error(`${evidence.path}: incomplete input-to-proof custom metrics`); + } + const warmups = Number(evidence.report.spec?.warmup ?? 0); + const measuredResources: any[] = evidence.report.samples ?? []; + return total.map((inputToProofNs, index) => { + const warmup = index < warmups; + const measuredIndex = index - warmups; + const resource = warmup ? null : measuredResources[measuredIndex]; + const artifact = definition.stack === "provekit_v1" + ? run.prover_size_bytes + : definition.stack === "noir_barretenberg" + ? Number(run.circuit_size_bytes) + Number(run.srs_size_bytes) + : run.zkey_size_bytes; + return { + warmup, + witness: definition.stack === "provekit_v1" ? null : witness[index] / 1e6, + prove: prove[index] / 1e6, + outer: inputToProofNs / 1e6, + proof: proofs[index], + payload: run.proving_payload_size_bytes, + artifact, + bundle: run.proving_payload_size_bytes, + peak: resource?.process_peak_memory_kb == null ? null : resource.process_peak_memory_kb / 1024, + }; + }); +} + +function combineIosPassport(left: ReturnType[number], right: ReturnType[number]) { + if (left.warmup !== right.warmup) throw new Error("iPhone staged Passport sample mismatch"); + return { + warmup: left.warmup, + witness: Number(left.witness) + Number(right.witness), + prove: left.prove + right.prove, + outer: left.outer + right.outer, + proof: left.proof + right.proof, + payload: left.payload + right.payload, + artifact: left.artifact + right.artifact, + bundle: left.bundle + right.bundle, + peak: left.peak == null || right.peak == null ? null : Math.max(left.peak, right.peak), + }; +} + +async function loadIosEvidence() { + const evidence: IosReportEvidence[] = []; + const glob = new Bun.Glob("**/bench-report.json"); + for await (const relative of glob.scan({ cwd: iphoneRawRoot, onlyFiles: true })) { + const path = resolve(iphoneRawRoot, relative); + const sessionRoot = dirname(path); + const buildRoot = dirname(sessionRoot); + const rawReport = await Bun.file(path).json(); + const reports = normalizeIosReports(rawReport); + if (!reports.some((report) => iosFunctions[report.function])) continue; + const sessionPath = resolve(sessionRoot, "session.json"); + const buildPath = resolve(buildRoot, "build.json"); + if (!(await Bun.file(sessionPath).exists()) || !(await Bun.file(buildPath).exists())) { + throw new Error(`${path}: missing BrowserStack session/build provenance`); + } + const session = await Bun.file(sessionPath).json(); + const build = await Bun.file(buildPath).json(); + if (session.status !== "passed" || build.status !== "passed") throw new Error(`${path}: BrowserStack run did not pass`); + const device = build.devices?.[0]; + if (device?.device !== "iPhone SE 2022" || !String(device?.os_version ?? "").startsWith("15.")) { + throw new Error(`${path}: unexpected BrowserStack device identity`); + } + const coldMatch = relative.match(/(?:^|\/)cold\/run-(\d+)(?:\/|$)/); + const coldBatch = relative.match(/(?:^|\/)cold\/batch(?:\/|$)/); + reports.forEach((report, reportIndex) => { + if (!iosFunctions[report.function]) return; + evidence.push({ + path, + buildPath, + sessionPath, + buildId: build.id ?? basename(buildRoot), + sessionId: session.id ?? basename(sessionRoot).replace(/^session-/, ""), + invocation: coldMatch ? Number(coldMatch[1]) : coldBatch ? reportIndex : null, + mode: coldMatch || coldBatch ? "cold_local" : "warm_reuse", + report, + build, + session, + }); + }); + } + return evidence; +} + +export function normalizeIosReports(rawReport: unknown): Record[] { + const reports = Array.isArray(rawReport) ? rawReport : [rawReport]; + if (!reports.every((report) => report && typeof report === "object" && !Array.isArray(report))) { + throw new Error("iPhone benchmark report must be a JSON object or array of JSON objects"); + } + return reports; +} + +export function validateRows(rows: CsvRow[], expected = expectedSeries(["mac_chrome"])) { + const grouped = new Map(); + const duplicates = new Set(); + for (const row of rows) { + const profile = row.circuit === "passport_complete_age_check" + ? "passport_complete_age_check" + : row.circuit === "passport_age_integrity" + ? "passport_p1" + : row.circuit === "oprf_nullifier" + ? "oprf_o2" + : "webauthn_closest_analogue"; + const id = seriesId(profile, rowTarget(row), row.prover as Stack, row.timing_mode as TimingMode); + const key = `${id}|${row.sample_kind}|${row.sample_index}`; + if (duplicates.has(key)) throw new Error(`duplicate sample ${key}`); + duplicates.add(key); + grouped.set(id, [...(grouped.get(id) ?? []), row]); + if (row.sample_kind === "gap") { + const validGap = + (id === E15_OOM_GAP_SERIES && row.status === "runtime_failed" && row.failure_code === "out_of_memory") + || (id === MAC_FIXED16_CIRCOM_WEBAUTHN_COLD_GAP && row.status === "runtime_failed" && row.failure_code === "out_of_memory") + || (id === MAC_FIXED16_CIRCOM_WEBAUTHN_WARM_GAP && row.status === "not_run" && row.failure_code === "blocked_by_cold_failure"); + if (!validGap || !row.failure_detail) { + throw new Error(`${id}: invalid gap status`); + } + for (const metric of ["prover_time_ms", "total_time_ms", "input_to_proof_time_ms", "proof_size_bytes", "circuit_size_bytes", "peak_memory_mib"] as const) { + if (row[metric] != null && row[metric] !== "") throw new Error(`${id}: gap ${metric} must be blank`); + } + } else { + for (const metric of ["prover_time_ms", "total_time_ms", "input_to_proof_time_ms", "proof_size_bytes", "circuit_size_bytes"] as const) { + if (typeof row[metric] !== "number" || row[metric]! <= 0) throw new Error(`${id}: invalid ${metric}`); + } + if (row.sample_kind === "measured" && (typeof row.peak_memory_mib !== "number" || row.peak_memory_mib <= 0)) throw new Error(`${id}: invalid peak_memory_mib`); + if (row.prover !== "provekit_v1" && (typeof row.witness_time_ms !== "number" || row.witness_time_ms <= 0)) throw new Error(`${id}: invalid witness_time_ms`); + if (Math.abs(Number(row.total_time_ms) - Number(row.input_to_proof_time_ms)) > 0.001) throw new Error(`${id}: headline mismatch`); + } + } + for (const id of expected) { + const series = grouped.get(id) ?? []; + const gaps = series.filter((r) => r.sample_kind === "gap"); + if (gaps.length === 1 && series.length === 1) continue; + if (gaps.length) throw new Error(`${id}: gap cannot be mixed with attempts`); + if (series.filter((r) => r.sample_kind === "warmup").length !== 1) throw new Error(`${id}: expected one warmup`); + if (series.filter((r) => r.sample_kind === "measured").length !== 5) throw new Error(`${id}: expected five measured samples`); + } + if (grouped.size !== expected.length) throw new Error(`expected ${expected.length} series, found ${grouped.size}`); +} + +function csvValue(value: unknown) { + if (value == null) return ""; + const string = String(value); + return /[",\n]/.test(string) ? `"${string.replaceAll('"', '""')}"` : string; +} + +export async function buildMacRows() { + const rows: CsvRow[] = []; + for (const profile of PROFILES) for (const stack of STACKS) for (const mode of TIMING_MODES) { + const id = seriesId(profile, "mac_chrome", stack, mode); + const path = resolve(rawRoot, `${id}.json`); + if (!(await Bun.file(path).exists())) throw new Error(`missing raw series ${path}`); + const series = await Bun.file(path).json() as RawSeries; + if (series.campaign_id !== macCampaignId || series.series_id !== id) throw new Error(`${id}: identity mismatch`); + const evidenceHash = await sha256(path); + if (series.status) { + const validGap = + (id === MAC_FIXED16_CIRCOM_WEBAUTHN_COLD_GAP && series.status === "runtime_failed" && series.failure_code === "out_of_memory") + || (id === MAC_FIXED16_CIRCOM_WEBAUTHN_WARM_GAP && series.status === "not_run" && series.failure_code === "blocked_by_cold_failure"); + if (!validGap || !series.failure_message) throw new Error(`${id}: invalid fixed-16 gap evidence`); + const [frontend, proverBackend, witnessBackend] = identity(stack); + const circuit = circuitIdentity[profile]; + const requested = series.execution?.prover_threads_requested ?? series.execution?.wasm_thread_request ?? 16; + const effective = series.execution?.prover_threads_effective ?? series.execution?.wasm_thread_count ?? 16; + rows.push({ + campaign_id: macCampaignId, + attempt_id: `${id}-gap`, + recorded_at_utc: series.created_at, + hardware: "macbook_m4", + device_model: series.environment.device_model, + os_version: series.environment.os_version, + abi: series.environment.abi, + runtime: "browser_wasm", + browser: series.environment.browser, + circuit: circuit.circuit, + circuit_variant: circuit.variant, + circuit_commit: circuit.commit, + prover: stack, + frontend, + prover_backend: proverBackend, + witness_backend: witnessBackend, + sample_kind: "gap", + sample_index: null, + status: series.status, + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + artifact_version: `input-to-proof-v1-${executionPolicy}`, + source_commit: circuit.commit, + package_versions: `${packages(stack)};execution_policy=${executionPolicy};threads_requested=${requested};threads_effective=${effective}`, + artifact_hashes: JSON.stringify({ raw_evidence_sha256: evidenceHash }), + session_id: "", + non_equivalence_note: `${circuit.note} Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.`, + failure_code: series.failure_code, + failure_detail: series.failure_message, + evidence_path: path, + timing_mode: mode, + input_to_proof_time_ms: null, + }); + continue; + } + const execution = browserExecution(series.attempts[0]?.report ?? {}); + const extracted = series.attempts.flatMap((attempt) => + reportSamples(profile, stack, attempt.report).map((sample: any) => ({ attempt, sample })), + ); + if (extracted.length !== 6) throw new Error(`${id}: expected six attempts, found ${extracted.length}`); + const [frontend, proverBackend, witnessBackend] = identity(stack); + const circuit = circuitIdentity[profile]; + extracted.forEach(({ attempt, sample }, index) => { + const warmup = mode === "cold_local" ? attempt.warmup === true : sample.warmup === true; + const peakKib = attempt.report.process_memory?.peak_rss_kib; + const row: CsvRow = { + campaign_id: macCampaignId, + attempt_id: `${id}-${index}`, + recorded_at_utc: series.created_at, + hardware: "macbook_m4", + device_model: series.environment.device_model, + os_version: series.environment.os_version, + abi: series.environment.abi, + runtime: "browser_wasm", + browser: series.environment.browser, + circuit: circuit.circuit, + circuit_variant: circuit.variant, + circuit_commit: circuit.commit, + prover: stack, + frontend, + prover_backend: proverBackend, + witness_backend: witnessBackend, + sample_kind: warmup ? "warmup" : "measured", + sample_index: warmup ? 0 : mode === "cold_local" ? index : Number(sample.warmup ? 0 : index), + status: "ok", + initialization_time_ms: sample.initialization, + witness_time_ms: sample.witness, + prover_time_ms: sample.prove, + verify_time_ms: sample.verify, + total_time_ms: sample.outer, + peak_memory_mib: peakKib / 1024, + proof_size_bytes: sample.proof, + circuit_size_bytes: sample.payload, + artifact_size_bytes: sample.artifact, + bundle_size_bytes: sample.bundle, + constraint_count: sample.constraints, + artifact_version: `input-to-proof-v1-${executionPolicy}`, + source_commit: stack === "provekit_v1" ? "9b2a6f37c67691eab4b0cec6c35e35c520e93285" : circuit.commit, + package_versions: `${packages(stack)};execution_policy=${executionPolicy};threads_requested=${execution.requested};threads_effective=${execution.effective};witness_backend=${execution.witness};prover_backend=${execution.prover}`, + artifact_hashes: JSON.stringify({ raw_evidence_sha256: evidenceHash }), + session_id: "", + non_equivalence_note: `${circuit.note} ${execution.note}`, + failure_code: "", + failure_detail: "", + evidence_path: path, + timing_mode: mode, + input_to_proof_time_ms: sample.outer, + }; + if (!sample.tampered) throw new Error(`${id}: tamper rejection missing`); + rows.push(row); + }); + } + return rows; +} + +export async function buildIphoneRows() { + const evidence = await loadIosEvidence(); + const rows: CsvRow[] = []; + for (const profile of PROFILES) for (const stack of STACKS) for (const mode of TIMING_MODES) { + const id = seriesId(profile, "iphone_se_2022", stack, mode); + const definitions = Object.entries(iosFunctions).filter(([, value]) => value.profile === profile && value.stack === stack); + const matching = evidence.filter((item) => { + const definition = iosFunctions[item.report.function]; + return item.mode === mode && definition?.profile === profile && definition.stack === stack; + }); + const expectedReports = definitions.length * (mode === "cold_local" ? 6 : 1); + if (matching.length !== expectedReports) { + throw new Error(`${id}: expected ${expectedReports} BrowserStack reports, found ${matching.length}`); + } + + const extracted: Array<{ sample: ReturnType[number]; evidence: IosReportEvidence[] }> = []; + if (definitions.length === 1) { + for (const item of matching.sort((a, b) => Number(a.invocation) - Number(b.invocation))) { + extracted.push(...iosSamples(item, iosFunctions[item.report.function]).map((sample) => ({ sample, evidence: [item] }))); + } + } else { + const invocations = mode === "cold_local" ? [0, 1, 2, 3, 4, 5] : [null]; + for (const invocation of invocations) { + const components = matching.filter((item) => item.invocation === invocation); + const registration = components.find((item) => iosFunctions[item.report.function].component === "registration"); + const disclosure = components.find((item) => iosFunctions[item.report.function].component === "disclosure"); + if (!registration || !disclosure) throw new Error(`${id}: missing staged Passport component for invocation ${invocation}`); + const left = iosSamples(registration, iosFunctions[registration.report.function]); + const right = iosSamples(disclosure, iosFunctions[disclosure.report.function]); + if (left.length !== right.length) throw new Error(`${id}: staged Passport sample count mismatch`); + extracted.push(...left.map((sample, index) => ({ sample: combineIosPassport(sample, right[index]), evidence: [registration, disclosure] }))); + } + } + if (extracted.length !== 6) throw new Error(`${id}: expected six attempts, found ${extracted.length}`); + + const [frontend, proverBackend, witnessBackend] = nativeIdentity(profile, stack); + const circuit = circuitIdentity[profile]; + for (let index = 0; index < extracted.length; index++) { + const item = extracted[index]; + const isWarmup = mode === "cold_local" ? index === 0 : item.sample.warmup; + const evidenceHashes = await Promise.all(item.evidence.map(async (value) => ({ + report_sha256: await sha256(value.path), + session_sha256: await sha256(value.sessionPath), + build_sha256: await sha256(value.buildPath), + }))); + const first = item.evidence[0]; + const device = first.build.devices?.[0]; + const recordedAt = new Date(first.session.start_time ?? first.build.start_time).toISOString(); + rows.push({ + campaign_id: campaignId, + attempt_id: `${id}-${index}`, + recorded_at_utc: recordedAt, + hardware: "iphone_se_2022", + device_model: device?.device ?? "iPhone SE 2022", + os_version: device?.os_version ?? "15", + abi: "arm64", + runtime: "ios_native", + browser: "", + circuit: circuit.circuit, + circuit_variant: circuit.variant, + circuit_commit: circuit.commit, + prover: stack, + frontend, + prover_backend: proverBackend, + witness_backend: witnessBackend, + sample_kind: isWarmup ? "warmup" : "measured", + sample_index: isWarmup ? 0 : index, + status: "ok", + initialization_time_ms: null, + witness_time_ms: item.sample.witness, + prover_time_ms: item.sample.prove, + verify_time_ms: null, + total_time_ms: item.sample.outer, + peak_memory_mib: item.sample.peak, + proof_size_bytes: item.sample.proof, + circuit_size_bytes: item.sample.payload, + artifact_size_bytes: item.sample.artifact, + bundle_size_bytes: item.sample.bundle, + constraint_count: null, + artifact_version: `input-to-proof-v1-${executionPolicy}`, + source_commit: stack === "provekit_v1" ? "9b2a6f37c67691eab4b0cec6c35e35c520e93285" : circuit.commit, + package_versions: nativePackages(profile, stack), + artifact_hashes: JSON.stringify({ raw_evidence_sha256: evidenceHashes }), + session_id: item.evidence.map((value) => `${value.buildId}/${value.sessionId}`).join(";"), + non_equivalence_note: `${circuit.note}${stack === "provekit_v1" ? " Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank." : ""}`, + failure_code: "", + failure_detail: "", + evidence_path: item.evidence.map((value) => value.path).join(";"), + timing_mode: mode, + input_to_proof_time_ms: item.sample.outer, + }); + } + } + return rows; +} + +type E15Evidence = { + path: string; + envelope: any; + result: any; +}; + +const e15WarmPaths: Record> = { + passport_complete_age_check: { + provekit_v1: "publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json", + noir_barretenberg: "publication/warm/barretenberg-passport-20260810/results.json", + circom_groth16: ["publication/warm/circom-passport-register/results.json", "publication/warm/circom-passport-disclose/results.json"], + }, + passport_p1: { + provekit_v1: "publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json", + noir_barretenberg: "publication/warm/barretenberg-passport-p1-20260810/results.json", + circom_groth16: "publication/warm/circom-passport-p1/results.json", + }, + oprf_o2: { + provekit_v1: "publication/warm/provekit-oprf-v2-20260809/results.json", + noir_barretenberg: "publication/warm/barretenberg-oprf-20260810/results.json", + circom_groth16: "publication/warm/circom-oprf/results.json", + }, + webauthn_closest_analogue: { + provekit_v1: "publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json", + noir_barretenberg: "publication/warm/barretenberg-webauthn-20260810/results.json", + circom_groth16: "publication/warm/circom-webauthn/results.json", + }, +}; + +const e15ColdDirectories: Record> = { + passport_complete_age_check: { + provekit_v1: "attempts/cold/passport", + noir_barretenberg: "publication/cold/barretenberg-passport", + circom_groth16: ["publication/cold/circom-passport-register", "publication/cold/circom-passport-disclose"], + }, + passport_p1: { + provekit_v1: "attempts/cold/passport-p1", + noir_barretenberg: "publication/cold/barretenberg-passport-p1", + circom_groth16: "publication/cold/circom-passport-p1", + }, + oprf_o2: { + provekit_v1: "attempts/cold/oprf", + noir_barretenberg: "publication/cold/barretenberg-oprf", + circom_groth16: "publication/cold/circom-oprf", + }, + webauthn_closest_analogue: { + provekit_v1: "attempts/cold/webauthn", + noir_barretenberg: "publication/cold/barretenberg-webauthn", + circom_groth16: null, + }, +}; + +const e15ProveKitColdReplacements: Partial>> = { + passport_complete_age_check: { 3: "attempts/cold-retry4-20260809/passport/run-3/results.json" }, + passport_p1: { 1: "attempts/cold-retry2-20260809/passport-p1/run-1/results.json" }, + oprf_o2: { 3: "attempts/cold-retry-20260809/oprf/run-3/results.json" }, + webauthn_closest_analogue: { 5: "attempts/cold-retry-20260809/webauthn/run-5/results.json" }, +}; + +async function loadE15Evidence(relative: string): Promise { + const path = resolve(e15RawRoot, relative); + if (!(await Bun.file(path).exists())) throw new Error(`missing E15 evidence ${path}`); + const envelope = await Bun.file(path).json(); + const successful = envelope.results?.filter((result: any) => result.status === "ok") ?? []; + if (successful.length !== 1) throw new Error(`${path}: expected one successful result, found ${successful.length}`); + return { path, envelope, result: successful[0] }; +} + +function e15Samples(stack: Stack, evidence: E15Evidence) { + const report = evidence.result.report; + const custom = report.custom_metrics; + const run = custom?.run_u64 ?? {}; + const values = custom?.sample_u64 ?? {}; + const total: number[] = values.input_to_proof_time_ns ?? []; + const proofs: number[] = values.proof_size_bytes ?? []; + const prove: number[] = values.prove_time_ns ?? []; + const witness: number[] = values.witness_time_ns ?? []; + if (!total.length || total.length !== proofs.length || total.length !== prove.length) { + throw new Error(`${evidence.path}: incomplete input-to-proof custom metrics`); + } + if (stack !== "provekit_v1" && witness.length !== total.length) throw new Error(`${evidence.path}: incomplete witness metrics`); + const warmups = Number(report.spec?.warmup ?? 0); + const resources: any[] = report.samples ?? []; + return total.map((outer, index) => { + const warmup = index < warmups; + const resource = warmup ? null : resources[index - warmups]; + const artifact = stack === "provekit_v1" + ? run.prover_size_bytes + : stack === "noir_barretenberg" + ? Number(run.circuit_size_bytes) + Number(run.srs_size_bytes) + : run.zkey_size_bytes; + return { + warmup, + witness: stack === "provekit_v1" ? null : witness[index] / 1e6, + prove: prove[index] / 1e6, + outer: outer / 1e6, + proof: proofs[index], + payload: run.proving_payload_size_bytes, + artifact, + bundle: run.proving_payload_size_bytes, + peak: resource?.process_peak_memory_kb == null ? null : resource.process_peak_memory_kb / 1024, + }; + }); +} + +async function e15EvidenceFor(profile: Profile, stack: Stack, mode: TimingMode) { + const selected = mode === "warm_reuse" ? e15WarmPaths[profile][stack] : e15ColdDirectories[profile][stack]; + if (selected == null) return []; + const components = Array.isArray(selected) ? selected : [selected]; + const attempts: E15Evidence[][] = []; + if (mode === "warm_reuse") { + attempts.push(await Promise.all(components.map(loadE15Evidence))); + } else { + for (let index = 0; index < 6; index++) { + const replacement = stack === "provekit_v1" ? e15ProveKitColdReplacements[profile]?.[index] : undefined; + attempts.push(await Promise.all(components.map((directory) => loadE15Evidence(replacement ?? `${directory}/run-${index}/results.json`)))); + } + } + return attempts; +} + +export async function buildE15Rows() { + const rows: CsvRow[] = []; + for (const profile of PROFILES) for (const stack of STACKS) for (const mode of TIMING_MODES) { + const id = seriesId(profile, "motorola_e15", stack, mode); + const attempts = await e15EvidenceFor(profile, stack, mode); + if (!attempts.length) { + if (id !== E15_OOM_GAP_SERIES) throw new Error(`${id}: missing E15 evidence manifest`); + const gap = await Bun.file(e15GapPath).json(); + if (gap.logical_series_id !== id || gap.status !== "runtime_failed" || gap.failure_code !== "out_of_memory") throw new Error(`${id}: invalid gap manifest`); + const reportPath = resolve(repoRoot, gap.evidence.report_path); + const logcatPath = resolve(repoRoot, gap.evidence.logcat_path); + if (await sha256(reportPath) !== gap.evidence.report_sha256 || await sha256(logcatPath) !== gap.evidence.logcat_sha256) throw new Error(`${id}: gap evidence hash mismatch`); + const failedEnvelope = await Bun.file(reportPath).json(); + rows.push({ + campaign_id: campaignId, attempt_id: `${id}-gap`, recorded_at_utc: failedEnvelope.generated_at_utc, hardware: "motorola_e15", + device_model: gap.device.model, os_version: gap.device.os, abi: gap.device.abi, runtime: gap.runtime, browser: "", + circuit: gap.circuit, circuit_variant: gap.circuit_variant, circuit_commit: gap.circuit_commit, prover: gap.stack, + frontend: gap.frontend, prover_backend: gap.prover_backend, witness_backend: gap.witness_backend, sample_kind: "gap", + sample_index: null, status: gap.status, initialization_time_ms: null, witness_time_ms: null, prover_time_ms: null, + verify_time_ms: null, total_time_ms: null, peak_memory_mib: null, proof_size_bytes: null, circuit_size_bytes: null, + artifact_size_bytes: null, bundle_size_bytes: null, constraint_count: null, artifact_version: `input-to-proof-v1-${executionPolicy}`, + source_commit: gap.circuit_commit, package_versions: nativePackages(profile, stack), + artifact_hashes: JSON.stringify({ report_sha256: gap.evidence.report_sha256, logcat_sha256: gap.evidence.logcat_sha256 }), + session_id: "", non_equivalence_note: gap.note, failure_code: gap.failure_code, failure_detail: gap.failure_detail, + evidence_path: `${reportPath};${logcatPath}`, timing_mode: mode, input_to_proof_time_ms: null, + }); + continue; + } + + const extracted: Array<{ sample: ReturnType[number]; evidence: E15Evidence[] }> = []; + for (const componentEvidence of attempts) { + const componentSamples = componentEvidence.map((item) => e15Samples(stack, item)); + const count = componentSamples[0].length; + if (!componentSamples.every((samples) => samples.length === count)) throw new Error(`${id}: staged sample count mismatch`); + for (let index = 0; index < count; index++) { + const parts = componentSamples.map((samples) => samples[index]); + const sample = parts.length === 1 ? parts[0] : combineIosPassport(parts[0], parts[1]); + extracted.push({ sample, evidence: componentEvidence }); + } + } + if (extracted.length !== 6) throw new Error(`${id}: expected six attempts, found ${extracted.length}`); + const circuit = circuitIdentity[profile]; + const [frontend, proverBackend, witnessBackend] = nativeIdentity(profile, stack); + for (let index = 0; index < extracted.length; index++) { + const item = extracted[index]; + const isWarmup = mode === "cold_local" ? index === 0 : item.sample.warmup; + const first = item.evidence[0]; + const hashes = await Promise.all(item.evidence.map(async (value) => ({ raw_evidence_sha256: await sha256(value.path) }))); + rows.push({ + campaign_id: campaignId, attempt_id: `${id}-${index}`, recorded_at_utc: first.envelope.generated_at_utc, + hardware: "motorola_e15", device_model: first.envelope.device.model, os_version: first.envelope.device.os, + abi: first.envelope.device.abi, runtime: "android_native", browser: "", circuit: circuit.circuit, + circuit_variant: circuit.variant, circuit_commit: circuit.commit, prover: stack, frontend, prover_backend: proverBackend, + witness_backend: witnessBackend, sample_kind: isWarmup ? "warmup" : "measured", sample_index: isWarmup ? 0 : index, + status: "ok", initialization_time_ms: null, witness_time_ms: item.sample.witness, prover_time_ms: item.sample.prove, + verify_time_ms: null, total_time_ms: item.sample.outer, peak_memory_mib: item.sample.peak, + proof_size_bytes: item.sample.proof, circuit_size_bytes: item.sample.payload, artifact_size_bytes: item.sample.artifact, + bundle_size_bytes: item.sample.bundle, constraint_count: null, artifact_version: `input-to-proof-v1-${executionPolicy}`, + source_commit: stack === "provekit_v1" ? "9b2a6f37c67691eab4b0cec6c35e35c520e93285" : circuit.commit, + package_versions: nativePackages(profile, stack), artifact_hashes: JSON.stringify(hashes), session_id: "", + non_equivalence_note: `${circuit.note}${stack === "provekit_v1" ? " Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank." : ""}`, + failure_code: "", failure_detail: "", evidence_path: item.evidence.map((value) => value.path).join(";"), + timing_mode: mode, input_to_proof_time_ms: item.sample.outer, + }); + } + } + return rows; +} + +if (import.meta.main) { + const targets = (process.env.INPUT_TO_PROOF_EXPORT_TARGETS ?? "mac_chrome").split(",") as Target[]; + const rows = [ + ...(targets.includes("mac_chrome") ? await buildMacRows() : []), + ...(targets.includes("iphone_se_2022") ? await buildIphoneRows() : []), + ...(targets.includes("motorola_e15") ? await buildE15Rows() : []), + ]; + validateRows(rows, expectedSeries(targets)); + const csv = [CSV_COLUMNS.join(","), ...rows.map((row) => CSV_COLUMNS.map((column) => csvValue(row[column])).join(","))].join("\n") + "\n"; + await Bun.write(outputPath, csv); + console.log(`${outputPath}: ${rows.length} rows, ${expectedSeries(targets).length} series validated`); +} diff --git a/benchmarks/v1/input-to-proof-data/input-to-proof-samples.csv b/benchmarks/v1/input-to-proof-data/input-to-proof-samples.csv new file mode 100644 index 000000000..5c6f3a113 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/input-to-proof-samples.csv @@ -0,0 +1,418 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path,timing_mode,input_to_proof_time_ms +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,2842.120000001043,1049.1049999985844,3412.5250000003725,117.99000000022352,7303.75,1416.921875,993532,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7303.75 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,2843.0149999987334,1054.925000000745,3336.464999999851,115.00499999895692,7234.404999999329,1413.21875,992764,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7234.404999999329 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,2966.2099999990314,1293.480000000447,5916.785000000149,248.48499999940395,10176.474999999627,1420.65625,992976,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10176.474999999627 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,3724.609999999404,1383.6300000008196,4081.754999998957,158.14499999955297,9189.99499999918,1419.609375,994300,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,9189.99499999918 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,2845.2599999997765,1049.1100000012666,7035.0999999996275,183.36500000022352,10929.47000000067,1419.28125,993444,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10929.47000000067 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,2926.5499999988824,1043.7250000014901,4237.64999999851,176.7299999985844,8207.924999998882,1420.109375,992764,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,8207.924999998882 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1102.394999999553,1050.0649999994785,4727.995000001043,212.54000000096858,6880.4550000000745,1608.015625,999632,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6880.4550000000745 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1278,845.375,5043.015000000596,193.625,7166.390000000596,1608.015625,991652,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7166.390000000596 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1296.464999999851,837.320000000298,5037,188.37000000104308,7170.790000000969,1608.015625,994596,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7170.790000000969 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1419.265000000596,847.160000000149,4606.530000001192,203.87999999895692,6872.960000000894,1608.015625,993188,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6872.960000000894 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1471.960000000894,856.9949999991804,4651.714999999851,276.445000000298,6980.680000001565,1608.015625,995280,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6980.680000001565 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1389.769999999553,853.2999999988824,4474.6850000005215,171.2649999987334,6717.754999998957,1608.015625,994212,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6717.754999998957 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,4348.745,712.235,4976.885,1633.795,10037.865,1735.34375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10037.865 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2858.755,710.165,8026.005,1542.55,11594.925,1723,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,11594.925 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2587.665,760.585,5524.04,1231.715,8872.29,1796.5,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,8872.29 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,3637.7,709.45,6380.82,1819.1,10727.97,1726.03125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10727.97 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2077.69,711.37,3863.43,1273.755,6652.49,1792.515625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6652.49 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2128.095,706.23,6831.17,1896.58,9665.495,1734.90625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,9665.495 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,745.05,4944.695,0,5689.8,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5689.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,645.265,5698.31,0,6343.62,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6343.62 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,725.91,5898.43,0,6624.385,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6624.385 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,924.91,5710.09,0,6635.05,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6635.05 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,678.5,6780.515,0,7459.05,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,7459.05 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,733.24,5886.9,0,6620.185,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6620.185 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,11.4,4416.835,16579.795,19.46,21008.03,14760.9375,1441,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,21008.03 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,7.95,4300.735,13689.82,17.665,17998.505,15044.921875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,17998.505 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,6.095,4306.37,12557.965,16.465,16870.43,15168.8125,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,16870.43 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,9.255,4454.065,15041.63,18.3,19504.95,14813.609375,1441,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,19504.95 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,5.645,4261.645,11047.29,11.54,15314.58,15569.78125,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15314.58 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,7.26,4299.855,16407.645,15.345,20714.76,15893.671875,1450,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,20714.76 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4364.78,15077.205,21.55,19442.24,15174.21875,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,19442.24 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,5048.455,16275.19,12.84,21323.915,15174.21875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,21323.915 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4316.945,11655.63,11.43,15972.8,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,15972.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4267.2,14298.215,21.66,18565.625,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,18565.625 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4448.685,12469.445,18.435,16918.345,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,16918.345 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4656.93,14999.81,15.19,19660.13,15174.21875,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,19660.13 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1622.155000001192,821.625,1708.1150000002235,91.07000000029802,4151.895000001416,887.65625,961017,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4151.895000001416 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1876.5550000015646,863.4749999996275,2735.339999999851,157,5475.370000001043,885.640625,960377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5475.370000001043 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1978.160000000149,858.0500000007451,2795.269999999553,137.18500000052154,5631.480000000447,884.828125,962809,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5631.480000000447 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,2322.0200000014156,924.875,2671.699999999255,130.57499999925494,5918.595000000671,885.421875,960721,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5918.595000000671 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1575.8499999996275,789.035000000149,2135.5200000014156,103.67999999970198,4500.405000001192,886.015625,960549,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4500.405000001192 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1558.5550000015646,790.3249999992549,2642.1199999991804,177.17999999970198,4991,881.140625,963833,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4991 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,554.570000000298,791.8149999994785,2604.7599999997765,100.02500000037253,3951.1500000003725,1033.078125,962085,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3951.1500000003725 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,627.5750000011176,641.9700000006706,1930.6199999991804,89.50499999895692,3200.1699999999255,1033.078125,967377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3200.1699999999255 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,622.910000000149,638.0800000000745,1897.769999999553,122.30000000074506,3158.765000000596,1033.078125,965157,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3158.765000000596 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,709.3000000007451,696.6549999993294,2027.339999999851,88.50500000081956,3433.2949999999255,1033.078125,967121,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3433.2949999999255 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,629.6500000003725,626.6699999999255,1691.1150000002235,87.52999999932945,2947.4350000005215,1033.078125,960081,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2947.4350000005215 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,621.5750000011176,626.6300000008196,1825.390000000596,82.08499999903142,3073.605000000447,1033.078125,960165,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3073.605000000447 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2916.98,552.065,2213.25,702.77,5682.295,1430.578125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5682.295 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2141.505,536.83,2088.175,668.555,4766.51,1403.203125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4766.51 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2354.715,535.86,2067.005,660.255,4957.58,1403.03125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4957.58 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2234.14,544.745,2088.39,659.525,4867.275,1400.828125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4867.275 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2889.57,544.465,2114.875,660.43,5548.91,1402.609375,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5548.91 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2350.105,540.185,2061.27,666.545,4951.56,1428.515625,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4951.56 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,423.71,1908.505,0,2332.245,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2332.245 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,420.66,1922.74,0,2343.43,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2343.43 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,421.22,1889.3,0,2310.545,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2310.545 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,422.685,1893.075,0,2315.79,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2315.79 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,422.365,1914.91,0,2337.32,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2337.32 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,421.46,1896.29,0,2317.765,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2317.765 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,4.1,3941.765,8451.815,6.63,12397.68,14436.53125,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12397.68 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.2,3979.935,8573.535,6.4,12555.67,14977.96875,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12555.67 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.29,3990.985,8595,6.45,12588.275,14629.671875,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12588.275 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,2.6,4003.765,8502.03,7.605,12508.395,14588.578125,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12508.395 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,2.835,4043.31,8677.805,6.39,12723.95,14386.03125,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12723.95 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,3.035,4000.415,8485.75,6.555,12489.2,15473.25,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12489.2 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4012.1,8717.49,6.325,12729.71,15019.90625,720,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12729.71 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,3988.105,8483.55,6.95,12471.8,15019.90625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12471.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4044.51,8580.92,5.825,12625.545,15019.90625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12625.545 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4018.445,8761.28,5.825,12779.825,15019.90625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12779.825 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4029.195,8587.455,13.035,12616.765,15019.90625,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12616.765 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4001.05,8682.295,5.76,12683.45,15019.90625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12683.45 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1102.2249999977648,1399.0800000000745,506.47000000067055,49.955000000074506,3007.77499999851,601.46875,845390,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3007.77499999851 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1112.339999999851,1406.695000000298,499.23000000044703,50.93999999947846,3018.265000000596,601.828125,849014,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3018.265000000596 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1122.7799999993294,1401.7249999996275,538.410000000149,48.63499999977648,3062.914999999106,599.890625,848206,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3062.914999999106 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1119.824999999255,1411.894999999553,491.42500000074506,49.11500000022352,3023.144999999553,600.46875,845302,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3023.144999999553 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1125.464999999851,1418.699999999255,498.2450000010431,50.519999999552965,3042.410000000149,601,849826,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3042.410000000149 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1116.035000000149,1412.355000000447,491.714999999851,49.665000000968575,3020.105000000447,600.71875,846454,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3020.105000000447 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,364.76999999955297,1398.605000000447,490.695000000298,49.25,2254.0800000000745,744.796875,844918,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2254.0800000000745 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,364.5300000011921,1343.714999999851,435.964999999851,44.21499999985099,2144.2200000006706,744.796875,848334,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2144.2200000006706 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,373.6150000002235,1333.690000001341,433.195000000298,42.475000001490116,2140.5050000008196,744.796875,848802,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2140.5050000008196 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,365.8700000010431,1325.429999999702,427.99499999918044,43.05000000074506,2119.2949999999255,744.796875,848462,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2119.2949999999255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,364.25,1319.949999999255,424.179999999702,41.665000000968575,2108.394999999553,744.796875,847266,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2108.394999999553 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,364.7600000016391,1326.844999998808,454.5049999989569,52.91000000014901,2146.1150000002235,744.796875,846414,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2146.1150000002235 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2874.525,609.985,1589.755,512.375,5074.265,1283.734375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5074.265 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2113.02,592.025,1290.605,411.71,3995.65,1277.78125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,3995.65 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2187.07,586.075,1299.35,402.915,4072.495,1279.1875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4072.495 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2291.4,590.185,1309.965,409.05,4191.55,1280.671875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4191.55 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2265.82,590.995,1272.485,407.635,4129.3,1285.4375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4129.3 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2254.585,590.63,1280.035,433.58,4125.25,1279.1875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4125.25 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,527.085,1345.135,0,1872.255,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1872.255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,529.895,1297.735,0,1827.67,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1827.67 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,525.56,1253.17,0,1778.755,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1778.755 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,530.225,1258.44,0,1788.705,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1788.705 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,523.49,1362.685,0,1886.21,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1886.21 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,525.145,1343.915,0,1869.085,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1869.085 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__cold_local-0,2026-08-14T10:12:41.742Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),warmup,0,ok,226.099333,3.343334,89.25554199999999,2.0604579999999997,318.700417,134.09375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""51a128bdca7a1812ee2828ef583edf45aaea59cabb240e6688b9acf153f64b52""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__cold_local.json,cold_local,318.700417 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__cold_local-1,2026-08-14T10:12:41.742Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,1,ok,238.40766599999998,3.336583,96.73275000000001,1.993667,338.479291,148.984375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""51a128bdca7a1812ee2828ef583edf45aaea59cabb240e6688b9acf153f64b52""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__cold_local.json,cold_local,338.479291 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__cold_local-2,2026-08-14T10:12:41.742Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,2,ok,260.979416,3.300792,97.719333,1.999458,362.003582,142.375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""51a128bdca7a1812ee2828ef583edf45aaea59cabb240e6688b9acf153f64b52""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__cold_local.json,cold_local,362.003582 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__cold_local-3,2026-08-14T10:12:41.742Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,3,ok,249.13570800000002,3.249958,88.85175,2.057916,341.241624,146.578125,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""51a128bdca7a1812ee2828ef583edf45aaea59cabb240e6688b9acf153f64b52""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__cold_local.json,cold_local,341.241624 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__cold_local-4,2026-08-14T10:12:41.742Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,4,ok,241.481167,3.281959,93.78037499999999,2.031917,338.546251,139.71875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""51a128bdca7a1812ee2828ef583edf45aaea59cabb240e6688b9acf153f64b52""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__cold_local.json,cold_local,338.546251 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__cold_local-5,2026-08-14T10:12:41.742Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,5,ok,256.885834,3.3335,94.040042,1.9940410000000002,354.26629299999996,139.84375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""51a128bdca7a1812ee2828ef583edf45aaea59cabb240e6688b9acf153f64b52""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__cold_local.json,cold_local,354.26629299999996 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__warm_reuse-0,2026-08-14T10:12:42.638Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),warmup,0,ok,247.548208,3.5148750000000004,93.70725,1.950667,344.773708,136.0625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""76b4fc72655f587c071a292bf6a9506470d0c17bec03076065948d05e442ab45""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__warm_reuse.json,warm_reuse,344.773708 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__warm_reuse-1,2026-08-14T10:12:42.638Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,1,ok,0,3.195,91.544875,2.134958,94.741833,141.421875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""76b4fc72655f587c071a292bf6a9506470d0c17bec03076065948d05e442ab45""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__warm_reuse.json,warm_reuse,94.741833 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__warm_reuse-2,2026-08-14T10:12:42.638Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,2,ok,0,3.074625,94.505083,2.004875,97.581999,144.734375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""76b4fc72655f587c071a292bf6a9506470d0c17bec03076065948d05e442ab45""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__warm_reuse.json,warm_reuse,97.581999 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__warm_reuse-3,2026-08-14T10:12:42.638Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,3,ok,0,3.160791,87.66466700000001,2.036042,90.82783300000001,148.796875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""76b4fc72655f587c071a292bf6a9506470d0c17bec03076065948d05e442ab45""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__warm_reuse.json,warm_reuse,90.82783300000001 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__warm_reuse-4,2026-08-14T10:12:42.638Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,4,ok,0,3.3018750000000003,96.795959,1.970209,100.099668,151.828125,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""76b4fc72655f587c071a292bf6a9506470d0c17bec03076065948d05e442ab45""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__warm_reuse.json,warm_reuse,100.099668 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__macbook_m4__circom_groth16__warm_reuse-5,2026-08-14T10:12:42.638Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1,arm64,native_diagnostic,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,5,ok,0,3.3105,93.731667,2.074084,97.046334,152.84375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""76b4fc72655f587c071a292bf6a9506470d0c17bec03076065948d05e442ab45""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__mac_native_diagnostic__circom_groth16__warm_reuse.json,warm_reuse,97.046334 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1616.809999998659,1637.0100000016391,1810.684999998659,88.18999999947846,5064.504999998957,972.234375,975568,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5064.504999998957 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1625.339999999851,1645.684999998659,1764.335000000894,83.01500000059605,5035.359999999404,966.484375,969336,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5035.359999999404 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1624.2799999993294,1640.5400000009686,1824.894999999553,85.48000000044703,5089.714999999851,969.21875,973092,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5089.714999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1610.9700000006706,1636.7649999987334,1841.6000000014901,88.2350000012666,5089.335000000894,970.484375,973604,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5089.335000000894 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1614.519999999553,1652.5,1762.0499999988824,83.30499999970198,5029.069999998435,970.859375,972708,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5029.069999998435 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1607.535000000149,1635.164999999106,1840.355000000447,84.55499999970198,5083.054999999702,965.53125,972664,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5083.054999999702 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,597.4350000005215,1611.844999998808,1764.6850000005215,80.91000000014901,3973.964999999851,1057.625,976720,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3973.964999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,594.089999999851,1218.7050000000745,1669.4199999999255,81.71499999985099,3482.214999999851,1057.625,971256,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3482.214999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,592.8300000000745,1223.0499999988824,1678.910000000149,73.68500000052154,3494.7949999999255,1057.625,972112,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3494.7949999999255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,592.875,1224.1650000009686,1695.5099999997765,73.42999999970198,3512.554999999702,1057.625,972024,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3512.554999999702 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,602.2899999991059,1220.445000000298,1658.9000000003725,73.1699999999255,3481.6349999997765,1057.625,972240,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3481.6349999997765 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,606.5800000000745,1229.515000000596,1702.125,73.20999999903142,3538.2249999996275,1057.625,975096,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3538.2249999996275 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2310.06,1291.51,2047.705,635.2,5649.275,1415.90625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5649.275 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2363.25,1290.04,2062.965,635.955,5716.255,1416.578125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5716.255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2282.265,1283.095,2083.845,637.12,5649.205,1416.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5649.205 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2092.845,1278.405,2095.845,679.85,5467.095,1441.609375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5467.095 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2149.255,1277.985,2071.745,639.71,5498.985,1414.421875,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5498.985 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2101.3,1273.695,2074.26,633.575,5449.255,1415.890625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5449.255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,1034.07,1801.57,0,2835.67,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2835.67 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,1026.735,1780.15,0,2806.915,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2806.915 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,1031.615,1799.2,0,2830.845,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2830.845 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,1040.36,2184.33,0,3224.73,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,3224.73 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,1061.88,1884.545,0,2946.455,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2946.455 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,1044.965,1866.935,0,2911.925,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2911.925 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-gap,2026-08-12T12:43:50.009Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,gap,,runtime_failed,,,,,,,,,,,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16","{""raw_evidence_sha256"":""b6a994516dc5a9e7f59d2fb67434402197b569ff71a9924d7789bd1b0f54f7ef""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.",out_of_memory,"The 16-worker SnarkJS WebAuthn attempt did not produce a proof. The dedicated Chrome renderer reached 14,559,360 KiB RSS (10.4 GiB current physical footprint; 21.7 GiB peak), then remained CPU-idle with all worker threads sleeping for 18 minutes 59 seconds. The attempt was terminated after preserving process evidence; no timing was recorded.",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-gap,2026-08-12T12:43:50.009Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,gap,,not_run,,,,,,,,,,,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16","{""raw_evidence_sha256"":""5fbc6616d8d3e872d396948d811baf33977b263da165b0b2e13c840526670f83""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.",blocked_by_cold_failure,Warm-reuse measurements were not started because the required fixed-16 cold WebAuthn attempt stalled in the renderer before producing a valid proof.,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,5561.899083,,5561.899083,1012.59375,738899,4246785,3974928,4246785,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,5561.899083 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,6721.897208,,6721.897208,1032.640625,739119,4242061,3970204,4242061,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6721.897208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,6744.484625,,6744.484625,1021.984375,738515,4297357,4025500,4297357,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6744.484625 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,6786.961709,,6786.961709,1018.59375,740692,4280029,4008172,4280029,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6786.961709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,7751.007208,,7751.007208,1028.75,739227,4199409,3927552,4199409,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,7751.007208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,7404.360792,,7404.360792,1022.75,739919,4237853,3965996,4237853,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,7404.360792 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,4706.155042,,4706.155042,,737829,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,4706.155042 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,6449.621417,,6449.621417,1036.625,741414,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6449.621417 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,6485.354208,,6485.354208,1058.1875,739392,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6485.354208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,6428.335125,,6428.335125,1074,740525,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6428.335125 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,6479.023709,,6479.023709,1090.65625,738544,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6479.023709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,6415.690167,,6415.690167,1096.0625,742373,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6415.690167 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,452.420083,6643.58075,,7096.001,862.4375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7096.001 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,503.480542,7514.892833,,8018.373459,859.15625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8018.373459 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,503.247291,7648.712417,,8151.95975,872.140625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8151.95975 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,503.200875,7473.9845,,7977.1855,857.0625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7977.1855 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,521.086042,7572.189625,,8093.275709,853.5,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8093.275709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,503.777375,7113.808542,,7617.586041,855.5,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7617.586041 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,457.751292,7447.586333,,7905.337833,,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7905.337833 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,482.815042,7496.62,,7979.435125,884.5625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7979.435125 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,515.780959,7643.547334,,8159.328416,891.953125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8159.328416 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,504.39725,7713.985542,,8218.382875,891.890625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8218.382875 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,511.586792,7285.887125,,7797.474042,891.96875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7797.474042 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,509.84,7720.695958,,8230.536,891.921875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8230.536 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-0,2026-08-10T06:45:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,6204.0834589999995,12047.987208,,18252.071,292.15625,2503,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f15435d7eea73d90fd4ba48d1973332befab2942e678a2d1c9ba97025ee8e47a"",""session_sha256"":""a6cb544430ac889396c197e5911935405973c3b58dc72f4927b38e04a7371a5c"",""build_sha256"":""57646c86fcfa271858e72600fbe83068a7e267f1b19ceb22fc804a9431f58bbc""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd/3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-0/circom-register-verified/appium-3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd/session-3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18252.071 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-1,2026-08-10T06:47:17.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6195.8720410000005,11553.437291000002,,17749.309458,292.109375,2500,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""b8d3f501b6ada217a8ed3fa88253b6fb470fddec16049e946f20592c74737d2d"",""session_sha256"":""484488bae00495d20f19b231d3236ad024e8082be83943d8a04a74d63a71135c"",""build_sha256"":""239f31d606340cc6dcb7f4003b087b2e8997d4c4338cbc6d84764b3069a073ce""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-d0cc69cff747b3205e2988f8429ad3a074625c9d/d0cc69cff747b3205e2988f8429ad3a074625c9d;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-1/circom-register-verified/appium-d0cc69cff747b3205e2988f8429ad3a074625c9d/session-d0cc69cff747b3205e2988f8429ad3a074625c9d/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,17749.309458 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-2,2026-08-10T06:48:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6185.364084,11846.453625,,18031.817875,292.171875,2499,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""aeaf9b2f942364bec89faf8ecedb9c8f93f4afabad49d1de325c7ef3c4614443"",""session_sha256"":""f13eaf78f614e66fdc1cf46584214ebc633026846b05570da4036762e6b16b56"",""build_sha256"":""be1a34897581ba40522b77c4519e7f2c475e425ab186cb02f14287a8efea8a84""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-f30a96f15aa4f591963a4feae1e7f3966d357a33/f30a96f15aa4f591963a4feae1e7f3966d357a33;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-2/circom-register-verified/appium-f30a96f15aa4f591963a4feae1e7f3966d357a33/session-f30a96f15aa4f591963a4feae1e7f3966d357a33/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18031.817875 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-3,2026-08-10T06:49:46.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6216.887,11949.56025,,18166.447374,292.296875,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bad22c058133b58cb7addea28485fe705279d136be1cfd816cc541a6e254570e"",""session_sha256"":""011e8c4336cad753523c687f98f32fe1ca633722a6f59a8f06e58d8b925960e4"",""build_sha256"":""1524ad1b29605dbce9e37268ab3a8f85f499cc005969e592d651056f5c6e6edb""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-7009179e108287e74bf3a9df29ec22d930291a89/7009179e108287e74bf3a9df29ec22d930291a89;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-3/circom-register-verified/appium-7009179e108287e74bf3a9df29ec22d930291a89/session-7009179e108287e74bf3a9df29ec22d930291a89/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18166.447374 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-4,2026-08-10T06:50:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6207.269458,11582.274332,,17789.544,292.28125,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""aac371ceb2b71c3b1b026f3454bab51fe48a9a29b38068459d6af62f04abbd0c"",""session_sha256"":""dc1d5e6917f5bd4b97a03bec97f6c308078ad6c87322359e55e463e0c91d1a33"",""build_sha256"":""8c48e0207a4a33ca620a0cae925fc3775c862cc521f98e93a9bdeb42a03b010e""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-e8421f4be5aa264d4cc7856838b3aa3c3d8acda7/e8421f4be5aa264d4cc7856838b3aa3c3d8acda7;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-4/circom-register-verified/appium-e8421f4be5aa264d4cc7856838b3aa3c3d8acda7/session-e8421f4be5aa264d4cc7856838b3aa3c3d8acda7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,17789.544 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-5,2026-08-10T06:51:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6208.870208,11830.389833000001,,18039.26025,292.21875,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""8055b1bf76302f0375633f84231c619ef95129e9bae4dc9218c5a4021ab25d29"",""session_sha256"":""ddf1b655ac6f35f43ba018ede47f22ef9cba21111cddbae201c60423c5dcbe87"",""build_sha256"":""016fce7a56fab3dc0f5a40371ef960db9ea92032a4897752d1de6ca33c876d81""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-d03af49f0f1418a0b40a8743f05857ef189383f7/d03af49f0f1418a0b40a8743f05857ef189383f7;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-5/circom-register-verified/appium-d03af49f0f1418a0b40a8743f05857ef189383f7/session-d03af49f0f1418a0b40a8743f05857ef189383f7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18039.26025 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,6132.7222919999995,11035.131125,,17167.853751,,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17167.853751 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6154.406542,11329.655666999999,,17484.062375,289.75,2500,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17484.062375 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6159.8206660000005,11483.373458000002,,17643.194292,289.796875,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17643.194292 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6162.827834,11630.165292000002,,17792.993334,289.875,2504,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17792.993334 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6188.240625,11671.697417,,17859.938209,289.875,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17859.938209 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6198.617625,11754.712708000001,,17953.330709,289.875,2502,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17953.330709 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2172.8525,,2172.8525,530.65625,716750,2578799,2331760,2578799,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2172.8525 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2242.035291,,2242.035291,527.359375,716187,2514819,2267780,2514819,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2242.035291 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2898.778958,,2898.778958,526.703125,715938,2573939,2326900,2573939,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2898.778958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,2410.340917,,2410.340917,530.140625,714941,2565007,2317968,2565007,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2410.340917 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,2929.068875,,2929.068875,530.640625,715885,2547371,2300332,2547371,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2929.068875 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,2426.808625,,2426.808625,536.59375,715147,2519239,2272200,2519239,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2426.808625 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2137.248125,,2137.248125,,717410,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2137.248125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2242.047,,2242.047,538.09375,714730,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2242.047 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2244.620417,,2244.620417,556.046875,718955,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2244.620417 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,2315.447916,,2315.447916,568.015625,713994,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2315.447916 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,2304.393875,,2304.393875,573.609375,717286,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2304.393875 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,2322.712625,,2322.712625,575.828125,717635,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2322.712625 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,283.588792,4691.273167,,4974.862125,491.59375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4974.862125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,288.769333,4321.633625,,4610.403042,496.984375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4610.403042 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,307.65025,4593.549125,,4901.1995,481.046875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4901.1995 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,300.4865,4444.501334,,4744.987958,493.78125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4744.987958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,317.124917,4704.524709,,5021.64975,488.078125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,5021.64975 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,305.928125,4811.90775,,5117.835958,487.609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,5117.835958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,278.133166,4241.928583,,4520.062375,,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4520.062375 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,308.967083,4330.398917,,4639.366125,490.84375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4639.366125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,315.864333,4321.75475,,4637.619209,491.15625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4637.619209 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,318.497667,4321.779917,,4640.277709,491.171875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4640.277709 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,333.711875,4346.148625,,4679.860584,491.234375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4679.860584 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,314.228041,4364.101459,,4678.3295,491.265625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4678.3295 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-0,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,6008.152458,7739.520708,,13747.673208,293.5625,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,13747.673208 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-1,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6010.293625,8005.910458,,14016.204209,290.375,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14016.204209 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-2,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6014.683375,8144.886375,,14159.569834,290.34375,931,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14159.569834 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-3,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6032.077167,8303.620458,,14335.697667,290.453125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14335.697667 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-4,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6050.001375,8364.070791,,14414.072208,290.578125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14414.072208 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-5,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6044.670125,8409.414125,,14454.084375,290.375,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14454.084375 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,5996.592333,7797.286875,,13793.879541,,932,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,13793.879541 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6012.239375,8049.649292,,14061.888791,293.9375,925,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14061.888791 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6032.486083,8203.367833,,14235.854042,293.9375,926,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14235.854042 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6050.944667,8270.582666,,14321.527417,293.9375,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14321.527417 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6056.481625,8337.024417,,14393.506166,293.953125,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14393.506166 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6061.639,8389.270083,,14450.909209,293.953125,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14450.909209 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,1140.392959,,1140.392959,143.328125,632660,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1140.392959 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,919.743542,,919.743542,142.671875,634964,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,919.743542 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,1254.2595,,1254.2595,141.125,635604,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1254.2595 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,1199.335791,,1199.335791,141.90625,635764,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1199.335791 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,1337.309875,,1337.309875,141.453125,629195,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1337.309875 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,903.116333,,903.116333,144.53125,629740,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,903.116333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,909.477083,,909.477083,,632244,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,909.477083 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,1237.383833,,1237.383833,144.125,634644,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1237.383833 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,1172.487958,,1172.487958,141.921875,630516,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1172.487958 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,1084.921333,,1084.921333,142.34375,636724,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1084.921333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,1242.178792,,1242.178792,145.109375,634580,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1242.178792 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,1423.84775,,1423.84775,145.84375,633588,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1423.84775 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,323.8575,2519.133458,,2842.991,367.453125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2842.991 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,320.633958,2596.478208,,2917.112292,366.46875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2917.112292 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,327.897709,2559.122667,,2887.0205,375.875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2887.0205 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,316.197375,2559.387917,,2875.585416,371.515625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2875.585416 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,329.706041,2680.23325,,3009.939333,373.484375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,3009.939333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,338.01325,2719.800375,,3057.813708,378.375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,3057.813708 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,303.190333,2643.975458,,2947.166042,,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2947.166042 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,307.867584,2645.076833,,2952.944459,384.0625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2952.944459 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,304.529667,2464.748583,,2769.278333,384.171875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2769.278333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,317.14025,2606.420959,,2923.561291,384.953125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2923.561291 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,321.849959,2755.037334,,3076.887375,388.328125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,3076.887375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,318.147167,2719.777166,,3037.924417,387.5625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,3037.924417 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__cold_local-0,2026-08-14 09:30:14 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),warmup,0,ok,848.164125,4.564667,326.185791,2.464,1178.916541,141.640625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""2f01f001ed50054866b6f09275d3f6c9c0de38dbd85bcfd6d430cdf1f506b876"",""build"":""fd1ecb3bf5a30fb9e99fcd9b1be11a823d374f086aa0da889585d2adafd285d6"",""session"":""83823bee74117ed2df53aa8cf5a449706dd3f1cca012701b548186ac8a1a6050""}",2bbd16bc1cbd766f27f67bd3fead1042c93a116d/bb74e938435414e7a6de51d8445d92077c8a24f4,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/session.json,cold_local,1178.916541 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__cold_local-1,2026-08-14 09:30:14 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,1,ok,830.904875,4.466833,343.359208,2.513959,1178.732958,141.3125,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""2f01f001ed50054866b6f09275d3f6c9c0de38dbd85bcfd6d430cdf1f506b876"",""build"":""fd1ecb3bf5a30fb9e99fcd9b1be11a823d374f086aa0da889585d2adafd285d6"",""session"":""83823bee74117ed2df53aa8cf5a449706dd3f1cca012701b548186ac8a1a6050""}",2bbd16bc1cbd766f27f67bd3fead1042c93a116d/bb74e938435414e7a6de51d8445d92077c8a24f4,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/session.json,cold_local,1178.732958 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__cold_local-2,2026-08-14 09:30:14 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,2,ok,839.380959,4.871542,325.897834,2.4595,1170.152419,146.421875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""2f01f001ed50054866b6f09275d3f6c9c0de38dbd85bcfd6d430cdf1f506b876"",""build"":""fd1ecb3bf5a30fb9e99fcd9b1be11a823d374f086aa0da889585d2adafd285d6"",""session"":""83823bee74117ed2df53aa8cf5a449706dd3f1cca012701b548186ac8a1a6050""}",2bbd16bc1cbd766f27f67bd3fead1042c93a116d/bb74e938435414e7a6de51d8445d92077c8a24f4,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/session.json,cold_local,1170.152419 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__cold_local-3,2026-08-14 09:30:14 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,3,ok,865.671542,4.721583,324.869333,2.708875,1195.264458,143.8125,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""2f01f001ed50054866b6f09275d3f6c9c0de38dbd85bcfd6d430cdf1f506b876"",""build"":""fd1ecb3bf5a30fb9e99fcd9b1be11a823d374f086aa0da889585d2adafd285d6"",""session"":""83823bee74117ed2df53aa8cf5a449706dd3f1cca012701b548186ac8a1a6050""}",2bbd16bc1cbd766f27f67bd3fead1042c93a116d/bb74e938435414e7a6de51d8445d92077c8a24f4,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/session.json,cold_local,1195.264458 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__cold_local-4,2026-08-14 09:30:14 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,4,ok,849.935458,4.941875,338.266334,2.669167,1193.145959,141.75,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""2f01f001ed50054866b6f09275d3f6c9c0de38dbd85bcfd6d430cdf1f506b876"",""build"":""fd1ecb3bf5a30fb9e99fcd9b1be11a823d374f086aa0da889585d2adafd285d6"",""session"":""83823bee74117ed2df53aa8cf5a449706dd3f1cca012701b548186ac8a1a6050""}",2bbd16bc1cbd766f27f67bd3fead1042c93a116d/bb74e938435414e7a6de51d8445d92077c8a24f4,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/session.json,cold_local,1193.145959 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__cold_local-5,2026-08-14 09:30:14 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,5,ok,862.468125,4.895917,336.26425,2.750167,1203.63,141.546875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""2f01f001ed50054866b6f09275d3f6c9c0de38dbd85bcfd6d430cdf1f506b876"",""build"":""fd1ecb3bf5a30fb9e99fcd9b1be11a823d374f086aa0da889585d2adafd285d6"",""session"":""83823bee74117ed2df53aa8cf5a449706dd3f1cca012701b548186ac8a1a6050""}",2bbd16bc1cbd766f27f67bd3fead1042c93a116d/bb74e938435414e7a6de51d8445d92077c8a24f4,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-cold-fetch/2bbd16bc1cbd766f27f67bd3fead1042c93a116d/session-bb74e938435414e7a6de51d8445d92077c8a24f4/session.json,cold_local,1203.63 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-14 09:25:48 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),warmup,0,ok,0,4.624833,317.139333,2.445292,321.766041,,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""c28d1303c1031aa84ffa5d3035aa51afcf4e2616a60a614c4b9b8b095e4d8681"",""build"":""e228b553c8e6c51361142a99db56177f7f788bf5a342a388b07786b61184acb8"",""session"":""4531110144be5d35c045ea92d7c0a78184d643a9e16cbc1840c0a245d0be59f2""}",69e1acdc072c04776792c4741d202a4ad9f56915/5871c1f8443e9d6799c332e8e83d39d5cb0003ef,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/session.json,warm_reuse,321.766041 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-14 09:25:48 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,1,ok,0,4.635041,328.255375,2.696042,332.892458,150.484375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""c28d1303c1031aa84ffa5d3035aa51afcf4e2616a60a614c4b9b8b095e4d8681"",""build"":""e228b553c8e6c51361142a99db56177f7f788bf5a342a388b07786b61184acb8"",""session"":""4531110144be5d35c045ea92d7c0a78184d643a9e16cbc1840c0a245d0be59f2""}",69e1acdc072c04776792c4741d202a4ad9f56915/5871c1f8443e9d6799c332e8e83d39d5cb0003ef,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/session.json,warm_reuse,332.892458 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-14 09:25:48 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,2,ok,0,4.684667,356.940417,2.453042,361.627042,140.59375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""c28d1303c1031aa84ffa5d3035aa51afcf4e2616a60a614c4b9b8b095e4d8681"",""build"":""e228b553c8e6c51361142a99db56177f7f788bf5a342a388b07786b61184acb8"",""session"":""4531110144be5d35c045ea92d7c0a78184d643a9e16cbc1840c0a245d0be59f2""}",69e1acdc072c04776792c4741d202a4ad9f56915/5871c1f8443e9d6799c332e8e83d39d5cb0003ef,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/session.json,warm_reuse,361.627042 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-14 09:25:48 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,3,ok,0,4.622875,345.78625,2.409958,350.410917,140.59375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""c28d1303c1031aa84ffa5d3035aa51afcf4e2616a60a614c4b9b8b095e4d8681"",""build"":""e228b553c8e6c51361142a99db56177f7f788bf5a342a388b07786b61184acb8"",""session"":""4531110144be5d35c045ea92d7c0a78184d643a9e16cbc1840c0a245d0be59f2""}",69e1acdc072c04776792c4741d202a4ad9f56915/5871c1f8443e9d6799c332e8e83d39d5cb0003ef,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/session.json,warm_reuse,350.410917 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-14 09:25:48 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,4,ok,0,4.541875,331.48425,2.5735,336.028,139.546875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""c28d1303c1031aa84ffa5d3035aa51afcf4e2616a60a614c4b9b8b095e4d8681"",""build"":""e228b553c8e6c51361142a99db56177f7f788bf5a342a388b07786b61184acb8"",""session"":""4531110144be5d35c045ea92d7c0a78184d643a9e16cbc1840c0a245d0be59f2""}",69e1acdc072c04776792c4741d202a4ad9f56915/5871c1f8443e9d6799c332e8e83d39d5cb0003ef,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/session.json,warm_reuse,336.028 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-14 09:25:48 +0000,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,5,ok,0,4.774375,353.804916,2.640709,358.581708,146.296875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""c28d1303c1031aa84ffa5d3035aa51afcf4e2616a60a614c4b9b8b095e4d8681"",""build"":""e228b553c8e6c51361142a99db56177f7f788bf5a342a388b07786b61184acb8"",""session"":""4531110144be5d35c045ea92d7c0a78184d643a9e16cbc1840c0a245d0be59f2""}",69e1acdc072c04776792c4741d202a4ad9f56915/5871c1f8443e9d6799c332e8e83d39d5cb0003ef,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/build.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/browserstack-warm-fetch/69e1acdc072c04776792c4741d202a4ad9f56915/session-5871c1f8443e9d6799c332e8e83d39d5cb0003ef/session.json,warm_reuse,358.581708 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2772.417125,,2772.417125,554.265625,714522,2324912,2275692,2324912,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2772.417125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2879.950208,,2879.950208,554.140625,716218,2373452,2324232,2373452,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2879.950208 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2946.604,,2946.604,547.921875,714370,2388132,2338912,2388132,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2946.604 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,3315.102917,,3315.102917,556.03125,716216,2387368,2338148,2387368,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3315.102917 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,3142.408333,,3142.408333,551.21875,717544,2369352,2320132,2369352,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3142.408333 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,3031.44075,,3031.44075,556.375,717723,2386684,2337464,2386684,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3031.44075 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2987.521167,,2987.521167,,712759,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,2987.521167 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,3374.250958,,3374.250958,561.265625,715532,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3374.250958 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,3054.951167,,3054.951167,577.171875,716745,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3054.951167 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,3222.688875,,3222.688875,589.75,715440,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3222.688875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,3016.537291,,3016.537291,591.796875,719840,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3016.537291 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,3171.360292,,3171.360292,592.59375,712265,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3171.360292 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1033.621084,4173.030667,,5206.651875,540.0625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5206.651875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1043.084958,3994.710292,,5037.795458,528.109375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5037.795458 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1072.522292,4008.883292,,5081.405667,554.0625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5081.405667 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1055.143,4061.1945,,5116.337541,532.234375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5116.337541 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1069.207583,4225.806417,,5295.014083,536.609375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5295.014083 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1135.534583,4131.623625,,5267.158292,537.203125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5267.158292 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1022.695417,4024.849833,,5047.545875,,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5047.545875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1091.779125,4019.158917,,5110.938125,566.609375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5110.938125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1130.776875,4098.645125,,5229.422041,570.34375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5229.422041 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1155.52975,3930.39975,,5085.929583,566.734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5085.929583 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1161.810417,4184.801375,,5346.612,581.46875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5346.612 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1180.926959,4172.13675,,5353.063792,585.859375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5353.063792 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-0,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,102420.876125,39876.665209,,142297.541375,872.21875,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,142297.541375 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-1,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,106936.38175,40870.077917,,147806.459792,862,1001,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,147806.459792 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-2,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,111014.192708,41400.739833,,152414.932583,867.203125,1003,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,152414.932583 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-3,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,109002.410042,40991.395834,,149993.805958,866.984375,1000,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,149993.805958 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-4,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,110082.735042,41763.033666,,151845.768833,866.984375,1004,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,151845.768833 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-5,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,110299.300084,41123.632709,,151422.932916,866.984375,1004,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,151422.932916 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,100787.023042,39877.106875,,140664.130291,,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,140664.130291 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,102831.955084,39591.856292,,142423.8115,869.40625,1001,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,142423.8115 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,103634.922416,39590.931875,,143225.854375,860.1875,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,143225.854375 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,103800.913625,39740.896375,,143541.810125,865.625,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,143541.810125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,104146.095833,40541.362334,,144687.458208,864.765625,1000,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,144687.458208 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,106845.61075,40982.819958,,147828.431083,865.40625,1003,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,147828.431083 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-0,2026-08-09T20:01:36.397Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,150764.229547,,150764.229547,777.4140625,735992,4240241,3968384,4240241,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""8c4eec0aac6ee6700f1f2e366aba6618579c86b3292ebf9b214018903dad9837""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-0/results.json,cold_local,150764.229547 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-1,2026-08-09T20:14:08.206Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,151292.213163,,151292.213163,707.79296875,740608,4188373,3916516,4188373,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""8ebb89be567c08eec7930837e20f75a6a3d410c2a11edfb242f29ebd8c74d914""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-1/results.json,cold_local,151292.213163 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-2,2026-08-09T20:26:39.589Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,152077.526855,,152077.526855,791.62890625,742458,4238025,3966168,4238025,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4f44326cfcfd9aa917784c8c3310f443054d0f13846908e4ddb0dca91bd1fab2""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-2/results.json,cold_local,152077.526855 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-3,2026-08-09T21:34:42.018Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,152313.415163,,152313.415163,771.859375,739838,4211625,3939768,4211625,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""0712859473d19ba69564c6b524c3e7e7b168adb645c8a418576a74cebf98e3a3""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry4-20260809/passport/run-3/results.json,cold_local,152313.415163 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-4,2026-08-09T20:41:20.676Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,150512.474239,,150512.474239,830.234375,737221,4218333,3946476,4218333,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""961dd84deedfd89da331a200760454ff843d2b03bacfeb48c761acaae6945906""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-4/results.json,cold_local,150512.474239 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-5,2026-08-09T20:53:52.047Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,152458.801547,,152458.801547,815.375,739700,4244457,3972600,4244457,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""22ab696bcf14bd0762fca85e6cbba02f0c70f332ce772ed3df8498f87bc5f66d""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-5/results.json,cold_local,152458.801547 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,151892.272316,,151892.272316,,739136,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151892.272316 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,151278.737471,,151278.737471,842.05078125,739427,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151278.737471 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,151264.522855,,151264.522855,879.7734375,738045,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151264.522855 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,152133.721778,,152133.721778,623.71875,741328,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,152133.721778 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,151222.247778,,151222.247778,863.24609375,740506,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151222.247778 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,151117.975086,,151117.975086,895,737789,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151117.975086 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T11:36:22.696Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,2865.287154,203079.489551,,205944.77755,706.30859375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""25b249e2c2da4e08e3bb89806c009a2afa43de3481cbdee454ea4f094a7ab639""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-0/results.json,cold_local,205944.77755 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T11:47:36.110Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,2872.622538,205042.635782,,207915.259704,773.95703125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c0194e04bdc10c8acf271f853cdced7aaa3321ac3c9cf365602b202003b0f4f6""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-1/results.json,cold_local,207915.259704 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T11:58:48.823Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,2895.865616,202800.136936,,205696.003397,744.1015625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""93e05d44ad0729418162f1db79ac4fe9872921d932fb06d2b717e6434e9165cd""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-2/results.json,cold_local,205696.003397 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T12:10:02.560Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,2851.148923,204448.643628,,207299.793551,705.546875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""0c1abf53be299a461d558926f17b8cbb277bcefb52b0beba681ec5e03f1189f7""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-3/results.json,cold_local,207299.793551 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T12:21:11.991Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,2872.618462,203511.816704,,206384.436013,717.3828125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""80baf1a897b600cb94440cc26e21177685766586c0c69c9fe69aed696f8d1ec6""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-4/results.json,cold_local,206384.436013 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T12:32:28.475Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,2858.514462,207933.075474,,210791.590859,711.4765625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d0f3b90a45f3af7afb5f5091d5022f00fcf3fe8da60b32ec9d6a96d813f5abc9""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-5/results.json,cold_local,210791.590859 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,2850.672923,203002.677551,,205853.352243,,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205853.352243 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,2867.334385,202867.789782,,205735.125012,759.42578125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205735.125012 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,2871.198461,202466.879089,,205338.078705,765.3828125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205338.078705 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,2878.200308,203673.143396,,206551.344628,705.96484375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,206551.344628 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,2881.895308,201911.566705,,204793.463089,783.296875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,204793.463089 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,2863.949461,202657.051089,,205521.00132,733.0390625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205521.00132 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-0,2026-08-10T20:05:07.858Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,22770.162616999998,316986.161249,,339756.325328,287.4921875,2502,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""367f6d30d2856c1290fa956ed98038805fed9d77febe599b7bf8f9523e339e43""},{""raw_evidence_sha256"":""2c629da556dd571d88127c2abbda0751fe1835299854e317b68ed5982c7e7336""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-0/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-0/results.json,cold_local,339756.325328 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-1,2026-08-10T20:15:22.523Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,22814.156001000003,316563.82448,,339377.981328,267.12109375,2504,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""66dbbf9de33484be01bbadca381df4d72e0a8e232594d87af924ae11cd3f103a""},{""raw_evidence_sha256"":""c3290e596f6ab0dc50f77eb8ce5446ac4c248eb92593b4c0a44fed6186b15723""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-1/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-1/results.json,cold_local,339377.981328 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-2,2026-08-10T20:25:37.923Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,22781.725541,317217.515096,,339999.24225199997,292.41015625,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""91960ad86c25fbd03b2d498638cf3fe12a43f8f9a50dc36fac4f89854880b449""},{""raw_evidence_sha256"":""add4e077b6069e46031b36a8d4b962e61c693a3dabf6d66c5abdb55510cd2ed9""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-2/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-2/results.json,cold_local,339999.24225199997 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-3,2026-08-10T20:35:56.948Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,22781.040079,317586.012404,,340367.05409600004,296.34375,2497,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""4ef071cda4677b8ad33b66b4a1c29534ae75a73d33b7ebf78311c289fe9bbb1c""},{""raw_evidence_sha256"":""b08e0a71418c1691322d688a6e28209e0c23636f17cfa1245e34d6fec312342b""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-3/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-3/results.json,cold_local,340367.05409600004 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-4,2026-08-10T20:46:13.929Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,22766.413694000003,316793.28925000003,,339559.704328,298.40625,2501,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""cf84107d76860ed7cf1955db87589b50894e0947f49c98cc0e3ee54fdfb75a1f""},{""raw_evidence_sha256"":""a44ebae9eecba28f98c62bfbb4ab5e51f55e92c955097555369bda464cb815f2""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-4/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-4/results.json,cold_local,339559.704328 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-5,2026-08-10T20:56:29.449Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,22762.995386,317206.783481,,339969.780481,291.21484375,2501,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""e98aa230521d813f8c507d0244fbf70244f3a1c3d5e4f9f2332e8d0f1284d346""},{""raw_evidence_sha256"":""1516fd5c363ea5beda32307c12705ef252b9192ecdb0a2f5c98286b9e7e3b936""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-5/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-5/results.json,cold_local,339969.780481 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,22851.894154999998,316427.88494200003,,339279.781559,,2499,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,339279.781559 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,22846.480925,315078.723019,,337925.205097,292.33203125,2504,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,337925.205097 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,22848.462771000002,315869.995942,,338718.46063600003,273.3984375,2502,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,338718.46063600003 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,22873.333771,316506.086019,,339379.421251,290.46484375,2497,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,339379.421251 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,22868.431617000002,315780.222787,,338648.656021,289.47265625,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,338648.656021 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,22842.737156,314969.260326,,337811.999021,287.52734375,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,337811.999021 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-0,2026-08-09T19:29:52.352Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,21931.14554,,21931.14554,473.82421875,714537,2544947,2297908,2544947,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""1adc9289e38ec836cebb9e7d02642b2280df2f552341e2d5c48f5e904edd70ee""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-0/results.json,cold_local,21931.14554 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-1,2026-08-09T21:19:58.552Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,37041.281771,,37041.281771,804.08984375,716512,2546303,2299264,2546303,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""499de31c42b13d58caba4c553b037393bd17558d272aba58810a21f88f069836""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry2-20260809/passport-p1/run-1/results.json,cold_local,37041.281771 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-2,2026-08-09T19:36:13.158Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,22010.566386,,22010.566386,475.72265625,714242,2561167,2314128,2561167,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4219d81524f94194e24a572de6701df98acfc2585ab68f1592bd23d6dc7b6a19""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-2/results.json,cold_local,22010.566386 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-3,2026-08-09T19:40:23.451Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,22004.165925,,22004.165925,470.55078125,717141,2534723,2287684,2534723,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""abb6d31172c9eb62445880fa1681bdee7a44e701428f15a5ff6d2e94e92534e7""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-3/results.json,cold_local,22004.165925 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-4,2026-08-09T19:44:30.877Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,21936.455616,,21936.455616,473.8046875,716285,2561447,2314408,2561447,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""bcb3a37e29e031da1db24ed43a49228fa57b70520f9390f51c5a94dda1a4aca3""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-4/results.json,cold_local,21936.455616 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-5,2026-08-09T19:49:02.544Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,21932.071156,,21932.071156,474.06640625,716138,2549071,2302032,2549071,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""73f1e2b814e1e7170fe46286b2096bf6e5b5082db2c3b5519374e508b7566710""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-5/results.json,cold_local,21932.071156 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,22012.132616,,22012.132616,,715538,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22012.132616 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,22013.30554,,22013.30554,468.4765625,716398,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22013.30554 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,21946.08954,,21946.08954,472.41796875,715701,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21946.08954 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,21960.394386,,21960.394386,473.38671875,713658,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21960.394386 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,22017.082848,,22017.082848,471.8828125,713578,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22017.082848 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,21965.429847,,21965.429847,471.87890625,717491,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21965.429847 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T10:47:29.617Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1930.646462,115098.799392,,117029.447007,465.24609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c8305a812976dc175ab872236aa6b088ddbd36c47b4c5e0bc26e82ce6c0bfa8e""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-0/results.json,cold_local,117029.447007 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T10:55:00.924Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1938.775616,115207.859392,,117146.636084,459.99609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""2d369cdc201378381b9492f05f0953ea39eb03b7f52b2c110e223b7f40eb7064""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-1/results.json,cold_local,117146.636084 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T11:02:33.065Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1934.800077,115154.204314,,117089.005468,466.125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""3776758f3143e02c849aad1358a73a39ebbfbcfc2724c5d71aa78a8752d56674""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-2/results.json,cold_local,117089.005468 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T11:10:03.637Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1938.140693,115850.475623,,117788.617315,465.1484375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""1ab20865d70ba9b594487a57d197a70b75148721eadd75a25d8e616a3211c92d""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-3/results.json,cold_local,117788.617315 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T11:17:36.073Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1938.114154,115212.368545,,117150.483622,465.85546875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""16ecdfdc963615f034092563ea6298879949b75d88a594141840bc7edb3e1aa0""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-4/results.json,cold_local,117150.483622 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T11:25:09.090Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1940.772231,115395.711161,,117336.484622,461.2109375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""4e89cbbb427961004c4949ca99e6fbad762e23a088fc23c79d5b30868cc5f119""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-5/results.json,cold_local,117336.484622 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1940.787077,115001.471699,,116942.260392,,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,116942.260392 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1937.975769,115208.417853,,117146.394699,468.6953125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117146.394699 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1936.869308,115176.956007,,117113.826392,468.7734375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117113.826392 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1934.062231,115440.940623,,117375.00393,470.2265625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117375.00393 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1941.104846,115179.304237,,117120.410084,475.015625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117120.410084 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1938.620923,115332.492545,,117271.114776,471.125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117271.114776 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-0,2026-08-10T21:06:43.851Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,21865.903309,219933.206475,,241799.110476,286.54296875,925,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""afc55c72c7a26a75ac3efd85759bffaaaac3f8e934d6d7825fe9b09a5ac907e1""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-0/results.json,cold_local,241799.110476 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-1,2026-08-10T21:16:57.847Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,21841.26554,219946.51209,,241787.778476,293.37109375,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""41b688b9fd447a2bfd12f7a33c2f7033e740e879a2ba93f1b9dc557196fe68c2""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-1/results.json,cold_local,241787.778476 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-2,2026-08-10T21:27:11.559Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,21889.267694,219716.131705,,241605.40063,293.5546875,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""10bc42d7e8cd6ff32e41fd32aa15bb8a4b5fe4572f6e6f379339fa18eb7ef40e""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-2/results.json,cold_local,241605.40063 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-3,2026-08-10T21:37:28.321Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,21855.38454,219855.616629,,241711.001861,292.140625,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""984facc03fc0a515947cc7e7f08656c4e60c47c6396ec8a647d35cbbff071b15""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-3/results.json,cold_local,241711.001861 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-4,2026-08-10T21:47:42.211Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,21859.755309,219596.209936,,241455.965784,297.5703125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""62d3a7935d4c9bec9adabb3693f142ca1113deee2d445a9eb6576ccb9ca41f56""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-4/results.json,cold_local,241455.965784 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-5,2026-08-10T21:57:55.559Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,21850.164078,219582.274705,,241432.439707,292.16796875,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5b4a3f2cdb94cc3bcfe2b37b101c4ce699fb36be1da5ecd36d01e35cd74290fd""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-5/results.json,cold_local,241432.439707 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,21838.82854,219571.219013,,241410.048707,,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,241410.048707 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,21935.204925,217164.146474,,239099.352015,289.1328125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239099.352015 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,21834.133463,217989.376859,,239823.511091,290.3828125,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239823.511091 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,21835.60154,218252.675321,,240088.277784,283.71875,926,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,240088.277784 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,21840.064848,217806.936706,,239647.002476,276.57421875,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239647.002476 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,21838.055771,217892.081475,,239730.13763,286.06640625,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239730.13763 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-0,2026-08-09T17:49:39.722Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,12584.178155,,12584.178155,145.85546875,632532,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""09ac8e4947b96f9397ef34b4b05de4f398f08bc9cdd677697d132111e6ecaefc""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-0/results.json,cold_local,12584.178155 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-1,2026-08-09T17:52:09.957Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,12680.550155,,12680.550155,144.88671875,636500,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""3b2677e383c3f9eacd1788ee85a3ccdd978efbf5cd4a46b5ddb108cc108e9a29""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-1/results.json,cold_local,12680.550155 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-2,2026-08-09T17:54:13.505Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,12466.876924,,12466.876924,145.1015625,634516,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9f9c74a226bcbf2c9b7afd64c23e4266b4a5c596861b4b99265d7d916833c1ee""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-2/results.json,cold_local,12466.876924 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-3,2026-08-09T21:04:59.575Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,12799.092386,,12799.092386,170.140625,634548,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""54ec9c0e17a3bebdc546c5c73fa6f139df54cb14cfd9d988ebf56b3b2fc87002""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry-20260809/oprf/run-3/results.json,cold_local,12799.092386 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-4,2026-08-09T17:58:28.620Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,12725.462078,,12725.462078,140.03515625,633096,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""2bb6eb16cf831f0e35cf8dfb8c095815ccc7c57758faadc9371e821018cf7be5""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-4/results.json,cold_local,12725.462078 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-5,2026-08-09T18:00:33.037Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,12444.639693,,12444.639693,145.078125,634868,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4c79106dd34e329ccedb44c559c6b4b3e7cd3b2cf9d9e42cd9f9d6af1bfd3fd8""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-5/results.json,cold_local,12444.639693 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,12162.576385,,12162.576385,,634836,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12162.576385 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,10413.302462,,10413.302462,145.93359375,631668,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10413.302462 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,10142.202539,,10142.202539,147.703125,632948,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10142.202539 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,10756.831616,,10756.831616,160.46484375,623775,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10756.831616 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,12584.569463,,12584.569463,158.10546875,632852,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12584.569463 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,12419.088693,,12419.088693,158.046875,626597,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12419.088693 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T07:57:50.331Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1883.057847,68266.155004,,70149.213543,318.24609375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""52c5dec4dd733ada22482652940c33f0620cca205fbc5c7127cee1133c93684e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-0/results.json,cold_local,70149.213543 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T09:35:27.717Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1888.725538,68274.720235,,70163.445927,306.59765625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""998f6f8068611896ea01432316048f8ae03ccf7600448157a91a2d5bef52832a""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-1/results.json,cold_local,70163.445927 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T09:40:50.624Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1882.602462,68229.872619,,70112.475697,306.09375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""de0477de370a6baf2aea70c0f55edf312a8a3b51e6b2e18105436d8a0ad19b89""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-2/results.json,cold_local,70112.475697 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T09:46:12.899Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1892.495308,68252.736004,,70145.231774,305.1796875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""03340fc290cbddd7555ae20c9de7f272552952b9aa40553af91747eca7265192""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-3/results.json,cold_local,70145.231774 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T09:51:32.631Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1892.782461,68287.56185,,70180.345466,307.2578125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""57fe05ea8648843c9ecc5c83c9ac60ed8a2ec12827670903f2479366d9060b75""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-4/results.json,cold_local,70180.345466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T09:56:55.485Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1887.943385,68227.946234,,70115.891158,303.5078125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""7d1d1f7c2db24881e8cbb594f3da736032c22fb59a1934934ab68e3f66699756""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-5/results.json,cold_local,70115.891158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1888.348615,68189.509312,,70077.859465,,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70077.859465 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1889.628538,67988.621235,,69878.250696,301.96875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,69878.250696 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1875.327384,68222.355158,,70097.683388,302.1484375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70097.683388 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1876.999154,68142.220927,,70019.221466,300.45703125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70019.221466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1875.057154,68249.552312,,70124.610158,301.87890625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70124.610158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1893.020615,69120.355389,,71013.376312,300.59375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,71013.376312 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__cold_local-0,2026-08-14T10:21:08.705Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),warmup,0,ok,7865.110154,71.409,3401.488616,32.37377,11338.032308,88.76171875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""6c9c90d2834e82f08ba3f5b257c68abef27f1737eee8809593495e24882fa236""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11338.032308 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__cold_local-1,2026-08-14T10:21:08.705Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,1,ok,7900.213847,71.302461,3528.713847,29.789845999999997,11500.253617,88.109375,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""6c9c90d2834e82f08ba3f5b257c68abef27f1737eee8809593495e24882fa236""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11500.253617 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__cold_local-2,2026-08-14T10:21:08.705Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,2,ok,7984.842462,70.734846,3591.649924,30.051308,11647.251616,81.8515625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""6c9c90d2834e82f08ba3f5b257c68abef27f1737eee8809593495e24882fa236""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11647.251616 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__cold_local-3,2026-08-14T10:21:08.705Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,3,ok,8031.249231000001,70.536,3597.973154,34.136616000000004,11699.781154,88.5625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""6c9c90d2834e82f08ba3f5b257c68abef27f1737eee8809593495e24882fa236""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11699.781154 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__cold_local-4,2026-08-14T10:21:08.705Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,4,ok,7849.530154,70.781846,3559.136693,29.876,11479.471693,76.76171875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""6c9c90d2834e82f08ba3f5b257c68abef27f1737eee8809593495e24882fa236""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11479.471693 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__cold_local-5,2026-08-14T10:21:08.705Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,5,ok,7839.399077,70.746846,3590.208,29.740230999999998,11500.377077000001,76.5625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""6c9c90d2834e82f08ba3f5b257c68abef27f1737eee8809593495e24882fa236""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11500.377077000001 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__warm_reuse-0,2026-08-14T10:21:38.816Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),warmup,0,ok,7804.613847,71.164923,3505.7982309999998,29.930077,11381.600000999999,83.9921875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""99534e6218a7644be7739e87367638fdb9e05b9fa6ffe947e9f0a54e2dfa1240""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,11381.600000999999 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__warm_reuse-1,2026-08-14T10:21:38.816Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,1,ok,0,71.117231,3594.929231,33.630385,3666.069616,83.9921875,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""99534e6218a7644be7739e87367638fdb9e05b9fa6ffe947e9f0a54e2dfa1240""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,3666.069616 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__warm_reuse-2,2026-08-14T10:21:38.816Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,2,ok,0,70.675692,3441.174154,29.796615,3511.8732299999997,89.03515625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""99534e6218a7644be7739e87367638fdb9e05b9fa6ffe947e9f0a54e2dfa1240""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,3511.8732299999997 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__warm_reuse-3,2026-08-14T10:21:38.816Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,3,ok,0,70.706384,3469.52277,29.577846,3540.2519230000003,89.03515625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""99534e6218a7644be7739e87367638fdb9e05b9fa6ffe947e9f0a54e2dfa1240""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,3540.2519230000003 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__warm_reuse-4,2026-08-14T10:21:38.816Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,4,ok,0,70.703616,3595.419462,29.541616,3666.147001,89.03515625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""99534e6218a7644be7739e87367638fdb9e05b9fa6ffe947e9f0a54e2dfa1240""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,3666.147001 +input-to-proof-v1-taceo-oprf-20260814,oprf_nullifier__motorola_e15__circom_groth16__warm_reuse-5,2026-08-14T10:21:38.816Z,motorola_e15,moto e15,14,"armeabi-v7a,armeabi",android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,taceo-groth16-0.2.1,circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep),measured,5,ok,0,70.693769,3572.4680009999997,29.895999999999997,3643.1866929999997,89.03515625,128,26812268,26806658,26812268,,input-to-proof-v1-taceo-groth16-0.2.1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""circom_helpers"":""8aacd73ed6ab0a2b9b2158e613acfa920860865a"",""circom_witness_rs"":""e11206a9f453145dcd6b814523cbfba4f60cf5c6"",""taceo_groth16"":""0.2.1"",""taceo_groth16_material"":""0.4.2"",""witness_graph_patch"":""circom-helpers-graph-api.patch"",""android_abi_patch"":""as_limbs()[0] as usize""}","{""zkey"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""graph"":""785a946147ed5d6f349aed1833dc9de11b16e4d6a88a5403b1c66ece0a289081"",""input"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40"",""report"":""99534e6218a7644be7739e87367638fdb9e05b9fa6ffe947e9f0a54e2dfa1240""}",ZY32M6782K,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/taceo-v021/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,3643.1866929999997 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-0,2026-08-09T18:06:53.295Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,27751.064925,,27751.064925,496.4609375,718163,2390932,2341712,2390932,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""f2e0ff7e7588dbed87ff8946aef1a8017d03860987d252ecddea0a04fc7ee65e""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-0/results.json,cold_local,27751.064925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-1,2026-08-09T18:11:05.720Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,27910.810463,,27910.810463,493.00390625,716743,2363144,2313924,2363144,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d60fc911089738a04c32e1dc20f8472b4a00ec86ee9f3cc098c00f96d0ff0442""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-1/results.json,cold_local,27910.810463 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-2,2026-08-09T19:15:04.224Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,27714.982386,,27714.982386,500.12109375,716211,2384412,2335192,2384412,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""0a71e2ffe395f25cb86883ce326e43ea5d5ec9f415d1ff0765f4152c92d37f70""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-2/results.json,cold_local,27714.982386 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-3,2026-08-09T19:19:15.319Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,27812.34954,,27812.34954,494.33203125,714300,2322424,2273204,2322424,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""593b56a00bebece2303ebbb221ab168493bed04dc656cac067f91f82c702d7c7""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-3/results.json,cold_local,27812.34954 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-4,2026-08-09T19:23:34.521Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,28003.115386,,28003.115386,491.296875,718670,2406852,2357632,2406852,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""bf346e612a20bc5b83e06797cb94c32a9b95e697ef3ea6d830d2253a32a8d891""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-4/results.json,cold_local,28003.115386 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-5,2026-08-09T21:09:23.421Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,27901.663771,,27901.663771,494.79296875,716291,2336580,2287360,2336580,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""6208691e252755688904025e0c40a7c4516edf2a62877a522d4ad144bca8bb62""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry-20260809/webauthn/run-5/results.json,cold_local,27901.663771 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,27986.81054,,27986.81054,,715639,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27986.81054 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,27898.193771,,27898.193771,493.74609375,715277,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27898.193771 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,27803.135617,,27803.135617,491.97265625,715049,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27803.135617 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,27862.763617,,27862.763617,501.51171875,716193,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27862.763617 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,27743.926233,,27743.926233,500.5625,712986,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27743.926233 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,27767.005925,,27767.005925,502.0390625,710361,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27767.005925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T10:04:06.562Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,7453.589847,107470.601853,,114924.192853,486.23828125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""3d3e0937e8ecb2a964b3ae04e58eba0ba1ad220f3dd426ad73580efdd2794a37""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-0/results.json,cold_local,114924.192853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T10:11:16.913Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,7464.466385,106320.877467,,113785.344853,490.734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""1959c4bb4de693d8e213388939aa3fff408ce6a4bfd39bb7430079b7d7399cae""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-1/results.json,cold_local,113785.344853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T10:18:26.772Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,7463.362462,107215.131775,,114678.495315,493.37890625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c7eebf005b62db532f56b4ba72caaa77ddf7fa4da0229c941fcf5b3dde183ede""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-2/results.json,cold_local,114678.495315 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T10:25:39.076Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,7442.536539,107617.012622,,115059.550238,492.9296875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d727ff17466c2d0280bf99f6391ed4e4c78714a199bf8d4fd58c4624b14ec071""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-3/results.json,cold_local,115059.550238 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T10:32:50.164Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,7455.639385,107196.120929,,114651.761238,494.9140625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""76261f17a59e8f803f69b08b1569e91056b5bacc951373fa414e09ec45285e4b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-4/results.json,cold_local,114651.761238 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T10:39:59.829Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,7464.392616,106954.437853,,114418.831468,494.05078125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d050f00a18626bf659e7f8efbb3c68361c40c320237f99acb68ab0d9a69e6422""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-5/results.json,cold_local,114418.831468 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,7427.613232,107333.576545,,114761.191161,,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114761.191161 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,7449.868847,107294.658468,,114744.528315,494.7265625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114744.528315 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,7461.823385,107155.801468,,114617.625853,502.796875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114617.625853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,7443.431078,107235.876545,,114679.308623,504.30859375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114679.308623 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,7451.634231,107122.822776,,114574.458468,506.52734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114574.458468 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,7443.167308,107202.061775,,114645.229776,506.37890625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114645.229776 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local-gap,2026-08-11T10:47:03.183Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6 (split helper canary),gap,,runtime_failed,,,,,,,,,,,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""report_sha256"":""41d6c31a71f5d19c512b9d240517ff372dd75ed6c026fa4c1be3ef5ce3e516ee"",""logcat_sha256"":""cfccf2a1be99f36e3968e157868513a43fc6b08f9e9e475a2574b87019499255""}",,"This is an explicit E15 input-to-proof gap. It is not a zero measurement, and no iPhone, Mac, or browser value is substituted.",out_of_memory,"Rapidsnark failed in the native E15 worker with `mmap failed: Out of memory`. The pinned WebAuthn zkey is 1,733,145,772 bytes and the frozen WTNS is 109,218,412 bytes; the 32-bit E15 could not create the proving mappings. Repeated helper-split and unmap canaries did not produce a stable valid run.",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/circom-webauthn-helper-unmap-canary-20260811/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/circom-webauthn-helper-unmap-canary-20260811/circom_webauthn_input_to_proof.logcat.txt,cold_local, +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,459162.841874,856718.871744,,1315881.714925,,1005,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1315881.714925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,459192.934565,864361.80159,,1323554.737002,776.859375,1001,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1323554.737002 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,460037.603105,862393.702743,,1322431.306233,663.66796875,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1322431.306233 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,459024.957566,860136.160974,,1319161.119694,705.38671875,1005,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1319161.119694 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,459224.595335,853365.856667,,1312590.452616,717.85546875,1003,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1312590.452616 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,459426.71272,853232.236667,,1312658.950001,810.06640625,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1312658.950001 diff --git a/benchmarks/v1/input-to-proof-data/manifest.json b/benchmarks/v1/input-to-proof-data/manifest.json new file mode 100644 index 000000000..4460f41ff --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/manifest.json @@ -0,0 +1,65 @@ +{ + "schema_version": 1, + "campaign_id": "input-to-proof-v1-20260807", + "sampling": { "warmups": 1, "measured": 5, "sequential": true }, + "workloads": [ + "passport_complete_age_check", + "passport_p1", + "oprf_o2", + "webauthn_closest_analogue" + ], + "timing_modes": { + "cold_local": "Fresh process/runtime per attempt; hash-verified assets are local and network transfer is excluded.", + "warm_reuse": "One initialized runtime is reused; every attempt still regenerates its witness and proof." + }, + "e15_status": { + "successful_logical_series": 23, + "gap_logical_series": 1, + "gap_manifest": "benchmarks/v1/input-to-proof-data/e15-webauthn-cold-gap.json", + "gap": { + "series": "webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local", + "status": "runtime_failed", + "failure_code": "out_of_memory" + } + }, + "final_export": { + "path": "benchmarks/v1/input-to-proof-data/input-to-proof-samples.csv", + "sha256": "388ec30b6331792b741e1f4248929a1cabd2174f60c15b5663297dc170fd731e", + "logical_series": 72, + "successful_series": 69, + "gap_series": 3, + "rows": 417, + "successful_attempt_rows": 414, + "gap_rows": 3, + "campaign_ids": [ + "input-to-proof-v1-20260807", + "input-to-proof-v1-mac-multithread-16-20260812", + "input-to-proof-v1-taceo-oprf-20260814" + ] + }, + "headline": "input_to_proof_time_ms", + "verification": "Valid-proof acceptance and tampered-proof rejection are mandatory and excluded from headline latency.", + "pins": { + "provekit_v1": "9b2a6f37c67691eab4b0cec6c35e35c520e93285", + "provekit_noir": "1.0.0-beta.11", + "oprf_noir_compat_commit": "7831dca615db55147c60f49415af6e86730df090", + "barretenberg_noir": "1.0.0-beta.19", + "bb_js": "4.2.0-aztecnr-rc.2", + "mopro": "0.3.7", + "circom": "2.2.2", + "snarkjs": "0.7.6", + "rust_witness": "0.1.6", + "rust_rapidsnark": "0.1.4", + "rust_rapidsnark_commit": "fcf92e7454600109e4eab4a0c907e8d59649fd9c", + "wasmi_iphone_oprf": "0.46.0", + "taceo_circom_helpers_commit": "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + "taceo_circom_witness_rs_commit": "e11206a9f453145dcd6b814523cbfba4f60cf5c6", + "taceo_groth16": "0.2.1", + "taceo_groth16_material": "0.4.2" + }, + "publication_boundaries": { + "mac_chrome": "browser_wasm", + "iphone_se_2022": "ios_native", + "motorola_e15": "android_native" + } +} diff --git a/benchmarks/v1/input-to-proof-data/merge-mac-fixed16.ts b/benchmarks/v1/input-to-proof-data/merge-mac-fixed16.ts new file mode 100644 index 000000000..83c11ad4c --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/merge-mac-fixed16.ts @@ -0,0 +1,120 @@ +import { resolve } from "node:path"; +import { CSV_COLUMNS } from "./schema"; + +type Row = Record<(typeof CSV_COLUMNS)[number], string>; + +const here = import.meta.dir; +const canonicalPath = resolve( + process.env.INPUT_TO_PROOF_CANONICAL_CSV ?? resolve(here, "input-to-proof-samples.csv"), +); +const replacementPath = resolve( + process.env.INPUT_TO_PROOF_FIXED16_CSV ?? + resolve(here, "../legacy/wasm/wasm-multithread-16-samples.csv"), +); +const outputPath = resolve( + process.env.INPUT_TO_PROOF_MERGED_OUTPUT_CSV ?? canonicalPath, +); + +function assert(condition: unknown, message: string): asserts condition { + if (!condition) throw new Error(message); +} + +function parseCsv(text: string): string[][] { + const rows: string[][] = []; + let row: string[] = []; + let value = ""; + let quoted = false; + for (let index = 0; index < text.length; index += 1) { + const character = text[index]; + if (quoted) { + if (character === '"' && text[index + 1] === '"') { + value += '"'; + index += 1; + } else if (character === '"') { + quoted = false; + } else { + value += character; + } + } else if (character === '"') { + quoted = true; + } else if (character === ",") { + row.push(value); + value = ""; + } else if (character === "\n") { + row.push(value); + rows.push(row); + row = []; + value = ""; + } else if (character !== "\r") { + value += character; + } + } + assert(!quoted, "CSV contains an unterminated quoted field"); + if (value.length || row.length) { + row.push(value); + rows.push(row); + } + return rows; +} + +function readRows(text: string, label: string): Row[] { + const parsed = parseCsv(text); + const header = parsed.shift(); + assert(header?.join("\0") === CSV_COLUMNS.join("\0"), `${label}: schema/order differs from input-to-proof-samples.csv`); + return parsed.filter((values) => values.length > 1).map((values, rowIndex) => { + assert(values.length === CSV_COLUMNS.length, `${label}: row ${rowIndex + 2} has ${values.length} fields, expected ${CSV_COLUMNS.length}`); + return Object.fromEntries(CSV_COLUMNS.map((column, index) => [column, values[index]])) as Row; + }); +} + +function csvValue(value: string) { + return /[",\r\n]/.test(value) ? `"${value.replaceAll('"', '""')}"` : value; +} + +function seriesKey(row: Row) { + return [row.circuit, row.hardware, row.prover, row.timing_mode].join("|"); +} + +const canonicalRows = readRows(await Bun.file(canonicalPath).text(), "canonical CSV"); +const fixedRows = readRows(await Bun.file(replacementPath).text(), "fixed-16 CSV"); +assert(fixedRows.length === 134, `fixed-16 CSV expected 134 rows, found ${fixedRows.length}`); +assert(fixedRows.every((row) => row.hardware === "macbook_m4"), "fixed-16 CSV contains non-Mac rows"); + +const fixedBySeries = new Map(); +for (const row of fixedRows) { + const key = seriesKey(row); + fixedBySeries.set(key, [...(fixedBySeries.get(key) ?? []), row]); +} +assert(fixedBySeries.size === 24, `fixed-16 CSV expected 24 Mac series, found ${fixedBySeries.size}`); + +const canonicalMacSeries = new Set(canonicalRows.filter((row) => row.hardware === "macbook_m4").map(seriesKey)); +assert(canonicalMacSeries.size === 24, `canonical CSV expected 24 Mac series, found ${canonicalMacSeries.size}`); + +const merged: Row[] = []; +const inserted = new Set(); +for (const row of canonicalRows) { + if (row.hardware !== "macbook_m4") { + merged.push(row); + continue; + } + const key = seriesKey(row); + if (inserted.has(key)) continue; + const replacement = fixedBySeries.get(key); + assert(replacement, `fixed-16 CSV missing Mac series ${key}`); + merged.push(...replacement); + inserted.add(key); +} +assert(inserted.size === fixedBySeries.size, "not all fixed-16 Mac series were inserted"); + +const attemptIds = new Set(); +for (const row of merged) { + assert(!attemptIds.has(row.attempt_id), `duplicate attempt_id after merge: ${row.attempt_id}`); + attemptIds.add(row.attempt_id); +} + +const csv = [ + CSV_COLUMNS.join(","), + ...merged.map((row) => CSV_COLUMNS.map((column) => csvValue(row[column])).join(",")), +].join("\n") + "\n"; +await Bun.write(outputPath, csv); +console.log(`${outputPath}: ${merged.length} rows; replaced ${inserted.size} Mac series with fixed-16 evidence; retained ${merged.filter((row) => row.hardware !== "macbook_m4").length} mobile rows`); diff --git a/benchmarks/v1/input-to-proof-data/native/README.md b/benchmarks/v1/input-to-proof-data/native/README.md new file mode 100644 index 000000000..e6899efd8 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/README.md @@ -0,0 +1,13 @@ +# Canonical native normalization helpers + +This directory contains only the small helpers used by the canonical +input-to-proof export: + +- `normalize-e15-provekit.ts` normalizes the retained ProveKit E15 reports; +- `normalize-e15-native-backend.ts` normalizes native Noir/Circom reports; +- `generate-e15-native-gaps.ts` emits the attested E15 gap rows; +- `export-benchmark-csv.ts` and `schema.ts` provide the shared row validator. + +The old proof-only, semantic-parity, iOS-recovery, and Mac-browser normalizers +are under [`../../legacy/data/`](../../legacy/data/). They are retained for audit +history and are not inputs to `input-to-proof-samples.csv`. diff --git a/benchmarks/v1/input-to-proof-data/native/export-benchmark-csv.ts b/benchmarks/v1/input-to-proof-data/native/export-benchmark-csv.ts new file mode 100644 index 000000000..03b965415 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/export-benchmark-csv.ts @@ -0,0 +1,383 @@ +#!/usr/bin/env bun + +import { + CIRCUITS, + CSV_COLUMNS, + EXPECTED_CELL_COUNT, + EXPECTED_MEASURED_PER_OK_CELL, + EXPECTED_RUNTIME, + EXPECTED_WARMUPS_PER_OK_CELL, + HARDWARE, + PROVERS, + SAMPLE_KINDS, + STATUSES, + cellKey, + expectedCellKeys, + variantKey, + type AttemptRecord, + type CsvColumn, + type Status, +} from "./schema"; + +const METRIC_COLUMNS = [ + "initialization_time_ms", + "witness_time_ms", + "prover_time_ms", + "verify_time_ms", + "total_time_ms", + "peak_memory_mib", + "proof_size_bytes", + "circuit_size_bytes", + "artifact_size_bytes", + "bundle_size_bytes", + "constraint_count", +] as const satisfies readonly CsvColumn[]; + +const GAP_STATUSES: ReadonlySet = new Set( + STATUSES.filter((status) => status !== "ok"), +); +const enumValues = { + hardware: new Set(HARDWARE), + runtime: new Set(Object.values(EXPECTED_RUNTIME)), + circuit: new Set(CIRCUITS), + prover: new Set(PROVERS), + sample_kind: new Set(SAMPLE_KINDS), + status: new Set(STATUSES), +}; + +export class ValidationError extends Error { + constructor(public readonly issues: string[]) { + super(issues.join("\n")); + this.name = "ValidationError"; + } +} + +function isObject(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function requiredString(record: Record, field: CsvColumn, issues: string[]) { + const value = record[field]; + if (typeof value !== "string" || value.trim() === "") { + issues.push(`${field} must be a non-empty string`); + return ""; + } + return value; +} + +function optionalString(record: Record, field: CsvColumn, issues: string[]) { + const value = record[field]; + if (typeof value !== "string") { + issues.push(`${field} must be a string (use an empty string when not applicable)`); + return ""; + } + return value; +} + +function nullableNumber(record: Record, field: CsvColumn, issues: string[]) { + const value = record[field]; + if (value === null) return null; + if (typeof value !== "number" || !Number.isFinite(value) || value < 0) { + issues.push(`${field} must be null or a finite non-negative number`); + return null; + } + return value; +} + +function parseAttempt(value: unknown, position: number): AttemptRecord { + const issues: string[] = []; + if (!isObject(value)) throw new ValidationError([`record ${position} must be an object`]); + const record = value; + + for (const key of Object.keys(record)) { + if (!CSV_COLUMNS.includes(key as CsvColumn)) issues.push(`unknown field: ${key}`); + } + for (const field of CSV_COLUMNS) { + if (!(field in record)) issues.push(`missing field: ${field}`); + } + + const parsed = { + campaign_id: requiredString(record, "campaign_id", issues), + attempt_id: requiredString(record, "attempt_id", issues), + recorded_at_utc: requiredString(record, "recorded_at_utc", issues), + hardware: requiredString(record, "hardware", issues), + device_model: requiredString(record, "device_model", issues), + os_version: requiredString(record, "os_version", issues), + abi: requiredString(record, "abi", issues), + runtime: requiredString(record, "runtime", issues), + browser: optionalString(record, "browser", issues), + circuit: requiredString(record, "circuit", issues), + circuit_variant: requiredString(record, "circuit_variant", issues), + circuit_commit: requiredString(record, "circuit_commit", issues), + prover: requiredString(record, "prover", issues), + frontend: requiredString(record, "frontend", issues), + prover_backend: requiredString(record, "prover_backend", issues), + witness_backend: optionalString(record, "witness_backend", issues), + sample_kind: requiredString(record, "sample_kind", issues), + sample_index: record.sample_index, + status: requiredString(record, "status", issues), + initialization_time_ms: nullableNumber(record, "initialization_time_ms", issues), + witness_time_ms: nullableNumber(record, "witness_time_ms", issues), + prover_time_ms: nullableNumber(record, "prover_time_ms", issues), + verify_time_ms: nullableNumber(record, "verify_time_ms", issues), + total_time_ms: nullableNumber(record, "total_time_ms", issues), + peak_memory_mib: nullableNumber(record, "peak_memory_mib", issues), + proof_size_bytes: nullableNumber(record, "proof_size_bytes", issues), + circuit_size_bytes: nullableNumber(record, "circuit_size_bytes", issues), + artifact_size_bytes: nullableNumber(record, "artifact_size_bytes", issues), + bundle_size_bytes: nullableNumber(record, "bundle_size_bytes", issues), + constraint_count: nullableNumber(record, "constraint_count", issues), + artifact_version: requiredString(record, "artifact_version", issues), + source_commit: requiredString(record, "source_commit", issues), + package_versions: requiredString(record, "package_versions", issues), + artifact_hashes: requiredString(record, "artifact_hashes", issues), + session_id: optionalString(record, "session_id", issues), + non_equivalence_note: requiredString(record, "non_equivalence_note", issues), + failure_code: optionalString(record, "failure_code", issues), + failure_detail: optionalString(record, "failure_detail", issues), + evidence_path: requiredString(record, "evidence_path", issues), + }; + + for (const [field, allowed] of Object.entries(enumValues)) { + const value = parsed[field as keyof typeof parsed]; + if (typeof value === "string" && !allowed.has(value)) { + issues.push(`${field} has unsupported value: ${value}`); + } + } + + const timestamp = Date.parse(parsed.recorded_at_utc); + if (!Number.isFinite(timestamp) || !parsed.recorded_at_utc.endsWith("Z")) { + issues.push("recorded_at_utc must be an ISO-8601 UTC timestamp ending in Z"); + } + if ( + parsed.hardware in EXPECTED_RUNTIME && + EXPECTED_RUNTIME[parsed.hardware as keyof typeof EXPECTED_RUNTIME] !== parsed.runtime + ) { + issues.push( + `runtime ${parsed.runtime} does not match ${parsed.hardware}; expected ${ + EXPECTED_RUNTIME[parsed.hardware as keyof typeof EXPECTED_RUNTIME] + }`, + ); + } + if (parsed.runtime === "browser_wasm" && parsed.browser === "") { + issues.push("browser_wasm records require browser"); + } + if (parsed.runtime !== "browser_wasm" && parsed.browser !== "") { + issues.push("native records must leave browser blank"); + } + const expectedFrontend = + parsed.prover === "circom_groth16" ? "circom" : parsed.prover ? "noir" : ""; + if (expectedFrontend && parsed.frontend !== expectedFrontend) { + issues.push(`${parsed.prover} records require frontend=${expectedFrontend}`); + } + + const isGap = GAP_STATUSES.has(parsed.status as (typeof STATUSES)[number]); + if (parsed.status === "ok") { + if (parsed.sample_kind === "gap") issues.push("ok records cannot use sample_kind=gap"); + if (!Number.isInteger(parsed.sample_index) || (parsed.sample_index as number) < 0) { + issues.push("ok records require a non-negative integer sample_index"); + } + if ( + parsed.sample_kind === "measured" && + (parsed.prover_time_ms === null || parsed.total_time_ms === null) + ) { + issues.push("ok measured records require prover_time_ms and total_time_ms"); + } + if ( + parsed.sample_kind === "measured" && + (parsed.artifact_size_bytes === null || + parsed.proof_size_bytes === null || + parsed.peak_memory_mib === null) + ) { + issues.push( + "ok measured records require proving payload size, proof size, and peak process memory", + ); + } + if ( + parsed.sample_kind === "warmup" && + ((parsed.prover_time_ms === null) !== (parsed.total_time_ms === null)) + ) { + issues.push( + "ok warmup records must provide both prover_time_ms and total_time_ms or leave both blank", + ); + } + if (parsed.failure_code !== "" || parsed.failure_detail !== "") { + issues.push("ok records must leave failure_code and failure_detail blank"); + } + } else if (isGap) { + if (parsed.sample_kind !== "gap") issues.push(`${parsed.status} records require sample_kind=gap`); + if (parsed.sample_index !== null) issues.push("gap records require sample_index=null"); + for (const metric of METRIC_COLUMNS) { + if (parsed[metric] !== null) issues.push(`gap records require ${metric}=null`); + } + if (parsed.failure_code === "" || parsed.failure_detail === "") { + issues.push("gap records require failure_code and failure_detail"); + } + } + + if (parsed.prover === "circom_groth16" && parsed.witness_backend === "") { + issues.push("circom_groth16 records require witness_backend"); + } + if (parsed.prover !== "circom_groth16" && parsed.witness_time_ms !== null) { + issues.push("witness_time_ms is reserved for separately measured Circom witness generation"); + } + if ( + parsed.witness_time_ms !== null && + parsed.total_time_ms !== null && + parsed.prover_time_ms !== null && + parsed.total_time_ms + Number.EPSILON < parsed.witness_time_ms + parsed.prover_time_ms + ) { + issues.push("total_time_ms cannot be less than witness_time_ms + prover_time_ms"); + } + if (parsed.proof_size_bytes !== null && !Number.isInteger(parsed.proof_size_bytes)) { + issues.push("proof_size_bytes must be an integer number of bytes"); + } + for (const field of [ + "circuit_size_bytes", + "artifact_size_bytes", + "bundle_size_bytes", + "constraint_count", + ] as const) { + if (parsed[field] !== null && !Number.isInteger(parsed[field])) { + issues.push(`${field} must be an integer`); + } + } + + if (issues.length) { + throw new ValidationError(issues.map((issue) => `record ${position} (${parsed.attempt_id}): ${issue}`)); + } + return parsed as AttemptRecord; +} + +export function validateAttempts(input: unknown, requireCompleteMatrix = true): AttemptRecord[] { + if (!Array.isArray(input)) throw new ValidationError(["input must be a JSON array of attempt records"]); + + const records: AttemptRecord[] = []; + const issues: string[] = []; + input.forEach((value, index) => { + try { + records.push(parseAttempt(value, index)); + } catch (error) { + if (error instanceof ValidationError) issues.push(...error.issues); + else throw error; + } + }); + + const attemptIds = new Set(); + const sampleKeys = new Set(); + for (const record of records) { + if (attemptIds.has(record.attempt_id)) issues.push(`duplicate attempt_id: ${record.attempt_id}`); + attemptIds.add(record.attempt_id); + const sampleKey = + `${variantKey(record)}|${record.sample_kind}|${record.sample_index ?? "gap"}`; + if (sampleKeys.has(sampleKey)) issues.push(`duplicate cell sample: ${sampleKey}`); + sampleKeys.add(sampleKey); + } + + const byCell = Map.groupBy(records, cellKey); + if (requireCompleteMatrix) { + for (const key of expectedCellKeys()) { + const cell = byCell.get(key) ?? []; + if (cell.length === 0) { + issues.push(`missing expected cell: ${key}`); + continue; + } + const ok = cell.filter((record) => record.status === "ok"); + const gaps = cell.filter((record) => record.status !== "ok"); + if (ok.length > 0 && gaps.length > 0) issues.push(`cell mixes ok and gap records: ${key}`); + if (gaps.length > 1) issues.push(`gap cell must have exactly one record: ${key}`); + if (ok.length > 0) { + const byVariant = Map.groupBy(ok, (record) => record.circuit_variant); + for (const [variant, variantRecords] of byVariant) { + const variantLabel = `${key}|${variant}`; + const warmups = variantRecords.filter((record) => record.sample_kind === "warmup"); + const measured = variantRecords.filter((record) => record.sample_kind === "measured"); + if (warmups.length !== EXPECTED_WARMUPS_PER_OK_CELL) { + issues.push(`ok variant requires 1 warmup, found ${warmups.length}: ${variantLabel}`); + } + if (measured.length !== EXPECTED_MEASURED_PER_OK_CELL) { + issues.push( + `ok variant requires 5 measured samples, found ${measured.length}: ${variantLabel}`, + ); + } + if (warmups[0]?.sample_index !== 0) { + issues.push(`warmup sample_index must be 0: ${variantLabel}`); + } + const indexes = measured.map((record) => record.sample_index).sort(); + if (JSON.stringify(indexes) !== JSON.stringify([1, 2, 3, 4, 5])) { + issues.push(`measured sample_index values must be 1..5: ${variantLabel}`); + } + } + } + } + if (byCell.size !== EXPECTED_CELL_COUNT) { + issues.push(`expected ${EXPECTED_CELL_COUNT} unique cells, found ${byCell.size}`); + } + } + + const campaignIds = new Set(records.map((record) => record.campaign_id)); + if (campaignIds.size > 1) issues.push("input contains more than one campaign_id"); + + if (issues.length) throw new ValidationError(issues); + return records.sort((a, b) => + [ + a.hardware, + a.circuit, + a.prover, + a.circuit_variant, + a.sample_kind, + a.sample_index ?? -1, + a.attempt_id, + ] + .join("|") + .localeCompare( + [ + b.hardware, + b.circuit, + b.prover, + b.circuit_variant, + b.sample_kind, + b.sample_index ?? -1, + b.attempt_id, + ].join("|"), + ), + ); +} + +function csvValue(value: unknown): string { + if (value === null || value === undefined) return ""; + const text = String(value); + return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text; +} + +export function toCsv(records: AttemptRecord[]): string { + const lines = [ + CSV_COLUMNS.join(","), + ...records.map((record) => CSV_COLUMNS.map((column) => csvValue(record[column])).join(",")), + ]; + return `${lines.join("\n")}\n`; +} + +function usage(): never { + console.error( + "usage: bun export-benchmark-csv.ts [--allow-partial]", + ); + process.exit(2); +} + +if (import.meta.main) { + const [inputPath, outputPath, flag] = process.argv.slice(2); + if (!inputPath || !outputPath || (flag !== undefined && flag !== "--allow-partial")) usage(); + try { + const input = await Bun.file(inputPath).json(); + const records = validateAttempts(input, flag !== "--allow-partial"); + await Bun.write(outputPath, toCsv(records)); + console.log(`wrote ${records.length} sample records to ${outputPath}`); + } catch (error) { + if (error instanceof ValidationError) { + for (const issue of error.issues) console.error(`error: ${issue}`); + process.exit(1); + } + throw error; + } +} diff --git a/benchmarks/v1/input-to-proof-data/native/generate-e15-native-gaps.test.ts b/benchmarks/v1/input-to-proof-data/native/generate-e15-native-gaps.test.ts new file mode 100644 index 000000000..e64d6c109 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/generate-e15-native-gaps.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, test } from "bun:test"; +import { generateE15NativeGaps } from "./generate-e15-native-gaps"; + +describe("generateE15NativeGaps", () => { + test("emits the six non-ProveKit E15 cells from an attested 32-bit identity", () => { + const records = generateE15NativeGaps( + { model: "moto e15", os: "14", abi: "armeabi-v7a", zygote: "zygote32" }, + { + campaignId: "campaign", + sourceCommit: "a".repeat(40), + recordedAtUtc: "2026-07-30T12:00:00.000Z", + noirEvidencePath: "/tmp/noir-passport.log", + circomEvidencePath: "/tmp/circom-build.log", + }, + ); + expect(records).toHaveLength(6); + expect(new Set(records.map((record) => record.prover))).toEqual( + new Set(["noir_barretenberg", "circom_groth16"]), + ); + expect(records.every((record) => record.sample_kind === "gap")).toBe(true); + expect( + records + .filter((record) => record.prover === "circom_groth16") + .every((record) => record.prover_backend.includes("arkworks")), + ).toBe(true); + }); + + test("rejects a non-armv7 identity", () => { + expect(() => + generateE15NativeGaps( + { abi: "arm64-v8a", zygote: "zygote64" }, + { + campaignId: "campaign", + sourceCommit: "a".repeat(40), + recordedAtUtc: "2026-07-30T12:00:00.000Z", + noirEvidencePath: "/tmp/noir-passport.log", + circomEvidencePath: "/tmp/circom-build.log", + }, + ), + ).toThrow("attested 32-bit target"); + }); +}); diff --git a/benchmarks/v1/input-to-proof-data/native/generate-e15-native-gaps.ts b/benchmarks/v1/input-to-proof-data/native/generate-e15-native-gaps.ts new file mode 100644 index 000000000..529839822 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/generate-e15-native-gaps.ts @@ -0,0 +1,227 @@ +#!/usr/bin/env bun + +import { resolve } from "node:path"; +import { validateAttempts } from "./export-benchmark-csv"; +import type { AttemptRecord, Circuit, Prover, Status } from "./schema"; + +interface DeviceIdentity { + model?: string; + os?: string; + abi?: string; + zygote?: string; +} + +interface GapDefinition { + circuit: Circuit; + variant: string; + circuitCommit: string; + prover: Prover; + proverBackend: string; + witnessBackend: string; + status: Exclude; + failureCode: string; + failureDetail: string; + evidencePath: string; +} + +const WORLD_ID = "85aeeef539961cae5a63de794997b507a5975717"; +const SELF = "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e"; +const WEBAUTHN_CIRCOM = "0fb5b4aa1398281c2fd3dbe14db147e05b61f201"; +const TACEO = "808f3c795b57963dd58ef282ccd61022ef39c285"; + +export function generateE15NativeGaps( + device: DeviceIdentity, + options: { + campaignId: string; + sourceCommit: string; + recordedAtUtc: string; + noirEvidencePath: string; + circomEvidencePath: string; + }, +): AttemptRecord[] { + if (device.abi !== "armeabi-v7a" || device.zygote !== "zygote32") { + throw new Error( + `E15 gaps require the attested 32-bit target, found ${device.abi}/${device.zygote}`, + ); + } + + const armv7Noir = + "Mopro 0.3.7's Barretenberg/Noir backend does not provide a qualified " + + "armeabi-v7a lane for this 32-bit userspace; no browser timing was substituted."; + const arkworksNotQualified = + "Rapidsnark is not available for the E15's armeabi-v7a userspace, and the " + + "Mopro Arkworks plus rust-witness fallback did not produce a qualified exact-circuit " + + "armv7 bundle with proof verification, tamper rejection, and 1+5 samples."; + + const gaps: GapDefinition[] = [ + { + circuit: "passport", + variant: "passport_complete_age_check", + circuitCommit: options.sourceCommit, + prover: "noir_barretenberg", + proverBackend: "barretenberg-ultrahonk-native", + witnessBackend: "", + status: "runtime_failed", + failureCode: "beta19_witness_exact_division", + failureDetail: + "The mechanical Noir beta.19 Passport port fails during RSA witness solving " + + "in noir-bignum exact division before a device build can be qualified.", + evidencePath: options.noirEvidencePath, + }, + { + circuit: "webauthn", + variant: "webauthn_assertion", + circuitCommit: WORLD_ID, + prover: "noir_barretenberg", + proverBackend: "barretenberg-ultrahonk-native", + witnessBackend: "", + status: "unsupported", + failureCode: "mopro_noir_armv7_unsupported", + failureDetail: armv7Noir, + evidencePath: options.circomEvidencePath, + }, + { + circuit: "oprf", + variant: "oprf_taceo", + circuitCommit: TACEO, + prover: "noir_barretenberg", + proverBackend: "barretenberg-ultrahonk-native", + witnessBackend: "", + status: "unsupported", + failureCode: "mopro_noir_armv7_unsupported", + failureDetail: armv7Noir, + evidencePath: options.circomEvidencePath, + }, + { + circuit: "passport", + variant: "self_register_and_vc_and_disclose", + circuitCommit: SELF, + prover: "circom_groth16", + proverBackend: "arkworks-groth16-native-armv7-unqualified", + witnessBackend: "rust-witness-armv7-unqualified", + status: "not_run", + failureCode: "arkworks_armv7_not_qualified", + failureDetail: arkworksNotQualified, + evidencePath: options.circomEvidencePath, + }, + { + circuit: "webauthn", + variant: "privacy_ethereum_webauthn", + circuitCommit: WEBAUTHN_CIRCOM, + prover: "circom_groth16", + proverBackend: "arkworks-groth16-native-armv7-unqualified", + witnessBackend: "rust-witness-armv7-unqualified", + status: "not_run", + failureCode: "arkworks_armv7_not_qualified", + failureDetail: arkworksNotQualified, + evidencePath: options.circomEvidencePath, + }, + { + circuit: "oprf", + variant: "world_id_protocol_query_and_nullifier", + circuitCommit: WORLD_ID, + prover: "circom_groth16", + proverBackend: "arkworks-groth16-native-armv7-unqualified", + witnessBackend: "rust-witness-armv7-unqualified", + status: "not_run", + failureCode: "arkworks_armv7_not_qualified", + failureDetail: arkworksNotQualified, + evidencePath: options.circomEvidencePath, + }, + ]; + + const common = { + campaign_id: options.campaignId, + recorded_at_utc: options.recordedAtUtc, + hardware: "motorola_e15" as const, + device_model: device.model ?? "moto e15", + os_version: `Android ${device.os ?? "14"}`, + abi: device.abi, + runtime: "android_native" as const, + browser: "", + frontend: "noir", + sample_kind: "gap" as const, + sample_index: null, + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + source_commit: options.sourceCommit, + artifact_hashes: JSON.stringify({}), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + }; + + const records = gaps.map((gap): AttemptRecord => ({ + ...common, + attempt_id: `motorola-e15-${gap.prover}-${gap.variant}-gap`, + circuit: gap.circuit, + circuit_variant: gap.variant, + circuit_commit: gap.circuitCommit, + prover: gap.prover, + frontend: gap.prover === "circom_groth16" ? "circom" : "noir", + prover_backend: gap.proverBackend, + witness_backend: gap.witnessBackend, + status: gap.status, + artifact_version: + gap.prover === "circom_groth16" + ? "mopro-0.3.7-circom-prover-0.1.4-rust-witness-0.1" + : "noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2", + package_versions: + gap.prover === "circom_groth16" + ? JSON.stringify({ + mopro: "0.3.7", + circom_prover: "0.1.4", + rust_witness: "0.1", + }) + : JSON.stringify({ + mopro: "0.3.7", + noir: "1.0.0-beta.19", + barretenberg_rs: "4.2.0-aztecnr-rc.2", + }), + failure_code: gap.failureCode, + failure_detail: gap.failureDetail, + evidence_path: resolve(gap.evidencePath), + })); + return validateAttempts(records, false); +} + +if (import.meta.main) { + const [ + devicePath, + outputPath, + sourceCommit, + circomEvidencePath = devicePath, + noirEvidencePath = devicePath, + ] = process.argv.slice(2); + if ( + !devicePath || + !outputPath || + !sourceCommit || + !/^[0-9a-f]{40}$/.test(sourceCommit) + ) { + console.error( + "usage: bun generate-e15-native-gaps.ts " + + " [circom-evidence-path] [noir-evidence-path]", + ); + process.exit(2); + } + const device = (await Bun.file(devicePath).json()) as DeviceIdentity; + const records = generateE15NativeGaps(device, { + campaignId: process.env.CAMPAIGN_ID ?? "provekit-v1-cross-device-20260730", + sourceCommit, + recordedAtUtc: new Date().toISOString(), + noirEvidencePath, + circomEvidencePath, + }); + await Bun.write(outputPath, `${JSON.stringify(records, null, 2)}\n`); + console.log(`wrote ${records.length} E15 native gap records to ${outputPath}`); +} diff --git a/benchmarks/v1/input-to-proof-data/native/normalize-e15-native-backend.test.ts b/benchmarks/v1/input-to-proof-data/native/normalize-e15-native-backend.test.ts new file mode 100644 index 000000000..525f4ca95 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/normalize-e15-native-backend.test.ts @@ -0,0 +1,97 @@ +import { describe, expect, test } from "bun:test"; +import { + extractMobenchReport, + normalizeE15NativeBackend, +} from "./normalize-e15-native-backend"; + +function fixture() { + return { + campaign_id: "campaign", + recorded_at_utc: "2026-07-30T22:00:00Z", + device: { + model: "moto e15", + os: "14", + abi: "armeabi-v7a", + zygote: "zygote32", + }, + lane: { + circuit: "passport" as const, + circuit_variant: "passport_complete_age_check", + circuit_commit: "a".repeat(40), + prover: "noir_barretenberg" as const, + prover_backend: "barretenberg-ultrahonk-native-armv7", + witness_backend: "", + artifact_version: + "noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2", + package_versions: { + mopro: "0.3.7", + noir: "1.0.0-beta.19", + barretenberg_rs: "4.2.0-aztecnr-rc.2", + }, + artifact_hashes: { apk: "b".repeat(64) }, + evidence_path: "/evidence/passport.logcat.txt", + report: { + spec: { + iterations: 5, + warmup: 1, + name: "bench_passport", + }, + samples: [1, 2, 3, 4, 5].map((index) => ({ + duration_ns: index * 2_000_000, + process_peak_memory_kb: index * 1024, + })), + custom_metrics: { + run_u64: { + circuit_size_bytes: 400, + proving_payload_size_bytes: 1_000, + }, + sample_u64: { + prove_time_ns: [500_000, 600_000, 700_000, 800_000, 900_000, 1_000_000], + proof_size_bytes: [100, 101, 102, 103, 104, 105], + }, + }, + }, + }, + }; +} + +describe("normalizeE15NativeBackend", () => { + test("emits one warmup and five exact-metric measured rows", () => { + const records = normalizeE15NativeBackend(fixture(), "c".repeat(40)); + + expect(records).toHaveLength(6); + expect(records[0]?.sample_kind).toBe("measured"); + const first = records.find((record) => record.sample_index === 1); + expect(first?.prover_time_ms).toBe(0.6); + expect(first?.total_time_ms).toBe(2); + expect(first?.proof_size_bytes).toBe(101); + expect(first?.peak_memory_mib).toBe(1); + expect(first?.artifact_size_bytes).toBe(1_000); + expect(first?.bundle_size_bytes).toBe(1_000); + expect(first?.circuit_size_bytes).toBe(400); + expect(JSON.parse(first!.artifact_hashes)).toEqual({ + apk: "b".repeat(64), + }); + const warmup = records.find((record) => record.sample_kind === "warmup"); + expect(warmup?.sample_index).toBe(0); + expect(warmup?.prover_time_ms).toBeNull(); + expect(warmup?.peak_memory_mib).toBeNull(); + }); + + test("reconstructs a chunked Mobench report from retained logcat", () => { + const report = extractMobenchReport( + [ + "I BenchRunner: BENCH_JSON_START", + 'I BenchRunner: BENCH_JSON_CHUNK {"spec":{"iterations":5,', + 'I BenchRunner: BENCH_JSON_CHUNK "warmup":1,"name":"bench"},"samples":[]}', + "I BenchRunner: BENCH_JSON_END", + ].join("\n"), + ); + + expect(report.spec).toEqual({ + iterations: 5, + warmup: 1, + name: "bench", + }); + }); +}); diff --git a/benchmarks/v1/input-to-proof-data/native/normalize-e15-native-backend.ts b/benchmarks/v1/input-to-proof-data/native/normalize-e15-native-backend.ts new file mode 100644 index 000000000..39ba09d86 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/normalize-e15-native-backend.ts @@ -0,0 +1,251 @@ +#!/usr/bin/env bun + +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { validateAttempts } from "./export-benchmark-csv"; +import type { AttemptRecord, Circuit, Prover } from "./schema"; + +interface MobenchSample { + duration_ns: number; + process_peak_memory_kb?: number | null; + peak_memory_kb?: number | null; +} + +interface MobenchReport { + spec: { + iterations: number; + warmup: number; + name: string; + }; + samples: MobenchSample[]; + custom_metrics?: { + run_u64?: Record; + sample_u64?: Record; + }; + resources?: { + process_peak_memory_kb?: number | null; + peak_memory_kb?: number | null; + }; +} + +interface NativeLane { + circuit: Circuit; + circuit_variant: string; + circuit_commit: string; + prover: Extract; + prover_backend: string; + witness_backend: string; + artifact_version: string; + package_versions: Record; + artifact_hashes: Record; + evidence_path: string; + report: MobenchReport; +} + +interface E15NativeInput { + campaign_id: string; + recorded_at_utc: string; + device: { + model?: string; + os?: string; + abi?: string; + zygote?: string; + }; + lane: NativeLane; +} + +interface E15NativeManifest { + campaign_id: string; + recorded_at_utc: string; + source_commit: string; + device: E15NativeInput["device"]; + lanes: Array & { logcat_path: string }>; +} + +export function extractMobenchReport(logcat: string): MobenchReport { + const chunks: string[] = []; + let collecting = false; + let complete = false; + for (const line of logcat.split(/\r?\n/)) { + if (line.includes("BENCH_JSON_START")) { + collecting = true; + complete = false; + chunks.length = 0; + continue; + } + if (line.includes("BENCH_JSON_END") && collecting) { + complete = true; + break; + } + if (!collecting) continue; + const marker = "BENCH_JSON_CHUNK "; + const markerIndex = line.indexOf(marker); + if (markerIndex >= 0) chunks.push(line.slice(markerIndex + marker.length)); + } + if (!complete || chunks.length === 0) { + throw new Error("retained logcat does not contain a complete BENCH_JSON report"); + } + const report = JSON.parse(chunks.join("")) as MobenchReport; + if (!report.spec || !Array.isArray(report.samples)) { + throw new Error("BENCH_JSON report is missing its spec or samples"); + } + return report; +} + +export function normalizeE15NativeBackend( + input: E15NativeInput, + sourceCommit: string, +): AttemptRecord[] { + if (input.device.abi !== "armeabi-v7a" || input.device.zygote !== "zygote32") { + throw new Error( + `E15 native result is not the canonical 32-bit target: ` + + `${input.device.abi}/${input.device.zygote}`, + ); + } + + const { lane } = input; + const { report } = lane; + if ( + report.spec.warmup !== 1 || + report.spec.iterations !== 5 || + report.samples.length !== 5 + ) { + throw new Error( + `${report.spec.name} violates the one-warmup/five-sequential-sample contract`, + ); + } + + const proveTimes = report.custom_metrics?.sample_u64?.prove_time_ns; + const proofSizes = report.custom_metrics?.sample_u64?.proof_size_bytes; + const provingPayloadSize = + report.custom_metrics?.run_u64?.proving_payload_size_bytes; + if ( + !proveTimes || + proveTimes.length !== 6 || + !proofSizes || + proofSizes.length !== 6 || + !Number.isInteger(provingPayloadSize) || + provingPayloadSize! <= 0 + ) { + throw new Error( + `${report.spec.name} is missing exact prove time, proof size, or proving payload metrics`, + ); + } + + const circuitSize = + report.custom_metrics?.run_u64?.circuit_size_bytes ?? + report.custom_metrics?.run_u64?.zkey_size_bytes ?? + null; + const attemptPrefix = + `motorola-e15-${lane.prover}-${lane.circuit_variant}`.replaceAll( + /[^a-zA-Z0-9._-]/g, + "-", + ); + const common = { + campaign_id: input.campaign_id, + recorded_at_utc: input.recorded_at_utc, + hardware: "motorola_e15" as const, + device_model: input.device.model ?? "moto e15", + os_version: `Android ${input.device.os ?? "14"}`, + abi: input.device.abi, + runtime: "android_native" as const, + browser: "", + circuit: lane.circuit, + circuit_variant: lane.circuit_variant, + circuit_commit: lane.circuit_commit || sourceCommit, + prover: lane.prover, + frontend: lane.prover === "circom_groth16" ? "circom" : "noir", + prover_backend: lane.prover_backend, + witness_backend: lane.witness_backend, + initialization_time_ms: null, + witness_time_ms: null, + verify_time_ms: null, + circuit_size_bytes: circuitSize, + artifact_size_bytes: provingPayloadSize!, + bundle_size_bytes: provingPayloadSize!, + constraint_count: null, + artifact_version: lane.artifact_version, + source_commit: sourceCommit, + package_versions: JSON.stringify(lane.package_versions), + artifact_hashes: JSON.stringify(lane.artifact_hashes), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: "", + failure_detail: "", + evidence_path: resolve(lane.evidence_path), + }; + + const records: AttemptRecord[] = [ + { + ...common, + attempt_id: `${attemptPrefix}-warmup`, + sample_kind: "warmup", + sample_index: 0, + status: "ok", + prover_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + }, + ]; + + report.samples.forEach((sample, index) => { + const peakMemoryKb = + sample.process_peak_memory_kb ?? + sample.peak_memory_kb ?? + report.resources?.process_peak_memory_kb ?? + report.resources?.peak_memory_kb ?? + null; + if (peakMemoryKb === null || peakMemoryKb <= 0) { + throw new Error(`${report.spec.name} sample ${index + 1} is missing peak process memory`); + } + records.push({ + ...common, + attempt_id: `${attemptPrefix}-sample-${index + 1}`, + sample_kind: "measured", + sample_index: index + 1, + status: "ok", + prover_time_ms: proveTimes[index + 1]! / 1_000_000, + total_time_ms: sample.duration_ns / 1_000_000, + peak_memory_mib: peakMemoryKb / 1024, + proof_size_bytes: proofSizes[index + 1]!, + }); + }); + + return validateAttempts(records, false); +} + +function usage(): never { + console.error( + "usage: bun normalize-e15-native-backend.ts ", + ); + process.exit(2); +} + +if (import.meta.main) { + const [manifestPath, outputPath] = process.argv.slice(2); + if (!manifestPath || !outputPath) usage(); + const manifest = (await Bun.file(manifestPath).json()) as E15NativeManifest; + if (!/^[0-9a-f]{40}$/.test(manifest.source_commit)) { + throw new Error("manifest source_commit must be an immutable 40-character Git SHA"); + } + const records = manifest.lanes.flatMap(({ logcat_path, ...lane }) => + normalizeE15NativeBackend( + { + campaign_id: manifest.campaign_id, + recorded_at_utc: manifest.recorded_at_utc, + device: manifest.device, + lane: { + ...lane, + evidence_path: lane.evidence_path || logcat_path, + report: extractMobenchReport(readFileSync(logcat_path, "utf8")), + }, + }, + manifest.source_commit, + ), + ); + const validated = validateAttempts(records, false); + await Bun.write(outputPath, `${JSON.stringify(validated, null, 2)}\n`); + console.log(`normalized ${validated.length} E15 native backend rows into ${outputPath}`); +} diff --git a/benchmarks/v1/input-to-proof-data/native/normalize-e15-provekit.test.ts b/benchmarks/v1/input-to-proof-data/native/normalize-e15-provekit.test.ts new file mode 100644 index 000000000..a4e6aa65f --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/normalize-e15-provekit.test.ts @@ -0,0 +1,85 @@ +import { describe, expect, test } from "bun:test"; +import { normalizeE15ProveKit } from "./normalize-e15-provekit"; + +function fixture() { + return { + campaign_id: "campaign", + generated_at_utc: "2026-07-29T20:00:00Z", + sampling: { warmup: 1, measured: 5, sequential: true }, + device: { model: "moto e15", os: "14", abi: "armeabi-v7a", zygote: "zygote32" }, + apk: { path: "/app.apk", sha256: "a".repeat(64), bytes: 1000 }, + results: (["passport", "webauthn", "oprf"] as const).map((workload) => ({ + workload, + function: `bench_${workload}`, + status: "ok" as const, + report: { + spec: { iterations: 5, warmup: 1 }, + samples: [1, 2, 3, 4, 5].map((value) => ({ + duration_ns: value * 1_000_000, + process_peak_memory_kb: value * 1024, + })), + custom_metrics: { + sample_u64: { + prove_time_ns: [500_000, 500_000, 1_500_000, 2_500_000, 3_500_000, 4_500_000], + proof_size_bytes: [100, 101, 102, 103, 104, 105], + }, + run_u64: { + prover_size_bytes: 700, + input_size_bytes: 300, + proving_payload_size_bytes: 1000, + }, + }, + }, + evidence_path: `/evidence/${workload}.txt`, + })), + }; +} + +describe("normalizeE15ProveKit", () => { + test("creates one attested warmup and five measured rows per workload", () => { + const records = normalizeE15ProveKit(fixture(), "b".repeat(40)); + expect(records).toHaveLength(18); + expect(records.filter((record) => record.sample_kind === "warmup")).toHaveLength(3); + expect(records.filter((record) => record.sample_kind === "measured")).toHaveLength(15); + const first = records.find( + (record) => record.circuit === "passport" && record.sample_index === 1, + ); + expect(first?.prover_time_ms).toBe(0.5); + expect(first?.total_time_ms).toBe(1); + expect(first?.proof_size_bytes).toBe(101); + expect(first?.artifact_size_bytes).toBe(1000); + expect(first?.bundle_size_bytes).toBe(1000); + expect(first?.circuit_size_bytes).toBe(700); + expect(JSON.parse(first!.artifact_hashes)).toEqual({}); + }); + + test("keeps an opaque native panic as an explicit gap", () => { + const input = fixture(); + input.results[2] = { + ...input.results[2], + status: "runtime_failed" as const, + report: undefined as never, + failure: { kind: "benchmark_error", message: "actual Rust panic" }, + } as never; + const records = normalizeE15ProveKit(input, "b".repeat(40)); + expect(records.find((record) => record.circuit === "oprf")?.failure_detail).toBe( + "actual Rust panic", + ); + }); + + test("labels the memory-constrained Passport variant and thread count", () => { + const input = fixture(); + input.results = [ + { + ...input.results[0]!, + function: + "bench_mobile::bench_passport_complete_age_check_e2e_single_thread", + }, + ]; + const records = normalizeE15ProveKit(input, "b".repeat(40)); + expect(records[0]?.circuit_variant).toBe( + "passport_complete_age_check_single_thread", + ); + expect(JSON.parse(records[0]!.package_versions).rayon_threads).toBe(1); + }); +}); diff --git a/benchmarks/v1/input-to-proof-data/native/normalize-e15-provekit.ts b/benchmarks/v1/input-to-proof-data/native/normalize-e15-provekit.ts new file mode 100644 index 000000000..775eca44b --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/normalize-e15-provekit.ts @@ -0,0 +1,230 @@ +#!/usr/bin/env bun + +import { statSync } from "node:fs"; +import { resolve } from "node:path"; +import { validateAttempts } from "./export-benchmark-csv"; +import type { AttemptRecord, Circuit, Status } from "./schema"; + +interface MobenchSample { + duration_ns: number; + process_peak_memory_kb?: number | null; + peak_memory_kb?: number | null; +} +interface CustomMetrics { + sample_u64?: Record; + run_u64?: Record; +} +interface E15Apk { + path: string; + sha256: string; + bytes: number; +} +interface E15Result { + workload: Circuit; + function: string; + status: "ok" | "runtime_failed" | "crashed" | "timed_out" | "not_run"; + report?: { + spec: { iterations: number; warmup: number }; + samples: MobenchSample[]; + custom_metrics?: CustomMetrics; + }; + failure?: { kind?: string; message?: string } | null; + evidence_path: string; + apk?: E15Apk; +} +interface E15Report { + campaign_id: string; + generated_at_utc: string; + sampling: { warmup: number; measured: number; sequential: boolean }; + device: { model?: string; os?: string; abi?: string; zygote?: string }; + apk: E15Apk; + results: E15Result[]; +} + +const metadata: Record< + Circuit, + { variant: string; commit: string } +> = { + passport: { + variant: "passport_complete_age_check", + commit: "", + }, + webauthn: { + variant: "webauthn_assertion", + commit: "85aeeef539961cae5a63de794997b507a5975717", + }, + oprf: { + variant: "oprf_taceo", + commit: "fd37726215b59d3d4823ea7b1967b1da3525ed9d", + }, +}; + +export function normalizeE15ProveKit( + input: E15Report, + sourceCommit: string, + campaignId = input.campaign_id, +): AttemptRecord[] { + if ( + input.sampling.warmup !== 1 || + input.sampling.measured !== 5 || + input.sampling.sequential !== true + ) { + throw new Error("E15 report violates the one-warmup/five-sequential-sample contract"); + } + if (input.device.abi !== "armeabi-v7a" || input.device.zygote !== "zygote32") { + throw new Error( + `E15 report is not the canonical 32-bit target: ${input.device.abi}/${input.device.zygote}`, + ); + } + const records: AttemptRecord[] = []; + for (const result of input.results) { + const circuit = result.workload; + const baseIdentity = metadata[circuit]; + const singleThreadPassport = + circuit === "passport" && result.function.endsWith("_single_thread"); + const identity = { + ...baseIdentity, + variant: singleThreadPassport + ? "passport_complete_age_check_single_thread" + : baseIdentity.variant, + }; + const common = { + campaign_id: campaignId, + recorded_at_utc: input.generated_at_utc, + hardware: "motorola_e15" as const, + device_model: input.device.model ?? "moto e15", + os_version: `Android ${input.device.os ?? "14"}`, + abi: input.device.abi, + runtime: "android_native" as const, + browser: "", + circuit, + circuit_variant: identity.variant, + circuit_commit: identity.commit || sourceCommit, + prover: "provekit_v1" as const, + frontend: "noir", + prover_backend: "provekit-v1-whir-native", + witness_backend: "", + initialization_time_ms: null, + witness_time_ms: null, + proof_size_bytes: null, + circuit_size_bytes: + result.report?.custom_metrics?.run_u64?.prover_size_bytes ?? null, + artifact_size_bytes: + result.report?.custom_metrics?.run_u64?.proving_payload_size_bytes ?? null, + bundle_size_bytes: + result.report?.custom_metrics?.run_u64?.proving_payload_size_bytes ?? null, + constraint_count: null, + artifact_version: "provekit-v1-native", + source_commit: sourceCommit, + package_versions: JSON.stringify({ + provekit: "v1", + mobench_sdk: "0.1.48+e992596a786cc18047102a318d40131c953e57b8", + mobench_cli: "0.1.48+e992596a786cc18047102a318d40131c953e57b8", + ...(singleThreadPassport ? { rayon_threads: 1 } : {}), + }), + artifact_hashes: JSON.stringify({}), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + evidence_path: result.evidence_path, + }; + if (result.status !== "ok") { + records.push({ + ...common, + attempt_id: `motorola-e15-provekit-${identity.variant}-gap`, + sample_kind: "gap", + sample_index: null, + status: result.status as Status, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + failure_code: result.failure?.kind ?? result.status, + failure_detail: + result.failure?.message ?? `E15 ${result.function} ended with ${result.status}`, + }); + continue; + } + if ( + !result.report || + result.report.spec.warmup !== 1 || + result.report.spec.iterations !== 5 || + result.report.samples.length !== 5 + ) { + throw new Error(`${result.function} does not contain five Mobench measured samples`); + } + const proveTimes = result.report.custom_metrics?.sample_u64?.prove_time_ns; + const proofSizes = result.report.custom_metrics?.sample_u64?.proof_size_bytes; + const expectedMetricCount = + result.report.spec.warmup + result.report.spec.iterations; + if ( + !proveTimes || + !proofSizes || + proveTimes.length !== expectedMetricCount || + proofSizes.length !== expectedMetricCount + ) { + throw new Error( + `${result.function} is missing ${expectedMetricCount} prove_time_ns/proof_size_bytes custom metrics`, + ); + } + const provingPayloadSize = + result.report.custom_metrics?.run_u64?.proving_payload_size_bytes; + if (!Number.isInteger(provingPayloadSize) || provingPayloadSize! <= 0) { + throw new Error(`${result.function} is missing proving_payload_size_bytes`); + } + records.push({ + ...common, + attempt_id: `motorola-e15-provekit-${identity.variant}-warmup`, + sample_kind: "warmup", + sample_index: 0, + status: "ok", + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + failure_code: "", + failure_detail: "", + }); + result.report.samples.forEach((sample, index) => { + const peakKb = sample.process_peak_memory_kb ?? sample.peak_memory_kb ?? null; + const metricIndex = result.report!.spec.warmup + index; + records.push({ + ...common, + attempt_id: `motorola-e15-provekit-${identity.variant}-sample-${index + 1}`, + sample_kind: "measured", + sample_index: index + 1, + status: "ok", + prover_time_ms: proveTimes[metricIndex]! / 1_000_000, + verify_time_ms: null, + total_time_ms: sample.duration_ns / 1_000_000, + peak_memory_mib: peakKb === null ? null : peakKb / 1024, + proof_size_bytes: proofSizes[metricIndex]!, + failure_code: "", + failure_detail: "", + }); + }); + } + return validateAttempts(records, false); +} + +if (import.meta.main) { + const [inputPath, outputPath] = process.argv.slice(2); + if (!inputPath || !outputPath) { + console.error("usage: bun normalize-e15-provekit.ts "); + process.exit(2); + } + const input = (await Bun.file(inputPath).json()) as E15Report; + const sourceCommit = process.env.CAMPAIGN_SOURCE_COMMIT ?? Bun.spawnSync( + ["git", "rev-parse", "HEAD"], + { cwd: resolve(import.meta.dir, "../../.."), stdout: "pipe" }, + ).stdout.toString().trim(); + const records = normalizeE15ProveKit( + input, + sourceCommit, + process.env.CAMPAIGN_ID ?? input.campaign_id, + ); + await Bun.write(outputPath, `${JSON.stringify(records, null, 2)}\n`); + console.log(`wrote ${records.length} E15 ProveKit attempt records to ${outputPath}`); +} diff --git a/benchmarks/v1/input-to-proof-data/native/schema.ts b/benchmarks/v1/input-to-proof-data/native/schema.ts new file mode 100644 index 000000000..d09cf40be --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/native/schema.ts @@ -0,0 +1,140 @@ +export const CSV_COLUMNS = [ + "campaign_id", + "attempt_id", + "recorded_at_utc", + "hardware", + "device_model", + "os_version", + "abi", + "runtime", + "browser", + "circuit", + "circuit_variant", + "circuit_commit", + "prover", + "frontend", + "prover_backend", + "witness_backend", + "sample_kind", + "sample_index", + "status", + "initialization_time_ms", + "witness_time_ms", + "prover_time_ms", + "verify_time_ms", + "total_time_ms", + "peak_memory_mib", + "proof_size_bytes", + "circuit_size_bytes", + "artifact_size_bytes", + "bundle_size_bytes", + "constraint_count", + "artifact_version", + "source_commit", + "package_versions", + "artifact_hashes", + "session_id", + "non_equivalence_note", + "failure_code", + "failure_detail", + "evidence_path", +] as const; + +export type CsvColumn = (typeof CSV_COLUMNS)[number]; + +export const HARDWARE = ["iphone_se_2022", "motorola_e15", "macbook_m4"] as const; +export const RUNTIMES = ["ios_native", "android_native", "browser_wasm"] as const; +export const CIRCUITS = ["oprf", "passport", "webauthn"] as const; +export const PROVERS = [ + "provekit_v1", + "noir_barretenberg", + "circom_groth16", +] as const; +export const SAMPLE_KINDS = ["warmup", "measured", "gap"] as const; +export const STATUSES = [ + "ok", + "unsupported", + "build_failed", + "crashed", + "runtime_failed", + "timed_out", + "zero_samples", + "not_run", +] as const; + +export type Hardware = (typeof HARDWARE)[number]; +export type Runtime = (typeof RUNTIMES)[number]; +export type Circuit = (typeof CIRCUITS)[number]; +export type Prover = (typeof PROVERS)[number]; +export type SampleKind = (typeof SAMPLE_KINDS)[number]; +export type Status = (typeof STATUSES)[number]; + +export interface AttemptRecord { + campaign_id: string; + attempt_id: string; + recorded_at_utc: string; + hardware: Hardware; + device_model: string; + os_version: string; + abi: string; + runtime: Runtime; + browser: string; + circuit: Circuit; + circuit_variant: string; + circuit_commit: string; + prover: Prover; + frontend: string; + prover_backend: string; + witness_backend: string; + sample_kind: SampleKind; + sample_index: number | null; + status: Status; + initialization_time_ms: number | null; + witness_time_ms: number | null; + prover_time_ms: number | null; + verify_time_ms: number | null; + total_time_ms: number | null; + peak_memory_mib: number | null; + proof_size_bytes: number | null; + circuit_size_bytes: number | null; + artifact_size_bytes: number | null; + bundle_size_bytes: number | null; + constraint_count: number | null; + artifact_version: string; + source_commit: string; + package_versions: string; + artifact_hashes: string; + session_id: string; + non_equivalence_note: string; + failure_code: string; + failure_detail: string; + evidence_path: string; +} + +export const EXPECTED_RUNTIME: Record = { + iphone_se_2022: "ios_native", + motorola_e15: "android_native", + macbook_m4: "browser_wasm", +}; + +export const EXPECTED_CELL_COUNT = HARDWARE.length * CIRCUITS.length * PROVERS.length; +export const EXPECTED_WARMUPS_PER_OK_CELL = 1; +export const EXPECTED_MEASURED_PER_OK_CELL = 5; + +export function cellKey(record: Pick) { + return `${record.hardware}|${record.circuit}|${record.prover}`; +} + +export function variantKey( + record: Pick, +) { + return `${cellKey(record)}|${record.circuit_variant}`; +} + +export function expectedCellKeys(): string[] { + return HARDWARE.flatMap((hardware) => + CIRCUITS.flatMap((circuit) => + PROVERS.map((prover) => `${hardware}|${circuit}|${prover}`), + ), + ); +} diff --git a/benchmarks/v1/input-to-proof-data/replace-taceo-oprf.ts b/benchmarks/v1/input-to-proof-data/replace-taceo-oprf.ts new file mode 100644 index 000000000..69c9d89c2 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/replace-taceo-oprf.ts @@ -0,0 +1,333 @@ +#!/usr/bin/env bun + +import { createHash } from "node:crypto"; +import { resolve } from "node:path"; + +const root = resolve(import.meta.dir, "../../.."); +const csvPath = resolve(process.env.INPUT_TO_PROOF_OUTPUT_CSV ?? import.meta.dir + "/input-to-proof-samples.csv"); +const taceoRoot = resolve(root, "target/v1-benchmarks/taceo-v021"); +const campaignId = "input-to-proof-v1-taceo-oprf-20260814"; +const circuitCommit = "85aeeef539961cae5a63de794997b507a5975717"; +const helpersCommit = "8aacd73ed6ab0a2b9b2158e613acfa920860865a"; +const witnessCommit = "e11206a9f453145dcd6b814523cbfba4f60cf5c6"; +const serial = "ZY32M6782K"; + +type Row = Record; +type Sample = { + warmup: boolean; + initialization: number; + witness: number; + prove: number; + verify: number; + total: number; + peak: number | null; + proof: number; +}; + +function parseCsv(text: string): { columns: string[]; rows: Row[] } { + const records: string[][] = []; + let record: string[] = []; + let field = ""; + let quoted = false; + for (let index = 0; index < text.length; index += 1) { + const char = text[index]; + if (quoted) { + if (char === '"' && text[index + 1] === '"') { + field += '"'; + index += 1; + } else if (char === '"') { + quoted = false; + } else { + field += char; + } + } else if (char === '"' && field.length === 0) { + quoted = true; + } else if (char === ",") { + record.push(field); + field = ""; + } else if (char === "\n") { + record.push(field.endsWith("\r") ? field.slice(0, -1) : field); + records.push(record); + record = []; + field = ""; + } else { + field += char; + } + } + if (field.length > 0 || record.length > 0) { + record.push(field); + records.push(record); + } + const [columns, ...values] = records; + if (!columns?.length) throw new Error("CSV has no header"); + return { + columns, + rows: values.filter((value) => value.length > 1).map((value) => + Object.fromEntries(columns.map((column, index) => [column, value[index] ?? ""])), + ), + }; +} + +function csvValue(value: string): string { + return /[",\n\r]/.test(value) ? `"${value.replaceAll('"', '""')}"` : value; +} + +async function json(path: string): Promise { + return Bun.file(path).json(); +} + +async function sha256(path: string): Promise { + const bytes = await Bun.file(path).arrayBuffer(); + return createHash("sha256").update(Buffer.from(bytes)).digest("hex"); +} + +const assets = { + zkey: resolve(root, "benchmarks/v1/circom/taceo-mobile/assets/OPRFNullifier.arks.zkey"), + graph: resolve(root, "target/v1-benchmarks/taceo-v021/generated/OPRFNullifierGraph.bin"), + input: resolve(root, "benchmarks/v1/circom/taceo-mobile/assets/oprf_nullifier.input.json"), +}; +const [zkeySize, graphSize, inputSize, zkeyHash, graphHash, inputHash] = await Promise.all([ + Bun.file(assets.zkey).size, + Bun.file(assets.graph).size, + Bun.file(assets.input).size, + sha256(assets.zkey), + sha256(assets.graph), + sha256(assets.input), +]); +const artifactSize = zkeySize + graphSize; +const payloadSize = artifactSize + inputSize; + +function required(value: unknown, label: string): number { + if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`missing ${label}`); + return value; +} + +function sampleFromNative(value: any): Sample { + if (value.status !== "ok" || value.valid_proof_accepted !== true || value.tampered_proof_rejected !== true) { + throw new Error("TACEO native evidence did not pass proof/tamper gates"); + } + return { + warmup: Boolean(value.warmup), + initialization: required(value.initialization_time_ms, "initialization_time_ms"), + witness: required(value.witness_time_ms, "witness_time_ms"), + prove: required(value.prover_time_ms, "prover_time_ms"), + verify: required(value.verify_time_ms, "verify_time_ms"), + total: required(value.input_to_proof_time_ms, "input_to_proof_time_ms"), + peak: required(value.peak_memory_mib, "peak_memory_mib"), + proof: required(value.proof_size_bytes, "proof_size_bytes"), + }; +} + +function customSample(report: any, index: number, warmup: boolean, resourceIndex: number | null): Sample { + const values = report.custom_metrics?.sample_u64 ?? {}; + const value = (name: string) => required(values[name]?.[index], `${name}[${index}]`) / 1e6; + const proof = required(values.proof_size_bytes?.[index], `proof_size_bytes[${index}]`); + const resource = resourceIndex == null ? null : report.samples?.[resourceIndex]; + return { + warmup, + initialization: value("initialization_time_ns"), + witness: value("witness_time_ns"), + prove: value("prove_time_ns"), + verify: value("verify_time_ns"), + total: value("input_to_proof_time_ns"), + peak: resource?.process_peak_memory_kb == null ? null : resource.process_peak_memory_kb / 1024, + proof, + }; +} + +type Evidence = { + target: "macbook_m4" | "iphone_se_2022" | "motorola_e15"; + mode: "cold_local" | "warm_reuse"; + reportPath: string; + buildPath?: string; + sessionPath?: string; + build?: any; + session?: any; + report: any; + samples: Sample[]; + environment: { hardware: string; device_model: string; os_version: string; abi: string; runtime: string; browser: string }; + sessionId: string; + rawHashes: Record; +}; + +async function nativeEvidence(target: Evidence["target"], mode: Evidence["mode"]): Promise { + const reportPath = resolve(taceoRoot, "evidence", `oprf_o2__${target === "macbook_m4" ? "mac_native_diagnostic" : "motorola_e15"}__circom_groth16__${mode}.json`); + const report = await json(reportPath); + const reportArtifacts = report.artifacts?.hashes ?? {}; + if (reportArtifacts.zkey !== zkeyHash || reportArtifacts.graph !== graphHash || reportArtifacts.input !== inputHash) { + throw new Error(`${reportPath}: artifact identity does not match the TACEO 0.2.1 campaign assets`); + } + const samples = report.samples.map(sampleFromNative); + if (samples.length !== 6) throw new Error(`${reportPath}: expected six samples`); + const rawHashes = { report: await sha256(reportPath), ...report.artifacts.hashes }; + return { + target, + mode, + reportPath, + report, + samples, + environment: report.environment, + sessionId: target === "motorola_e15" ? serial : "", + rawHashes, + }; +} + +async function iphoneEvidence(mode: Evidence["mode"]): Promise { + const warm = mode === "warm_reuse"; + const buildId = warm ? "69e1acdc072c04776792c4741d202a4ad9f56915" : "2bbd16bc1cbd766f27f67bd3fead1042c93a116d"; + const sessionId = warm ? "5871c1f8443e9d6799c332e8e83d39d5cb0003ef" : "bb74e938435414e7a6de51d8445d92077c8a24f4"; + const rootPath = resolve(taceoRoot, warm ? "browserstack-warm-fetch" : "browserstack-cold-fetch", buildId, `session-${sessionId}`); + const reportPath = resolve(rootPath, "bench-report.json"); + const buildPath = resolve(taceoRoot, warm ? "browserstack-warm-fetch" : "browserstack-cold-fetch", buildId, "build.json"); + const sessionPath = resolve(rootPath, "session.json"); + const report = await json(reportPath); + const build = await json(buildPath); + const session = await json(sessionPath); + const buildDevices = (Array.isArray(build.devices) ? build.devices : Object.values(build.devices ?? {})) as any[]; + const deviceStatuses = buildDevices.map((item: any) => item.status ?? item.sessions?.[0]?.status); + const sessionPassed = session.status === "passed" + || (session.test_status?.SUCCESS === 1 + && session.test_status?.FAILED === 0 + && session.test_status?.TIMEDOUT === 0 + && session.test_status?.ERROR === 0) + || (session.testcases?.status?.passed === 1 + && session.testcases?.status?.failed === 0 + && session.testcases?.status?.timedout === 0 + && session.testcases?.status?.error === 0); + const browserStackPassed = (build.status === "done" || build.status === "passed") + && deviceStatuses.length === 1 + && deviceStatuses[0] === "passed" + && sessionPassed; + if (!browserStackPassed) throw new Error(`${reportPath}: BrowserStack run did not pass`); + const buildDevice = buildDevices[0] ?? {}; + const deviceLabel = String(session.device ?? buildDevice.device ?? Object.keys(build.devices ?? {})[0] ?? ""); + const osMatch = deviceLabel.match(/-(\d+(?:\.\d+)*)$/); + const deviceModel = String(buildDevice.device ?? (osMatch ? deviceLabel.slice(0, -osMatch[0].length) : deviceLabel)); + const osVersion = String(buildDevice.os_version ?? osMatch?.[1] ?? ""); + if (deviceModel !== "iPhone SE 2022" || !osVersion.startsWith("15.")) throw new Error(`${reportPath}: unexpected device`); + const reports = Array.isArray(report) ? report : [report]; + for (const item of reports) { + const metrics = item.custom_metrics?.run_u64 ?? {}; + if (metrics.zkey_size_bytes !== zkeySize || metrics.graph_size_bytes !== graphSize || metrics.input_size_bytes !== inputSize || metrics.proving_payload_size_bytes !== payloadSize) { + throw new Error(`${reportPath}: BrowserStack report payload does not match the pinned TACEO assets`); + } + } + const samples = mode === "warm_reuse" + ? customSample(reports[0], 0, true, null) && [0, 1, 2, 3, 4, 5].map((index) => customSample(reports[0], index, index === 0, index === 0 ? null : index - 1)) + : reports.map((item, index) => customSample(item, 0, index === 0, 0)); + if (samples.length !== 6) throw new Error(`${reportPath}: expected six samples`); + const rawHashes = { + report: await sha256(reportPath), + build: await sha256(buildPath), + session: await sha256(sessionPath), + }; + return { + target: "iphone_se_2022", + mode, + reportPath, + buildPath, + sessionPath, + build, + session, + report, + samples, + environment: { + hardware: "iphone_se_2022", + device_model: deviceModel, + os_version: osVersion, + abi: "arm64", + runtime: "ios_native", + browser: "", + }, + sessionId: `${buildId}/${sessionId}`, + rawHashes, + }; +} + +function note() { + return "Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Replaced the prior Circom OPRF rows with TACEO circom-helpers main 8aacd73ed6ab0a2b9b2158e613acfa920860865a and circom-witness-rs codex/remove-cxx-bridge-and-grep e11206a9f453145dcd6b814523cbfba4f60cf5c6. Proving payload is zkey + regenerated witness graph + frozen input JSON; mobile IPA/XCUITest upload size is excluded. Valid proof acceptance and tampered-proof rejection were required before timing."; +} + +function replaceRows(rows: Row[], evidence: Evidence): Row[] { + const targetRows = rows.filter((row) => row.circuit === "oprf_nullifier" && row.prover === "circom_groth16" && row.hardware === evidence.target && row.timing_mode === evidence.mode); + if (targetRows.length !== 6) throw new Error(`${evidence.target}/${evidence.mode}: expected six existing rows, found ${targetRows.length}`); + const byIndex = new Map(targetRows.map((row) => [Number(row.sample_index), row])); + return rows.map((row) => { + if (!(row.circuit === "oprf_nullifier" && row.prover === "circom_groth16" && row.hardware === evidence.target && row.timing_mode === evidence.mode)) return row; + const index = evidence.samples.findIndex((sample) => sample.warmup ? row.sample_kind === "warmup" : row.sample_kind === "measured" && Number(row.sample_index) === evidence.samples.indexOf(sample)); + const sample = evidence.samples[index < 0 ? Number(row.sample_index) : index]; + if (!sample) throw new Error(`${evidence.target}/${evidence.mode}: row/sample mismatch`); + const rawEvidence = evidence.rawHashes; + const artifactHashes = { zkey: zkeyHash, graph: graphHash, input: inputHash, ...rawEvidence }; + const packageVersions = JSON.stringify({ + circom: "2.2.2", + circom_helpers: helpersCommit, + circom_witness_rs: witnessCommit, + taceo_groth16: "0.2.1", + taceo_groth16_material: "0.4.2", + witness_graph_patch: "circom-helpers-graph-api.patch", + android_abi_patch: "as_limbs()[0] as usize", + }); + const evidencePath = [evidence.reportPath, evidence.buildPath, evidence.sessionPath].filter(Boolean).join(";"); + return { + ...row, + campaign_id: campaignId, + attempt_id: `${row.circuit}__${evidence.target}__circom_groth16__${evidence.mode}-${sample.warmup ? 0 : Number(row.sample_index)}`, + recorded_at_utc: evidence.report.created_at_utc ?? evidence.session?.start_time ?? evidence.build?.start_time ?? row.recorded_at_utc, + device_model: evidence.environment.device_model, + os_version: evidence.environment.os_version, + abi: evidence.environment.abi, + runtime: evidence.environment.runtime, + browser: evidence.environment.browser, + prover_backend: "taceo-groth16-0.2.1", + witness_backend: "circom-witness-rs@0.3.0 (codex/remove-cxx-bridge-and-grep)", + sample_kind: sample.warmup ? "warmup" : "measured", + sample_index: sample.warmup ? "0" : String(evidence.samples.filter((item) => !item.warmup).indexOf(sample) + 1), + status: "ok", + initialization_time_ms: String(sample.initialization), + witness_time_ms: String(sample.witness), + prover_time_ms: String(sample.prove), + verify_time_ms: String(sample.verify), + total_time_ms: String(sample.total), + peak_memory_mib: sample.peak == null ? "" : String(sample.peak), + proof_size_bytes: String(sample.proof), + circuit_size_bytes: String(payloadSize), + artifact_size_bytes: String(artifactSize), + bundle_size_bytes: String(payloadSize), + artifact_version: "input-to-proof-v1-taceo-groth16-0.2.1", + source_commit: circuitCommit, + package_versions: packageVersions, + artifact_hashes: JSON.stringify(artifactHashes), + session_id: evidence.sessionId, + non_equivalence_note: note(), + failure_code: "", + failure_detail: "", + evidence_path: evidencePath, + input_to_proof_time_ms: String(sample.total), + }; + }); +} + +const parsed = parseCsv(await Bun.file(csvPath).text()); +const requiredColumns = ["circuit", "prover", "hardware", "timing_mode", "sample_kind", "sample_index"]; +for (const column of requiredColumns) if (!parsed.columns.includes(column)) throw new Error(`CSV missing ${column}`); +const evidence = [ + await nativeEvidence("macbook_m4", "cold_local"), + await nativeEvidence("macbook_m4", "warm_reuse"), + await nativeEvidence("motorola_e15", "cold_local"), + await nativeEvidence("motorola_e15", "warm_reuse"), + await iphoneEvidence("cold_local"), + await iphoneEvidence("warm_reuse"), +]; +let rows = parsed.rows; +for (const item of evidence) rows = replaceRows(rows, item); + +const expected = new Set(evidence.map((item) => `${item.target}|${item.mode}`)); +for (const item of expected) { + const [target, mode] = item.split("|"); + const count = rows.filter((row) => row.circuit === "oprf_nullifier" && row.prover === "circom_groth16" && row.hardware === target && row.timing_mode === mode).length; + if (count !== 6) throw new Error(`${item}: expected six rows after replacement, found ${count}`); +} +const output = [parsed.columns.join(","), ...rows.map((row) => parsed.columns.map((column) => csvValue(row[column] ?? "")).join(","))].join("\n") + "\n"; +await Bun.write(csvPath, output); +console.log(`${csvPath}: replaced ${evidence.length} TACEO OPRF series; preserved ${rows.length} rows and ${parsed.columns.length} columns`); diff --git a/benchmarks/v1/input-to-proof-data/schema.ts b/benchmarks/v1/input-to-proof-data/schema.ts new file mode 100644 index 000000000..1adaf0485 --- /dev/null +++ b/benchmarks/v1/input-to-proof-data/schema.ts @@ -0,0 +1,39 @@ +export const CAMPAIGN_ID = "input-to-proof-v1-20260807"; +export const PROFILES = [ + "passport_complete_age_check", + "passport_p1", + "oprf_o2", + "webauthn_closest_analogue", +] as const; +export const TARGETS = ["mac_chrome", "iphone_se_2022", "motorola_e15"] as const; +export const STACKS = ["provekit_v1", "noir_barretenberg", "circom_groth16"] as const; +export const TIMING_MODES = ["cold_local", "warm_reuse"] as const; +export const CSV_COLUMNS = [ + "campaign_id", "attempt_id", "recorded_at_utc", "hardware", "device_model", "os_version", "abi", + "runtime", "browser", "circuit", "circuit_variant", "circuit_commit", "prover", "frontend", + "prover_backend", "witness_backend", "sample_kind", "sample_index", "status", + "initialization_time_ms", "witness_time_ms", "prover_time_ms", "verify_time_ms", "total_time_ms", + "peak_memory_mib", "proof_size_bytes", "circuit_size_bytes", "artifact_size_bytes", + "bundle_size_bytes", "constraint_count", "artifact_version", "source_commit", "package_versions", + "artifact_hashes", "session_id", "non_equivalence_note", "failure_code", "failure_detail", "evidence_path", + "timing_mode", "input_to_proof_time_ms", +] as const; + +export type Profile = (typeof PROFILES)[number]; +export type Target = (typeof TARGETS)[number]; +export type Stack = (typeof STACKS)[number]; +export type TimingMode = (typeof TIMING_MODES)[number]; + +export function seriesId(profile: Profile, target: Target, stack: Stack, mode: TimingMode) { + return `${profile}__${target}__${stack}__${mode}`; +} + +export function expectedSeries(targets: readonly Target[] = TARGETS) { + return PROFILES.flatMap((profile) => + targets.flatMap((target) => + STACKS.flatMap((stack) => + TIMING_MODES.map((mode) => seriesId(profile, target, stack, mode)), + ), + ), + ); +} diff --git a/benchmarks/v1/legacy/README.md b/benchmarks/v1/legacy/README.md new file mode 100644 index 000000000..f57ffe1f5 --- /dev/null +++ b/benchmarks/v1/legacy/README.md @@ -0,0 +1,49 @@ +# Legacy benchmark material + +The publication source is [`../input-to-proof-data/input-to-proof-samples.csv`](../input-to-proof-data/input-to-proof-samples.csv). +Everything in this directory is retained only for auditability and historical +comparison; it must not be merged into the canonical input-to-proof dataset. + +## Retained history + +- `data/benchmark-samples.csv` is the original exploratory export. It mixed + proof-only timings, compound Passport registration/disclosure rows, and + older circuit identities. +- `semantic-parity/semantic-parity-samples.csv` is the 27-cell proof-only + rerun. Its timing begins after witness generation, so it is not an + input-to-proof result. +- `semantic-parity-data/` contains the exporter and retained proof-only + evidence for that rerun. +- `taceo-candidate/` contains an experimental Circom Helpers/Groth16 lane. + It changed witness graphs, proving keys, and statements, so it is not a + backend-only replacement for the canonical Circom rows. +- `wasm/` contains the superseded automatic-thread and fixed-16 Mac source + exports used while rebuilding the canonical Mac rows. The fixed-16 result + was merged into the canonical CSV; the source export remains here solely as + provenance. +- `retired-docs/` contains the former semantic-parity, proof-only, + multithreading, and command-transcript documents. +- `scripts/` contains superseded device runners, Android shard tooling, + Barretenberg mobile packaging, and chart generators. +- `analysis/`, `data/`, `manifests/`, `examples/`, `arkworks-host/`, and + `barretenberg-mobile/` contain diagnostic or superseded tooling not needed + by the canonical reproduction entrypoint. + +## Why the canonical campaign was rerun + +1. Earlier headline rows measured proving only; the canonical boundary is raw + structured input through serialized proof bytes, including witness + generation. +2. Cold and warm initialization boundaries were inconsistent across stacks. +3. The old files mixed non-equivalent circuits and staged Passport product + flows; the canonical file names four explicit profiles, including P1. +4. ProveKit is pinned to the V1 core commit and the Mac browser lane uses a + fixed 16-worker build for ProveKit and SnarkJS. +5. Proof bytes, deduplicated proving payload, and peak process RSS are recorded + separately; APK/IPA transport size is never used as proving payload. +6. Mobile rows require valid-proof acceptance, tampered-proof rejection, and + one warmup plus five measured samples. The E15 Circom/WebAuthn OOM remains a + blank structured gap rather than an estimate or a substituted value. + +Historical files are intentionally not deleted. Their provenance is useful, +but their measurement contracts are different from the canonical campaign. diff --git a/benchmarks/v1/legacy/analysis/benchmark_analysis.py b/benchmarks/v1/legacy/analysis/benchmark_analysis.py new file mode 100644 index 000000000..72a8e1c95 --- /dev/null +++ b/benchmarks/v1/legacy/analysis/benchmark_analysis.py @@ -0,0 +1,458 @@ +"""Historical Marimo analysis for the proof-only semantic-parity export. + +Run from the repository root: + marimo edit benchmarks/v1/analysis/benchmark_analysis.py +or: + marimo run benchmarks/v1/analysis/benchmark_analysis.py +""" + +import marimo + +__generated_with = "0.23.15" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import marimo as mo + import matplotlib.pyplot as plt + import pandas as pd + import seaborn as sns + from pathlib import Path + + return Path, mo, pd, plt, sns + + +@app.cell +def _(mo): + mo.md(r""" + # Historical semantic-parity benchmark + + ## tl;dr + + This notebook reads only the legacy proof-only semantic-parity CSV. + Completed charts use measured samples, never warmups or gaps. Missing and + failed cells remain visible rather than being converted to zeros. + """) + return + + +@app.cell +def _(Path, pd): + csv_path = Path(__file__).resolve().parents[1] / "legacy" / "semantic-parity" / "semantic-parity-samples.csv" + samples = pd.read_csv(csv_path, keep_default_na=False) + + numeric_columns = [ + "sample_index", + "witness_time_ms", + "prover_time_ms", + "verify_time_ms", + "total_time_ms", + "peak_memory_mib", + "proof_size_bytes", + "artifact_size_bytes", + ] + for numeric_column in numeric_columns: + samples[numeric_column] = pd.to_numeric(samples[numeric_column], errors="coerce") + + expected_hardware = ["iphone_se_2022", "motorola_e15", "macbook_m4"] + expected_circuits = ["oprf", "passport", "webauthn"] + expected_provers = ["provekit_v1", "noir_barretenberg", "circom_groth16"] + expected_cells = pd.MultiIndex.from_product( + [expected_hardware, expected_circuits, expected_provers], + names=["hardware", "circuit", "prover"], + ).to_frame(index=False) + return csv_path, expected_cells, expected_hardware, samples + + +@app.cell +def _(csv_path, mo): + mo.md( + f""" + ## Context & Methods + + Source: `{csv_path}` + + ### Key Assumptions + + - The target surfaces are iPhone native, Motorola native, and M4 Mac browser/WASM. + - OPRF, Passport, and WebAuthn counterparts are the closest available workloads, + not statement-equivalent circuits. + - Each successful cell requires one discarded warmup and five measured samples. + - Blank metrics indicate missing evidence. A numeric zero is treated as a measurement. + - Circom witness and Groth16 proving phases are reported separately. + """ + ) + return + + +@app.cell +def _(expected_cells, pd, samples): + if samples.empty: + observed_cells = pd.DataFrame( + columns=[ + "hardware", + "circuit", + "prover", + "cell_status", + "measured_samples", + "coverage_ok", + ] + ) + else: + observed_variants = ( + samples.groupby(["hardware", "circuit", "prover"], as_index=False) + .agg( + cell_status=("status", lambda values: "ok" if (values == "ok").all() else values.iloc[0]), + measured_samples=("sample_kind", lambda values: int((values == "measured").sum())), + warmups=("sample_kind", lambda values: int((values == "warmup").sum())), + ) + ) + successful_variants = samples[samples["status"] == "ok"].groupby( + ["hardware", "circuit", "prover", "circuit_variant"], as_index=False + ).agg( + measured_samples=("sample_kind", lambda values: int((values == "measured").sum())), + warmups=("sample_kind", lambda values: int((values == "warmup").sum())), + ) + successful_variants["variant_coverage_ok"] = ( + (successful_variants["measured_samples"] == 5) + & (successful_variants["warmups"] == 1) + ) + successful_cells = successful_variants.groupby( + ["hardware", "circuit", "prover"], as_index=False + ).agg(coverage_ok=("variant_coverage_ok", "all")) + observed_cells = observed_variants.merge( + successful_cells, + on=["hardware", "circuit", "prover"], + how="left", + ) + observed_cells["coverage_ok"] = ( + observed_cells["coverage_ok"].map(lambda value: value is True) + & (observed_cells["cell_status"] == "ok") + ) + + coverage = expected_cells.merge( + observed_cells, + on=["hardware", "circuit", "prover"], + how="left", + ) + coverage["cell_status"] = coverage["cell_status"].fillna("missing") + coverage["measured_samples"] = coverage["measured_samples"].fillna(0).astype(int) + coverage["coverage_ok"] = coverage["coverage_ok"].map(lambda value: value is True) + return (coverage,) + + +@app.cell +def _(coverage, mo, samples): + complete_cells = int(coverage["coverage_ok"].sum()) + gap_cells = int((coverage["cell_status"] != "ok").sum()) + measured_attempts = int((samples["sample_kind"] == "measured").sum()) if not samples.empty else 0 + mo.md( + f""" + ## Data + + - Complete cells: **{complete_cells} / 27** + - Missing or failed cells: **{gap_cells}** + - Measured attempts retained: **{measured_attempts}** + """ + ) + return + + +@app.cell +def _(coverage, expected_hardware, plt, sns): + status_order = [ + "ok", + "unsupported", + "build_failed", + "crashed", + "runtime_failed", + "timed_out", + "zero_samples", + "not_run", + "missing", + ] + status_codes = {status: index for index, status in enumerate(status_order)} + coverage_plot = coverage.copy() + coverage_plot["workload"] = coverage_plot["circuit"] + " · " + coverage_plot["prover"] + coverage_plot["status_code"] = coverage_plot["cell_status"].map(status_codes) + coverage_matrix = coverage_plot.pivot( + index="workload", columns="hardware", values="status_code" + ).reindex(columns=expected_hardware) + + coverage_annotations = coverage_plot.pivot( + index="workload", columns="hardware", values="cell_status" + ).reindex(columns=expected_hardware) + + figure_coverage, axis_coverage = plt.subplots(figsize=(10, 6)) + sns.heatmap( + coverage_matrix, + annot=coverage_annotations, + fmt="", + cmap=sns.color_palette( + [ + "#2e7d32", + "#f9a825", + "#ef6c00", + "#b71c1c", + "#c62828", + "#8e24aa", + "#6a1b9a", + "#607d8b", + "#eceff1", + ], + as_cmap=True, + ), + vmin=0, + vmax=len(status_order) - 1, + cbar=False, + linewidths=0.5, + linecolor="white", + ax=axis_coverage, + ) + axis_coverage.set_title("Coverage status for all 27 expected cells") + axis_coverage.set_xlabel("Target hardware/runtime") + axis_coverage.set_ylabel("Closest circuit counterpart · prover") + figure_coverage.tight_layout() + figure_coverage + return + + +@app.cell +def _(mo): + mo.md(r""" + ## Results + + The following views cover the four publication metrics: proving time, exact + proving payload size, serialized proof size, and peak process memory. + Completed bars use measured samples only. Absent bars are missing evidence, + not zero-size or zero-time proofs. + """) + return + + +@app.cell +def _(plt, samples, sns): + measured = samples[ + (samples["status"] == "ok") & (samples["sample_kind"] == "measured") + ].copy() + measured["workload_variant"] = ( + measured["circuit"] + " · " + measured["circuit_variant"] + ) + if measured.empty: + figure_latency, axis_latency = plt.subplots(figsize=(10, 4)) + axis_latency.text( + 0.5, + 0.5, + "No measured samples yet", + ha="center", + va="center", + transform=axis_latency.transAxes, + ) + axis_latency.set_axis_off() + else: + latency_summary = ( + measured.groupby( + ["hardware", "circuit", "circuit_variant", "workload_variant", "prover"], + as_index=False, + ) + .agg( + median_prover_ms=("prover_time_ms", "median"), + min_prover_ms=("prover_time_ms", "min"), + max_prover_ms=("prover_time_ms", "max"), + samples=("prover_time_ms", "count"), + ) + ) + figure_latency = sns.catplot( + data=latency_summary, + kind="bar", + x="workload_variant", + y="median_prover_ms", + hue="prover", + col="hardware", + col_wrap=1, + height=3.1, + aspect=2.8, + sharey=False, + ).figure + figure_latency.suptitle("Median measured prover time by circuit and target", y=1.01) + for axis in figure_latency.axes: + axis.tick_params(axis="x", rotation=25) + figure_latency.tight_layout() + figure_latency + return (measured,) + + +@app.cell +def _(mo): + mo.md(r""" + ### Proving payload, proof size, and peak process memory + + `artifact_size_bytes` is the exact deduplicated set of inputs needed by the + prover for that lane; it is not an IPA, APK, or browser upload size. Proof + size is the serialized proof emitted by the adapter. Peak memory is process + RSS where the target exposes it. + + The coverage heatmap remains authoritative for missing and failed cells. + An absent bar below means that no successful native/browser measurement + exists. Workload variants are the closest available counterparts and are + not apples-to-apples cryptographic statements. + """) + return + + +@app.cell +def _(measured, mo, pd, sns): + footprint_frames = [ + measured.assign( + metric="Exact proving payload (MiB)", + metric_value=measured["artifact_size_bytes"] / (1024**2), + ), + measured.assign( + metric="Serialized proof size (KiB)", + metric_value=measured["proof_size_bytes"] / 1024, + ), + measured.assign( + metric="Peak process memory (MiB)", + metric_value=measured["peak_memory_mib"], + ), + ] + footprint_long = pd.concat(footprint_frames, ignore_index=True).dropna( + subset=["metric_value"] + ) + metric_order = [ + "Exact proving payload (MiB)", + "Serialized proof size (KiB)", + "Peak process memory (MiB)", + ] + + if footprint_long.empty: + footprint_view = mo.md( + "No proving-payload, proof-size, or peak-memory measurements are available." + ) + else: + footprint_grid = sns.catplot( + data=footprint_long, + kind="bar", + x="workload_variant", + y="metric_value", + hue="prover", + col="hardware", + row="metric", + row_order=metric_order, + estimator="median", + errorbar=("pi", 100), + sharex=False, + sharey=False, + height=3.0, + aspect=1.55, + ) + footprint_grid.set_axis_labels("Closest circuit counterpart", "") + footprint_grid.set_titles(row_template="{row_name}", col_template="{col_name}") + footprint_grid.figure.suptitle( + "Measured proof footprint by closest non-equivalent counterpart", + y=1.01, + ) + for footprint_axis in footprint_grid.axes.flat: + footprint_axis.tick_params(axis="x", rotation=30) + footprint_grid.figure.tight_layout() + footprint_view = footprint_grid.figure + footprint_view + return + + +@app.cell +def _(mo): + mo.md(r""" + ### Circom phase separation + + This chart applies only to Circom rows. Witness generation and Groth16 + proving are separate phases. Browser `snarkjs.fullProve` observations must + be instrumented around witness calculation and proving before they can + populate both columns; a single combined duration must stay in + `total_time_ms`. + """) + return + + +@app.cell +def _(measured, plt, sns): + circom_measured = measured[measured["prover"] == "circom_groth16"].copy() + phase_long = circom_measured.melt( + id_vars=["hardware", "circuit", "circuit_variant", "workload_variant", "attempt_id"], + value_vars=["witness_time_ms", "prover_time_ms"], + var_name="phase", + value_name="time_ms", + ).dropna(subset=["time_ms"]) + + figure_phases, axis_phases = plt.subplots(figsize=(10, 4)) + if phase_long.empty: + axis_phases.text( + 0.5, + 0.5, + "No separately timed Circom phases yet", + ha="center", + va="center", + transform=axis_phases.transAxes, + ) + axis_phases.set_axis_off() + else: + sns.barplot( + data=phase_long, + x="workload_variant", + y="time_ms", + hue="phase", + estimator="median", + errorbar=("pi", 100), + ax=axis_phases, + ) + axis_phases.set_title("Circom witness and Groth16 prover time") + axis_phases.set_ylabel("Median time (ms), with observed range") + axis_phases.set_xlabel("Closest circuit counterpart") + axis_phases.tick_params(axis="x", rotation=25) + figure_phases.tight_layout() + figure_phases + return + + +@app.cell +def _(mo, samples): + notes = ( + samples.loc[samples["non_equivalence_note"] != "", ["circuit", "prover", "non_equivalence_note"]] + .drop_duplicates() + .sort_values(["circuit", "prover"]) + ) + mo.md("## Takeaways\n\n### Non-equivalence notes") + return (notes,) + + +@app.cell +def _(mo, notes): + mo.ui.table(notes, selection=None, pagination=True, page_size=12) + return + + +@app.cell +def _(coverage, mo): + missing_table = coverage.loc[ + coverage["cell_status"] != "ok", + ["hardware", "circuit", "prover", "cell_status", "measured_samples"], + ] + mo.md( + """ + ### Missing and failed cells + + These cells stay in the analysis and must be explained before publication. + """ + ) + return (missing_table,) + + +@app.cell +def _(missing_table, mo): + mo.ui.table(missing_table, selection=None, pagination=True, page_size=15) + return + + +if __name__ == "__main__": + app.run() diff --git a/benchmarks/v1/legacy/analysis/test_benchmark_analysis.py b/benchmarks/v1/legacy/analysis/test_benchmark_analysis.py new file mode 100644 index 000000000..0662d67d7 --- /dev/null +++ b/benchmarks/v1/legacy/analysis/test_benchmark_analysis.py @@ -0,0 +1,73 @@ +import statistics +import unittest +from pathlib import Path + +import pandas as pd + + +class BenchmarkAnalysisTest(unittest.TestCase): + def test_fixture_medians_match_independent_statistics(self): + fixture = pd.DataFrame( + [ + {"variant": "a", "sample_kind": "warmup", "prover_time_ms": 99}, + {"variant": "a", "sample_kind": "measured", "prover_time_ms": 1}, + {"variant": "a", "sample_kind": "measured", "prover_time_ms": 9}, + {"variant": "a", "sample_kind": "measured", "prover_time_ms": 3}, + {"variant": "a", "sample_kind": "measured", "prover_time_ms": 7}, + {"variant": "a", "sample_kind": "measured", "prover_time_ms": 5}, + ] + ) + measured = fixture[fixture["sample_kind"] == "measured"] + notebook_median = measured.groupby("variant")["prover_time_ms"].median().loc["a"] + independent_median = statistics.median( + measured.loc[measured["variant"] == "a", "prover_time_ms"].tolist() + ) + self.assertEqual(notebook_median, independent_median) + self.assertEqual(notebook_median, 5) + + def test_legacy_semantic_csv_has_27_cells_and_complete_successful_variants(self): + csv_path = Path(__file__).resolve().parents[1] / "legacy" / "semantic-parity" / "semantic-parity-samples.csv" + samples = pd.read_csv(csv_path, keep_default_na=False) + cells = samples[["hardware", "circuit", "prover"]].drop_duplicates() + self.assertEqual(len(cells), 27) + + successful = samples[samples["status"] == "ok"] + variants = successful.groupby( + ["hardware", "circuit", "prover", "circuit_variant"] + ) + for identity, records in variants: + with self.subTest(identity=identity): + self.assertEqual((records["sample_kind"] == "warmup").sum(), 1) + self.assertEqual((records["sample_kind"] == "measured").sum(), 5) + + def test_successful_measured_rows_have_all_four_publication_metrics(self): + csv_path = Path(__file__).resolve().parents[1] / "legacy" / "semantic-parity" / "semantic-parity-samples.csv" + samples = pd.read_csv(csv_path, keep_default_na=False) + measured = samples[ + (samples["status"] == "ok") & (samples["sample_kind"] == "measured") + ] + metric_columns = [ + "prover_time_ms", + "artifact_size_bytes", + "proof_size_bytes", + "peak_memory_mib", + ] + numeric_metrics = measured[metric_columns].apply(pd.to_numeric, errors="coerce") + self.assertFalse(numeric_metrics.isna().any().any()) + self.assertTrue((numeric_metrics > 0).all().all()) + + def test_notebook_names_all_four_publication_metrics(self): + notebook_path = Path(__file__).with_name("benchmark_analysis.py") + notebook_source = notebook_path.read_text() + for metric in [ + "prover_time_ms", + "artifact_size_bytes", + "proof_size_bytes", + "peak_memory_mib", + ]: + with self.subTest(metric=metric): + self.assertIn(metric, notebook_source) + + +if __name__ == "__main__": + unittest.main() diff --git a/benchmarks/v1/legacy/arkworks-host/Cargo.lock b/benchmarks/v1/legacy/arkworks-host/Cargo.lock new file mode 100644 index 000000000..59b824954 --- /dev/null +++ b/benchmarks/v1/legacy/arkworks-host/Cargo.lock @@ -0,0 +1,8584 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "acir_field" +version = "1.0.0-beta.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d970028c6fb0fd910ae17d148bc162695cd791e796bf91e015b3206472ae5a38" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "cfg-if", + "hex", + "num-bigint", + "serde", +] + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bdf7932042b511ad4ad67f7eeac896df62439ac91a8c516d678b79cbe3f9c27" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-ens", + "alloy-network", + "alloy-provider", + "alloy-rpc-client", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36ddb69f5e41407e7a93aead3480f7c8ff076e73d01a951ae8f7ea4542c1ca0" +dependencies = [ + "alloy-primitives", + "num_enum", + "phf", +] + +[[package]] +name = "alloy-consensus" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f0f42ee16e9eaffa4df5aa3a17b1df88dd222310d13152ab91357a2551fd054" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.7", + "secp256k1 0.30.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-consensus-any" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db388e804269d977d60fa7530ccfefe9184ca48d4055dad3ec7e649a29186a06" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69937abc65310c6eb739e540b107688943b61f38e7dcf9fde769367d3608d657" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "serde_json", + "thiserror 2.0.19", + "tracing", +] + +[[package]] +name = "alloy-core" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8421a5ee9019b6d89f92935d0f8facd9f6ca088b41d7cc47244a02ccde4545f" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a04eb4abc2b5074a18e687ee63918f407cc7990083cba9b999445f839796060" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "itoa", + "serde", + "serde_json", + "winnow 1.0.4", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-eip7928" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b12337f74cbfa451cb04dac173974814a6ff463079e1793aa09600ba8813ab" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "once_cell", + "serde", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-eips" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52010e7c255f45b0ef3ca18144cbfbe0c044b055fe53f59323f3df5d95f265b1" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-eip7928", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "serde", + "serde_with", + "sha2 0.10.9", +] + +[[package]] +name = "alloy-ens" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c3d803649b2023413a5b84892ed3874977dfa8b8d5481dea05488f20f6f4ef" +dependencies = [ + "alloy-contract", + "alloy-primitives", + "alloy-provider", + "alloy-sol-types", + "async-trait", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-json-abi" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cee30dd4c2f4b23f434fdf675e7bf9681b86768141277266c6f548ef25cba0a" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d7ff4d7f1503d12edda9b241904a309d6e1d5bcee3f0ffdc4d3d3f16f366b8" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http", + "serde", + "serde_json", + "thiserror 2.0.19", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44ff1439d901b44f6ff840545f82d65e66830ee33fb33cae495a566d66e0ccc8" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-network-primitives" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb920286c4a71fb0ff3bbb207a640a531a42fceef5b43d4a943f7d5265789876" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f007e257069855bdf21d27762fd3f3705a613f805c9a08309bf353503f081d71" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "fixed-cache", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "indexmap 2.14.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.5", + "rapidhash", + "ruint", + "rustc-hash", + "secp256k1 0.31.1", + "serde", + "sha3 0.11.0", +] + +[[package]] +name = "alloy-provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "329375f50202cc6b2dcc8c6b1e53b716cbbebbeea54e931befc4f3b628dfc469" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-signer", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "either", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest 0.13.4", + "serde", + "serde_json", + "thiserror 2.0.19", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d4311c03125e8a18296504560b9de3d75ecbd0dcda7f71e6cf2a196d57e6fba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "alloy-rpc-client" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52bffef2c5714f578f267bb959b47908b95728f1f3e2073a96d928f4441c148d" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest 0.13.4", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe7fa70c3af4b2de7f670b50d680700e0f979ce3a0ab7725958b51ffc3b16c2" +dependencies = [ + "alloy-consensus-any", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f60a196df184facc9acbb61bd765a36cfb3c9d27eb6b43d5bd26340df1b96a" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-serde" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07758cbde42596b66da52bb661d77e253c3f7f9b3f553faf07adbadeb6419502" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc43a73bc1bf7044898e1b0dcefaba45d0cfac3e379bb5ca29cc3e3a04c61451" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-signer-local" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372ff9be2b61c2cd6d33cfcef9bd5865962c0628c932767f5154443aba2c9746" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.7", + "thiserror 2.0.19", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5655c38d5f84955bf727b2eeb62fddd91ebb98fd1d7ae6eb77f73ea88f9b9cf" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error3", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6277c780e07b76951e09a59788dde230d1582612324177d11a43a61e21a6bb83" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.14.0", + "proc-macro-error3", + "proc-macro2", + "quote", + "sha3 0.11.0", + "syn 2.0.119", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9762b2ad3e5a0c09886de54fe549ab0056681df843cb082e2df7e1c0eb270d30" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.119", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4c7130f0f01f4719678bda3db3bc7267fc2f7f9d0565e3bd964cd2bb45050d" +dependencies = [ + "serde", + "winnow 1.0.4", +] + +[[package]] +name = "alloy-sol-types" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96e74d6213180f78dbdccddce8af02a639c160c94b0a543fa35c77c58b8a7fc" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830c87b05870c80c8d2cfb9245feaff36468893f19fc124c7ff563cabda6386c" +dependencies = [ + "alloy-json-rpc", + "auto_impl", + "base64 0.22.1", + "derive_more", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.19", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ecd298fb0e6a31bd90c72efba2728e3d7569f1c89a3719576fb0e4e40b0fc8" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "itertools 0.14.0", + "reqwest 0.13.4", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f14b5d9b2c2173980202c6ff470d96e7c5e202c65a9f67884ad565226df7fbb" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more", + "nybbles", + "serde", + "smallvec", + "thiserror 2.0.19", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50185b84799c8b5f016a0c9da74309fe28d1c70fbe590a4e8d9cae6df3eebb0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-snark", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "rayon", + "sha2 0.10.9", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[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-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "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-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff 0.5.0", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "rayon", +] + +[[package]] +name = "ark-grumpkin" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef677b59f5aff4123207c4dceb1c0ec8fdde2d4af7886f48be42ad864bfa0352" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "rayon", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint", + "rayon", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.7", + "rayon", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" +dependencies = [ + "serde", + "zeroize", +] + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive 0.14.0", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b8246bcbf8eb97abef10c2d92166449680d41d55c0fc6978a91dec2e3619608" +dependencies = [ + "askama_macros", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser 0.14.0", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_derive" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9670bc84a28bb3da91821ef74226949ab63f1265aff7c751634f1dd0e6f97c" +dependencies = [ + "askama_parser 0.15.6", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0756b45480437dded0565dfc568af62ccce146fb6cfe902e808ba86e445f44f" +dependencies = [ + "askama_derive 0.15.6", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "askama_parser" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0af3691ba3af77949c0b5a3925444b85cb58a0184cc7fec16c68ba2e7be868" +dependencies = [ + "rustc-hash", + "serde", + "serde_derive", + "unicode-ident", + "winnow 1.0.4", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "aws-lc-rs" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bhttp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d305a54bcb99974213b4c78a486c34091e83c5d6d6572f7f4331c904ea9d127" +dependencies = [ + "thiserror 2.0.19", +] + +[[package]] +name = "binary-merge" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcoin-consensus-encoding" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "207311705279250ba465076a1bac4b1ac982855fff73fc5f67e22158ac58cdc9" +dependencies = [ + "bitcoin-internals", + "hex-conservative 1.2.0", + "serde", +] + +[[package]] +name = "bitcoin-internals" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d573f4cf32996a8dce612e4348cece65a241f1882ed594047c9ba348e8869fa5" + +[[package]] +name = "bitcoin-io" +version = "0.1.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb5de036369d1ac59d3c1819ebc4d850f89466f5401c571a285b6ed564a4cb78" +dependencies = [ + "bitcoin-consensus-encoding", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca4c7abb40c8817d77403c880988cfd484f23ab2365726afb2f798363e2c4a2" +dependencies = [ + "bitcoin-io", + "hex-conservative 0.2.2", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "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.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.2.17", + "digest 0.10.7", + "zeroize", +] + +[[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 = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "blst" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20659f9bbee16cbbd2f7393e40ab6309f5a98f76a2eb57a995ec508b72387fe" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "borsh" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f347189c62a579b8cd5f80714efa178f52e461dc2e6d701d264f5ff22e566c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "brillig" +version = "1.0.0-beta.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfbe65c55645e99aa4dbe3b7657a568326189d895ee87d9d83e678dd61be4514" +dependencies = [ + "acir_field", + "serde", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "build-data" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e6d5ca7a4989b90a9fafea85ce3c8bc9f0e0a76edcdcb330fe0c4fda92251f" +dependencies = [ + "chrono", + "safe-regex", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "2.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d04308254695569fdb9bfe3bacc1c91837a670d0806605eb82d63748fbd3a6" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.28", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20 0.9.1", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", + "zeroize", +] + +[[package]] +name = "circom-witness-rs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "byteorder", + "cxx-build", + "eyre", + "hex", + "num-bigint", + "num-traits", + "postcard", + "rand 0.8.7", + "ruint", + "serde", + "serde_json", +] + +[[package]] +name = "clap" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.19", +] + +[[package]] +name = "codespan" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e" +dependencies = [ + "codespan-reporting 0.11.1", + "serde", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "serde", + "termcolor", + "unicode-width 0.1.14", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width 0.2.2", +] + +[[package]] +name = "color-eyre" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-hex" +version = "1.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "proptest", + "serde_core", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "fiat-crypto", + "rustc_version 0.4.1", + "subtle", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "cxx-build" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3184a94384c663718698311a78a51ac00c484c10b4eeac06fb0a068c5f64fa2" +dependencies = [ + "cc", + "codespan-reporting 0.13.1", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "scratch", + "syn 3.0.3", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dashmap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[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 = "derive-where" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.119", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +dependencies = [ + "serde", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "embed-doc-image" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af36f591236d9d822425cb6896595658fa558fcebf5ee8accac1d4b92c47166e" +dependencies = [ + "base64 0.13.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "enum-ordinalize" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07f808d588c10e464ea6f7d3eaed500049eff30aaac103460f61828c2d65b3eb" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e528e2d34ba8a67a1a650b86beae8ef69fc5fdb638016f386b973226590432" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixed-cache" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fe63500644ef0269fe6b744e7e5dc5c20b5eebf3d881bc2be53f194636f6583" +dependencies = [ + "equivalent", + "rapidhash", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.7", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.14.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.1", + "serde", + "spin 0.9.9", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex-conservative" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35431185f361ccf3ffc58254628af5f1f5d5f28531da2e02e5d6c82bbc282a10" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hpke" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65d16b699dd1a1fa2d851c970b0c971b388eeeb40f744252b8de48860980c8f" +dependencies = [ + "aead", + "aes-gcm", + "chacha20poly1305", + "digest 0.10.7", + "generic-array", + "hkdf", + "hmac", + "rand_core 0.9.5", + "sha2 0.10.9", + "subtle", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.9", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "inplace-vec-builder" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf64c2edc8226891a71f127587a2861b132d2b942310843814d5001d99a1d307" +dependencies = [ + "smallvec", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.19", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" +dependencies = [ + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros", + "jsonrpsee-types", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "jsonrpsee-types", + "pin-project", + "serde", + "serde_json", + "thiserror 2.0.19", + "tokio", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" +dependencies = [ + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "rustls", + "rustls-platform-verifier 0.5.3", + "serde", + "serde_json", + "thiserror 2.0.19", + "tokio", + "tower", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fa4f5daed39f982a1bb9d15449a28347490ad42b212f8eaa2a2a344a0dce9e9" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" +dependencies = [ + "http", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.9", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "keccak" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", +] + +[[package]] +name = "keccak-asm" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libaes" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82903360c009b816f5ab72a9b68158c27c301ee2c3f20655b55c5e589e7d3bb7" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "macro-string" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a9dbbfc75d2688ed057456ce8a3ee3f48d12eec09229f560f3643b9f275653" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak 0.1.6", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11683a0dbfb40d9789a7ee43bcc590a3028a34823a1c427e1fec16fc8ea2d12" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ceb68cfc37e295c4584c68174f93814b07b9f048590d266b3040ed0aaeed3f" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "nybbles" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "ohttp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a03aaaf57495c75ce66aee6a7c3b21abf046c9d4cca3d45b22cdbf0de1bfba" +dependencies = [ + "aead", + "aes-gcm", + "byteorder", + "chacha20poly1305", + "hex", + "hkdf", + "hpke", + "log", + "rand 0.9.5", + "serde", + "serde_derive", + "sha2 0.10.9", + "thiserror 2.0.19", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "ordered-float" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", + "rand 0.8.7", + "serde", +] + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "p3-challenger" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7d2d45f5a51dc3f965e8d6da60a6c26c807e88657863d56da275eaa05ad36f1" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-monty-31", + "p3-symmetric", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-dft" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beabb40bc8ac7f5f95870f271fb844c7e2e1ebb7f0761a8eebb2614b56c6b1c1" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "spin 0.10.1", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4819a3e4c1882431a63d4847ffa10d110017aee4cb9cf4319ca6dca191930969" +dependencies = [ + "itertools 0.14.0", + "num-bigint", + "p3-maybe-rayon", + "p3-util", + "paste", + "rand 0.9.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-koala-bear" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb02789fca0950e246123d652bd78e75a76e3b90a651fd88dbb215cd3e81f5a" +dependencies = [ + "p3-challenger", + "p3-field", + "p3-monty-31", + "p3-poseidon2", + "p3-symmetric", + "rand 0.9.5", +] + +[[package]] +name = "p3-matrix" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fde449bd2963d394284ec46db8c647e6a5602d90601117b76752072ab54168" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.9.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54afab3883d8a14676b492709d6c4e9fa535c36718b737db0817aacfaaaa11f6" + +[[package]] +name = "p3-mds" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3895055d735ac96d010747b3aaabd4c2645b9fd80226960550318db2e25afb75" +dependencies = [ + "p3-dft", + "p3-field", + "p3-symmetric", + "p3-util", + "rand 0.9.5", +] + +[[package]] +name = "p3-monty-31" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fe0be661891af1f703ceaf57334fcbd540804988984dc2b500dd99740e7c81" +dependencies = [ + "itertools 0.14.0", + "num-bigint", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "paste", + "rand 0.9.5", + "serde", + "spin 0.10.1", + "tracing", +] + +[[package]] +name = "p3-poseidon2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6fc2368447576283f8b3849a36095017f25addf06eab9e33b0ce7f96b0b99d" +dependencies = [ + "p3-field", + "p3-mds", + "p3-symmetric", + "p3-util", + "rand 0.9.5", +] + +[[package]] +name = "p3-symmetric" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a14456a42a7d9e65f13999706f1bca2832175935169b3a54286e18331cf1d82f" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911154accf66034b0eec4452956c088f92a200b37a8225c1caed74cfbd38cc8d" +dependencies = [ + "serde", + "transpose", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap 2.14.0", +] + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "serde", +] + +[[package]] +name = "phf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[package]] +name = "prettytable-rs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" +dependencies = [ + "csv", + "encode_unicode", + "is-terminal", + "lazy_static", + "term", + "unicode-width 0.1.14", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error-attr3" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82366fd7d8b7a440d66d13418820c69df9b3908bcb1a0476d7f5ce5d12f5a04d" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error3" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b511283ea8a74b4b39447b128c5d00f03a356b7424554b13e298a5550100d9ac" +dependencies = [ + "proc-macro-error-attr3", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "num-traits", + "rand 0.9.5", + "rand_chacha 0.9.0", + "rand_xorshift 0.4.0", + "regex-syntax", + "unarray", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph 0.7.1", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.119", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "protoc-bin-vendored" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c381df33c98266b5f08186583660090a4ffa0889e76c7e9a5e175f645a67fa" +dependencies = [ + "protoc-bin-vendored-linux-aarch_64", + "protoc-bin-vendored-linux-ppcle_64", + "protoc-bin-vendored-linux-s390_64", + "protoc-bin-vendored-linux-x86_32", + "protoc-bin-vendored-linux-x86_64", + "protoc-bin-vendored-macos-aarch_64", + "protoc-bin-vendored-macos-x86_64", + "protoc-bin-vendored-win32", +] + +[[package]] +name = "protoc-bin-vendored-linux-aarch_64" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c350df4d49b5b9e3ca79f7e646fde2377b199e13cfa87320308397e1f37e1a4c" + +[[package]] +name = "protoc-bin-vendored-linux-ppcle_64" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55a63e6c7244f19b5c6393f025017eb5d793fd5467823a099740a7a4222440c" + +[[package]] +name = "protoc-bin-vendored-linux-s390_64" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dba5565db4288e935d5330a07c264a4ee8e4a5b4a4e6f4e83fad824cc32f3b0" + +[[package]] +name = "protoc-bin-vendored-linux-x86_32" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8854774b24ee28b7868cd71dccaae8e02a2365e67a4a87a6cd11ee6cdbdf9cf5" + +[[package]] +name = "protoc-bin-vendored-linux-x86_64" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b38b07546580df720fa464ce124c4b03630a6fb83e05c336fea2a241df7e5d78" + +[[package]] +name = "protoc-bin-vendored-macos-aarch_64" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89278a9926ce312e51f1d999fee8825d324d603213344a9a706daa009f1d8092" + +[[package]] +name = "protoc-bin-vendored-macos-x86_64" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81745feda7ccfb9471d7a4de888f0652e806d5795b61480605d4943176299756" + +[[package]] +name = "protoc-bin-vendored-win32" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95067976aca6421a523e491fce939a3e65249bac4b977adee0ee9771568e8aa3" + +[[package]] +name = "provekit-common" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd137e327416256ac7281b7c0eed960d59ab5cd10d805ae4ee0e5241a8e01938" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "base64 0.22.1", + "bytes", + "ciborium", + "getrandom 0.2.17", + "hex", + "itertools 0.14.0", + "postcard", + "provekit-spongefish", + "provekit-spongefish-pow", + "provekit-whir", + "provekit_acir", + "provekit_noirc_abi", + "rayon", + "ruint", + "serde", + "serde_json", + "sha2 0.10.9", + "sha3 0.10.9", + "tracing", + "xz2", + "zerocopy", + "zstd", +] + +[[package]] +name = "provekit-prover" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945f8953ae3756ac30bb51fce354f386fa209a114f0d7584e2b82b781802ec95" +dependencies = [ + "anyhow", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "postcard", + "provekit-common", + "provekit-whir", + "provekit_acir", + "provekit_bn254_blackbox_solver", + "provekit_nargo", + "provekit_noir_artifact_cli", + "provekit_noirc_abi", + "rayon", + "tracing", +] + +[[package]] +name = "provekit-spongefish" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a705ff6cb8bc4566a2d1a9f665243db958cbd90a852c3eef0dcc8dc8879ce5" +dependencies = [ + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "digest 0.10.7", + "keccak 0.1.6", + "p3-koala-bear", + "rand 0.8.7", + "sha2 0.10.9", + "sha3 0.10.9", + "zeroize", +] + +[[package]] +name = "provekit-spongefish-pow" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef05687e1ea5d63b54f03c86cf2ddd2cd3752a70151921619d0c66d129e6f309" +dependencies = [ + "blake3", + "bytemuck", + "keccak 0.1.6", + "provekit-spongefish", + "rand 0.8.7", + "rayon", +] + +[[package]] +name = "provekit-v1-arkworks-host-bench" +version = "0.1.0" +dependencies = [ + "serde_json", + "zk-mobile-bench", +] + +[[package]] +name = "provekit-verifier" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1ff1bcdce6c807b04657898aae2fd863bd4958b7ded64aaad4f10156061d7b6" +dependencies = [ + "anyhow", + "ark-std 0.5.0", + "provekit-common", + "provekit-whir", + "rayon", + "tracing", +] + +[[package]] +name = "provekit-whir" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35334259c6ad5b1287ecef6bfb3deb3dbb963c9366091951316bdb33c2080fe6" +dependencies = [ + "approx", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "blake3", + "ciborium", + "clap", + "const-oid 0.9.6", + "derive-where", + "digest 0.10.7", + "hex", + "hex-literal", + "itertools 0.14.0", + "ordered-float", + "provekit-spongefish", + "rayon", + "serde", + "serde_json", + "sha2 0.10.9", + "sha3 0.10.9", + "static_assertions", + "tracing", + "zerocopy", + "zeroize", +] + +[[package]] +name = "provekit_acir" +version = "1.0.0-beta.11-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "959971b1aef157ee72d079da9f4bd5ed7469a7856757ca181de567b83130e83a" +dependencies = [ + "acir_field", + "base64 0.22.1", + "bincode", + "brillig", + "color-eyre", + "flate2", + "num_enum", + "prost", + "prost-build", + "protoc-bin-vendored", + "provekit_noir_protobuf", + "rmp-serde", + "serde", + "serde-big-array", + "strum 0.24.1", + "strum_macros 0.24.3", + "thiserror 1.0.69", +] + +[[package]] +name = "provekit_acvm" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0386544eb81ca8263bd7b5d79eb9a5294d5a63855551dfaf75c31f12ff16c0e3" +dependencies = [ + "fxhash", + "indexmap 2.14.0", + "provekit_acir", + "provekit_acvm_blackbox_solver", + "provekit_brillig_vm", + "serde", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "provekit_acvm_blackbox_solver" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b023eaafc6a450044f4818f16c5891bc53761699c0e02fe662272c1d4aea1d" +dependencies = [ + "blake2", + "blake3", + "k256", + "keccak 0.1.6", + "libaes", + "log", + "num-bigint", + "p256", + "provekit_acir", + "sha2 0.10.9", + "thiserror 1.0.69", +] + +[[package]] +name = "provekit_bn254_blackbox_solver" +version = "1.0.0-beta.11-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bdcce7779ebf850cb86562988681722770a4f4feb060e2bdabe4281da2bf8f1" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-grumpkin", + "hex", + "lazy_static", + "num-bigint", + "provekit_acir", + "provekit_acvm_blackbox_solver", +] + +[[package]] +name = "provekit_brillig_vm" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6556e0bb21519b34dad9fa8d31b9ecc8ecfcd0bb5a6509b9f3ecbbc1c8867a5" +dependencies = [ + "num-bigint", + "num-traits", + "provekit_acir", + "provekit_acvm_blackbox_solver", + "thiserror 1.0.69", +] + +[[package]] +name = "provekit_fm" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a91cf01b1bb32994bef01af86e9b7ffad04df8fe5ac3f518799cded62008e9" +dependencies = [ + "codespan-reporting 0.11.1", + "provekit_iter-extended", + "serde", +] + +[[package]] +name = "provekit_iter-extended" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a492db53977c8849cd738cebc1411e0999f0ac43889b852679c03a4a062a0" + +[[package]] +name = "provekit_nargo" +version = "1.0.0-beta.11-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a94736624bc9986e7b99b81ce66bd587acb32b950542e88af8809b6e8766eb" +dependencies = [ + "jsonrpsee", + "provekit_acvm", + "provekit_fm", + "provekit_iter-extended", + "provekit_noir_greybox_fuzzer", + "provekit_noirc_abi", + "provekit_noirc_driver", + "provekit_noirc_errors", + "provekit_noirc_frontend", + "provekit_noirc_printable_type", + "rand 0.8.7", + "rayon", + "serde", + "serde_json", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tracing", + "walkdir", +] + +[[package]] +name = "provekit_noir_artifact_cli" +version = "1.0.0-beta.11-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada67d3859ca41d028af4241c70f2146d1bd0598504f92fffad9e9eac1269c0e" +dependencies = [ + "clap", + "color-eyre", + "const_format", + "provekit_acir", + "provekit_acvm", + "provekit_bn254_blackbox_solver", + "provekit_fm", + "provekit_nargo", + "provekit_noirc_abi", + "provekit_noirc_artifacts", + "provekit_noirc_artifacts_info", + "provekit_noirc_driver", + "provekit_noirc_errors", + "provekit_noirc_printable_type", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.7.8", + "tracing-subscriber 0.3.23", +] + +[[package]] +name = "provekit_noir_greybox_fuzzer" +version = "1.0.0-beta.11-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2ba1491805cf01e4fb9684bf40a92e6a532eaf22bfd901002c1a9d5e9bb5ca" +dependencies = [ + "build-data", + "num-traits", + "proptest", + "provekit_acvm", + "provekit_fm", + "provekit_noirc_abi", + "provekit_noirc_artifacts", + "rand 0.8.7", + "rand_xorshift 0.3.0", + "rayon", + "sha256", + "termcolor", + "walkdir", +] + +[[package]] +name = "provekit_noir_protobuf" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ad9aed4d9ae4c68f5593a22881168d476cabfd5d68b415859428cbef413be1" +dependencies = [ + "color-eyre", + "prost", +] + +[[package]] +name = "provekit_noirc_abi" +version = "1.0.0-beta.11-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb59259f8d1d4071ab4f776a3b269d96664fb3cea668836bf23640f2bf2d6dcc" +dependencies = [ + "num-bigint", + "num-traits", + "provekit_acvm", + "provekit_iter-extended", + "provekit_noirc_printable_type", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.7.8", +] + +[[package]] +name = "provekit_noirc_arena" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc744ed991c78c783bf55bf08a14e4e3f6724b71b32ca7608840343dab800b6b" + +[[package]] +name = "provekit_noirc_artifacts" +version = "1.0.0-beta.11-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeb972e65b43b6093817a476c2c6fe7ff4507604bb36bac882dcdd2decdeb49" +dependencies = [ + "codespan-reporting 0.11.1", + "provekit_acvm", + "provekit_fm", + "provekit_noirc_abi", + "provekit_noirc_driver", + "provekit_noirc_errors", + "provekit_noirc_printable_type", + "serde", +] + +[[package]] +name = "provekit_noirc_artifacts_info" +version = "1.0.0-beta.11-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36cbce4b11b60ba516abad650e2369648963c49269552f738dde16e384fc577d" +dependencies = [ + "clap", + "prettytable-rs", + "provekit_acir", + "provekit_acvm", + "provekit_iter-extended", + "provekit_noirc_artifacts", + "rayon", + "serde", + "serde_json", +] + +[[package]] +name = "provekit_noirc_driver" +version = "1.0.0-beta.11-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba7041da8e05a99e84a27a431a73dfed6247a8519c8460c2e995d1a81fd420b" +dependencies = [ + "build-data", + "clap", + "fxhash", + "provekit_acvm", + "provekit_fm", + "provekit_iter-extended", + "provekit_noirc_abi", + "provekit_noirc_errors", + "provekit_noirc_evaluator", + "provekit_noirc_frontend", + "rust-embed", + "serde", + "tracing", +] + +[[package]] +name = "provekit_noirc_errors" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22662c70fc6a2a962a45e4d0c2587422ce832e6edc8832bd6861c00f3469b03a" +dependencies = [ + "base64 0.22.1", + "codespan", + "codespan-reporting 0.11.1", + "flate2", + "fxhash", + "provekit_acvm", + "provekit_fm", + "provekit_noirc_printable_type", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "provekit_noirc_evaluator" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bff3796a08cf2a4d70fda79b8d36d585df5d77d568943a3a39571a45b8dabdb" +dependencies = [ + "cfg-if", + "chrono", + "fxhash", + "im", + "num-bigint", + "num-integer", + "num-traits", + "petgraph 0.8.3", + "provekit_acvm", + "provekit_bn254_blackbox_solver", + "provekit_fm", + "provekit_iter-extended", + "provekit_noirc_errors", + "provekit_noirc_frontend", + "provekit_noirc_printable_type", + "rayon", + "serde", + "serde_json", + "serde_with", + "smallvec", + "thiserror 1.0.69", + "tracing", + "vec-collections", +] + +[[package]] +name = "provekit_noirc_frontend" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf1f199c75ee1a4da6f5b3860d8c82bae1097b56afb93a129475072023f3757" +dependencies = [ + "cfg-if", + "fxhash", + "im", + "num-bigint", + "num-traits", + "petgraph 0.8.3", + "provekit_acvm", + "provekit_bn254_blackbox_solver", + "provekit_fm", + "provekit_iter-extended", + "provekit_noirc_arena", + "provekit_noirc_errors", + "provekit_noirc_printable_type", + "rangemap", + "rustc-hash", + "serde", + "serde_json", + "small-ord-set", + "smol_str", + "strum 0.24.1", + "strum_macros 0.24.3", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "provekit_noirc_printable_type" +version = "1.0.0-beta.11-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf5eb03eb02230d3dc4fc481d0b7c90272d394601cd20900ea99938eb6cb7f" +dependencies = [ + "provekit_acvm", + "provekit_iter-extended", + "serde", + "serde_json", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.19", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.19", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +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 = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", + "serde", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20 0.10.1", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[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", + "serde", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "rapidhash" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da7e78a036ce858e8d55b7e7dc8ba3a88b78350fd2155d3591bbd966b58589e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +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 = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.9", +] + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier 0.7.0", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "ruint" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45caf26f647c19115bf9c453c70ffe4a4a3a6390dceebd942610584f99b8ddce" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "ark-ff 0.6.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.7", + "rand 0.9.5", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rust-embed" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" +dependencies = [ + "mime_guess", + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.119", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" +dependencies = [ + "sha2 0.11.0", + "walkdir", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.28", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni 0.21.1", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs 1.0.9", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "safe-proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "492d1a72624b0bd5b7f0193ea5834a1905534a517573a117e949e895f342906c" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "safe-quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcaa9a650f2f98ba4da0190623210c85945cb78b262709f606c57655eda173e1" +dependencies = [ + "safe-proc-macro2", +] + +[[package]] +name = "safe-regex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5194fafa3cb9da89e0cab6dffa1f3fdded586bd6396d12be11b4cae0c7ee45c2" +dependencies = [ + "safe-regex-macro", +] + +[[package]] +name = "safe-regex-compiler" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e822ae1e61251bcfd698317c237cf83f7c57161a5dc24ee609a85697f1ed15b3" +dependencies = [ + "safe-proc-macro2", + "safe-quote", +] + +[[package]] +name = "safe-regex-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2768de7e6ef19f59c5fd3c3ac207ef12b68a49f95e3172d67e4a04cfd992ca06" +dependencies = [ + "safe-proc-macro2", + "safe-regex-compiler", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.7", + "secp256k1-sys 0.10.1", + "serde", +] + +[[package]] +name = "secp256k1" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" +dependencies = [ + "bitcoin_hashes", + "rand 0.9.5", + "secp256k1-sys 0.11.0", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", + "sha2-asm", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sha2-asm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b845214d6175804686b2bd482bcffe96651bb2d1200742b712003504a2dac1ab" +dependencies = [ + "cc", +] + +[[package]] +name = "sha256" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2 0.10.9", +] + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest 0.10.7", + "keccak 0.1.6", +] + +[[package]] +name = "sha3" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" +dependencies = [ + "digest 0.11.3", + "keccak 0.2.0", +] + +[[package]] +name = "sha3-asm" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version 0.4.1", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "small-ord-set" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf7035a2b2268a5be8c1395738565b06beda836097e12021cdefc06b127a0e7e" +dependencies = [ + "smallvec", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "smol_str" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" +dependencies = [ + "borsh", + "serde_core", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "sorted-iter" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bceb57dc07c92cdae60f5b27b3fa92ecaaa42fe36c55e22dbfb0b44893e0b1f7" + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "083be3061e64d362cbe6ef12cfe1307ba3884326d8856448fe8a120fa2c44ebf" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "taceo-ark-babyjubjub" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "taceo-ark-serde-compat" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fcd6f55fec9dd131019bdc0319db2271915056607b75bf8b8bc0a6ec496347" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "num-bigint", + "serde", + "taceo-ark-babyjubjub", +] + +[[package]] +name = "taceo-circom-types" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae56552ed9a44722d293640d5aedd90b9940284bf1f1bf4df727b3ce5bc34b" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "byteorder", + "serde", + "serde_json", + "taceo-ark-serde-compat", + "thiserror 2.0.19", + "tracing", +] + +[[package]] +name = "taceo-eddsa-babyjubjub" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10becbd559ee21d8376a4c2e18f0e38257ec1b5bfff3dcb2cb2945ca1db38906" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "eyre", + "num-bigint", + "rand 0.8.7", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "zeroize", +] + +[[package]] +name = "taceo-groth16" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b4c2cb727c5e3312f88e0ae5785d4d5c28ccb3afa4ebe297cf9ea32b358262" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "eyre", + "rayon", + "tracing", +] + +[[package]] +name = "taceo-groth16-material" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3231b9df1847b843a1178e5dfdc6fd4b35b6571adb017408b073db885960f71" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "circom-witness-rs", + "eyre", + "hex", + "postcard", + "rand 0.8.7", + "ruint", + "sha2 0.11.0", + "taceo-circom-types", + "taceo-groth16", + "thiserror 2.0.19", +] + +[[package]] +name = "taceo-groth16-sol" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d590d9ef92eee2cf8930ba4732bfbbd56d98b42545b0611b7c4ec7f112adc908" +dependencies = [ + "alloy-primitives", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "askama 0.15.6", + "eyre", + "ruint", +] + +[[package]] +name = "taceo-oprf" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10bf82ba41bbc8a6693362d67738145c77bdcec36345d85d4a86d2fb7dc44dc" +dependencies = [ + "taceo-oprf-client", + "taceo-oprf-core", + "taceo-oprf-types", +] + +[[package]] +name = "taceo-oprf-client" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc6179c5bad58f1210bd8872963960145227e8488dfedb4893538acecc5f8ae" +dependencies = [ + "ark-ec", + "ciborium", + "futures", + "getrandom 0.2.17", + "gloo-net", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-oprf-core", + "taceo-oprf-types", + "taceo-poseidon2", + "thiserror 2.0.19", + "tokio", + "tokio-tungstenite", + "tracing", + "uuid", +] + +[[package]] +name = "taceo-oprf-core" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be7f117e2bff79209ce40cdf4af6d566501cb1e63d2e1f9be6134a3bd3a3a2a3" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "itertools 0.15.0", + "num-bigint", + "rand 0.8.7", + "serde", + "subtle", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "uuid", + "zeroize", +] + +[[package]] +name = "taceo-oprf-types" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4b3645c7a7592e8aacdb4ca7270e75da3cca6061ae012521f3cb0dd01ff0b16" +dependencies = [ + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "async-trait", + "eyre", + "http", + "ruint", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-oprf-core", + "uuid", +] + +[[package]] +name = "taceo-poseidon2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "num-bigint", + "num-traits", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber 0.3.23", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.19", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "uniffi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +dependencies = [ + "anyhow", + "askama 0.14.0", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck 0.5.0", + "indexmap 2.14.0", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vec-collections" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9965c8f2ffed1dbcd16cafe18a009642f540fa22661c6cfd6309ddb02e4982" +dependencies = [ + "binary-merge", + "inplace-vec-builder", + "lazy_static", + "num-traits", + "serde", + "smallvec", + "sorted-iter", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[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.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.9", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.9", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "world-id-authenticator" +version = "0.13.0" +dependencies = [ + "alloy", + "anyhow", + "ark-serialize 0.5.0", + "backon", + "base64 0.22.1", + "bhttp", + "eyre", + "getrandom 0.3.4", + "hex", + "ohttp", + "rand 0.8.7", + "reqwest 0.12.28", + "ruint", + "rustls", + "secrecy", + "serde", + "serde_json", + "taceo-ark-babyjubjub", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-oprf", + "taceo-poseidon2", + "thiserror 2.0.19", + "tokio", + "webpki-roots 1.0.9", + "world-id-primitives", + "world-id-proof", + "world-id-registries", +] + +[[package]] +name = "world-id-core" +version = "0.13.0" +dependencies = [ + "taceo-eddsa-babyjubjub", + "world-id-authenticator", + "world-id-issuer", + "world-id-primitives", + "world-id-proof", + "world-id-registries", +] + +[[package]] +name = "world-id-issuer" +version = "0.13.0" +dependencies = [ + "alloy", + "ark-ff 0.5.0", + "ruint", + "rustls", + "taceo-eddsa-babyjubjub", + "thiserror 2.0.19", + "url", + "world-id-primitives", +] + +[[package]] +name = "world-id-primitives" +version = "0.13.0" +dependencies = [ + "alloy", + "alloy-primitives", + "ark-bn254", + "ark-ff 0.5.0", + "arrayvec", + "embed-doc-image", + "eyre", + "getrandom 0.3.4", + "hex", + "provekit-common", + "rand 0.8.7", + "ruint", + "secrecy", + "serde", + "serde_json", + "sha2 0.11.0", + "sha3 0.10.9", + "strum 0.27.2", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-circom-types", + "taceo-eddsa-babyjubjub", + "taceo-oprf", + "taceo-poseidon2", + "thiserror 2.0.19", + "url", + "uuid", +] + +[[package]] +name = "world-id-proof" +version = "0.13.0" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "eyre", + "once_cell", + "provekit-common", + "provekit-prover", + "provekit-verifier", + "rand 0.8.7", + "rayon", + "reqwest 0.12.28", + "ruint", + "serde", + "taceo-ark-babyjubjub", + "taceo-circom-types", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-groth16-sol", + "taceo-oprf", + "taceo-poseidon2", + "tar", + "thiserror 2.0.19", + "tracing", + "world-id-primitives", + "zeroize", + "zstd", +] + +[[package]] +name = "world-id-registries" +version = "0.13.0" +dependencies = [ + "alloy", + "anyhow", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zk-mobile-bench" +version = "0.1.0" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "inventory", + "mobench-sdk", + "rand 0.8.7", + "rand_chacha 0.3.1", + "serde", + "serde_json", + "taceo-ark-babyjubjub", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-oprf", + "taceo-poseidon2", + "thiserror 2.0.19", + "uniffi", + "world-id-core", + "world-id-primitives", + "world-id-proof", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[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/benchmarks/v1/legacy/arkworks-host/Cargo.toml b/benchmarks/v1/legacy/arkworks-host/Cargo.toml new file mode 100644 index 000000000..beb070124 --- /dev/null +++ b/benchmarks/v1/legacy/arkworks-host/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "provekit-v1-arkworks-host-bench" +version = "0.1.0" +edition = "2024" +publish = false + +[workspace] + +[dependencies] +serde_json = "1" +zk-mobile-bench = { path = "../../../target/v1-benchmarks/sources/world-id-protocol/crates/zk-mobile-bench" } diff --git a/benchmarks/v1/legacy/arkworks-host/src/main.rs b/benchmarks/v1/legacy/arkworks-host/src/main.rs new file mode 100644 index 000000000..60b4a7862 --- /dev/null +++ b/benchmarks/v1/legacy/arkworks-host/src/main.rs @@ -0,0 +1,42 @@ +use std::process::ExitCode; + +use zk_mobile_bench::{BenchSpec, run_benchmark}; + +fn main() -> ExitCode { + let name = match std::env::args().nth(1) { + Some(name) => name, + None => { + eprintln!("usage: provekit-v1-arkworks-host-bench "); + return ExitCode::FAILURE; + } + }; + let warmup = std::env::var("MOBENCH_WARMUP") + .ok() + .and_then(|value| value.parse().ok()) + .unwrap_or(1); + let iterations = std::env::var("MOBENCH_ITERATIONS") + .ok() + .and_then(|value| value.parse().ok()) + .unwrap_or(5); + + match run_benchmark(BenchSpec { + name, + iterations, + warmup, + }) { + Ok(report) => match serde_json::to_string_pretty(&report) { + Ok(json) => { + println!("{json}"); + ExitCode::SUCCESS + } + Err(error) => { + eprintln!("failed to encode report: {error}"); + ExitCode::FAILURE + } + }, + Err(error) => { + eprintln!("benchmark failed: {error}"); + ExitCode::FAILURE + } + } +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/.gitignore b/benchmarks/v1/legacy/barretenberg-mobile/.gitignore new file mode 100644 index 000000000..b83d22266 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/benchmarks/v1/legacy/barretenberg-mobile/CMakeLists.txt b/benchmarks/v1/legacy/barretenberg-mobile/CMakeLists.txt new file mode 100644 index 000000000..2d9a1ac98 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/CMakeLists.txt @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 3.24) +project(provekit_v1_barretenberg_mobile LANGUAGES C CXX) + +if(NOT DEFINED BB_V087_CPP_SOURCE) + message(FATAL_ERROR "BB_V087_CPP_SOURCE must point to pinned v0.87.0 barretenberg/cpp") +endif() + +set(DISABLE_AZTEC_VM ON CACHE BOOL "" FORCE) +set(DISABLE_ASM ON CACHE BOOL "" FORCE) +set(DISABLE_ADX ON CACHE BOOL "" FORCE) +set(MULTITHREADING OFF CACHE BOOL "" FORCE) +set(OMP_MULTITHREADING OFF CACHE BOOL "" FORCE) +set(TESTING OFF CACHE BOOL "" FORCE) +set(BENCHMARK OFF CACHE BOOL "" FORCE) +set(FUZZING OFF CACHE BOOL "" FORCE) +# Upstream's ENABLE_PIC also unconditionally builds its Node addon. Mobile +# needs PIC objects, not Node-API, so use CMake's standard setting directly. +set(ENABLE_PIC OFF CACHE BOOL "" FORCE) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + # Xcode 26 diagnoses syntax accepted by the Clang generation used for v0.87. + # This compatibility flag changes no source or proof-system behavior. + add_compile_options(-Wno-missing-template-arg-list-after-template-kw) + include_directories(BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/compat/apple") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR ANDROID) + # v0.87's CLI-oriented file loader shells out to `gunzip`, which is absent + # from app sandboxes. Shadow only that header for mobile and decompress the + # immutable .gz fixtures in-process through the platform zlib. + include_directories(BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/compat/mobile") +endif() + +add_subdirectory("${BB_V087_CPP_SOURCE}" upstream EXCLUDE_FROM_ALL) + +add_library(barretenberg_v087_mobile STATIC cpp/bb_v087_mobile.cpp) +target_include_directories( + barretenberg_v087_mobile + PUBLIC include + PRIVATE + "${BB_V087_CPP_SOURCE}/src" + "${CMAKE_BINARY_DIR}/_deps/tracy-src/public" + "${CMAKE_BINARY_DIR}/_deps/msgpack-c/src/msgpack-c/include" + "${CMAKE_BINARY_DIR}/_deps/libdeflate-src" +) +target_compile_features(barretenberg_v087_mobile PRIVATE cxx_std_20) +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_options( + barretenberg_v087_mobile PRIVATE + -fbracket-depth=512 + -fconstexpr-steps=100000000 + ) +endif() +target_link_libraries(barretenberg_v087_mobile PRIVATE barretenberg) +if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR ANDROID) + target_link_libraries(barretenberg_v087_mobile PRIVATE z) +endif() +set_target_properties( + barretenberg_v087_mobile + PROPERTIES + OUTPUT_NAME barretenberg_v087_mobile + POSITION_INDEPENDENT_CODE ON +) + +install( + TARGETS barretenberg_v087_mobile barretenberg + ARCHIVE DESTINATION lib +) +install(FILES include/bb_v087_mobile.h DESTINATION include) diff --git a/benchmarks/v1/legacy/barretenberg-mobile/Cargo.lock b/benchmarks/v1/legacy/barretenberg-mobile/Cargo.lock new file mode 100644 index 000000000..20f87209a --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/Cargo.lock @@ -0,0 +1,1004 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[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.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clap" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[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 = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[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.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-barretenberg-mobile" +version = "0.1.0" +dependencies = [ + "anyhow", + "hex", + "inventory", + "mobench-sdk", + "serde", + "serde_json", + "sha2", + "uniffi", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[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 = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "uniffi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +dependencies = [ + "anyhow", + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/legacy/barretenberg-mobile/Cargo.toml b/benchmarks/v1/legacy/barretenberg-mobile/Cargo.toml new file mode 100644 index 000000000..caddd42c0 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "provekit-v1-barretenberg-mobile" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" +build = "build.rs" + +[lib] +crate-type = ["lib", "cdylib", "staticlib"] +doctest = false + +[features] +default = ["mobench", "native-v087"] +native-v087 = [] +mobench = ["dep:inventory", "dep:mobench-sdk", "dep:uniffi"] + +[dependencies] +anyhow = "1" +hex = "0.4" +inventory = { version = "0.3", optional = true } +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8", optional = true } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" +uniffi = { version = "0.31", features = ["cli"], optional = true } + +[workspace] diff --git a/benchmarks/v1/legacy/barretenberg-mobile/README.md b/benchmarks/v1/legacy/barretenberg-mobile/README.md new file mode 100644 index 000000000..068a77b80 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/README.md @@ -0,0 +1,138 @@ +# Historical Barretenberg 0.87 native mobile adapter + +This beta.11/v0.87 adapter is retained as compatibility and feasibility +evidence. It is not the backend reported by the final cross-device campaign, +which uses the pinned beta.19/Barretenberg 4.2 line described in +[`../REPRODUCIBILITY.md`](../REPRODUCIBILITY.md). Do not cite this document as +the publication benchmark method. + +This directory is an exact-version native adapter for the campaign's Noir +`1.0.0-beta.11` / Barretenberg `v0.87.0` lane. It does **not** use or relabel +Mopro's beta.19 / Barretenberg 4.2 backend. + +The adapter is deliberately fail closed: + +- the upstream source revision is pinned in `upstream.lock.json`; +- device builds use the upstream static `barretenberg` CMake target; +- CRS initialization uses `init_file_crs_factory`, whose native factory has + `allow_download=false`; +- package assets and the native library must match `package-manifest.json`; +- Rust's `native-v087` feature will not link unless + `BB_V087_MOBILE_LIB_DIR` contains the exact library; +- every C++ exception is caught at the C ABI boundary, and every returned + allocation has one matching free function. + +The upstream v0.87 release publishes macOS/Linux executables and WASM, but no +iOS or Android libraries. The source does define a static `barretenberg` +archive. `build-barretenberg-mobile.sh` therefore builds the pinned source +directly and supplies explicit Apple/Android CMake toolchains. + +## Build feasibility + +Start with the host build before spending time on mobile packaging: + +```bash +benchmarks/v1/scripts/build-barretenberg-mobile.sh host +``` + +Then build a device archive: + +```bash +benchmarks/v1/scripts/build-barretenberg-mobile.sh ios +ANDROID_NDK_HOME=/path/to/ndk \ + benchmarks/v1/scripts/build-barretenberg-mobile.sh android +``` + +The build script never changes upstream source. A source incompatibility, +missing SDK/NDK, or unsupported standard-library call is a hard failure. + +## Package contract + +The device package contains the native library, a complete local CRS, and the +frozen beta.11 `circuit.json`, `witness.gz`, and retained canonical proof +fixtures for Passport, WebAuthn, and OPRF. Create it with: + +```bash +bun benchmarks/v1/scripts/package-barretenberg-mobile.ts \ + --platform ios \ + --adapter-library target/v1-benchmarks/barretenberg-mobile/ios-v3/install/lib/libbarretenberg_v087_mobile.a \ + --upstream-library target/v1-benchmarks/barretenberg-mobile/ios-v3/install/lib/libbarretenberg.a \ + --crs /absolute/path/to/complete/crs \ + --output target/v1-benchmarks/barretenberg-mobile/packages/ios +``` + +The generated manifest records SHA-256, byte length, source revision, backend +version, Noir version, platform, and relative packaged path for every asset. +The Rust wrapper verifies the whole manifest before calling native code. + +## Timing boundary + +The package exposes four phases for each workload: + +- `witness`: beta.11 ACVM witness generation; intentionally unavailable until + the existing beta.11 ACVM is wired into this crate; +- `prove`: native Barretenberg only; circuit, witness, and CRS preparation are + outside the timed call; +- `verify`: native Barretenberg only; proof/VK reads and verification are timed; +- `e2e`: native prove followed by native verify; witness generation remains a + separately reported phase. + +No workload is publishable until a wrapper-generated proof verifies with the +canonical `bb v0.87.0`, a canonical proof verifies through the wrapper, and a +tampered proof, modified public inputs, and mismatched VK are all rejected. + +## Retained host feasibility result + +On 2026-07-27, canonical `bb v0.87.0` proved the frozen OPRF beta.11 +bytecode/witness and verified both its generated proof and the retained web +proof against the generated VK. Both proofs were 14,592 bytes and were +byte-for-byte identical: + +```text +sha256 569fc5a96b07d60ccc3f59dabd0088d711b5aa7a3b392e7fb40609238712c625 +``` + +A one-bit mutation in the generated proof was rejected. This establishes +beta.11/v0.87 host compatibility and validates the public-input field encoding; +it does not establish a successful mobile link or device run. + +## Retained cross-build feasibility + +Pinned source commit `9081b0ed38c43c120afb7c80f8f6cd418ca5ad70` +successfully produced both archives on 2026-07-27: + +| Target | Adapter SHA-256 | Upstream archive SHA-256 | +| --- | --- | --- | +| arm64 iOS 15+ | `015079faa86d7955ef489ca749c37415659ab1a0e4e78ba839cd9ff667b5497e` | `1925d738990001a36cf95200cbeb1f4401d487f3032ba8a5ce6dcc70110752a8` | +| AArch64 Android API 28+ | `a7c26cdb936769a1d1537794422d57d49653c5083332d8024fcf72bc73ff1361` | `686a0e37dd699a9f92a67d7608a3b6fceaa9e7f131e281f4e94cd4d39c342c40` | + +The Android adapter's extracted object is ELF64 AArch64, the iOS archive is +arm64 Mach-O, and both export all seven expected `bb_v087_*` entry points. +Android API 28 is the honest minimum because v0.87 calls `aligned_alloc` and +`getrandom`, which are unavailable in older Android NDK API surfaces. + +Both post-hook archives also pass a real Rust target link. Mobench's required +iOS simulator slice uses an explicit fail-closed shim; only the independently +linked arm64 device slice contains Barretenberg. Release IPA/AAB payload +validation confirms all 21 runtime assets byte-for-byte before upload. + +The original iOS failure traced to upstream's CLI-oriented `gunzip` subprocess, +which is unavailable in app sandboxes. The Android null crash initially looked +consistent with the same path, but the v3 result below shows another Android +cause remains. The v3 mobile compatibility header decompresses immutable +`.gz` inputs in-process with zlib. The generated iOS app also links `-lz`, and +generated Android apps enforce API 28. + +iPhone SE 2022 / iOS 15.4 subsequently completed all nine prove, verify, and +end-to-end functions with one warmup and five samples. The medians are retained +in `results/run-30041758043/barretenberg-mobile-release/ios-v3-summary.json`. +The beta.11 ACVM witness phase remains unavailable. + +Android is still blocked. The v3 Pixel 7 / Android 13 OPRF app loaded the exact +1/5 benchmark spec and then the isolated native worker received `SIGSEGV` at +address zero before emitting a sample. Do not widen Android until that +remaining target-specific crash is fixed. + +These hashes are feasibility evidence from this checkout, not release pins: +rebuilds may differ because static archives contain build metadata. The package +manifest records the exact bytes actually linked into a benchmark app. diff --git a/benchmarks/v1/legacy/barretenberg-mobile/build.rs b/benchmarks/v1/legacy/barretenberg-mobile/build.rs new file mode 100644 index 000000000..1ee4105a8 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/build.rs @@ -0,0 +1,65 @@ +use std::{env, path::PathBuf}; + +fn main() { + println!("cargo:rerun-if-env-changed=BB_V087_MOBILE_LIB_DIR"); + println!("cargo:rerun-if-env-changed=ANDROID_NDK_HOME"); + if env::var_os("CARGO_FEATURE_NATIVE_V087").is_none() { + return; + } + let target_os = env::var("CARGO_CFG_TARGET_OS").expect("Cargo target OS"); + let target_abi = env::var("CARGO_CFG_TARGET_ABI").unwrap_or_default(); + if target_os == "ios" && target_abi == "sim" { + // Mobench constructs a complete XCFramework and therefore compiles + // simulator slices even for BrowserStack device-only campaigns. The + // simulator staticlibs may retain unresolved C ABI references: Xcode + // selects the independently linked arm64 device slice for the IPA. + return; + } + let directory = env::var_os("BB_V087_MOBILE_LIB_DIR") + .map(PathBuf::from) + .expect("native-v087 requires BB_V087_MOBILE_LIB_DIR"); + let adapter = directory.join("libbarretenberg_v087_mobile.a"); + let upstream = directory.join("libbarretenberg.a"); + assert!( + adapter.is_file() && upstream.is_file(), + "BB_V087_MOBILE_LIB_DIR must contain exact v0.87 adapter and upstream archives" + ); + println!("cargo:rustc-link-search=native={}", directory.display()); + println!("cargo:rustc-link-lib=static=barretenberg_v087_mobile"); + println!("cargo:rustc-link-lib=static=barretenberg"); + if target_os == "android" { + let host_prebuilt = match env::consts::OS { + "macos" => "darwin-x86_64", + "linux" => "linux-x86_64", + other => panic!("unsupported Android NDK build host: {other}"), + }; + let android_triple = match env::var("CARGO_CFG_TARGET_ARCH").as_deref() { + Ok("aarch64") => "aarch64-linux-android", + Ok("arm") => "arm-linux-androideabi", + Ok("x86") => "i686-linux-android", + Ok("x86_64") => "x86_64-linux-android", + Ok(other) => panic!("unsupported Android target architecture: {other}"), + Err(error) => panic!("missing Android target architecture: {error}"), + }; + let ndk = env::var_os("ANDROID_NDK_HOME") + .map(PathBuf::from) + .expect("Android native-v087 requires ANDROID_NDK_HOME"); + let cxx_directory = ndk + .join("toolchains/llvm/prebuilt") + .join(host_prebuilt) + .join("sysroot/usr/lib") + .join(android_triple); + assert!( + cxx_directory.join("libc++_static.a").is_file(), + "ANDROID_NDK_HOME does not contain libc++_static for {android_triple}" + ); + println!("cargo:rustc-link-search=native={}", cxx_directory.display()); + println!("cargo:rustc-link-lib=static=c++_static"); + println!("cargo:rustc-link-lib=static=c++abi"); + } else { + println!("cargo:rustc-link-lib=c++"); + } + if target_os == "android" || target_os == "ios" { + println!("cargo:rustc-link-lib=z"); + } +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/cmake/android-arm64.cmake b/benchmarks/v1/legacy/barretenberg-mobile/cmake/android-arm64.cmake new file mode 100644 index 000000000..0ebf0c314 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/cmake/android-arm64.cmake @@ -0,0 +1,10 @@ +if(NOT DEFINED ENV{ANDROID_NDK_HOME}) + message(FATAL_ERROR "ANDROID_NDK_HOME is required") +endif() +set(ANDROID_ABI arm64-v8a CACHE STRING "" FORCE) +# v0.87 uses aligned_alloc/getrandom directly; both are public NDK APIs from 28. +set(ANDROID_PLATFORM android-28 CACHE STRING "" FORCE) +set(ANDROID_STL c++_static CACHE STRING "" FORCE) +include("$ENV{ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake") +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) diff --git a/benchmarks/v1/legacy/barretenberg-mobile/cmake/ios-arm64.cmake b/benchmarks/v1/legacy/barretenberg-mobile/cmake/ios-arm64.cmake new file mode 100644 index 000000000..7ffc16610 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/cmake/ios-arm64.cmake @@ -0,0 +1,8 @@ +set(CMAKE_SYSTEM_NAME iOS) +set(CMAKE_SYSTEM_PROCESSOR arm64) +set(CMAKE_OSX_SYSROOT iphoneos CACHE STRING "" FORCE) +set(CMAKE_OSX_ARCHITECTURES arm64 CACHE STRING "" FORCE) +set(CMAKE_OSX_DEPLOYMENT_TARGET 15.0 CACHE STRING "" FORCE) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO) diff --git a/benchmarks/v1/legacy/barretenberg-mobile/compat/apple/sys/random.h b/benchmarks/v1/legacy/barretenberg-mobile/compat/apple/sys/random.h new file mode 100644 index 000000000..f2283777c --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/compat/apple/sys/random.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +/* + * Barretenberg v0.87 includes Linux's unconditionally and uses + * getentropy on __APPLE__. The iOS SDK exposes neither that header nor the + * libc declaration. arc4random_buf is the platform CSPRNG, has no failure + * mode, and accepts the same output buffer contract. + */ +static inline int getentropy(void* buffer, size_t length) +{ + arc4random_buf(buffer, length); + return 0; +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/compat/mobile/barretenberg/api/get_bytecode.hpp b/benchmarks/v1/legacy/barretenberg-mobile/compat/mobile/barretenberg/api/get_bytecode.hpp new file mode 100644 index 000000000..4f1cdbd40 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/compat/mobile/barretenberg/api/get_bytecode.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Mobile replacement for v0.87's CLI loader, which invokes `gunzip` through + * `popen`. iOS and Android app sandboxes have no shell utility contract. + */ +inline std::vector gunzip(const std::string& path) +{ + gzFile input = gzopen(path.c_str(), "rb"); + if (input == nullptr) { + throw std::runtime_error("failed to open gzip input: " + path); + } + std::vector output; + std::array chunk{}; + for (;;) { + const int bytes = gzread(input, chunk.data(), static_cast(chunk.size())); + if (bytes > 0) { + output.insert(output.end(), chunk.begin(), chunk.begin() + bytes); + continue; + } + if (bytes == 0 && gzeof(input) != 0) { + break; + } + int error_number = Z_OK; + const char* error = gzerror(input, &error_number); + const std::string message = + error != nullptr ? error : "unknown gzip decompression error"; + gzclose(input); + throw std::runtime_error("failed to decompress " + path + ": " + message); + } + if (gzclose(input) != Z_OK) { + throw std::runtime_error("failed to close gzip input: " + path); + } + return output; +} + +inline std::vector get_bytecode(const std::string& bytecode_path) +{ + if (bytecode_path == "-") { + return { std::istreambuf_iterator(std::cin), std::istreambuf_iterator() }; + } + if (std::filesystem::path(bytecode_path).extension() == ".json") { + throw std::runtime_error( + "mobile Barretenberg requires a packaged raw .gz bytecode fixture"); + } + return gunzip(bytecode_path); +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/cpp/bb_v087_mobile.cpp b/benchmarks/v1/legacy/barretenberg-mobile/cpp/bb_v087_mobile.cpp new file mode 100644 index 000000000..bb3ca9c12 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/cpp/bb_v087_mobile.cpp @@ -0,0 +1,225 @@ +#include "bb_v087_mobile.h" + +#include "barretenberg/api/api_ultra_honk.hpp" +#include "barretenberg/srs/global_crs.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +std::mutex backend_mutex; +bool crs_initialized = false; + +void clear_bundle(bb_v087_proof_bundle* bundle) +{ + if (bundle != nullptr) { + bundle->public_inputs = {}; + bundle->proof = {}; + bundle->verification_key = {}; + } +} + +void set_error(char** error_out, const std::string& message) +{ + if (error_out == nullptr) { + return; + } + *error_out = static_cast(std::malloc(message.size() + 1)); + if (*error_out != nullptr) { + std::memcpy(*error_out, message.c_str(), message.size() + 1); + } +} + +bb_v087_buffer read_owned_file(const std::filesystem::path& path) +{ + std::ifstream input(path, std::ios::binary | std::ios::ate); + if (!input) { + throw std::runtime_error("failed to open output file: " + path.string()); + } + const auto end = input.tellg(); + if (end < 0) { + throw std::runtime_error("failed to determine output size: " + path.string()); + } + const auto length = static_cast(end); + input.seekg(0, std::ios::beg); + auto* data = static_cast(std::malloc(length == 0 ? 1 : length)); + if (data == nullptr) { + throw std::bad_alloc(); + } + if (length != 0 && !input.read(reinterpret_cast(data), static_cast(length))) { + std::free(data); + throw std::runtime_error("failed to read output file: " + path.string()); + } + return { data, length }; +} + +bool valid_path_argument(const char* value) +{ + return value != nullptr && value[0] != '\0'; +} + +bb::API::Flags campaign_flags() +{ + return { + .zk = false, + .ipa_accumulation = false, + .scheme = "ultra_honk", + .oracle_hash_type = "poseidon2", + .output_format = "bytes", + .write_vk = true, + }; +} + +template bb_v087_status guarded(char** error_out, Function&& function) +{ + if (error_out != nullptr) { + *error_out = nullptr; + } + try { + function(); + return BB_V087_OK; + } catch (const std::filesystem::filesystem_error& error) { + set_error(error_out, error.what()); + return BB_V087_IO_ERROR; + } catch (const std::exception& error) { + set_error(error_out, error.what()); + return BB_V087_BACKEND_ERROR; + } catch (...) { + set_error(error_out, "unknown Barretenberg exception"); + return BB_V087_BACKEND_ERROR; + } +} + +} // namespace + +// The upstream aggregate archive omits its `env` module: native executables +// normally link that module as a separate CMake target. Mobile consumers link +// only the aggregate archive, so provide the two native environment hooks in +// the adapter. Upstream is compiled with NO_MULTITHREADING for this lane. +extern "C" uint32_t env_hardware_concurrency(void) +{ + return 1; +} + +extern "C" void logstr(const char* value) +{ + if (value != nullptr) { + std::cerr << value << '\n'; + } +} + +extern "C" const char* bb_v087_mobile_version(void) +{ + return "0.87.0"; +} + +extern "C" bb_v087_status bb_v087_init_local_crs(const char* crs_directory, char** error_out) +{ + if (!valid_path_argument(crs_directory)) { + set_error(error_out, "crs_directory must be a non-empty path"); + return BB_V087_INVALID_ARGUMENT; + } + std::lock_guard lock(backend_mutex); + return guarded(error_out, [&] { + if (!crs_initialized) { + bb::srs::init_file_crs_factory(std::filesystem::path(crs_directory)); + crs_initialized = true; + } + }); +} + +extern "C" bb_v087_status bb_v087_prove(const char* circuit_path, + const char* witness_path, + const char* output_directory, + bb_v087_proof_bundle* out, + char** error_out) +{ + if (!valid_path_argument(circuit_path) || !valid_path_argument(witness_path) || + !valid_path_argument(output_directory) || out == nullptr) { + set_error(error_out, "prove requires circuit, witness, output directory, and output bundle"); + return BB_V087_INVALID_ARGUMENT; + } + clear_bundle(out); + std::lock_guard lock(backend_mutex); + if (!crs_initialized) { + set_error(error_out, "local CRS must be initialized before proving"); + return BB_V087_INVALID_ARGUMENT; + } + return guarded(error_out, [&] { + const std::filesystem::path output(output_directory); + std::filesystem::create_directories(output); + std::filesystem::remove(output / "public_inputs"); + std::filesystem::remove(output / "proof"); + std::filesystem::remove(output / "vk"); + + bb::UltraHonkAPI api; + api.prove(campaign_flags(), circuit_path, witness_path, output); + + bb_v087_proof_bundle result{}; + try { + result.public_inputs = read_owned_file(output / "public_inputs"); + result.proof = read_owned_file(output / "proof"); + result.verification_key = read_owned_file(output / "vk"); + } catch (...) { + bb_v087_free_proof_bundle(&result); + throw; + } + *out = result; + }); +} + +extern "C" bb_v087_status bb_v087_verify(const char* public_inputs_path, + const char* proof_path, + const char* verification_key_path, + bool* verified_out, + char** error_out) +{ + if (!valid_path_argument(public_inputs_path) || !valid_path_argument(proof_path) || + !valid_path_argument(verification_key_path) || verified_out == nullptr) { + set_error(error_out, "verify requires public inputs, proof, verification key, and result"); + return BB_V087_INVALID_ARGUMENT; + } + *verified_out = false; + std::lock_guard lock(backend_mutex); + if (!crs_initialized) { + set_error(error_out, "local CRS must be initialized before verification"); + return BB_V087_INVALID_ARGUMENT; + } + return guarded(error_out, [&] { + bb::UltraHonkAPI api; + *verified_out = + api.verify(campaign_flags(), public_inputs_path, proof_path, verification_key_path); + }); +} + +extern "C" void bb_v087_free_buffer(bb_v087_buffer* buffer) +{ + if (buffer != nullptr) { + std::free(buffer->data); + buffer->data = nullptr; + buffer->len = 0; + } +} + +extern "C" void bb_v087_free_proof_bundle(bb_v087_proof_bundle* bundle) +{ + if (bundle != nullptr) { + bb_v087_free_buffer(&bundle->public_inputs); + bb_v087_free_buffer(&bundle->proof); + bb_v087_free_buffer(&bundle->verification_key); + } +} + +extern "C" void bb_v087_free_error(char* error) +{ + std::free(error); +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/include/bb_v087_mobile.h b/benchmarks/v1/legacy/barretenberg-mobile/include/bb_v087_mobile.h new file mode 100644 index 000000000..0c5b9c1bd --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/include/bb_v087_mobile.h @@ -0,0 +1,74 @@ +#ifndef PROVEKIT_V1_BB_V087_MOBILE_H +#define PROVEKIT_V1_BB_V087_MOBILE_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum bb_v087_status { + BB_V087_OK = 0, + BB_V087_INVALID_ARGUMENT = 1, + BB_V087_IO_ERROR = 2, + BB_V087_BACKEND_ERROR = 3, + BB_V087_VERSION_MISMATCH = 4 +} bb_v087_status; + +typedef struct bb_v087_buffer { + uint8_t* data; + size_t len; +} bb_v087_buffer; + +typedef struct bb_v087_proof_bundle { + bb_v087_buffer public_inputs; + bb_v087_buffer proof; + bb_v087_buffer verification_key; +} bb_v087_proof_bundle; + +/** Returns the immutable backend version compiled into this adapter. */ +const char* bb_v087_mobile_version(void); + +/** + * Initializes the global CRS from local files only. + * + * The upstream file factory is selected with allow_download=false. The caller + * owns `error_out` on failure and must release it with bb_v087_free_error. + */ +bb_v087_status bb_v087_init_local_crs(const char* crs_directory, char** error_out); + +/** + * Generates a Poseidon2 UltraHonk proof from beta.11 bytecode and witness files. + * + * `output_directory` must be unique to this invocation. The caller owns all + * buffers in `out` and must release them with bb_v087_free_proof_bundle. + */ +bb_v087_status bb_v087_prove(const char* circuit_path, + const char* witness_path, + const char* output_directory, + bb_v087_proof_bundle* out, + char** error_out); + +/** Verifies a Poseidon2 UltraHonk proof. A malformed proof is a clean false. */ +bb_v087_status bb_v087_verify(const char* public_inputs_path, + const char* proof_path, + const char* verification_key_path, + bool* verified_out, + char** error_out); + +/** Releases a buffer returned by this adapter and zeroes its fields. */ +void bb_v087_free_buffer(bb_v087_buffer* buffer); + +/** Releases every owned buffer in a proof bundle and zeroes its fields. */ +void bb_v087_free_proof_bundle(bb_v087_proof_bundle* bundle); + +/** Releases an error string returned by this adapter. */ +void bb_v087_free_error(char* error); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/lib.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/lib.rs new file mode 100644 index 000000000..f3e7179e4 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/lib.rs @@ -0,0 +1,116 @@ +//! Fail-closed Rust boundary for exact Noir beta.11 / Barretenberg v0.87. + +mod manifest; +mod phases; + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +mod mobench; + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +mod native_c_abi; + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +use { + mobench::{ + setup_oprf_e2e, setup_oprf_prove, setup_oprf_verify, setup_passport_e2e, + setup_passport_prove, setup_passport_verify, setup_webauthn_e2e, setup_webauthn_prove, + setup_webauthn_verify, + }, + mobench_sdk::benchmark, + std::hint::black_box, +}; + +#[cfg(all( + feature = "native-v087", + not(all(target_os = "ios", target_abi = "sim")) +))] +mod native; + +#[cfg(all(feature = "native-v087", target_os = "ios", target_abi = "sim"))] +#[path = "native_ios_sim.rs"] +mod native; + +#[cfg(feature = "native-v087")] +pub use native::{initialize_local_crs, prove, verify, ProofBundle}; +pub use { + manifest::{verify_package, verify_runtime_package, PackageManifest, VerifiedPackage}, + phases::{Backend, Phase, Workload}, +}; + +/// Returns the reason this build cannot execute native v0.87. +pub fn unavailable_reason() -> Option<&'static str> { + #[cfg(feature = "native-v087")] + { + None + } + #[cfg(not(feature = "native-v087"))] + { + Some( + "exact Barretenberg v0.87 native archive is not linked; build with native-v087 and \ + BB_V087_MOBILE_LIB_DIR", + ) + } +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_passport_prove, per_iteration)] +pub fn bench_passport_barretenberg_prove(prepared: mobench::PreparedProof) { + black_box(mobench::run_proof(&prepared)); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_passport_verify)] +pub fn bench_passport_barretenberg_verify(prepared: &mobench::PreparedVerification) { + let valid = mobench::run_verify(prepared); + assert!(valid, "valid Passport Barretenberg proof was rejected"); + black_box(valid); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_passport_e2e, per_iteration)] +pub fn bench_passport_barretenberg_e2e(prepared: mobench::PreparedEndToEnd) { + black_box(mobench::run_end_to_end(&prepared)); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_webauthn_prove, per_iteration)] +pub fn bench_webauthn_barretenberg_prove(prepared: mobench::PreparedProof) { + black_box(mobench::run_proof(&prepared)); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_webauthn_verify)] +pub fn bench_webauthn_barretenberg_verify(prepared: &mobench::PreparedVerification) { + let valid = mobench::run_verify(prepared); + assert!(valid, "valid WebAuthn Barretenberg proof was rejected"); + black_box(valid); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_webauthn_e2e, per_iteration)] +pub fn bench_webauthn_barretenberg_e2e(prepared: mobench::PreparedEndToEnd) { + black_box(mobench::run_end_to_end(&prepared)); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_oprf_prove, per_iteration)] +pub fn bench_oprf_barretenberg_prove(prepared: mobench::PreparedProof) { + black_box(mobench::run_proof(&prepared)); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_oprf_verify)] +pub fn bench_oprf_barretenberg_verify(prepared: &mobench::PreparedVerification) { + let valid = mobench::run_verify(prepared); + assert!(valid, "valid OPRF Barretenberg proof was rejected"); + black_box(valid); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +#[benchmark(setup = setup_oprf_e2e, per_iteration)] +pub fn bench_oprf_barretenberg_e2e(prepared: mobench::PreparedEndToEnd) { + black_box(mobench::run_end_to_end(&prepared)); +} + +#[cfg(all(feature = "mobench", feature = "native-v087"))] +uniffi::setup_scaffolding!(); diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/manifest.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/manifest.rs new file mode 100644 index 000000000..95be104fd --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/manifest.rs @@ -0,0 +1,343 @@ +use { + anyhow::{bail, ensure, Context, Result}, + serde::Deserialize, + sha2::{Digest, Sha256}, + std::{ + fs, + path::{Component, Path, PathBuf}, + }, +}; + +const EXPECTED_BACKEND_VERSION: &str = "0.87.0"; +const EXPECTED_NOIR_VERSION: &str = "1.0.0-beta.11"; +const EXPECTED_COMMIT: &str = "9081b0ed38c43c120afb7c80f8f6cd418ca5ad70"; + +#[derive(Debug, Deserialize)] +pub struct PackageManifest { + pub schema_version: u32, + pub backend: String, + pub backend_version: String, + pub noir_version: String, + pub upstream_commit: String, + pub platform: String, + pub network_at_device: bool, + pub assets: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct Asset { + pub path: PathBuf, + pub role: String, + pub bytes: u64, + pub sha256: String, +} + +#[derive(Debug)] +pub struct VerifiedPackage { + pub root: PathBuf, + pub manifest: PackageManifest, +} + +pub fn verify_package(root: impl AsRef) -> Result { + verify_manifest(root.as_ref(), "package-manifest.json", true) +} + +/// Verifies the runtime-only package embedded in a Mobench app. +/// +/// The linked static archives are authenticated by the outer immutable +/// Mobench artifact manifest. They are deliberately not duplicated as runtime +/// resources, especially on Android where the v0.87 archive is hundreds of +/// megabytes before the final linker discards unused objects. +pub fn verify_runtime_package(root: impl AsRef) -> Result { + verify_manifest(root.as_ref(), "runtime-package-manifest.json", false) +} + +fn verify_manifest( + root: &Path, + manifest_name: &str, + require_native_libraries: bool, +) -> Result { + let manifest_path = root.join(manifest_name); + let manifest: PackageManifest = serde_json::from_slice( + &fs::read(&manifest_path).with_context(|| format!("read {}", manifest_path.display()))?, + ) + .context("decode package manifest")?; + ensure!(manifest.schema_version == 1, "unsupported manifest schema"); + ensure!(manifest.backend == "barretenberg", "unexpected backend"); + ensure!( + manifest.backend_version == EXPECTED_BACKEND_VERSION, + "Barretenberg version mismatch" + ); + ensure!( + manifest.noir_version == EXPECTED_NOIR_VERSION, + "Noir version mismatch" + ); + ensure!( + manifest.upstream_commit == EXPECTED_COMMIT, + "upstream source mismatch" + ); + ensure!( + !manifest.network_at_device, + "device package must forbid network" + ); + ensure!( + manifest.platform == "ios" || manifest.platform == "android", + "unsupported package platform" + ); + ensure!(!manifest.assets.is_empty(), "package has no assets"); + + let mut native_adapter_libraries = 0; + let mut native_upstream_libraries = 0; + let mut crs_files = 0; + for asset in &manifest.assets { + if asset + .path + .components() + .any(|component| !matches!(component, Component::Normal(_))) + { + bail!( + "asset path must be relative and normalized: {:?}", + asset.path + ); + } + let path = root.join(&asset.path); + let bytes = fs::read(&path).with_context(|| format!("read {}", path.display()))?; + ensure!( + bytes.len() as u64 == asset.bytes, + "size mismatch for {:?}", + asset.path + ); + let digest = hex::encode(Sha256::digest(&bytes)); + ensure!( + digest == asset.sha256, + "SHA-256 mismatch for {:?}", + asset.path + ); + if asset.role == "native-adapter-library" { + native_adapter_libraries += 1; + } else if asset.role == "native-upstream-library" { + native_upstream_libraries += 1; + } else if asset.role == "crs" { + crs_files += 1; + } + } + if require_native_libraries { + ensure!( + native_adapter_libraries == 1, + "package must contain one native adapter library" + ); + ensure!( + native_upstream_libraries == 1, + "package must contain one native upstream library" + ); + } else { + ensure!( + native_adapter_libraries == 0 && native_upstream_libraries == 0, + "runtime package must not duplicate linked static archives" + ); + } + ensure!(crs_files > 0, "package must contain a local CRS"); + for crs_name in ["bn254_g1.dat", "bn254_g2.dat"] { + let crs_path = Path::new("crs").join(crs_name); + ensure!( + manifest + .assets + .iter() + .any(|asset| asset.role == "crs" && asset.path == crs_path), + "package is missing {crs_name}" + ); + } + for workload in [ + "passport_complete_age_check", + "webauthn_assertion", + "oprf_taceo", + ] { + let fixture_role = format!("fixture:{workload}"); + ensure!( + manifest + .assets + .iter() + .filter(|asset| asset.role == fixture_role) + .count() + == 4, + "package has an incomplete {workload} frozen fixture" + ); + for suffix in ["native-bytecode", "native-public-inputs"] { + let role = format!("fixture:{workload}:{suffix}"); + ensure!( + manifest + .assets + .iter() + .filter(|asset| asset.role == role) + .count() + == 1, + "package has an incomplete {workload} native fixture" + ); + } + } + Ok(VerifiedPackage { + root: root.to_path_buf(), + manifest, + }) +} + +#[cfg(test)] +mod tests { + use {super::*, serde_json::json}; + + fn write_asset(root: &Path, path: &str, role: &str) -> serde_json::Value { + let bytes = format!("{path}:{role}").into_bytes(); + let destination = root.join(path); + fs::create_dir_all(destination.parent().unwrap()).unwrap(); + fs::write(&destination, &bytes).unwrap(); + json!({ + "path": path, + "role": role, + "bytes": bytes.len(), + "sha256": hex::encode(Sha256::digest(&bytes)), + }) + } + + #[test] + fn rejects_wrong_version_before_reading_assets() { + let root = + std::env::temp_dir().join(format!("bb-v087-manifest-test-{}", std::process::id())); + fs::create_dir_all(&root).unwrap(); + fs::write( + root.join("package-manifest.json"), + r#"{ + "schema_version":1,"backend":"barretenberg", + "backend_version":"4.2.0","noir_version":"1.0.0-beta.19", + "upstream_commit":"wrong","platform":"ios", + "network_at_device":false,"assets":[] + }"#, + ) + .unwrap(); + let error = verify_package(&root).unwrap_err().to_string(); + assert!(error.contains("Barretenberg version mismatch")); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn accepts_complete_package_and_rejects_tampering() { + let root = std::env::temp_dir().join(format!("bb-v087-valid-test-{}", std::process::id())); + fs::create_dir_all(&root).unwrap(); + let mut assets = vec![ + write_asset( + &root, + "lib/libbarretenberg_v087_mobile.a", + "native-adapter-library", + ), + write_asset(&root, "lib/libbarretenberg.a", "native-upstream-library"), + write_asset(&root, "crs/bn254_g1.dat", "crs"), + write_asset(&root, "crs/bn254_g2.dat", "crs"), + ]; + for workload in [ + "passport_complete_age_check", + "webauthn_assertion", + "oprf_taceo", + ] { + for name in [ + "circuit.json", + "witness.gz", + "public-inputs.json", + "proof.bin", + ] { + assets.push(write_asset( + &root, + &format!("fixtures/{workload}/{name}"), + &format!("fixture:{workload}"), + )); + } + for (name, suffix) in [ + ("bytecode.gz", "native-bytecode"), + ("public_inputs", "native-public-inputs"), + ] { + assets.push(write_asset( + &root, + &format!("fixtures/{workload}/{name}"), + &format!("fixture:{workload}:{suffix}"), + )); + } + } + let manifest = json!({ + "schema_version": 1, + "backend": "barretenberg", + "backend_version": EXPECTED_BACKEND_VERSION, + "noir_version": EXPECTED_NOIR_VERSION, + "upstream_commit": EXPECTED_COMMIT, + "platform": "ios", + "network_at_device": false, + "assets": assets, + }); + fs::write( + root.join("package-manifest.json"), + serde_json::to_vec(&manifest).unwrap(), + ) + .unwrap(); + verify_package(&root).unwrap(); + + fs::write(root.join("crs/bn254_g2.dat"), b"tampered").unwrap(); + assert!(verify_package(&root) + .unwrap_err() + .to_string() + .contains("mismatch")); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn accepts_runtime_package_without_duplicating_linked_archives() { + let root = + std::env::temp_dir().join(format!("bb-v087-runtime-test-{}", std::process::id())); + fs::create_dir_all(&root).unwrap(); + let mut assets = vec![ + write_asset(&root, "crs/bn254_g1.dat", "crs"), + write_asset(&root, "crs/bn254_g2.dat", "crs"), + ]; + for workload in [ + "passport_complete_age_check", + "webauthn_assertion", + "oprf_taceo", + ] { + for name in [ + "circuit.json", + "witness.gz", + "public-inputs.json", + "proof.bin", + ] { + assets.push(write_asset( + &root, + &format!("fixtures/{workload}/{name}"), + &format!("fixture:{workload}"), + )); + } + for (name, suffix) in [ + ("bytecode.gz", "native-bytecode"), + ("public_inputs", "native-public-inputs"), + ] { + assets.push(write_asset( + &root, + &format!("fixtures/{workload}/{name}"), + &format!("fixture:{workload}:{suffix}"), + )); + } + } + let manifest = json!({ + "schema_version": 1, + "backend": "barretenberg", + "backend_version": EXPECTED_BACKEND_VERSION, + "noir_version": EXPECTED_NOIR_VERSION, + "upstream_commit": EXPECTED_COMMIT, + "platform": "android", + "network_at_device": false, + "assets": assets, + }); + fs::write( + root.join("runtime-package-manifest.json"), + serde_json::to_vec(&manifest).unwrap(), + ) + .unwrap(); + verify_runtime_package(&root).unwrap(); + fs::remove_dir_all(root).unwrap(); + } +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/mobench.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/mobench.rs new file mode 100644 index 000000000..c6b2e43a5 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/mobench.rs @@ -0,0 +1,284 @@ +use { + crate::{ + initialize_local_crs, prove, verify, verify_package, verify_runtime_package, Workload, + }, + std::{ + env, fs, + path::{Path, PathBuf}, + sync::atomic::{AtomicU64, Ordering}, + }, +}; + +const PACKAGE_ENV: &str = "MOBENCH_BB_V087_PACKAGE_ROOT"; +const RUNTIME_MANIFEST: &str = "runtime-package-manifest.json"; +static OUTPUT_SEQUENCE: AtomicU64 = AtomicU64::new(0); + +#[derive(Debug)] +pub struct PreparedProof { + circuit: PathBuf, + witness: PathBuf, + output: PathBuf, +} + +#[derive(Debug)] +pub struct PreparedVerification { + public_inputs: PathBuf, + proof: PathBuf, + verification_key: PathBuf, +} + +#[derive(Debug)] +pub struct PreparedEndToEnd { + proof: PreparedProof, +} + +fn benchmark_library_root() -> PathBuf { + #[cfg(target_os = "android")] + { + let library_name = format!("lib{}.so", env!("CARGO_PKG_NAME").replace('-', "_")); + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(&library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + return PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .to_path_buf(); + } + + #[cfg(not(target_os = "android"))] + { + env::current_exe() + .expect("resolve benchmark executable path") + .parent() + .expect("benchmark executable has an app-bundle parent") + .to_path_buf() + } +} + +fn encoded_resource_name(path: &Path) -> String { + let encoded = path + .to_string_lossy() + .replace(['/', '.', '-'], "_") + .replace("__", "_"); + format!("libmobench_bb_v087_{encoded}.so") +} + +fn runtime_asset_paths() -> Vec { + let mut paths = vec![ + PathBuf::from(RUNTIME_MANIFEST), + PathBuf::from("crs/bn254_g1.dat"), + PathBuf::from("crs/bn254_g2.dat"), + ]; + for workload in Workload::ALL { + let root = Path::new("fixtures").join(workload.fixture_name()); + for name in [ + "circuit.json", + "witness.gz", + "public-inputs.json", + "proof.bin", + "bytecode.gz", + "public_inputs", + ] { + paths.push(root.join(name)); + } + } + paths +} + +fn materialize_embedded_package(source_root: &Path) -> PathBuf { + let destination = env::temp_dir().join("provekit-v1-barretenberg-v087-runtime"); + for relative in runtime_asset_paths() { + let source = source_root.join(encoded_resource_name(&relative)); + let target = destination.join(&relative); + let bytes = fs::read(&source) + .unwrap_or_else(|error| panic!("read embedded {}: {error}", source.display())); + fs::create_dir_all(target.parent().expect("runtime asset has a parent")) + .unwrap_or_else(|error| panic!("create runtime package directory: {error}")); + fs::write(&target, bytes) + .unwrap_or_else(|error| panic!("stage embedded {}: {error}", target.display())); + } + verify_runtime_package(&destination).expect("verify staged Barretenberg runtime package"); + destination +} + +fn package_root() -> PathBuf { + if let Some(path) = env::var_os(PACKAGE_ENV) { + let root = PathBuf::from(path); + if root.join(RUNTIME_MANIFEST).is_file() { + verify_runtime_package(&root).expect("verify configured Barretenberg runtime package"); + } else { + verify_package(&root).expect("verify configured Barretenberg full package"); + } + return root; + } + + let root = benchmark_library_root(); + let nested = root.join("barretenberg-v087"); + if nested.join(RUNTIME_MANIFEST).is_file() { + verify_runtime_package(&nested).expect("verify bundled Barretenberg runtime package"); + return nested; + } + materialize_embedded_package(&root) +} + +fn output_directory(workload: Workload) -> PathBuf { + let sequence = OUTPUT_SEQUENCE.fetch_add(1, Ordering::Relaxed); + env::temp_dir() + .join("provekit-v1-barretenberg-v087-output") + .join(format!( + "{}-{}-{sequence}", + workload.fixture_name(), + std::process::id() + )) +} + +fn setup_proof(workload: Workload) -> PreparedProof { + let root = package_root(); + initialize_local_crs(&root.join("crs")).expect("initialize exact v0.87 local CRS"); + let fixture = root.join("fixtures").join(workload.fixture_name()); + PreparedProof { + circuit: fixture.join("bytecode.gz"), + witness: fixture.join("witness.gz"), + output: output_directory(workload), + } +} + +pub fn run_proof(prepared: &PreparedProof) -> crate::ProofBundle { + prove(&prepared.circuit, &prepared.witness, &prepared.output) + .expect("Barretenberg v0.87 UltraHonk proof") +} + +fn setup_verification(workload: Workload) -> PreparedVerification { + let prepared = setup_proof(workload); + let bundle = run_proof(&prepared); + let verification = PreparedVerification { + public_inputs: prepared.output.join("public_inputs"), + proof: prepared.output.join("proof"), + verification_key: prepared.output.join("vk"), + }; + assert_eq!( + bundle.proof, + fs::read(&verification.proof).expect("read prepared proof"), + "native returned proof differs from its output file" + ); + assert!( + verify( + &verification.public_inputs, + &verification.proof, + &verification.verification_key + ) + .expect("verify prepared Barretenberg proof"), + "prepared Barretenberg proof must verify" + ); + verification +} + +fn setup_end_to_end(workload: Workload) -> PreparedEndToEnd { + PreparedEndToEnd { + proof: setup_proof(workload), + } +} + +pub fn run_verify(prepared: &PreparedVerification) -> bool { + verify( + &prepared.public_inputs, + &prepared.proof, + &prepared.verification_key, + ) + .expect("Barretenberg v0.87 UltraHonk verification") +} + +pub fn run_end_to_end(prepared: &PreparedEndToEnd) -> (crate::ProofBundle, bool) { + let bundle = run_proof(&prepared.proof); + let valid = verify( + &prepared.proof.output.join("public_inputs"), + &prepared.proof.output.join("proof"), + &prepared.proof.output.join("vk"), + ) + .expect("Barretenberg v0.87 end-to-end verification"); + assert!(valid, "end-to-end Barretenberg proof was rejected"); + (bundle, valid) +} + +pub fn setup_passport_prove() -> PreparedProof { + setup_proof(Workload::PassportCompleteAgeCheck) +} + +pub fn setup_passport_verify() -> PreparedVerification { + setup_verification(Workload::PassportCompleteAgeCheck) +} + +pub fn setup_passport_e2e() -> PreparedEndToEnd { + setup_end_to_end(Workload::PassportCompleteAgeCheck) +} + +pub fn setup_webauthn_prove() -> PreparedProof { + setup_proof(Workload::WebAuthnAssertion) +} + +pub fn setup_webauthn_verify() -> PreparedVerification { + setup_verification(Workload::WebAuthnAssertion) +} + +pub fn setup_webauthn_e2e() -> PreparedEndToEnd { + setup_end_to_end(Workload::WebAuthnAssertion) +} + +pub fn setup_oprf_prove() -> PreparedProof { + setup_proof(Workload::OprfTaceo) +} + +pub fn setup_oprf_verify() -> PreparedVerification { + setup_verification(Workload::OprfTaceo) +} + +pub fn setup_oprf_e2e() -> PreparedEndToEnd { + setup_end_to_end(Workload::OprfTaceo) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn registers_all_nine_mobench_functions() { + let names = mobench_sdk::list_benchmark_names(); + for suffix in [ + "::bench_passport_barretenberg_prove", + "::bench_passport_barretenberg_verify", + "::bench_passport_barretenberg_e2e", + "::bench_webauthn_barretenberg_prove", + "::bench_webauthn_barretenberg_verify", + "::bench_webauthn_barretenberg_e2e", + "::bench_oprf_barretenberg_prove", + "::bench_oprf_barretenberg_verify", + "::bench_oprf_barretenberg_e2e", + ] { + assert!( + names.iter().any(|name| name.ends_with(suffix)), + "missing {suffix}: {names:?}" + ); + } + } + + #[test] + fn frozen_oprf_proves_verifies_and_rejects_tampering() { + let prepared = setup_verification(Workload::OprfTaceo); + assert!( + run_verify(&prepared), + "valid frozen OPRF proof was rejected" + ); + let mut proof = fs::read(&prepared.proof).expect("read OPRF proof"); + let midpoint = proof.len() / 2; + proof[midpoint] ^= 1; + fs::write(&prepared.proof, proof).expect("write tampered OPRF proof"); + assert!( + !run_verify(&prepared), + "one-bit-tampered OPRF proof was accepted" + ); + } +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/native.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/native.rs new file mode 100644 index 000000000..040217f2c --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/native.rs @@ -0,0 +1,158 @@ +use { + anyhow::{bail, ensure, Result}, + std::{ + ffi::{CStr, CString}, + os::raw::c_char, + path::Path, + ptr, + }, +}; + +#[repr(C)] +struct NativeBuffer { + data: *mut u8, + len: usize, +} + +#[repr(C)] +struct NativeProofBundle { + public_inputs: NativeBuffer, + proof: NativeBuffer, + verification_key: NativeBuffer, +} + +unsafe extern "C" { + fn bb_v087_mobile_version() -> *const c_char; + fn bb_v087_init_local_crs(path: *const c_char, error: *mut *mut c_char) -> i32; + fn bb_v087_prove( + circuit: *const c_char, + witness: *const c_char, + output: *const c_char, + bundle: *mut NativeProofBundle, + error: *mut *mut c_char, + ) -> i32; + fn bb_v087_verify( + public_inputs: *const c_char, + proof: *const c_char, + verification_key: *const c_char, + verified: *mut bool, + error: *mut *mut c_char, + ) -> i32; + fn bb_v087_free_proof_bundle(bundle: *mut NativeProofBundle); + fn bb_v087_free_error(error: *mut c_char); +} + +pub struct ProofBundle { + pub public_inputs: Vec, + pub proof: Vec, + pub verification_key: Vec, +} + +fn path_string(path: &Path) -> Result { + Ok(CString::new(path.to_string_lossy().as_bytes())?) +} + +fn status(status: i32, error: *mut c_char) -> Result<()> { + if status == 0 { + ensure!( + error.is_null(), + "native success returned an error allocation" + ); + return Ok(()); + } + let message = if error.is_null() { + format!("native Barretenberg failed with status {status}") + } else { + // SAFETY: The C ABI returns a NUL-terminated allocation on failure. + let value = unsafe { CStr::from_ptr(error) } + .to_string_lossy() + .into_owned(); + // SAFETY: This pointer is owned by the caller exactly once. + unsafe { bb_v087_free_error(error) }; + value + }; + bail!(message) +} + +pub fn initialize_local_crs(path: &Path) -> Result<()> { + // SAFETY: The version function returns a process-lifetime static string. + let version = unsafe { CStr::from_ptr(bb_v087_mobile_version()) }.to_str()?; + ensure!(version == "0.87.0", "linked Barretenberg version mismatch"); + let path = path_string(path)?; + let mut error = ptr::null_mut(); + // SAFETY: CString is valid for the call and error is an out pointer. + let result = unsafe { bb_v087_init_local_crs(path.as_ptr(), &mut error) }; + status(result, error) +} + +pub fn prove(circuit: &Path, witness: &Path, output: &Path) -> Result { + let circuit = path_string(circuit)?; + let witness = path_string(witness)?; + let output = path_string(output)?; + let mut native = NativeProofBundle { + public_inputs: NativeBuffer { + data: ptr::null_mut(), + len: 0, + }, + proof: NativeBuffer { + data: ptr::null_mut(), + len: 0, + }, + verification_key: NativeBuffer { + data: ptr::null_mut(), + len: 0, + }, + }; + let mut error = ptr::null_mut(); + // SAFETY: All input strings live through the call and native is initialized. + let result = unsafe { + bb_v087_prove( + circuit.as_ptr(), + witness.as_ptr(), + output.as_ptr(), + &mut native, + &mut error, + ) + }; + status(result, error)?; + // SAFETY: Successful native buffers are valid for their reported lengths. + let bundle = unsafe { + ProofBundle { + public_inputs: std::slice::from_raw_parts( + native.public_inputs.data, + native.public_inputs.len, + ) + .to_vec(), + proof: std::slice::from_raw_parts(native.proof.data, native.proof.len) + .to_vec(), + verification_key: std::slice::from_raw_parts( + native.verification_key.data, + native.verification_key.len, + ) + .to_vec(), + } + }; + // SAFETY: Every native allocation is freed exactly once after copying. + unsafe { bb_v087_free_proof_bundle(&mut native) }; + Ok(bundle) +} + +pub fn verify(public_inputs: &Path, proof: &Path, verification_key: &Path) -> Result { + let public_inputs = path_string(public_inputs)?; + let proof = path_string(proof)?; + let verification_key = path_string(verification_key)?; + let mut verified = false; + let mut error = ptr::null_mut(); + // SAFETY: All strings and output pointers are valid for the call. + let result = unsafe { + bb_v087_verify( + public_inputs.as_ptr(), + proof.as_ptr(), + verification_key.as_ptr(), + &mut verified, + &mut error, + ) + }; + status(result, error)?; + Ok(verified) +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/native_c_abi.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/native_c_abi.rs new file mode 100644 index 000000000..b0399d8dd --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/native_c_abi.rs @@ -0,0 +1,124 @@ +use { + mobench_sdk::{run_benchmark, BenchSpec, MobenchBuf}, + std::{ + any::Any, + cell::RefCell, + ffi::CString, + os::raw::c_char, + panic::{catch_unwind, AssertUnwindSafe}, + slice, + }, +}; + +thread_local! { + static LAST_ERROR: RefCell = RefCell::new(CString::default()); +} + +fn set_last_error(message: impl AsRef) { + let sanitized = message.as_ref().replace('\0', "\\0"); + let value = CString::new(sanitized).unwrap_or_default(); + LAST_ERROR.with(|error| *error.borrow_mut() = value); +} + +fn panic_message(payload: Box) -> String { + if let Some(message) = payload.downcast_ref::() { + message.clone() + } else if let Some(message) = payload.downcast_ref::<&str>() { + (*message).to_owned() + } else { + "benchmark panicked with a non-string payload".to_owned() + } +} + +/// Runs a Mobench benchmark through the native JSON C ABI. +/// +/// This mirrors Mobench 0.1.48's ABI while preserving the panic payload in +/// `mobench_last_error_message`, which is required to diagnose device-only +/// setup failures. +/// +/// # Safety +/// +/// `spec_ptr` must be valid for `spec_len` readable bytes when non-null. +/// `out` must point to one writable [`MobenchBuf`]. +#[no_mangle] +pub unsafe extern "C" fn mobench_run_benchmark_json( + spec_ptr: *const u8, + spec_len: usize, + out: *mut MobenchBuf, +) -> i32 { + let result = catch_unwind(AssertUnwindSafe(|| -> Result<(), String> { + if out.is_null() { + return Err("output buffer pointer must not be null".to_owned()); + } + // SAFETY: The caller guarantees that `out` is writable. + unsafe { *out = MobenchBuf::default() }; + if spec_len > 0 && spec_ptr.is_null() { + return Err("spec pointer must not be null when spec length is non-zero".to_owned()); + } + let spec_bytes = if spec_len == 0 { + &[] + } else { + // SAFETY: The caller guarantees `spec_ptr` is readable for + // `spec_len` bytes. + unsafe { slice::from_raw_parts(spec_ptr, spec_len) } + }; + let spec: BenchSpec = serde_json::from_slice(spec_bytes) + .map_err(|error| format!("failed to parse BenchSpec JSON: {error}"))?; + let report = run_benchmark(spec).map_err(|error| error.to_string())?; + let mut bytes = serde_json::to_vec(&report) + .map_err(|error| format!("failed to serialize benchmark report: {error}"))?; + let buffer = MobenchBuf { + ptr: bytes.as_mut_ptr(), + len: bytes.len(), + cap: bytes.capacity(), + }; + std::mem::forget(bytes); + // SAFETY: The caller guarantees that `out` is writable. + unsafe { *out = buffer }; + Ok(()) + })); + match result { + Ok(Ok(())) => { + set_last_error(""); + 0 + } + Ok(Err(error)) => { + set_last_error(error); + 1 + } + Err(payload) => { + set_last_error(panic_message(payload)); + 2 + } + } +} + +/// Frees a buffer returned by [`mobench_run_benchmark_json`]. +/// +/// # Safety +/// +/// `buffer` must be null or point to an initialized [`MobenchBuf`]. A non-null +/// allocation must have been returned by this module and not yet freed. +#[no_mangle] +pub unsafe extern "C" fn mobench_free_buf(buffer: *mut MobenchBuf) { + if buffer.is_null() { + return; + } + // SAFETY: The caller guarantees that `buffer` is writable. + let buffer = unsafe { &mut *buffer }; + if !buffer.ptr.is_null() { + let (data, len, cap) = (buffer.ptr, buffer.len, buffer.cap); + *buffer = MobenchBuf::default(); + // SAFETY: This allocation was created from a Vec with these exact + // pointer, length, and capacity values. + unsafe { drop(Vec::from_raw_parts(data, len, cap)) }; + } else { + *buffer = MobenchBuf::default(); + } +} + +/// Returns the most recent C-ABI error message for this thread. +#[no_mangle] +pub extern "C" fn mobench_last_error_message() -> *const c_char { + LAST_ERROR.with(|error| error.borrow().as_ptr()) +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/native_ios_sim.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/native_ios_sim.rs new file mode 100644 index 000000000..91ff46b73 --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/native_ios_sim.rs @@ -0,0 +1,28 @@ +use { + anyhow::{bail, Result}, + std::path::Path, +}; + +/// Placeholder result type for Mobench's unused iOS simulator XCFramework +/// slice. BrowserStack executes the independently linked arm64 device slice. +pub struct ProofBundle { + pub public_inputs: Vec, + pub proof: Vec, + pub verification_key: Vec, +} + +fn unsupported() -> Result { + bail!("Barretenberg v0.87 is linked only into the iOS device slice") +} + +pub fn initialize_local_crs(_path: &Path) -> Result<()> { + unsupported() +} + +pub fn prove(_circuit: &Path, _witness: &Path, _output: &Path) -> Result { + unsupported() +} + +pub fn verify(_public_inputs: &Path, _proof: &Path, _verification_key: &Path) -> Result { + unsupported() +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/src/phases.rs b/benchmarks/v1/legacy/barretenberg-mobile/src/phases.rs new file mode 100644 index 000000000..bd0a6d63c --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/src/phases.rs @@ -0,0 +1,59 @@ +/// The only backend identity accepted by this adapter. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct Backend; + +impl Backend { + pub const VERSION: &'static str = "0.87.0"; + pub const NOIR_VERSION: &'static str = "1.0.0-beta.11"; +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Workload { + PassportCompleteAgeCheck, + WebAuthnAssertion, + OprfTaceo, +} + +impl Workload { + pub const ALL: [Self; 3] = [ + Self::PassportCompleteAgeCheck, + Self::WebAuthnAssertion, + Self::OprfTaceo, + ]; + + pub const fn fixture_name(self) -> &'static str { + match self { + Self::PassportCompleteAgeCheck => "passport_complete_age_check", + Self::WebAuthnAssertion => "webauthn_assertion", + Self::OprfTaceo => "oprf_taceo", + } + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Phase { + Witness, + Prove, + Verify, + EndToEnd, +} + +impl Phase { + pub const ALL: [Self; 4] = [Self::Witness, Self::Prove, Self::Verify, Self::EndToEnd]; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn matrix_exposes_all_twelve_phase_cells() { + let cells = Workload::ALL + .into_iter() + .flat_map(|workload| Phase::ALL.map(|phase| (workload, phase))) + .count(); + assert_eq!(cells, 12); + assert_eq!(Backend::VERSION, "0.87.0"); + assert_eq!(Backend::NOIR_VERSION, "1.0.0-beta.11"); + } +} diff --git a/benchmarks/v1/legacy/barretenberg-mobile/upstream.lock.json b/benchmarks/v1/legacy/barretenberg-mobile/upstream.lock.json new file mode 100644 index 000000000..838d3a02c --- /dev/null +++ b/benchmarks/v1/legacy/barretenberg-mobile/upstream.lock.json @@ -0,0 +1,10 @@ +{ + "schema_version": 1, + "repository": "https://github.com/AztecProtocol/aztec-packages.git", + "tag": "v0.87.0", + "commit": "9081b0ed38c43c120afb7c80f8f6cd418ca5ad70", + "barretenberg_version": "0.87.0", + "noir_version": "1.0.0-beta.11", + "native_release_assets": [], + "source_build_required": true +} diff --git a/benchmarks/v1/legacy/data/README.md b/benchmarks/v1/legacy/data/README.md new file mode 100644 index 000000000..7b3b85be4 --- /dev/null +++ b/benchmarks/v1/legacy/data/README.md @@ -0,0 +1,56 @@ +# Historical exploratory benchmark sample data + +`benchmark-samples.csv` is retained as the original exploratory/compound +variant export. It is not canonical; use +[`../../input-to-proof-data/input-to-proof-samples.csv`](../../input-to-proof-data/input-to-proof-samples.csv) +for publication. Generate this historical format from normalized JSON attempt +records: + +```sh +bun benchmarks/v1/legacy/data/export-benchmark-csv.ts \ + path/to/attempts.json \ + benchmarks/v1/legacy/data/benchmark-samples.csv +``` + +The default validation gate requires all 27 hardware × circuit × prover cells. +A successful variant contains sample indexes `0..5`: one `warmup` and five +`measured` attempts. An unavailable variant contains exactly one `gap` attempt +whose status explains why it has no samples. Gap metrics must be JSON `null` and +are exported as blank CSV fields; zero is always a measurement. + +Mobench attests that native warmups ran but intentionally does not retain their +durations. Native warmup rows therefore use `status=ok` with blank timing +fields. The five measured rows always contain real durations; no warmup +duration is inferred or copied. + +Use `--allow-partial` only while collecting data. It relaxes matrix coverage and +sample-count checks, but retains record-level, duplicate, unit, status, runtime, +and gap validation. + +Times are milliseconds, memory is MiB, and proof size is bytes. Circom witness +time is separate from Groth16 prover time. `total_time_ms` may include boundary +overhead but cannot be smaller than witness plus prover time. +Every successful measured row must include the campaign's four headline +metrics: `prover_time_ms`, deduplicated proving payload in +`circuit_size_bytes` (mirrored in `artifact_size_bytes` and +`bundle_size_bytes` for compatibility), `proof_size_bytes`, and process peak +RSS in `peak_memory_mib`. + +This export has 27 base cells and 33 historical variant series. Five iPhone +Circom variants predate structured payload telemetry; their payload is a +labelled asset-size estimate of the pinned zkey plus frozen WTNS witness. The +estimate is recorded in `non_equivalence_note` and excludes IPA and transport +sizes. Do not generalize that exception to other rows. + +The three target surfaces are fixed: + +- `iphone_se_2022` → `ios_native` +- `motorola_e15` → `android_native` +- `macbook_m4` → `browser_wasm` + +Circuit counterparts are explicitly not statement-equivalent. Every record +therefore requires a reader-facing `non_equivalence_note`; charts must not imply +an apples-to-apples cryptographic comparison. `circuit_variant` keeps compound +counterparts separate within a base comparison cell, including Self passport +registration/disclosure and World ID Protocol OPRF query/nullifier. Every +successful variant independently requires one warmup and five measured samples. diff --git a/benchmarks/v1/legacy/data/benchmark-samples.csv b/benchmarks/v1/legacy/data/benchmark-samples.csv new file mode 100644 index 000000000..48ded9a40 --- /dev/null +++ b/benchmarks/v1/legacy/data/benchmark-samples.csv @@ -0,0 +1,199 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_nullifier-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,592.884041,,592.887208,102.796875,1603,40639660,40639660,40639660,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},87d92b1468554aa396ecf5fd1d8a106a4112efdf,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_nullifier-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,584.771291,,584.775625,103.703125,1604,40639660,40639660,40639660,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},87d92b1468554aa396ecf5fd1d8a106a4112efdf,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_nullifier-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,586.583208,,586.586083,103.703125,1603,40639660,40639660,40639660,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},87d92b1468554aa396ecf5fd1d8a106a4112efdf,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_nullifier-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,600.201459,,600.206166,103.75,1604,40639660,40639660,40639660,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},87d92b1468554aa396ecf5fd1d8a106a4112efdf,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_nullifier-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,601.713083,,601.716833,103.765625,1602,40639660,40639660,40639660,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},87d92b1468554aa396ecf5fd1d8a106a4112efdf,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_nullifier-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,40639660,40639660,40639660,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},87d92b1468554aa396ecf5fd1d8a106a4112efdf,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_query-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,306.735583,,306.738959,70.953125,1178,18543164,18543164,18543164,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},3dab9c6773337d817e38e7183a3dc5fd80155d91,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_query-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,301.802125,,301.804917,70.953125,1182,18543164,18543164,18543164,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},3dab9c6773337d817e38e7183a3dc5fd80155d91,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_query-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,292.535333,,292.537083,70.953125,1183,18543164,18543164,18543164,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},3dab9c6773337d817e38e7183a3dc5fd80155d91,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_query-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,294.811042,,294.815125,70.953125,1183,18543164,18543164,18543164,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},3dab9c6773337d817e38e7183a3dc5fd80155d91,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_query-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,311.012208,,311.015084,71.984375,1184,18543164,18543164,18543164,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},3dab9c6773337d817e38e7183a3dc5fd80155d91,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-world_id_protocol_query-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,18543164,18543164,18543164,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},3dab9c6773337d817e38e7183a3dc5fd80155d91,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-oprf_taceo-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,1,ok,,,1440.765334,,1440.769125,256.453125,16196,1243671,270743076,270743076,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0456be33e41372e05bcb7ddbd9b83bac0074c74f,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-oprf_taceo-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,2,ok,,,1363.179375,,1363.181417,256.4375,16196,1243671,270743076,270743076,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0456be33e41372e05bcb7ddbd9b83bac0074c74f,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-oprf_taceo-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,3,ok,,,1422.379458,,1422.381292,256.453125,16196,1243671,270743076,270743076,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0456be33e41372e05bcb7ddbd9b83bac0074c74f,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-oprf_taceo-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,4,ok,,,1414.61725,,1414.619625,256.875,16196,1243671,270743076,270743076,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0456be33e41372e05bcb7ddbd9b83bac0074c74f,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-oprf_taceo-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,5,ok,,,1442.068917,,1442.072333,256.484375,16196,1243671,270743076,270743076,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0456be33e41372e05bcb7ddbd9b83bac0074c74f,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-oprf_taceo-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native,,warmup,0,ok,,,,,,,,1243671,270743076,270743076,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0456be33e41372e05bcb7ddbd9b83bac0074c74f,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-oprf_taceo-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,1,ok,,,1140.326041,,1140.67675,153.703125,632398,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fbdbb2d03f08558293dd058b272a359b6c501d7e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-oprf_taceo-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,2,ok,,,1094.505625,,1095.151416,155.09375,632051,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fbdbb2d03f08558293dd058b272a359b6c501d7e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-oprf_taceo-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,3,ok,,,1110.2435,,1110.831667,152.796875,631790,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fbdbb2d03f08558293dd058b272a359b6c501d7e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-oprf_taceo-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,4,ok,,,1104.7755,,1105.15775,154.6875,636558,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fbdbb2d03f08558293dd058b272a359b6c501d7e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-oprf_taceo-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,5,ok,,,1124.437375,,1124.8425,156.046875,634702,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fbdbb2d03f08558293dd058b272a359b6c501d7e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-oprf_taceo-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,warmup,0,ok,,,,,,,,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fbdbb2d03f08558293dd058b272a359b6c501d7e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_register_rsa_4096-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,2977.333584,,2977.337167,712.234375,972,530077148,530077148,530077148,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},7387fe448004d419fb66ff781edb4e1def4dfbe3,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_register_rsa_4096-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,2932.633375,,2932.636708,712.15625,973,530077148,530077148,530077148,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},7387fe448004d419fb66ff781edb4e1def4dfbe3,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_register_rsa_4096-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,2972.240583,,2972.244042,712.15625,974,530077148,530077148,530077148,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},7387fe448004d419fb66ff781edb4e1def4dfbe3,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_register_rsa_4096-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,3022.747583,,3022.751417,712.15625,974,530077148,530077148,530077148,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},7387fe448004d419fb66ff781edb4e1def4dfbe3,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_register_rsa_4096-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,3181.378833,,3181.382541,712.15625,974,530077148,530077148,530077148,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},7387fe448004d419fb66ff781edb4e1def4dfbe3,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_register_rsa_4096-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,530077148,530077148,530077148,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},7387fe448004d419fb66ff781edb4e1def4dfbe3,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_vc_and_disclose-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,1110.521916,,1110.52575,174.75,1529,74380364,74380364,74380364,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},2ebb43b231b4bef5cd21a5648ab45506f436b040,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_vc_and_disclose-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,1126.54775,,1126.552292,174.78125,1528,74380364,74380364,74380364,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},2ebb43b231b4bef5cd21a5648ab45506f436b040,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_vc_and_disclose-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,1162.030292,,1162.033334,174.78125,1531,74380364,74380364,74380364,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},2ebb43b231b4bef5cd21a5648ab45506f436b040,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_vc_and_disclose-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,1140.435208,,1140.438542,174.828125,1531,74380364,74380364,74380364,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},2ebb43b231b4bef5cd21a5648ab45506f436b040,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_vc_and_disclose-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,1164.259334,,1164.262833,174.734375,1529,74380364,74380364,74380364,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},2ebb43b231b4bef5cd21a5648ab45506f436b040,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-self_vc_and_disclose-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,74380364,74380364,74380364,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7""}",{},2ebb43b231b4bef5cd21a5648ab45506f436b040,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-passport_complete_age_check-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,1,ok,,,10435.982542,,10435.995459,1049.140625,16100,2030462,270752058,270752058,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0ac2a44caad82500b6175c727837036e7c9f781e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-passport_complete_age_check-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,2,ok,,,7471.022291,,7471.027833,1077.625,16100,2030462,270752058,270752058,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0ac2a44caad82500b6175c727837036e7c9f781e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-passport_complete_age_check-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,3,ok,,,6949.408083,,6949.410958,1079.921875,16100,2030462,270752058,270752058,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0ac2a44caad82500b6175c727837036e7c9f781e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-passport_complete_age_check-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,4,ok,,,7507.038375,,7507.043125,1081.640625,16100,2030462,270752058,270752058,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0ac2a44caad82500b6175c727837036e7c9f781e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-passport_complete_age_check-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,5,ok,,,7498.057208,,7498.059666,1081.75,16100,2030462,270752058,270752058,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0ac2a44caad82500b6175c727837036e7c9f781e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-passport_complete_age_check-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native,,warmup,0,ok,,,,,,,,2030462,270752058,270752058,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},0ac2a44caad82500b6175c727837036e7c9f781e,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-passport_complete_age_check-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,1,ok,,,5827.066542,,5828.390375,1035.6875,740391,4026340,4298197,4298197,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},0cee957fb10aad41b1a97137f8075ccf30707f7d,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-passport_complete_age_check-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,2,ok,,,6256.487,,6257.9595,1066.09375,735939,4026340,4298197,4298197,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},0cee957fb10aad41b1a97137f8075ccf30707f7d,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-passport_complete_age_check-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,3,ok,,,6252.148625,,6253.613625,1062.078125,738236,4026340,4298197,4298197,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},0cee957fb10aad41b1a97137f8075ccf30707f7d,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-passport_complete_age_check-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,4,ok,,,6362.035125,,6363.506875,1078.5625,738487,4026340,4298197,4298197,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},0cee957fb10aad41b1a97137f8075ccf30707f7d,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-passport_complete_age_check-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,5,ok,,,6206.167167,,6207.815917,1081.25,738641,4026340,4298197,4298197,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},0cee957fb10aad41b1a97137f8075ccf30707f7d,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-passport_complete_age_check-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,warmup,0,ok,,,,,,,,4026340,4298197,4298197,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},0cee957fb10aad41b1a97137f8075ccf30707f7d,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-privacy_ethereum_webauthn-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,36998.1695,,36998.182209,845.3125,1002,1842364184,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-privacy_ethereum_webauthn-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,39245.250417,,39245.254625,845,1006,1842364184,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-privacy_ethereum_webauthn-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,38393.932667,,38393.945125,844.40625,1001,1842364184,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-privacy_ethereum_webauthn-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,38679.03925,,38679.051959,844.8125,1000,1842364184,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-privacy_ethereum_webauthn-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,38943.579333,,38943.588417,848.21875,1002,1842364184,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-circom_groth16-privacy_ethereum_webauthn-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,1842364184,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-webauthn_assertion-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,1,ok,,,4044.97525,,4044.980875,667.375,21092,2691859,271478529,271478529,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-webauthn_assertion-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,2,ok,,,4019.74825,,4019.753625,667.34375,21092,2691859,271478529,271478529,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-webauthn_assertion-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,3,ok,,,4102.73925,,4102.742667,675.375,21092,2691859,271478529,271478529,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-webauthn_assertion-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,4,ok,,,4060.3015,,4060.31975,675.375,21092,2691859,271478529,271478529,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-webauthn_assertion-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,5,ok,,,4099.76075,,4099.766,675.375,21092,2691859,271478529,271478529,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-noir_barretenberg-webauthn_assertion-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,warmup,0,ok,,,,,,,,2691859,271478529,271478529,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-webauthn_assertion-sample-1,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,1,ok,,,2744.448,,2745.328208,561.5,714002,2327248,2376468,2376468,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fc11d978ae10d3c4766298eb0be0348c979831c4,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-webauthn_assertion-sample-2,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,2,ok,,,2794.075083,,2794.925916,575.375,714909,2327248,2376468,2376468,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fc11d978ae10d3c4766298eb0be0348c979831c4,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-webauthn_assertion-sample-3,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,3,ok,,,2821.319334,,2822.188709,587.484375,716960,2327248,2376468,2376468,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fc11d978ae10d3c4766298eb0be0348c979831c4,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-webauthn_assertion-sample-4,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,4,ok,,,3179.574625,,3180.6465,601.546875,714819,2327248,2376468,2376468,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fc11d978ae10d3c4766298eb0be0348c979831c4,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-webauthn_assertion-sample-5,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,5,ok,,,3282.888375,,3284.043667,606.90625,718839,2327248,2376468,2376468,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fc11d978ae10d3c4766298eb0be0348c979831c4,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,iphone-se-2022-provekit_v1-webauthn_assertion-warmup,2026-07-30T16:24:00.515Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,warmup,0,ok,,,,,,,,2327248,2376468,2376468,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1""}",{},fc11d978ae10d3c4766298eb0be0348c979831c4,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_nullifier-sample-1,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,1,ok,,180.7,2036.1,9.6,2231.8,3031.75,723,918505,39203507,39203507,53677,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""zkey_sha256"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""input_sha256"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_nullifier-sample-2,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,2,ok,,189,1932.9,8.4,2135.2,3031.75,725,918505,39203507,39203507,53677,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""zkey_sha256"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""input_sha256"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_nullifier-sample-3,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,3,ok,,173.5,1810.2,7.9,1995.7,3031.75,724,918505,39203507,39203507,53677,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""zkey_sha256"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""input_sha256"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_nullifier-sample-4,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,4,ok,,168.7,1836.8,7.3,2017.1,3031.75,722,918505,39203507,39203507,53677,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""zkey_sha256"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""input_sha256"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_nullifier-sample-5,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,5,ok,,158.5,1820.1,7.7,1990.7,3031.75,722,918505,39203507,39203507,53677,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""zkey_sha256"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""input_sha256"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_nullifier-warmup,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,warmup,0,ok,,188.4,2091.7,8.9,2293.5,3031.75,724,918505,39203507,39203507,53677,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""zkey_sha256"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""input_sha256"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_query-sample-1,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,1,ok,,72.4,1171.3,8.6,1256.4,3031.75,723,738804,18192574,18192574,20966,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""24fbb8a2f0516407b07bafa08f58f47cf08ac3398278bcaf9d0151223c55d0a5"",""zkey_sha256"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""input_sha256"":""eb823c2b9b24f8aa4ce9927161770916e4377a68657ced5cc32f916a5c7874bc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_query-sample-2,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,2,ok,,72.9,1097.8,7.7,1183.3,3031.75,723,738804,18192574,18192574,20966,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""24fbb8a2f0516407b07bafa08f58f47cf08ac3398278bcaf9d0151223c55d0a5"",""zkey_sha256"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""input_sha256"":""eb823c2b9b24f8aa4ce9927161770916e4377a68657ced5cc32f916a5c7874bc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_query-sample-3,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,3,ok,,65.4,992.4,7.5,1069.6,3031.75,722,738804,18192574,18192574,20966,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""24fbb8a2f0516407b07bafa08f58f47cf08ac3398278bcaf9d0151223c55d0a5"",""zkey_sha256"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""input_sha256"":""eb823c2b9b24f8aa4ce9927161770916e4377a68657ced5cc32f916a5c7874bc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_query-sample-4,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,4,ok,,66.3,935.2,8.7,1014.2,3031.75,721,738804,18192574,18192574,20966,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""24fbb8a2f0516407b07bafa08f58f47cf08ac3398278bcaf9d0151223c55d0a5"",""zkey_sha256"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""input_sha256"":""eb823c2b9b24f8aa4ce9927161770916e4377a68657ced5cc32f916a5c7874bc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_query-sample-5,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,5,ok,,66.7,1065.9,9.7,1146.1,3031.75,727,738804,18192574,18192574,20966,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""24fbb8a2f0516407b07bafa08f58f47cf08ac3398278bcaf9d0151223c55d0a5"",""zkey_sha256"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""input_sha256"":""eb823c2b9b24f8aa4ce9927161770916e4377a68657ced5cc32f916a5c7874bc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-world_id_protocol_query-warmup,2026-07-30T12:11:53.390Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,warmup,0,ok,,51.8,918.8,10.5,985.7,3031.75,722,738804,18192574,18192574,20966,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""24fbb8a2f0516407b07bafa08f58f47cf08ac3398278bcaf9d0151223c55d0a5"",""zkey_sha256"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""input_sha256"":""eb823c2b9b24f8aa4ce9927161770916e4377a68657ced5cc32f916a5c7874bc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-noir-oprf_taceo-sample-1,2026-07-30T11:53:23.000Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,1,ok,,,5101.44,,5101.44,906.234375,16000,1243671,73610980,73610980,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness_sha256"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""source_artifact_sha256"":""2b868c6487ff092271b8797131d779e5ed182af9ccd1c6353384a2e1c789d345""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-noir-oprf_taceo-sample-2,2026-07-30T11:53:23.000Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,2,ok,,,5452.175,,5452.175,906.234375,16000,1243671,73610980,73610980,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness_sha256"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""source_artifact_sha256"":""2b868c6487ff092271b8797131d779e5ed182af9ccd1c6353384a2e1c789d345""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-noir-oprf_taceo-sample-3,2026-07-30T11:53:23.000Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,3,ok,,,5099.595,,5099.595,906.234375,16000,1243671,73610980,73610980,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness_sha256"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""source_artifact_sha256"":""2b868c6487ff092271b8797131d779e5ed182af9ccd1c6353384a2e1c789d345""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-noir-oprf_taceo-sample-4,2026-07-30T11:53:23.000Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,4,ok,,,5436.865,,5436.865,906.234375,16000,1243671,73610980,73610980,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness_sha256"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""source_artifact_sha256"":""2b868c6487ff092271b8797131d779e5ed182af9ccd1c6353384a2e1c789d345""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-noir-oprf_taceo-sample-5,2026-07-30T11:53:23.000Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,5,ok,,,4618.515,,4618.515,906.234375,16000,1243671,73610980,73610980,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness_sha256"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""source_artifact_sha256"":""2b868c6487ff092271b8797131d779e5ed182af9ccd1c6353384a2e1c789d345""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-noir-oprf_taceo-warmup,2026-07-30T11:53:23.000Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,warmup,0,ok,,,4218.99,,4218.99,906.234375,16000,1243671,73610980,73610980,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness_sha256"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""source_artifact_sha256"":""2b868c6487ff092271b8797131d779e5ed182af9ccd1c6353384a2e1c789d345""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-oprf_taceo-sample-1,2026-07-30T11:41:41.286Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,1,ok,37.80500000715256,,2571.160000026226,78.56999999284744,3119.335000038147,537.765625,409685,1439997,1440804,1440804,42124,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""1fa4f2b74e405653d77e635864f91650656b112eba30655e06dc1127dd0f7566"",""inputs_sha256"":""3bb7a7ab32da798341c1d7c5152d4d91bf2ddad4416673c78f6993f07f750259""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-oprf_taceo-sample-2,2026-07-30T11:41:41.286Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,2,ok,37.80500000715256,,1755.1949999928474,74.96499997377396,2135.714999973774,537.765625,409217,1439997,1440804,1440804,42124,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""1fa4f2b74e405653d77e635864f91650656b112eba30655e06dc1127dd0f7566"",""inputs_sha256"":""3bb7a7ab32da798341c1d7c5152d4d91bf2ddad4416673c78f6993f07f750259""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-oprf_taceo-sample-3,2026-07-30T11:41:41.286Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,3,ok,37.80500000715256,,1938.7999999523163,77.83499997854233,2397.889999985695,537.765625,411093,1439997,1440804,1440804,42124,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""1fa4f2b74e405653d77e635864f91650656b112eba30655e06dc1127dd0f7566"",""inputs_sha256"":""3bb7a7ab32da798341c1d7c5152d4d91bf2ddad4416673c78f6993f07f750259""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-oprf_taceo-sample-4,2026-07-30T11:41:41.286Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,4,ok,37.80500000715256,,1972.5600000023842,86.125,2494.389999985695,537.765625,411181,1439997,1440804,1440804,42124,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""1fa4f2b74e405653d77e635864f91650656b112eba30655e06dc1127dd0f7566"",""inputs_sha256"":""3bb7a7ab32da798341c1d7c5152d4d91bf2ddad4416673c78f6993f07f750259""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-oprf_taceo-sample-5,2026-07-30T11:41:41.286Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,5,ok,37.80500000715256,,2242.660000026226,108.17500001192093,2785.770000040531,537.765625,409813,1439997,1440804,1440804,42124,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""1fa4f2b74e405653d77e635864f91650656b112eba30655e06dc1127dd0f7566"",""inputs_sha256"":""3bb7a7ab32da798341c1d7c5152d4d91bf2ddad4416673c78f6993f07f750259""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-oprf_taceo-warmup,2026-07-30T11:41:41.286Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,warmup,0,ok,37.80500000715256,,2604.6200000047684,111.88499999046326,3116.6099999547005,537.765625,409773,1439997,1440804,1440804,42124,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""1fa4f2b74e405653d77e635864f91650656b112eba30655e06dc1127dd0f7566"",""inputs_sha256"":""3bb7a7ab32da798341c1d7c5152d4d91bf2ddad4416673c78f6993f07f750259""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-oprf.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_disclosure-sample-1,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_disclosure,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,1,ok,,250.7,3775.1,7.4,4035.5,15978.53125,720,8614580,78341122,78341122,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13"",""zkey_sha256"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""input_sha256"":""f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_disclosure-sample-2,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_disclosure,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,2,ok,,284.9,3804,6.5,4097.9,15978.53125,726,8614580,78341122,78341122,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13"",""zkey_sha256"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""input_sha256"":""f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_disclosure-sample-3,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_disclosure,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,3,ok,,273.8,3716.8,6.4,3999.5,15978.53125,721,8614580,78341122,78341122,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13"",""zkey_sha256"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""input_sha256"":""f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_disclosure-sample-4,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_disclosure,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,4,ok,,264.5,3977.4,7.2,4251.8,15978.53125,725,8614580,78341122,78341122,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13"",""zkey_sha256"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""input_sha256"":""f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_disclosure-sample-5,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_disclosure,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,5,ok,,286.4,3869.2,6.3,4164.2,15978.53125,722,8614580,78341122,78341122,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13"",""zkey_sha256"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""input_sha256"":""f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_disclosure-warmup,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_disclosure,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,warmup,0,ok,,268.3,3317.9,6,3602.4,15978.53125,723,8614580,78341122,78341122,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13"",""zkey_sha256"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""input_sha256"":""f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_registration-sample-1,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_registration,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,1,ok,,6180.8,14944.8,11.5,21144.2,15978.53125,726,10868992,510011120,510011120,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14"",""zkey_sha256"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""input_sha256"":""2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_registration-sample-2,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_registration,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,2,ok,,5914.3,14646.5,7.8,20572.5,15978.53125,723,10868992,510011120,510011120,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14"",""zkey_sha256"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""input_sha256"":""2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_registration-sample-3,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_registration,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,3,ok,,4822.2,14504.7,8.5,19339.5,15978.53125,722,10868992,510011120,510011120,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14"",""zkey_sha256"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""input_sha256"":""2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_registration-sample-4,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_registration,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,4,ok,,5897.8,14412.7,9.4,20323.1,15978.53125,722,10868992,510011120,510011120,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14"",""zkey_sha256"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""input_sha256"":""2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_registration-sample-5,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_registration,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,measured,5,ok,,4517.3,13520.3,7,18048,15978.53125,719,10868992,510011120,510011120,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14"",""zkey_sha256"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""input_sha256"":""2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-self_passport_registration-warmup,2026-07-30T12:11:08.004Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,self_passport_registration,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,snarkjs_0.7.6_browser_wasm,snarkjs-wtns-calculate-wasm,warmup,0,ok,,5656.3,16103.5,12.7,21777.3,15978.53125,722,10868992,510011120,510011120,,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14"",""zkey_sha256"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""input_sha256"":""2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-passport.json +provekit-v1-cross-device-20260730,mac-chrome-noir-passport_complete_age_check-sample-1,2026-07-30T11:56:33.348Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,1,ok,,,24599.765,,24599.765,1448.96875,16000,2030462,73619962,73619962,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness_sha256"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""source_artifact_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-passport.json +provekit-v1-cross-device-20260730,mac-chrome-noir-passport_complete_age_check-sample-2,2026-07-30T11:56:33.348Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,2,ok,,,22338.88,,22338.88,1448.96875,16000,2030462,73619962,73619962,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness_sha256"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""source_artifact_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-passport.json +provekit-v1-cross-device-20260730,mac-chrome-noir-passport_complete_age_check-sample-3,2026-07-30T11:56:33.348Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,3,ok,,,26884.32,,26884.32,1448.96875,16000,2030462,73619962,73619962,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness_sha256"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""source_artifact_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-passport.json +provekit-v1-cross-device-20260730,mac-chrome-noir-passport_complete_age_check-sample-4,2026-07-30T11:56:33.348Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,4,ok,,,28745.635,,28745.635,1448.96875,16000,2030462,73619962,73619962,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness_sha256"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""source_artifact_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-passport.json +provekit-v1-cross-device-20260730,mac-chrome-noir-passport_complete_age_check-sample-5,2026-07-30T11:56:33.348Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,5,ok,,,22967.84,,22967.84,1448.96875,16000,2030462,73619962,73619962,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness_sha256"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""source_artifact_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-passport.json +provekit-v1-cross-device-20260730,mac-chrome-noir-passport_complete_age_check-warmup,2026-07-30T11:56:33.348Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,warmup,0,ok,,,20316.85,,20316.85,1448.96875,16000,2030462,73619962,73619962,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness_sha256"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""source_artifact_sha256"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-passport.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-passport_complete_age_check-sample-1,2026-07-30T11:35:12.022Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,1,ok,190.3400000333786,,28857.09000003338,1197.3849999904633,31469.44999998808,1539.125,561932,4999893,5041505,5041505,695117,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""6c019043c368c5752227e3ad15c8a989a68ff6e42fff108092af21f50a2fde92"",""inputs_sha256"":""a4a658accc1502ba0591af1041da00d568a6cf7225e815e890e5fb37fba59881""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-passport.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-passport_complete_age_check-sample-2,2026-07-30T11:35:12.022Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,2,ok,190.3400000333786,,33710.40499997139,927.0649999976158,36366.74000000954,1539.125,562148,4999893,5041505,5041505,695117,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""6c019043c368c5752227e3ad15c8a989a68ff6e42fff108092af21f50a2fde92"",""inputs_sha256"":""a4a658accc1502ba0591af1041da00d568a6cf7225e815e890e5fb37fba59881""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-passport.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-passport_complete_age_check-sample-3,2026-07-30T11:35:12.022Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,3,ok,190.3400000333786,,34155.785000026226,1188.9399999976158,38192.94499999285,1539.125,562744,4999893,5041505,5041505,695117,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""6c019043c368c5752227e3ad15c8a989a68ff6e42fff108092af21f50a2fde92"",""inputs_sha256"":""a4a658accc1502ba0591af1041da00d568a6cf7225e815e890e5fb37fba59881""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-passport.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-passport_complete_age_check-sample-4,2026-07-30T11:35:12.022Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,4,ok,190.3400000333786,,36367.07499998808,1405.9300000071526,40990.34000003338,1539.125,563172,4999893,5041505,5041505,695117,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""6c019043c368c5752227e3ad15c8a989a68ff6e42fff108092af21f50a2fde92"",""inputs_sha256"":""a4a658accc1502ba0591af1041da00d568a6cf7225e815e890e5fb37fba59881""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-passport.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-passport_complete_age_check-sample-5,2026-07-30T11:35:12.022Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,5,ok,190.3400000333786,,33645.15499997139,867.9549999833107,37349.22999995947,1539.125,563212,4999893,5041505,5041505,695117,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""6c019043c368c5752227e3ad15c8a989a68ff6e42fff108092af21f50a2fde92"",""inputs_sha256"":""a4a658accc1502ba0591af1041da00d568a6cf7225e815e890e5fb37fba59881""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-passport.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-passport_complete_age_check-warmup,2026-07-30T11:35:12.022Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,passport,passport_complete_age_check,b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,warmup,0,ok,190.3400000333786,,36848.60500001907,870.4350000023842,39849.91500002146,1539.125,562060,4999893,5041505,5041505,695117,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""6c019043c368c5752227e3ad15c8a989a68ff6e42fff108092af21f50a2fde92"",""inputs_sha256"":""a4a658accc1502ba0591af1041da00d568a6cf7225e815e890e5fb37fba59881""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-passport.json +provekit-v1-cross-device-20260730,mac-chrome-circom-privacy_ethereum_webauth_circom-sample-1,2026-07-30T12:58:57.845Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,privacy_ethereum_webauth_circom,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,1,ok,,85322.8,194531.6,15,279876.1,11064.78125,724,20470384,1753618376,1753618376,2812892,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-circom-privacy_ethereum_webauth_circom-sample-2,2026-07-30T12:58:57.845Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,privacy_ethereum_webauth_circom,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,2,ok,,85185.5,219079.6,14.3,304283.8,11064.78125,725,20470384,1753618376,1753618376,2812892,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-circom-privacy_ethereum_webauth_circom-sample-3,2026-07-30T12:58:57.845Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,privacy_ethereum_webauth_circom,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,3,ok,,84991.7,201139.9,9.6,286145.6,11064.78125,722,20470384,1753618376,1753618376,2812892,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-circom-privacy_ethereum_webauth_circom-sample-4,2026-07-30T12:58:57.845Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,privacy_ethereum_webauth_circom,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,4,ok,,82799.8,270838,17.6,353662.8,11064.78125,725,20470384,1753618376,1753618376,2812892,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-circom-privacy_ethereum_webauth_circom-sample-5,2026-07-30T12:58:57.845Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,privacy_ethereum_webauth_circom,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,5,ok,,109613.8,222479.7,6.8,332103.9,11064.78125,720,20470384,1753618376,1753618376,2812892,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-circom-privacy_ethereum_webauth_circom-warmup,2026-07-30T12:58:57.845Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,privacy_ethereum_webauth_circom,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,warmup,0,ok,,74317.2,221252.3,54.1,295628.2,11064.78125,721,20470384,1753618376,1753618376,2812892,circom-2.2.2-snarkjs-zkey,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-noir-webauthn_assertion-sample-1,2026-07-30T11:52:39.319Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,1,ok,,,14677.335,,14677.335,1060.0625,16000,2691859,74346433,74346433,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-noir-webauthn_assertion-sample-2,2026-07-30T11:52:39.319Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,2,ok,,,16153.085,,16153.085,1060.0625,16000,2691859,74346433,74346433,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-noir-webauthn_assertion-sample-3,2026-07-30T11:52:39.319Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,3,ok,,,14740.61,,14740.61,1060.0625,16000,2691859,74346433,74346433,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-noir-webauthn_assertion-sample-4,2026-07-30T11:52:39.319Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,4,ok,,,13333.53,,13333.53,1060.0625,16000,2691859,74346433,74346433,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-noir-webauthn_assertion-sample-5,2026-07-30T11:52:39.319Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,5,ok,,,16982.47,,16982.47,1060.0625,16000,2691859,74346433,74346433,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-noir-webauthn_assertion-warmup,2026-07-30T11:52:39.319Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,warmup,0,ok,,,13841.28,,13841.28,1060.0625,16000,2691859,74346433,74346433,,noir-v1.0.0-beta.19-acir,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-webauthn_assertion-sample-1,2026-07-30T11:41:21.555Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,1,ok,94.21999996900558,,19913.209999978542,584.8700000047684,22218.060000002384,962.40625,548024,2384833,2392664,2392664,345540,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""716b20dd5675243c3af3f02e5cbb0b60717082d0d84366c162d0723ccd1cb749"",""inputs_sha256"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-webauthn_assertion-sample-2,2026-07-30T11:41:21.555Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,2,ok,94.21999996900558,,22535.989999949932,491.1399999856949,24164.030000030994,962.40625,544012,2384833,2392664,2392664,345540,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""716b20dd5675243c3af3f02e5cbb0b60717082d0d84366c162d0723ccd1cb749"",""inputs_sha256"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-webauthn_assertion-sample-3,2026-07-30T11:41:21.555Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,3,ok,94.21999996900558,,20499.09500002861,577.0300000309944,22332.95499998331,962.40625,546272,2384833,2392664,2392664,345540,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""716b20dd5675243c3af3f02e5cbb0b60717082d0d84366c162d0723ccd1cb749"",""inputs_sha256"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-webauthn_assertion-sample-4,2026-07-30T11:41:21.555Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,4,ok,94.21999996900558,,22415.830000042915,614.4900000095367,25000.725000023842,962.40625,544952,2384833,2392664,2392664,345540,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""716b20dd5675243c3af3f02e5cbb0b60717082d0d84366c162d0723ccd1cb749"",""inputs_sha256"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-webauthn_assertion-sample-5,2026-07-30T11:41:21.555Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,measured,5,ok,94.21999996900558,,27428.59000003338,829.4499999880791,30168.42500001192,962.40625,545504,2384833,2392664,2392664,345540,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""716b20dd5675243c3af3f02e5cbb0b60717082d0d84366c162d0723ccd1cb749"",""inputs_sha256"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-webauthn.json +provekit-v1-cross-device-20260730,mac-chrome-provekit-webauthn_assertion-warmup,2026-07-30T11:41:21.555Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js,warmup,0,ok,94.21999996900558,,22167.105000019073,606.0099999904633,24578.45499998331,962.40625,546144,2384833,2392664,2392664,345540,pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@worldcoin/provekit"":""0.1.0"",""@noir-lang/noir_js"":""1.0.0-beta.20""}","{""prover_sha256"":""716b20dd5675243c3af3f02e5cbb0b60717082d0d84366c162d0723ccd1cb749"",""inputs_sha256"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/provekit-webauthn.json +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_nullifier-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,1,ok,,,8011.589,,8011.624308,142.05078125,1772,38279392,40639660,40639660,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-nullifier-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_nullifier-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,2,ok,,,8050.139077,,8050.173155,148.76171875,1778,38279392,40639660,40639660,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-nullifier-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_nullifier-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,3,ok,,,8234.68277,,8234.722539,154.4140625,1785,38279392,40639660,40639660,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-nullifier-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_nullifier-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,4,ok,,,8284.441539,,8284.483,150.15625,1773,38279392,40639660,40639660,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-nullifier-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_nullifier-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,5,ok,,,8262.845847,,8262.886769,153.52734375,1773,38279392,40639660,40639660,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-nullifier-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_nullifier-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,warmup,0,ok,,,,,,,,38279392,40639660,40639660,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-nullifier-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_query-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,1,ok,,,4305.973846,,4306.001923,118.328125,1331,17450128,18543164,18543164,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""witness"":""89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-query-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_query-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,2,ok,,,4283.635077,,4283.660923,109.9765625,1323,17450128,18543164,18543164,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""witness"":""89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-query-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_query-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,3,ok,,,4380.035924,,4380.066462,112.0859375,1322,17450128,18543164,18543164,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""witness"":""89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-query-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_query-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,4,ok,,,4262.422077,,4262.453538,111.63671875,1325,17450128,18543164,18543164,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""witness"":""89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-query-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_query-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,5,ok,,,4278.446769,,4278.471924,109.44140625,1329,17450128,18543164,18543164,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""witness"":""89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-query-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-world_id_protocol_query-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,world_id_protocol_query,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,warmup,0,ok,,,,,,,,17450128,18543164,18543164,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""zkey"":""1fe8c40ce1de0f6a0dc636472db845bed20fc6f5d9ae8a03c6de53ad80db9bfe"",""witness"":""89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-oprf-query-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-oprf_taceo-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,1,ok,,,37668.657157,,37668.667156,207.63671875,16196,1243671,6501924,6501924,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""358b8711f4a787bbe1234d72cf48b8cea4271c9466c66090cd0310b2ab0409a8"",""circuit"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""consumed_srs"":""9fd9fad54cfdc61ec309e818fe7bbddad1ca7dde72cc9b1afd126b744f887078""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-oprf-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-oprf_taceo-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,2,ok,,,37629.680386,,37629.690772,206.34375,16196,1243671,6501924,6501924,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""358b8711f4a787bbe1234d72cf48b8cea4271c9466c66090cd0310b2ab0409a8"",""circuit"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""consumed_srs"":""9fd9fad54cfdc61ec309e818fe7bbddad1ca7dde72cc9b1afd126b744f887078""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-oprf-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-oprf_taceo-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,3,ok,,,37603.385925,,37603.39531,204.9609375,16196,1243671,6501924,6501924,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""358b8711f4a787bbe1234d72cf48b8cea4271c9466c66090cd0310b2ab0409a8"",""circuit"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""consumed_srs"":""9fd9fad54cfdc61ec309e818fe7bbddad1ca7dde72cc9b1afd126b744f887078""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-oprf-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-oprf_taceo-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,4,ok,,,37659.08031,,37659.094771,205.625,16196,1243671,6501924,6501924,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""358b8711f4a787bbe1234d72cf48b8cea4271c9466c66090cd0310b2ab0409a8"",""circuit"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""consumed_srs"":""9fd9fad54cfdc61ec309e818fe7bbddad1ca7dde72cc9b1afd126b744f887078""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-oprf-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-oprf_taceo-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,5,ok,,,37672.131387,,37672.140386,205.01171875,16196,1243671,6501924,6501924,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""358b8711f4a787bbe1234d72cf48b8cea4271c9466c66090cd0310b2ab0409a8"",""circuit"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""consumed_srs"":""9fd9fad54cfdc61ec309e818fe7bbddad1ca7dde72cc9b1afd126b744f887078""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-oprf-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-oprf_taceo-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,808f3c795b57963dd58ef282ccd61022ef39c285,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,warmup,0,ok,,,,,,,,1243671,6501924,6501924,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""358b8711f4a787bbe1234d72cf48b8cea4271c9466c66090cd0310b2ab0409a8"",""circuit"":""d5443c2c0a97e748ef53143b8ed72c3def2b7e02b78a73a6566946309a218525"",""witness"":""da3792d254434e5859fb3ab6dd2c84701a4bcf9573e7d5ebc40856540d355f13"",""consumed_srs"":""9fd9fad54cfdc61ec309e818fe7bbddad1ca7dde72cc9b1afd126b744f887078""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-oprf-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-provekit-oprf_taceo-sample-1,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,1,ok,,,11879.887693,,11886.702155,161.953125,635310,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-oprf/oprf.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-oprf_taceo-sample-2,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,2,ok,,,11952.041001,,11964.425539,159.54296875,628523,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-oprf/oprf.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-oprf_taceo-sample-3,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,3,ok,,,11868.524308,,11883.048924,162.84765625,630247,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-oprf/oprf.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-oprf_taceo-sample-4,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,4,ok,,,11923.239462,,11930.512616,162.94140625,634574,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-oprf/oprf.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-oprf_taceo-sample-5,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,measured,5,ok,,,11869.546462,,11882.142462,162.92578125,629564,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-oprf/oprf.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-oprf_taceo-warmup,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_taceo,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,,warmup,0,ok,,,,,,,,1619516,1623638,1623638,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-oprf/oprf.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_register_rsa_4096-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,50444.186464,,50444.225849,638.87890625,1094,499111760,530077148,530077148,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""2a7c55c722cb5abb2cda895e33f028968426279f00e525a35e67a63dbc0bfd25"",""zkey"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""witness"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""verification_key"":""2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-registration-rapidsnark-1x5-clean +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_register_rsa_4096-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,50240.358464,,50240.394234,636.0625,1093,499111760,530077148,530077148,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""2a7c55c722cb5abb2cda895e33f028968426279f00e525a35e67a63dbc0bfd25"",""zkey"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""witness"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""verification_key"":""2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-registration-rapidsnark-1x5-clean +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_register_rsa_4096-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,50495.571926,,50495.60708,612.484375,1097,499111760,530077148,530077148,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""2a7c55c722cb5abb2cda895e33f028968426279f00e525a35e67a63dbc0bfd25"",""zkey"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""witness"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""verification_key"":""2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-registration-rapidsnark-1x5-clean +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_register_rsa_4096-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,50277.153849,,50277.190233,631.6015625,1098,499111760,530077148,530077148,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""2a7c55c722cb5abb2cda895e33f028968426279f00e525a35e67a63dbc0bfd25"",""zkey"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""witness"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""verification_key"":""2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-registration-rapidsnark-1x5-clean +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_register_rsa_4096-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,50172.811772,,50172.854465,655.08984375,1098,499111760,530077148,530077148,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""2a7c55c722cb5abb2cda895e33f028968426279f00e525a35e67a63dbc0bfd25"",""zkey"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""witness"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""verification_key"":""2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-registration-rapidsnark-1x5-clean +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_register_rsa_4096-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_register_rsa_4096,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,499111760,530077148,530077148,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""2a7c55c722cb5abb2cda895e33f028968426279f00e525a35e67a63dbc0bfd25"",""zkey"":""761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31"",""witness"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""verification_key"":""2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-registration-rapidsnark-1x5-clean +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_vc_and_disclose-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,1,ok,,,16092.067385,,16092.11477,224.05078125,1647,69717184,74380364,74380364,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""apk"":""94849b72b86f46a4cd3ba922527f1fd0a1eddadfa5005aa99c458f59711061f9"",""zkey"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""witness"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-disclose-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_vc_and_disclose-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,2,ok,,,16127.992924,,16128.028385,224.0859375,1646,69717184,74380364,74380364,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""apk"":""94849b72b86f46a4cd3ba922527f1fd0a1eddadfa5005aa99c458f59711061f9"",""zkey"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""witness"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-disclose-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_vc_and_disclose-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,3,ok,,,16565.545232,,16565.593232,225.44921875,1650,69717184,74380364,74380364,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""apk"":""94849b72b86f46a4cd3ba922527f1fd0a1eddadfa5005aa99c458f59711061f9"",""zkey"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""witness"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-disclose-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_vc_and_disclose-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,4,ok,,,16287.966693,,16288.101539,217.48828125,1648,69717184,74380364,74380364,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""apk"":""94849b72b86f46a4cd3ba922527f1fd0a1eddadfa5005aa99c458f59711061f9"",""zkey"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""witness"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-disclose-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_vc_and_disclose-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,measured,5,ok,,,16183.308001,,16183.353539,218.75390625,1645,69717184,74380364,74380364,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""apk"":""94849b72b86f46a4cd3ba922527f1fd0a1eddadfa5005aa99c458f59711061f9"",""zkey"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""witness"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-disclose-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-self_vc_and_disclose-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,self_vc_and_disclose,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,arkworks-groth16-native-armv7,frozen-wtns-rust-witness,warmup,0,ok,,,,,,,,69717184,74380364,74380364,,groth16-circom-prover-0.1.4-arkworks-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""circom_prover"":""0.1.4"",""rust_witness"":""0.1"",""backend"":""arkworks""}","{""apk"":""94849b72b86f46a4cd3ba922527f1fd0a1eddadfa5005aa99c458f59711061f9"",""zkey"":""4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964"",""witness"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-passport-disclose-arkworks-1plus5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-passport_complete_age_check-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,1,ok,,,203865.239166,,203865.290782,706.45703125,16100,2030462,35871034,35871034,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""bd7b883ebc0a0169423def14b633d39c6534d59874047d5889988e0b5a5b78ca"",""circuit"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""consumed_srs"":""1df37a2ce1da3713c7300691a65ffe84de144ea64899d5cfbf0061aaaeb6ad31""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-passport-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-passport_complete_age_check-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,2,ok,,,204082.70432,,204082.746089,694.265625,16100,2030462,35871034,35871034,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""bd7b883ebc0a0169423def14b633d39c6534d59874047d5889988e0b5a5b78ca"",""circuit"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""consumed_srs"":""1df37a2ce1da3713c7300691a65ffe84de144ea64899d5cfbf0061aaaeb6ad31""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-passport-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-passport_complete_age_check-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,3,ok,,,202977.795473,,202977.825012,770.65234375,16100,2030462,35871034,35871034,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""bd7b883ebc0a0169423def14b633d39c6534d59874047d5889988e0b5a5b78ca"",""circuit"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""consumed_srs"":""1df37a2ce1da3713c7300691a65ffe84de144ea64899d5cfbf0061aaaeb6ad31""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-passport-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-passport_complete_age_check-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,4,ok,,,203160.876705,,203161.39732,773.16796875,16100,2030462,35871034,35871034,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""bd7b883ebc0a0169423def14b633d39c6534d59874047d5889988e0b5a5b78ca"",""circuit"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""consumed_srs"":""1df37a2ce1da3713c7300691a65ffe84de144ea64899d5cfbf0061aaaeb6ad31""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-passport-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-passport_complete_age_check-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,5,ok,,,203536.377243,,203536.888319,772.546875,16100,2030462,35871034,35871034,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""bd7b883ebc0a0169423def14b633d39c6534d59874047d5889988e0b5a5b78ca"",""circuit"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""consumed_srs"":""1df37a2ce1da3713c7300691a65ffe84de144ea64899d5cfbf0061aaaeb6ad31""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-passport-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-passport_complete_age_check-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check,13044531f0f38e02ed19fcbd9b26202b8ba5a962,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,warmup,0,ok,,,,,,,,2030462,35871034,35871034,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""bd7b883ebc0a0169423def14b633d39c6534d59874047d5889988e0b5a5b78ca"",""circuit"":""f881063fce7ab895dc1db13f5b0ef9bfba14a892e04450c722137b07e6ef78f8"",""witness"":""77e51e03be9499b4da0afbfd88049cb006d19794dd222966eff8005d3bbbf012"",""consumed_srs"":""1df37a2ce1da3713c7300691a65ffe84de144ea64899d5cfbf0061aaaeb6ad31""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-passport-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-provekit-passport_complete_age_check_single_thread-sample-1,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check_single_thread,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,1,ok,,,149267.693624,,154502.640547,810.90625,738671,3897568,4169425,4169425,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""rayon_threads"":1}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-passport-frozen-bundle-metrics-final-1x5-rebooted/passport.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-passport_complete_age_check_single_thread-sample-2,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check_single_thread,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,2,ok,,,149318.805625,,154582.915163,804.1484375,739327,3897568,4169425,4169425,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""rayon_threads"":1}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-passport-frozen-bundle-metrics-final-1x5-rebooted/passport.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-passport_complete_age_check_single_thread-sample-3,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check_single_thread,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,3,ok,,,148852.165855,,154083.724316,825.0859375,736219,3897568,4169425,4169425,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""rayon_threads"":1}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-passport-frozen-bundle-metrics-final-1x5-rebooted/passport.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-passport_complete_age_check_single_thread-sample-4,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check_single_thread,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,4,ok,,,149291.295009,,154558.49724,821.0078125,740149,3897568,4169425,4169425,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""rayon_threads"":1}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-passport-frozen-bundle-metrics-final-1x5-rebooted/passport.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-passport_complete_age_check_single_thread-sample-5,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check_single_thread,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,measured,5,ok,,,149502.019702,,154779.98301,783.12890625,736455,3897568,4169425,4169425,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""rayon_threads"":1}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-passport-frozen-bundle-metrics-final-1x5-rebooted/passport.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-passport_complete_age_check_single_thread-warmup,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_complete_age_check_single_thread,13044531f0f38e02ed19fcbd9b26202b8ba5a962,provekit_v1,noir,provekit-v1-whir-native,,warmup,0,ok,,,,,,,,3897568,4169425,4169425,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""rayon_threads"":1}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-passport-frozen-bundle-metrics-final-1x5-rebooted/passport.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-privacy_ethereum_webauthn-sample-1,2026-07-31T08:43:20Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,850346.968128,,850348.095358,810.6796875,1130,1733145772,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-privacy_ethereum_webauthn-sample-2,2026-07-31T08:43:20Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,862780.278129,,862781.979974,787.08203125,1127,1733145772,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-privacy_ethereum_webauthn-sample-3,2026-07-31T08:43:20Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,855096.265358,,855096.853897,708.84765625,1127,1733145772,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-privacy_ethereum_webauthn-sample-4,2026-07-31T08:43:20Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,854925.975512,,854927.018205,767.01953125,1127,1733145772,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-privacy_ethereum_webauthn-sample-5,2026-07-31T08:43:20Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,859999.803436,,860001.488282,802.69921875,1131,1733145772,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +provekit-v1-cross-device-20260730,motorola-e15-circom_groth16-privacy_ethereum_webauthn-warmup,2026-07-31T08:43:20Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,privacy_ethereum_webauthn,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,1733145772,1842364184,1842364184,,groth16-rust-rapidsnark-0.1.4-armv7,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-webauthn_assertion-sample-1,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,1,ok,,,107501.417621,,107501.428699,483.88671875,21092,2691859,19820289,19820289,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-webauthn_assertion-sample-2,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,2,ok,,,107456.724698,,107456.736391,483.25,21092,2691859,19820289,19820289,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-webauthn_assertion-sample-3,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,3,ok,,,107258.951083,,107258.963314,480.703125,21092,2691859,19820289,19820289,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-webauthn_assertion-sample-4,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,4,ok,,,107847.259314,,107847.276314,483.6875,21092,2691859,19820289,19820289,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-webauthn_assertion-sample-5,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,5,ok,,,107241.40493,,107241.41693,485.36328125,21092,2691859,19820289,19820289,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-noir_barretenberg-webauthn_assertion-warmup,2026-07-31T08:30:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,warmup,0,ok,,,,,,,,2691859,19820289,19820289,,noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2-armv7-file-srs,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +provekit-v1-cross-device-20260730,motorola-e15-provekit-webauthn_assertion-sample-1,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,1,ok,,,27788.906155,,27804.583386,507.921875,716001,2377452,2426672,2426672,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-webauthn-backoff/webauthn.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-webauthn_assertion-sample-2,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,2,ok,,,28539.414771,,28552.889771,496.8984375,718672,2377452,2426672,2426672,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-webauthn-backoff/webauthn.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-webauthn_assertion-sample-3,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,3,ok,,,27806.005848,,27820.859924,493.54296875,713530,2377452,2426672,2426672,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-webauthn-backoff/webauthn.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-webauthn_assertion-sample-4,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,4,ok,,,27884.23054,,27900.211771,500.34765625,714255,2377452,2426672,2426672,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-webauthn-backoff/webauthn.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-webauthn_assertion-sample-5,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,measured,5,ok,,,27907.13054,,27920.985617,501.67578125,713847,2377452,2426672,2426672,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-webauthn-backoff/webauthn.logcat.txt +provekit-v1-cross-device-20260730,motorola-e15-provekit-webauthn_assertion-warmup,2026-07-30T16:55:37.172Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_assertion,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,,warmup,0,ok,,,,,,,,2377452,2426672,2426672,,provekit-v1-native,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""provekit"":""v1"",""mobench_sdk"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8"",""mobench_cli"":""0.1.48+e992596a786cc18047102a318d40131c953e57b8""}",{},,Closest available counterpart only; proof statements and implementation details are not equivalent.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-provekit-proof-metrics-webauthn-backoff/webauthn.logcat.txt diff --git a/benchmarks/v1/legacy/data/export-benchmark-csv.test.ts b/benchmarks/v1/legacy/data/export-benchmark-csv.test.ts new file mode 100644 index 000000000..d8445030a --- /dev/null +++ b/benchmarks/v1/legacy/data/export-benchmark-csv.test.ts @@ -0,0 +1,263 @@ +import { describe, expect, test } from "bun:test"; +import { + ValidationError, + toCsv, + validateAttempts, +} from "./export-benchmark-csv"; +import { + CIRCUITS, + CSV_COLUMNS, + HARDWARE, + PROVERS, + EXPECTED_RUNTIME, + type AttemptRecord, +} from "./schema"; + +function base(overrides: Partial = {}): AttemptRecord { + return { + campaign_id: "campaign-1", + attempt_id: "attempt-1", + recorded_at_utc: "2026-07-29T12:00:00Z", + hardware: "iphone_se_2022", + device_model: "iPhone SE 2022", + os_version: "iOS 15.4", + abi: "arm64", + runtime: "ios_native", + browser: "", + circuit: "oprf", + circuit_variant: "oprf_taceo", + circuit_commit: "1111111111111111111111111111111111111111", + prover: "provekit_v1", + frontend: "noir", + prover_backend: "whir", + witness_backend: "", + sample_kind: "measured", + sample_index: 1, + status: "ok", + initialization_time_ms: 0.5, + witness_time_ms: null, + prover_time_ms: 12.5, + verify_time_ms: 1.25, + total_time_ms: 13.75, + peak_memory_mib: 42, + proof_size_bytes: 1024, + circuit_size_bytes: 2048, + artifact_size_bytes: 4096, + bundle_size_bytes: 8192, + constraint_count: 100, + artifact_version: "fixture-v1", + source_commit: "0123456789abcdef0123456789abcdef01234567", + package_versions: "{\"provekit\":\"1.0.0\"}", + artifact_hashes: "{\"pkp\":\"sha256:abc\"}", + session_id: "fixture-session", + non_equivalence_note: "Closest available circuit; not statement-equivalent.", + failure_code: "", + failure_detail: "", + evidence_path: "evidence/attempt-1.json", + ...overrides, + }; +} + +function completeMatrix(): AttemptRecord[] { + const records: AttemptRecord[] = []; + for (const hardware of HARDWARE) { + for (const circuit of CIRCUITS) { + for (const prover of PROVERS) { + for (let index = 0; index <= 5; index++) { + records.push( + base({ + attempt_id: `${hardware}-${circuit}-${prover}-${index}`, + hardware, + runtime: EXPECTED_RUNTIME[hardware], + browser: hardware === "macbook_m4" ? "Google Chrome fixture" : "", + circuit, + prover, + frontend: prover === "circom_groth16" ? "circom" : "noir", + prover_backend: + prover === "provekit_v1" + ? "whir" + : prover === "noir_barretenberg" + ? "ultra_honk" + : "rapidsnark", + witness_backend: prover === "circom_groth16" ? "witnesscalc_adapter" : "", + witness_time_ms: prover === "circom_groth16" ? 2 : null, + sample_kind: index === 0 ? "warmup" : "measured", + sample_index: index, + prover_time_ms: 12.5, + total_time_ms: prover === "circom_groth16" ? 14.5 : 12.5, + }), + ); + } + } + } + } + return records; +} + +describe("validateAttempts", () => { + test("accepts the complete 27-cell matrix with one warmup and five samples", () => { + expect(validateAttempts(completeMatrix())).toHaveLength(27 * 6); + }); + + test("accepts one explicit gap row in place of samples", () => { + const records = completeMatrix().filter( + (record) => + !( + record.hardware === "motorola_e15" && + record.circuit === "passport" && + record.prover === "circom_groth16" + ), + ); + records.push( + base({ + attempt_id: "moto-passport-circom-gap", + hardware: "motorola_e15", + runtime: "android_native", + circuit: "passport", + prover: "circom_groth16", + frontend: "circom", + prover_backend: "rapidsnark", + witness_backend: "witnesscalc_adapter", + sample_kind: "gap", + sample_index: null, + status: "unsupported", + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + failure_code: "unsupported_abi", + failure_detail: "Rapidsnark does not publish an armv7 Android library.", + }), + ); + expect(validateAttempts(records)).toHaveLength(26 * 6 + 1); + }); + + test("rejects metrics on gap records", () => { + expect(() => + validateAttempts( + [ + base({ + sample_kind: "gap", + sample_index: null, + status: "runtime_failed", + initialization_time_ms: null, + prover_time_ms: 0, + total_time_ms: null, + verify_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + failure_code: "crash", + failure_detail: "SIGSEGV", + }), + ], + false, + ), + ).toThrow(ValidationError); + }); + + test("rejects duplicate logical samples and duplicate attempt ids", () => { + const record = base(); + expect(() => validateAttempts([record, { ...record }], false)).toThrow( + /duplicate attempt_id/, + ); + }); + + test("rejects a native runtime assigned to the Mac browser target", () => { + expect(() => + validateAttempts( + [base({ hardware: "macbook_m4", runtime: "ios_native" })], + false, + ), + ).toThrow(/does not match macbook_m4/); + }); + + test("rejects incomplete successful cells in full-matrix mode", () => { + expect(() => validateAttempts([base()])).toThrow(/requires 1 warmup/); + }); + + test("accepts an attested native warmup with unavailable timing", () => { + expect( + validateAttempts( + [ + base({ + sample_kind: "warmup", + sample_index: 0, + prover_time_ms: null, + total_time_ms: null, + }), + ], + false, + ), + ).toHaveLength(1); + }); + + test("rejects a partially populated warmup timing pair", () => { + expect(() => + validateAttempts( + [ + base({ + sample_kind: "warmup", + sample_index: 0, + prover_time_ms: null, + total_time_ms: 12, + }), + ], + false, + ), + ).toThrow(/must provide both/); + }); + + test("rejects a measured success missing any campaign headline metric", () => { + for (const missing of [ + "artifact_size_bytes", + "proof_size_bytes", + "peak_memory_mib", + ] as const) { + expect(() => + validateAttempts([base({ [missing]: null })], false), + ).toThrow(/require proving payload size, proof size, and peak process memory/); + } + }); + + test("accepts separately named variants inside one comparison cell", () => { + const records = completeMatrix(); + const firstVariant = records.filter( + (record) => + record.hardware === "macbook_m4" && + record.circuit === "oprf" && + record.prover === "circom_groth16", + ); + records.push( + ...firstVariant.map((record) => ({ + ...record, + attempt_id: `${record.attempt_id}-nullifier`, + circuit_variant: "world_id_protocol_nullifier", + })), + ); + expect(validateAttempts(records)).toHaveLength(27 * 6 + 6); + }); +}); + +describe("toCsv", () => { + test("uses canonical columns, blank nulls, and RFC 4180 escaping", () => { + const record = base({ + failure_detail: "", + non_equivalence_note: 'Closest match, not "equivalent".', + }); + const csv = toCsv([record]); + expect(csv.split("\n")[0]).toBe(CSV_COLUMNS.join(",")); + expect(csv).toContain(",,12.5"); + expect(csv).toContain('"Closest match, not ""equivalent""."'); + }); +}); diff --git a/benchmarks/v1/legacy/data/merge-attempts.ts b/benchmarks/v1/legacy/data/merge-attempts.ts new file mode 100644 index 000000000..67dccbffd --- /dev/null +++ b/benchmarks/v1/legacy/data/merge-attempts.ts @@ -0,0 +1,19 @@ +#!/usr/bin/env bun + +function usage(): never { + console.error("usage: bun merge-attempts.ts ..."); + process.exit(2); +} + +if (import.meta.main) { + const [outputPath, ...inputPaths] = process.argv.slice(2); + if (!outputPath || inputPaths.length === 0) usage(); + const records: unknown[] = []; + for (const inputPath of inputPaths) { + const value = await Bun.file(inputPath).json(); + if (!Array.isArray(value)) throw new Error(`${inputPath} is not a JSON attempt array`); + records.push(...value); + } + await Bun.write(outputPath, `${JSON.stringify(records, null, 2)}\n`); + console.log(`merged ${records.length} attempt records into ${outputPath}`); +} diff --git a/benchmarks/v1/legacy/data/merge-e15-reports.test.ts b/benchmarks/v1/legacy/data/merge-e15-reports.test.ts new file mode 100644 index 000000000..995ad15a2 --- /dev/null +++ b/benchmarks/v1/legacy/data/merge-e15-reports.test.ts @@ -0,0 +1,72 @@ +import { describe, expect, test } from "bun:test"; +import { mergeE15Reports } from "./merge-e15-reports"; + +function report(workload: string, status: string) { + return { + schema_version: 1, + campaign_id: "campaign", + sampling: { warmup: 1, measured: 5, sequential: true }, + device: { abi: "armeabi-v7a", zygote: "zygote32" }, + apk: { sha256: "a".repeat(64) }, + results: [{ workload, status }], + }; +} + +describe("mergeE15Reports", () => { + test("merges isolated retries in canonical workload order", () => { + const merged = mergeE15Reports([ + { path: "passport.json", report: report("passport", "crashed") }, + { path: "oprf.json", report: report("oprf", "ok") }, + ]); + expect(merged.results.map((result) => result.workload)).toEqual([ + "oprf", + "passport", + ]); + }); + + test("lets later isolated evidence replace a stale failure", () => { + const merged = mergeE15Reports([ + { path: "old.json", report: report("oprf", "runtime_failed") }, + { path: "new.json", report: report("oprf", "ok") }, + ]); + expect(merged.results[0]?.status).toBe("ok"); + }); + + test("retains per-workload APK identity across isolated rebuilds", () => { + const other = report("passport", "crashed"); + other.apk.sha256 = "b".repeat(64); + const merged = mergeE15Reports([ + { path: "a.json", report: report("oprf", "ok") }, + { path: "b.json", report: other }, + ]); + expect(merged.results[1]?.apk?.sha256).toBe("b".repeat(64)); + }); + + test("rejects different campaign IDs without an explicit override", () => { + const other = report("webauthn", "ok"); + other.campaign_id = "other-campaign"; + expect(() => + mergeE15Reports([ + { path: "one.json", report: report("oprf", "ok") }, + { path: "two.json", report: other }, + ]), + ).toThrow("incompatible E15 report campaign"); + }); + + test("uses an explicit campaign ID for compatible retained shards", () => { + const other = report("webauthn", "ok"); + other.campaign_id = "other-campaign"; + const merged = mergeE15Reports( + [ + { path: "one.json", report: report("oprf", "ok") }, + { path: "two.json", report: other }, + ], + "frozen-campaign", + ); + expect(merged.campaign_id).toBe("frozen-campaign"); + expect(merged.results.map((result) => result.workload)).toEqual([ + "oprf", + "webauthn", + ]); + }); +}); diff --git a/benchmarks/v1/legacy/data/merge-e15-reports.ts b/benchmarks/v1/legacy/data/merge-e15-reports.ts new file mode 100644 index 000000000..7838ed0c2 --- /dev/null +++ b/benchmarks/v1/legacy/data/merge-e15-reports.ts @@ -0,0 +1,97 @@ +#!/usr/bin/env bun + +import { resolve } from "node:path"; + +interface E15Report { + schema_version: number; + campaign_id: string; + sampling: { warmup: number; measured: number; sequential: boolean }; + device: { abi?: string; zygote?: string; [key: string]: unknown }; + apk: { + path?: string; + sha256: string; + bytes?: number; + [key: string]: unknown; + }; + results: Array<{ + workload: string; + apk?: E15Report["apk"]; + [key: string]: unknown; + }>; +} + +const workloadOrder = ["oprf", "webauthn", "passport"]; + +export function mergeE15Reports( + inputs: Array<{ path: string; report: E15Report; sha256?: string }>, + campaignId?: string, +) { + const first = inputs[0]; + if (!first) throw new Error("at least one E15 report is required"); + const expected = { + sampling: JSON.stringify(first.report.sampling), + abi: first.report.device.abi, + zygote: first.report.device.zygote, + }; + const results = new Map(); + for (const input of inputs) { + const actual = { + sampling: JSON.stringify(input.report.sampling), + abi: input.report.device.abi, + zygote: input.report.device.zygote, + }; + if (JSON.stringify(actual) !== JSON.stringify(expected)) { + throw new Error(`${input.path}: incompatible E15 report identity`); + } + if (!campaignId && input.report.campaign_id !== first.report.campaign_id) { + throw new Error(`${input.path}: incompatible E15 report campaign`); + } + for (const result of input.report.results) { + if (!workloadOrder.includes(result.workload)) { + throw new Error( + `${input.path}: unknown E15 workload ${result.workload}`, + ); + } + results.set(result.workload, { ...result, apk: input.report.apk }); + } + } + return { + ...first.report, + campaign_id: campaignId ?? first.report.campaign_id, + generated_at_utc: new Date().toISOString(), + provenance: inputs.map((input) => ({ + path: resolve(input.path), + sha256: input.sha256 ?? "", + })), + results: workloadOrder + .map((workload) => results.get(workload)) + .filter((result): result is E15Report["results"][number] => + Boolean(result), + ), + }; +} + +if (import.meta.main) { + const [outputPath, ...inputPaths] = process.argv.slice(2); + if (!outputPath || inputPaths.length === 0) { + console.error( + "usage: bun merge-e15-reports.ts [results.json ...]", + ); + process.exit(2); + } + const inputs = await Promise.all( + inputPaths.map(async (path) => { + const bytes = await Bun.file(path).bytes(); + return { + path, + report: JSON.parse(new TextDecoder().decode(bytes)) as E15Report, + sha256: new Bun.CryptoHasher("sha256").update(bytes).digest("hex"), + }; + }), + ); + const merged = mergeE15Reports(inputs, process.env.CAMPAIGN_ID); + await Bun.write(outputPath, `${JSON.stringify(merged, null, 2)}\n`); + console.log( + `wrote ${merged.results.length} E15 workload results to ${outputPath}`, + ); +} diff --git a/benchmarks/v1/legacy/data/merge-ios-prebuilt-summaries.test.ts b/benchmarks/v1/legacy/data/merge-ios-prebuilt-summaries.test.ts new file mode 100644 index 000000000..31030cecd --- /dev/null +++ b/benchmarks/v1/legacy/data/merge-ios-prebuilt-summaries.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from "bun:test"; +import { mergeIosPrebuiltSummaries } from "./merge-ios-prebuilt-summaries"; + +describe("mergeIosPrebuiltSummaries", () => { + test("merges disjoint Mobench function maps", () => { + const merged = mergeIosPrebuiltSummaries([ + { path: "a.json", summary: { functions: { a: { value: 1 } } } }, + { path: "b.json", summary: { functions: { b: { value: 2 } } } }, + ]); + expect(Object.keys(merged.functions)).toEqual(["a", "b"]); + }); + + test("rejects conflicting duplicate function evidence", () => { + expect(() => + mergeIosPrebuiltSummaries([ + { path: "a.json", summary: { functions: { same: { value: 1 } } } }, + { path: "b.json", summary: { functions: { same: { value: 2 } } } }, + ]), + ).toThrow(/conflicting duplicate/); + }); +}); diff --git a/benchmarks/v1/legacy/data/merge-ios-prebuilt-summaries.ts b/benchmarks/v1/legacy/data/merge-ios-prebuilt-summaries.ts new file mode 100644 index 000000000..ed2b4c98d --- /dev/null +++ b/benchmarks/v1/legacy/data/merge-ios-prebuilt-summaries.ts @@ -0,0 +1,61 @@ +#!/usr/bin/env bun + +import { resolve } from "node:path"; + +interface MobenchSummary { + functions?: Record; +} + +export function mergeIosPrebuiltSummaries( + inputs: Array<{ path: string; summary: MobenchSummary; sha256?: string }>, +) { + const functions: Record = {}; + for (const input of inputs) { + if (!input.summary.functions || typeof input.summary.functions !== "object") { + throw new Error(`${input.path}: missing Mobench functions object`); + } + for (const [name, result] of Object.entries(input.summary.functions)) { + if (name in functions) { + if (JSON.stringify(functions[name]) !== JSON.stringify(result)) { + throw new Error(`${name}: conflicting duplicate iOS benchmark result`); + } + continue; + } + functions[name] = result; + } + } + return { + schema: "provekit.merged-ios-prebuilt-summaries.v1", + generated_at_utc: new Date().toISOString(), + inputs: inputs.map((input) => ({ + path: resolve(input.path), + sha256: input.sha256 ?? "", + })), + functions, + }; +} + +if (import.meta.main) { + const [outputPath, ...inputPaths] = process.argv.slice(2); + if (!outputPath || inputPaths.length === 0) { + console.error( + "usage: bun merge-ios-prebuilt-summaries.ts [summary.json ...]", + ); + process.exit(2); + } + const inputs = await Promise.all( + inputPaths.map(async (path) => { + const bytes = await Bun.file(path).bytes(); + return { + path, + summary: JSON.parse(new TextDecoder().decode(bytes)) as MobenchSummary, + sha256: new Bun.CryptoHasher("sha256").update(bytes).digest("hex"), + }; + }), + ); + const merged = mergeIosPrebuiltSummaries(inputs); + await Bun.write(outputPath, `${JSON.stringify(merged, null, 2)}\n`); + console.log( + `wrote ${Object.keys(merged.functions).length} iOS function results to ${outputPath}`, + ); +} diff --git a/benchmarks/v1/legacy/data/normalize-ios-prebuilt.test.ts b/benchmarks/v1/legacy/data/normalize-ios-prebuilt.test.ts new file mode 100644 index 000000000..b9f0c7a83 --- /dev/null +++ b/benchmarks/v1/legacy/data/normalize-ios-prebuilt.test.ts @@ -0,0 +1,188 @@ +import { describe, expect, test } from "bun:test"; +import { IOS_LANES, normalizeIosPrebuilt } from "./normalize-ios-prebuilt"; + +function fixture() { + const functions: Record = {}; + const entries: any[] = []; + const names = [...new Set(IOS_LANES.flatMap((lane) => Object.values(lane.functions)))]; + for (const [index, name] of names.entries()) { + functions[name!] = { + spec: { iterations: 5, warmup: 1 }, + remote_run: { build_id: `build-${index}` }, + benchmark_results: { + "iPhone SE 2022-15": [ + { + function: name, + samples: [1, 2, 3, 4, 5].map((n) => (index * 10 + n) * 1_000_000), + custom_metrics: { + sample_u64: { + proof_size_bytes: [100, 101, 102, 103, 104, 105], + prove_time_ns: [200, 201, 202, 203, 204, 205].map( + (value) => value * 1_000_000, + ), + }, + run_u64: { + circuit_size_bytes: 400, + proving_payload_size_bytes: 1000, + }, + }, + }, + ], + }, + performance_metrics: { + "iPhone SE 2022-15": { memory: { peak_mb: 100 + index } }, + }, + }; + entries.push({ + function: name, + iterations: 5, + warmup: 1, + artifacts: [ + { + kind: "ios-app", + path: `entries/${index}/app.ipa`, + size: 1000 + index, + sha256: `${index}`.padStart(64, "0"), + }, + ], + }); + } + return { + summary: { functions }, + manifest: { source_sha: "b".repeat(40), platform: "ios", entries }, + }; +} + +const options = { + campaignId: "campaign", + sourceCommit: "a".repeat(40), + device: "iPhone SE 2022-15", + osVersion: "iOS 15", + evidencePath: "/evidence/summary.json", + recordedAtUtc: "2026-07-29T12:00:00Z", +}; + +describe("normalizeIosPrebuilt", () => { + test("emits one attested warmup and five measured rows for every iOS lane", () => { + const { summary, manifest } = fixture(); + const records = normalizeIosPrebuilt(summary, manifest, options); + expect(records).toHaveLength(IOS_LANES.length * 6); + expect(records.filter((record) => record.sample_kind === "warmup")).toHaveLength( + IOS_LANES.length, + ); + expect(records.filter((record) => record.sample_kind === "measured")).toHaveLength( + IOS_LANES.length * 5, + ); + expect( + records.every( + (record) => + record.sample_kind !== "warmup" || + (record.prover_time_ms === null && record.total_time_ms === null), + ), + ).toBe(true); + expect(records.every((record) => record.source_commit === options.sourceCommit)).toBe(true); + expect(records.every((record) => record.source_commit !== fixture().manifest.source_sha)).toBe( + true, + ); + const provekitSample = records.find( + (record) => + record.prover === "provekit_v1" && + record.circuit === "passport" && + record.sample_kind === "measured" && + record.sample_index === 1, + ); + expect(provekitSample?.initialization_time_ms).toBeNull(); + expect(provekitSample?.verify_time_ms).toBeNull(); + expect(provekitSample?.total_time_ms).not.toBeNull(); + expect(provekitSample?.prover_time_ms).not.toBe(provekitSample?.total_time_ms); + expect(provekitSample?.proof_size_bytes).toBe(101); + expect(provekitSample?.prover_time_ms).toBe(201); + expect(provekitSample?.artifact_size_bytes).toBe(1000); + expect(provekitSample?.bundle_size_bytes).toBe(1000); + expect(provekitSample?.circuit_size_bytes).toBe(400); + expect(JSON.parse(provekitSample!.artifact_hashes)).toEqual({}); + const webauthnRapidsnark = records.find( + (record) => + record.prover === "circom_groth16" && + record.circuit_variant === "privacy_ethereum_webauthn" && + record.sample_kind === "measured", + ); + expect(webauthnRapidsnark?.prover_backend).toBe( + "rapidsnark-groth16-native-single-thread", + ); + expect(JSON.parse(webauthnRapidsnark!.package_versions).rapidsnark_threads).toBe(1); + }); + + test("rejects a result with fewer than five measured samples", () => { + const { summary, manifest } = fixture(); + const first = Object.keys(summary.functions)[0]!; + summary.functions[first].benchmark_results["iPhone SE 2022-15"][0].samples.pop(); + expect(() => normalizeIosPrebuilt(summary, manifest, options)).toThrow( + /expected five measured samples/, + ); + }); + + test("uses zkey plus frozen WTNS for the iPhone Circom circuit payload", () => { + const { summary, manifest } = fixture(); + const functionName = + "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_prove"; + const metrics = + summary.functions[functionName].benchmark_results["iPhone SE 2022-15"][0] + .custom_metrics.run_u64; + delete metrics.circuit_size_bytes; + metrics.zkey_size_bytes = 1_733_145_772; + metrics.witness_size_bytes = 109_218_412; + metrics.proving_payload_size_bytes = 1_842_364_184; + + const records = normalizeIosPrebuilt(summary, manifest, options); + const webauthnRapidsnark = records.find( + (record) => + record.prover === "circom_groth16" && + record.circuit_variant === "privacy_ethereum_webauthn" && + record.sample_kind === "measured", + ); + + expect(webauthnRapidsnark?.circuit_size_bytes).toBe(1_842_364_184); + expect(webauthnRapidsnark?.artifact_size_bytes).toBe(1_842_364_184); + expect(webauthnRapidsnark?.bundle_size_bytes).toBe(1_842_364_184); + expect(webauthnRapidsnark?.non_equivalence_note).toContain( + "asset-size estimate: zkey plus frozen WTNS", + ); + }); + + test("emits an explicit evidence-backed gap for a missing lane", () => { + const { summary, manifest } = fixture(); + delete summary.functions[ + "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_prove" + ]; + manifest.entries = manifest.entries.filter( + (entry) => + entry.function !== + "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_prove", + ); + + const records = normalizeIosPrebuilt(summary, manifest, { + ...options, + gaps: [ + { + circuit: "webauthn", + circuit_variant: "privacy_ethereum_webauthn", + prover: "circom_groth16", + status: "build_failed", + failure_code: "browserstack_ipa_too_large", + failure_detail: "BrowserStack rejected the 1.18 GB IPA with HTTP 413.", + evidence_path: "/tmp/http-413.txt", + }, + ], + }); + + const gap = records.find( + (record) => + record.circuit === "webauthn" && + record.prover === "circom_groth16", + ); + expect(gap?.sample_kind).toBe("gap"); + expect(gap?.status).toBe("build_failed"); + expect(gap?.prover_time_ms).toBeNull(); + }); +}); diff --git a/benchmarks/v1/legacy/data/normalize-ios-prebuilt.ts b/benchmarks/v1/legacy/data/normalize-ios-prebuilt.ts new file mode 100644 index 000000000..d91ab8f1a --- /dev/null +++ b/benchmarks/v1/legacy/data/normalize-ios-prebuilt.ts @@ -0,0 +1,561 @@ +#!/usr/bin/env bun + +import { statSync } from "node:fs"; +import { resolve } from "node:path"; +import { validateAttempts } from "./export-benchmark-csv"; +import type { AttemptRecord, Circuit, Prover, Status } from "./schema"; + +type Phase = "initialize" | "prove" | "verify" | "total"; +interface Lane { + circuit: Circuit; + variant: string; + circuitCommit: string; + prover: Prover; + proverBackend: string; + witnessBackend: string; + functions: Partial>; +} +interface Artifact { + kind: string; + path: string; + size: number; + sha256: string; +} +interface Entry { + function: string; + iterations: number; + warmup: number; + artifacts: Artifact[]; +} +interface Manifest { + source_sha: string; + platform: string; + entries: Entry[]; +} +interface FunctionResult { + spec?: { iterations?: number; warmup?: number }; + remote_run?: { build_id?: string }; + benchmark_results?: Record; + performance_metrics?: Record; +} +interface BenchmarkResult { + function?: string; + samples?: unknown[]; + resources?: { + process_peak_memory_kb?: number; + peak_memory_kb?: number; + }; + custom_metrics?: { + sample_u64?: Record; + run_u64?: Record; + }; +} +interface MergedSummary { + functions?: Record; +} +interface GapEvidence { + circuit: Circuit; + prover: Prover; + circuit_variant?: string; + status: Exclude; + failure_code: string; + failure_detail: string; + evidence_path: string; + session_id?: string; +} + +const WORLD_ID = "85aeeef539961cae5a63de794997b507a5975717"; +const SELF = "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e"; +const WEBAUTHN_CIRCOM = "0fb5b4aa1398281c2fd3dbe14db147e05b61f201"; +const TACEO_V1 = "808f3c795b57963dd58ef282ccd61022ef39c285"; +const TACEO_V2 = "fd37726215b59d3d4823ea7b1967b1da3525ed9d"; + +export const IOS_LANES: Lane[] = [ + { + circuit: "passport", + variant: "passport_complete_age_check", + circuitCommit: "", + prover: "provekit_v1", + proverBackend: "provekit-v1-whir-native", + witnessBackend: "", + functions: { + prove: "bench_mobile::bench_passport_complete_age_check_prove", + }, + }, + { + circuit: "passport", + variant: "passport_complete_age_check", + circuitCommit: "", + prover: "noir_barretenberg", + proverBackend: "barretenberg-ultrahonk-native", + witnessBackend: "", + functions: { + prove: "provekit_v1_mobile_adapters::bench_passport_barretenberg_prove", + }, + }, + { + circuit: "webauthn", + variant: "webauthn_assertion", + circuitCommit: WORLD_ID, + prover: "provekit_v1", + proverBackend: "provekit-v1-whir-native", + witnessBackend: "", + functions: { + prove: "bench_mobile::bench_webauthn_assertion_prove", + }, + }, + { + circuit: "oprf", + variant: "oprf_taceo", + circuitCommit: TACEO_V2, + prover: "provekit_v1", + proverBackend: "provekit-v1-whir-native", + witnessBackend: "", + functions: { + prove: "bench_mobile::bench_oprf_prove", + }, + }, + { + circuit: "webauthn", + variant: "webauthn_assertion", + circuitCommit: WORLD_ID, + prover: "noir_barretenberg", + proverBackend: "barretenberg-ultrahonk-native", + witnessBackend: "", + functions: { + prove: "provekit_v1_mobile_adapters::bench_webauthn_barretenberg_prove", + }, + }, + { + circuit: "oprf", + variant: "oprf_taceo", + circuitCommit: TACEO_V1, + prover: "noir_barretenberg", + proverBackend: "barretenberg-ultrahonk-native", + witnessBackend: "", + functions: { + prove: "provekit_v1_mobile_adapters::bench_oprf_barretenberg_prove", + }, + }, + { + circuit: "passport", + variant: "self_vc_and_disclose", + circuitCommit: SELF, + prover: "circom_groth16", + proverBackend: "rapidsnark-groth16-native", + witnessBackend: "frozen-wtns-witnesscalc-adapter-0.1.7", + functions: { + prove: "provekit_v1_rapidsnark_mobile::bench_passport_rapidsnark_prove", + }, + }, + { + circuit: "passport", + variant: "self_register_rsa_4096", + circuitCommit: SELF, + prover: "circom_groth16", + proverBackend: "rapidsnark-groth16-native", + witnessBackend: "frozen-wtns-witnesscalc-adapter-0.1.7", + functions: { + prove: + "provekit_v1_rapidsnark_mobile_register::bench_passport_rapidsnark_prove", + }, + }, + { + circuit: "webauthn", + variant: "privacy_ethereum_webauthn", + circuitCommit: WEBAUTHN_CIRCOM, + prover: "circom_groth16", + proverBackend: "rapidsnark-groth16-native-single-thread", + witnessBackend: "frozen-wtns-witnesscalc-adapter-0.1.7", + functions: { + prove: + "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_prove", + }, + }, + { + circuit: "oprf", + variant: "world_id_protocol_query", + circuitCommit: WORLD_ID, + prover: "circom_groth16", + proverBackend: "rapidsnark-groth16-native", + witnessBackend: "frozen-wtns-witnesscalc-adapter-0.1.7", + functions: { + prove: + "provekit_v1_rapidsnark_mobile_oprf::bench_oprf_query_rapidsnark_prove", + }, + }, + { + circuit: "oprf", + variant: "world_id_protocol_nullifier", + circuitCommit: WORLD_ID, + prover: "circom_groth16", + proverBackend: "rapidsnark-groth16-native", + witnessBackend: "frozen-wtns-witnesscalc-adapter-0.1.7", + functions: { + prove: + "provekit_v1_rapidsnark_mobile_oprf::bench_oprf_nullifier_rapidsnark_prove", + }, + }, +]; + +function durationNs(sample: unknown): number { + const value = + typeof sample === "number" + ? sample + : sample && typeof sample === "object" && "duration_ns" in sample + ? (sample as { duration_ns: unknown }).duration_ns + : undefined; + if (typeof value !== "number" || !Number.isFinite(value) || value < 0) { + throw new Error(`invalid Mobench duration sample: ${JSON.stringify(sample)}`); + } + return value; +} + +function processPeakMemoryKib(sample: unknown): number | null { + if (!sample || typeof sample !== "object") return null; + const value = + "process_peak_memory_kb" in sample + ? (sample as { process_peak_memory_kb: unknown }).process_peak_memory_kb + : "peak_memory_kb" in sample + ? (sample as { peak_memory_kb: unknown }).peak_memory_kb + : undefined; + return typeof value === "number" && Number.isFinite(value) && value > 0 + ? value + : null; +} + +function samplesFor(result: FunctionResult, functionName: string, device: string): number[] { + return benchmarkResultFor(result, functionName, device).samples!.map(durationNs); +} + +function benchmarkResultFor( + result: FunctionResult, + functionName: string, + device: string, +): BenchmarkResult { + const entries = result.benchmark_results?.[device]; + if (!entries) throw new Error(`${functionName}: missing benchmark_results for ${device}`); + const entry = entries.find((candidate) => candidate.function === functionName) ?? entries[0]; + if (!entry?.samples || entry.samples.length !== 5) { + throw new Error( + `${functionName}: expected five measured samples, found ${entry?.samples?.length ?? 0}`, + ); + } + return entry; +} + +export function normalizeIosPrebuilt( + summary: MergedSummary, + manifest: Manifest, + options: { + campaignId: string; + sourceCommit: string; + device: string; + osVersion: string; + evidencePath: string; + recordedAtUtc: string; + gaps?: GapEvidence[]; + }, +): AttemptRecord[] { + if (manifest.platform !== "ios") throw new Error(`expected ios manifest, found ${manifest.platform}`); + const functions = summary.functions ?? {}; + const entries = new Map(manifest.entries.map((entry) => [entry.function, entry])); + const records: AttemptRecord[] = []; + + for (const lane of IOS_LANES) { + const phaseSamples = new Map(); + const names = new Set(Object.values(lane.functions)); + const missingNames = [...names].filter( + (name) => !functions[name] || !entries.has(name), + ); + if (missingNames.length) { + const gap = options.gaps?.find( + (candidate) => + candidate.circuit === lane.circuit && + candidate.prover === lane.prover && + (!candidate.circuit_variant || + candidate.circuit_variant === lane.variant), + ); + if (!gap) { + throw new Error( + `missing iOS result or manifest entry: ${missingNames.join(", ")}`, + ); + } + records.push({ + campaign_id: options.campaignId, + attempt_id: `iphone-se-2022-${lane.prover}-${lane.variant}-gap`, + recorded_at_utc: options.recordedAtUtc, + hardware: "iphone_se_2022", + device_model: "iPhone SE 2022", + os_version: options.osVersion, + abi: "arm64", + runtime: "ios_native", + browser: "", + circuit: lane.circuit, + circuit_variant: lane.variant, + circuit_commit: lane.circuitCommit || options.sourceCommit, + prover: lane.prover, + frontend: lane.prover === "circom_groth16" ? "circom" : "noir", + prover_backend: lane.proverBackend, + witness_backend: lane.witnessBackend, + sample_kind: "gap", + sample_index: null, + status: gap.status, + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + artifact_version: + lane.prover === "provekit_v1" + ? "provekit-v1-native" + : lane.prover === "noir_barretenberg" + ? "noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2" + : "groth16-rust-rapidsnark-0.1.4", + source_commit: options.sourceCommit, + package_versions: JSON.stringify( + lane.prover === "provekit_v1" + ? { provekit: "v1" } + : lane.prover === "noir_barretenberg" + ? { + mopro: "0.3.7", + noir: "1.0.0-beta.19", + barretenberg_rs: "4.2.0-aztecnr-rc.2", + } + : { + mopro: "0.3.7", + rust_rapidsnark: "0.1.4", + witnesscalc_adapter: "0.1.7", + ...(lane.variant === "privacy_ethereum_webauthn" + ? { rapidsnark_threads: 1 } + : {}), + }, + ), + artifact_hashes: JSON.stringify({}), + session_id: gap.session_id ?? "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: gap.failure_code, + failure_detail: gap.failure_detail, + evidence_path: resolve(gap.evidence_path), + }); + continue; + } + for (const [phase, name] of Object.entries(lane.functions) as [Phase, string][]) { + const result = functions[name]; + const entry = entries.get(name); + if (!result || !entry) throw new Error(`missing iOS result or manifest entry: ${name}`); + if (entry.warmup !== 1 || entry.iterations !== 5) { + throw new Error(`${name}: manifest violates the one-warmup/five-sample contract`); + } + if (result.spec?.warmup !== 1 || result.spec?.iterations !== 5) { + throw new Error(`${name}: result spec violates the one-warmup/five-sample contract`); + } + phaseSamples.set(phase, samplesFor(result, name, options.device)); + } + + // IPA and XCUITest uploads are transport containers, not proving inputs. + // Input hashes remain blank until the frozen proving files are reported + // directly rather than inferred from duplicate uploaded bundles. + const artifactHashes = {}; + const proveFunction = lane.functions.prove; + const proveResult = proveFunction ? functions[proveFunction] : undefined; + const proveReport = + proveFunction && proveResult + ? benchmarkResultFor(proveResult, proveFunction, options.device) + : undefined; + const customMetrics = proveReport?.custom_metrics; + const proofSizes = customMetrics?.sample_u64?.proof_size_bytes; + const proveTimes = customMetrics?.sample_u64?.prove_time_ns; + const provingPayloadSize = + customMetrics?.run_u64?.proving_payload_size_bytes ?? null; + // The campaign's reader-facing "circuit size" metric means every frozen + // input needed to create a proof. For iPhone Circom lanes the retained + // asset inventory is zkey + WTNS, so use its reported aggregate rather + // than the zkey-only value. + const circuitSize = + lane.prover === "circom_groth16" && + customMetrics?.run_u64?.zkey_size_bytes !== undefined + ? provingPayloadSize + : customMetrics?.run_u64?.circuit_size_bytes ?? + customMetrics?.run_u64?.prover_size_bytes ?? + null; + if ( + !proofSizes || + proofSizes.length !== 6 || + !proveTimes || + proveTimes.length !== 6 || + !Number.isInteger(provingPayloadSize) || + provingPayloadSize! <= 0 + ) { + throw new Error( + `${proveFunction}: missing exact prove_time_ns, proof_size_bytes, or proving_payload_size_bytes custom metrics`, + ); + } + const sessionIds = [...names] + .map((name) => functions[name]?.remote_run?.build_id) + .filter((value): value is string => Boolean(value)); + const peakMemory = [...names] + .map((name) => functions[name]?.performance_metrics?.[options.device]?.memory?.peak_mb) + .filter((value): value is number => typeof value === "number"); + const proveResourcePeakKib = + proveReport?.resources?.process_peak_memory_kb ?? + proveReport?.resources?.peak_memory_kb ?? + null; + const fallbackPeakMemoryMib = + proveResourcePeakKib !== null + ? proveResourcePeakKib / 1024 + : peakMemory.length + ? Math.max(...peakMemory) + : null; + const common = { + campaign_id: options.campaignId, + recorded_at_utc: options.recordedAtUtc, + hardware: "iphone_se_2022" as const, + device_model: "iPhone SE 2022", + os_version: options.osVersion, + abi: "arm64", + runtime: "ios_native" as const, + browser: "", + circuit: lane.circuit, + circuit_variant: lane.variant, + circuit_commit: lane.circuitCommit || options.sourceCommit, + prover: lane.prover, + frontend: lane.prover === "circom_groth16" ? "circom" : "noir", + prover_backend: lane.proverBackend, + witness_backend: lane.witnessBackend, + initialization_time_ms: null, + witness_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: circuitSize, + artifact_size_bytes: provingPayloadSize, + bundle_size_bytes: provingPayloadSize, + constraint_count: null, + artifact_version: + lane.prover === "provekit_v1" + ? "provekit-v1-native" + : lane.prover === "noir_barretenberg" + ? "noir-v1.0.0-beta.19-barretenberg-rs-4.2.0-aztecnr-rc.2" + : "groth16-rust-rapidsnark-0.1.4", + source_commit: options.sourceCommit, + package_versions: JSON.stringify( + lane.prover === "provekit_v1" + ? { provekit: "v1" } + : lane.prover === "noir_barretenberg" + ? { + mopro: "0.3.7", + noir: "1.0.0-beta.19", + barretenberg_rs: "4.2.0-aztecnr-rc.2", + } + : { + mopro: "0.3.7", + rust_rapidsnark: "0.1.4", + witnesscalc_adapter: "0.1.7", + ...(lane.variant === "privacy_ethereum_webauthn" + ? { rapidsnark_threads: 1 } + : {}), + }, + ), + artifact_hashes: JSON.stringify(artifactHashes), + session_id: sessionIds.join(";"), + non_equivalence_note: + lane.prover === "circom_groth16" + ? "Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded." + : "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: "", + failure_detail: "", + evidence_path: options.evidencePath, + }; + + records.push({ + ...common, + attempt_id: `iphone-se-2022-${lane.prover}-${lane.variant}-warmup`, + sample_kind: "warmup", + sample_index: 0, + status: "ok", + initialization_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + }); + for (let index = 0; index < 5; index++) { + const proveNs = proveTimes[index + 1]!; + const verifyNs = phaseSamples.get("verify")?.[index]; + // For proof-only campaigns this is the Mobench wrapper duration for the + // prove function, while prover_time_ms remains the adapter's internal + // prover call. It is not presented as a full witness+prove+verify e2e. + const totalNs = phaseSamples.get("total")?.[index] ?? + phaseSamples.get("prove")![index]!; + const samplePeakKib = processPeakMemoryKib(proveReport?.samples?.[index]); + records.push({ + ...common, + attempt_id: `iphone-se-2022-${lane.prover}-${lane.variant}-sample-${index + 1}`, + sample_kind: "measured", + sample_index: index + 1, + status: "ok", + initialization_time_ms: + phaseSamples.get("initialize")?.[index] === undefined + ? null + : phaseSamples.get("initialize")![index]! / 1_000_000, + prover_time_ms: proveNs / 1_000_000, + verify_time_ms: verifyNs === undefined ? null : verifyNs / 1_000_000, + total_time_ms: totalNs / 1_000_000, + peak_memory_mib: + samplePeakKib === null ? fallbackPeakMemoryMib : samplePeakKib / 1024, + proof_size_bytes: proofSizes[index + 1]!, + }); + } + } + return validateAttempts(records, false); +} + +function usage(): never { + console.error( + "usage: bun normalize-ios-prebuilt.ts [device] [os-version] [gaps.json]", + ); + process.exit(2); +} + +if (import.meta.main) { + const [ + summaryPath, + manifestPath, + outputPath, + sourceCommit, + device = "iPhone SE 2022-15", + osVersion = "iOS 15", + gapsPath, + ] = process.argv.slice(2); + if ( + !summaryPath || + !manifestPath || + !outputPath || + !sourceCommit || + !/^[0-9a-f]{40}$/.test(sourceCommit) + ) { + usage(); + } + const summary = (await Bun.file(summaryPath).json()) as MergedSummary; + const manifest = (await Bun.file(manifestPath).json()) as Manifest; + const gaps = gapsPath + ? ((await Bun.file(gapsPath).json()) as GapEvidence[]) + : undefined; + const records = normalizeIosPrebuilt(summary, manifest, { + campaignId: process.env.CAMPAIGN_ID ?? "provekit-v1-cross-device-20260729", + sourceCommit, + device, + osVersion, + evidencePath: resolve(summaryPath), + recordedAtUtc: statSync(summaryPath).mtime.toISOString(), + gaps, + }); + await Bun.write(outputPath, `${JSON.stringify(records, null, 2)}\n`); + console.log(`wrote ${records.length} iOS attempt records to ${outputPath}`); +} diff --git a/benchmarks/v1/legacy/data/normalize-mac-browser.ts b/benchmarks/v1/legacy/data/normalize-mac-browser.ts new file mode 100644 index 000000000..782d9a586 --- /dev/null +++ b/benchmarks/v1/legacy/data/normalize-mac-browser.ts @@ -0,0 +1,593 @@ +#!/usr/bin/env bun + +import { statSync } from "node:fs"; +import { resolve } from "node:path"; +import { toCsv, validateAttempts } from "./export-benchmark-csv"; +import type { AttemptRecord, Circuit } from "./schema"; + +const repoRoot = resolve(import.meta.dir, "../../.."); +const rawRoot = resolve( + process.argv[2] ?? + resolve(repoRoot, "target/v1-benchmarks/reproduction/mac-chrome-20260729/raw"), +); +const outputJson = resolve( + process.argv[3] ?? + resolve(repoRoot, "target/v1-benchmarks/reproduction/mac-chrome-20260729/attempts.json"), +); +const outputCsv = resolve( + process.argv[4] ?? + resolve(repoRoot, "target/v1-benchmarks/reproduction/mac-chrome-20260729/samples.csv"), +); +const campaignId = process.env.CAMPAIGN_ID ?? "provekit-v1-cross-device-20260729"; +const gitRevision = Bun.spawnSync(["git", "rev-parse", "HEAD"], { + cwd: repoRoot, + stdout: "pipe", + stderr: "pipe", +}); +if (gitRevision.exitCode !== 0) { + throw new Error(`failed to resolve campaign source commit: ${gitRevision.stderr.toString()}`); +} +const sourceCommit = + process.env.CAMPAIGN_SOURCE_COMMIT ?? gitRevision.stdout.toString().trim(); +const browserIdentity = (await Bun.file(resolve(rawRoot, "provekit-oprf.json")).json()) as { + browser?: { name?: unknown; version?: unknown; headless?: unknown }; +}; +if ( + typeof browserIdentity.browser?.name !== "string" || + typeof browserIdentity.browser.version !== "string" || + browserIdentity.browser.headless !== true +) { + throw new Error("provekit-oprf.json is missing the canonical headless browser identity"); +} +const browser = + `${browserIdentity.browser.name} ${browserIdentity.browser.version} headless`; + +interface BarretenbergSample { + duration_ns: number; + sample_index: number; + warmup: boolean; +} + +interface BarretenbergReport { + status?: "build_failed" | "runtime_failed"; + failure_class?: string; + failure_message?: string; + samples?: BarretenbergSample[]; + metadata?: { + backend: string; + workload: string; + proof_size_bytes: number; + tampered_proof_rejected: boolean; + }; + process_memory?: ProcessMemory; + proving_payload_transport?: { + crs_size_bytes: number; + }; +} + +interface ProcessMemory { + metric: "peak_chrome_renderer_rss"; + peak_rss_kib: number | null; +} + +interface CircomSample { + sample_index: number; + warmup: boolean; + status: "ok"; + initialization_time_ns: number | null; + witness_time_ns: number; + prove_time_ns: number; + verify_time_ns: number; + end_to_end_time_ns: number; + proof_size_bytes: number; + tampered_proof_rejected: boolean; +} + +interface CircomResult { + circuit: string; + variant: string; + wasm: string; + zkey: string; + verification_key: string; + input: string; + circuit_commit: string; + samples: CircomSample[]; +} + +interface CircomReport { + status?: "timed_out" | "runtime_failed"; + failure_class?: string; + failure_message?: string; + backend?: string; + workload: Circuit; + results?: CircomResult[]; + process_memory?: ProcessMemory; +} + +interface ProveKitSample { + iteration: number; + warmup: boolean; + prepare_time_ms: number; + witness_time_ms?: number; + prove_time_ms: number; + verify_time_ms: number; + end_to_end_time_ms: number; + proof_size_bytes: number; + tampered_proof_rejected: boolean; + js_heap_bytes?: number; +} + +interface ProveKitReport { + benchmark: string; + backend: string; + initialization_time_ms: number; + artifacts: { + prover_bytes: number; + verifier_bytes: number; + }; + bundle: { + shared_runtime_bytes: number; + incremental_circuit_bytes: number; + cold_download_bytes: number; + }; + circuit: { + constraints: number; + witnesses: number; + }; + warmup: number; + iterations: number; + samples: ProveKitSample[]; + process_memory?: ProcessMemory; +} + +const records: AttemptRecord[] = []; +const hashCache = new Map(); + +function recordedAt(path: string): string { + return statSync(path).mtime.toISOString(); +} + +async function sha256(path: string): Promise { + const cached = hashCache.get(path); + if (cached) return cached; + const process = Bun.spawn(["shasum", "-a", "256", path], { + stdout: "pipe", + stderr: "pipe", + }); + const output = await new Response(process.stdout).text(); + if ((await process.exited) !== 0) { + throw new Error(`failed to hash ${path}: ${await new Response(process.stderr).text()}`); + } + const hash = output.trim().split(/\s+/)[0]; + hashCache.set(path, hash); + return hash; +} + +function base( + circuit: Circuit, + circuitVariant: string, + circuitCommit: string, +): Omit< + AttemptRecord, + | "attempt_id" + | "recorded_at_utc" + | "sample_kind" + | "sample_index" + | "status" + | "initialization_time_ms" + | "witness_time_ms" + | "prover_time_ms" + | "verify_time_ms" + | "total_time_ms" + | "peak_memory_mib" + | "proof_size_bytes" + | "circuit_size_bytes" + | "artifact_size_bytes" + | "bundle_size_bytes" + | "constraint_count" + | "artifact_version" + | "package_versions" + | "artifact_hashes" + | "session_id" + | "non_equivalence_note" + | "failure_code" + | "failure_detail" + | "evidence_path" + | "prover" + | "frontend" + | "prover_backend" + | "witness_backend" +> { + return { + campaign_id: campaignId, + hardware: "macbook_m4", + device_model: "MacBook Pro M4 Max", + os_version: "macOS 26.5.2 (25F84)", + abi: "arm64", + runtime: "browser_wasm", + browser, + circuit, + circuit_variant: circuitVariant, + circuit_commit: circuitCommit, + source_commit: sourceCommit, + }; +} + +function nsToMs(value: number | null): number | null { + return value === null ? null : value / 1_000_000; +} + +async function normalizeProveKit( + fileName: string, + circuit: Circuit, + circuitVariant: string, + circuitCommit: string, +) { + const evidencePath = resolve(rawRoot, fileName); + if (!(await Bun.file(evidencePath).exists()) || Bun.file(evidencePath).size === 0) return; + const report = (await Bun.file(evidencePath).json()) as ProveKitReport; + if ( + report.warmup !== 1 || + report.iterations !== 5 || + report.samples.length !== 6 || + !report.samples.every((sample) => sample.tampered_proof_rejected) || + report.samples.filter((sample) => sample.warmup).length !== 1 + ) { + throw new Error(`${fileName} does not satisfy the 1+5 correctness contract`); + } + if (report.process_memory?.peak_rss_kib == null) { + throw new Error(`${fileName} is missing Chrome renderer peak RSS`); + } + + const assetRoot = resolve(repoRoot, "benchmarks/v1/wasm/dist/assets", circuitVariant); + const proverPath = resolve(assetRoot, `${circuitVariant}.pkp`); + const inputsPath = resolve(assetRoot, "inputs.json"); + const proverFile = Bun.file(proverPath); + const inputsFile = Bun.file(inputsPath); + const provingPayloadSize = proverFile.size + inputsFile.size; + const hashes = { + prover_sha256: await sha256(proverPath), + inputs_sha256: await sha256(inputsPath), + }; + const timestamp = recordedAt(evidencePath); + + for (const sample of report.samples) { + const canonicalIndex = sample.warmup ? 0 : sample.iteration + 1; + records.push({ + ...base(circuit, circuitVariant, circuitCommit), + attempt_id: `mac-chrome-provekit-${circuitVariant}-${sample.warmup ? "warmup" : `sample-${canonicalIndex}`}`, + recorded_at_utc: timestamp, + prover: "provekit_v1", + frontend: "noir", + prover_backend: "provekit-v1-whir-wasm-single-thread", + witness_backend: "@noir-lang/noir_js", + sample_kind: sample.warmup ? "warmup" : "measured", + sample_index: canonicalIndex, + status: "ok", + initialization_time_ms: report.initialization_time_ms, + witness_time_ms: sample.witness_time_ms ?? null, + prover_time_ms: sample.prove_time_ms, + verify_time_ms: sample.verify_time_ms, + total_time_ms: sample.end_to_end_time_ms, + peak_memory_mib: + report.process_memory?.peak_rss_kib == null + ? null + : report.process_memory.peak_rss_kib / 1024, + proof_size_bytes: sample.proof_size_bytes, + circuit_size_bytes: report.artifacts.prover_bytes, + artifact_size_bytes: provingPayloadSize, + bundle_size_bytes: provingPayloadSize, + constraint_count: report.circuit.constraints, + artifact_version: "pkp-2.0-pkv-2.1-noir-v1.0.0-beta.20", + package_versions: JSON.stringify({ + "@worldcoin/provekit": "0.1.0", + "@noir-lang/noir_js": "1.0.0-beta.20", + }), + artifact_hashes: JSON.stringify(hashes), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: "", + failure_detail: "", + evidence_path: evidencePath, + }); + } +} + +async function normalizeBarretenberg( + fileName: string, + circuit: Circuit, + circuitVariant: string, + circuitCommit: string, + artifactRelative: string, +) { + const evidencePath = resolve(rawRoot, fileName); + if (!(await Bun.file(evidencePath).exists())) return; + const report = (await Bun.file(evidencePath).json()) as BarretenbergReport; + const timestamp = recordedAt(evidencePath); + if (report.status) { + records.push({ + ...base(circuit, circuitVariant, circuitCommit), + attempt_id: `mac-chrome-noir-${circuitVariant}-gap`, + recorded_at_utc: timestamp, + prover: "noir_barretenberg", + frontend: "noir", + prover_backend: "barretenberg-ultrahonk-wasm-single-thread", + witness_backend: "@noir-lang/noir_js", + sample_kind: "gap", + sample_index: null, + status: report.status, + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + artifact_version: "noir-v1.0.0-beta.19-acir", + package_versions: JSON.stringify({ + "@aztec/bb.js": "4.2.0-aztecnr-rc.2", + "@noir-lang/noir_js": "1.0.0-beta.19", + }), + artifact_hashes: JSON.stringify({}), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: report.failure_class ?? "browser_runtime", + failure_detail: report.failure_message ?? "Barretenberg browser execution failed.", + evidence_path: evidencePath, + }); + return; + } + if (!report.samples || !report.metadata) { + throw new Error(`${fileName} is missing samples or metadata`); + } + if ( + report.samples.length !== 6 || + !report.metadata.tampered_proof_rejected || + !report.samples.some((sample) => sample.warmup) + ) { + throw new Error(`${fileName} does not satisfy the 1+5 correctness contract`); + } + const artifactPath = resolve(repoRoot, artifactRelative); + const artifactHash = await sha256(artifactPath); + const provingAssetRoot = resolve( + repoRoot, + "benchmarks/v1/barretenberg/web/dist/assets", + circuitVariant, + ); + const provingCircuitPath = resolve(provingAssetRoot, "circuit.json"); + const provingWitnessPath = resolve(provingAssetRoot, "witness.gz"); + const provingCircuit = Bun.file(provingCircuitPath); + const provingWitness = Bun.file(provingWitnessPath); + const crsSize = report.proving_payload_transport?.crs_size_bytes; + if ( + report.process_memory?.peak_rss_kib == null || + !Number.isSafeInteger(crsSize) || + crsSize! <= 0 + ) { + throw new Error(`${fileName} is missing renderer RSS or exact CRS payload size`); + } + const provingPayloadSize = provingCircuit.size + provingWitness.size + crsSize!; + const provingHashes = { + circuit_sha256: await sha256(provingCircuitPath), + witness_sha256: await sha256(provingWitnessPath), + }; + + for (const sample of report.samples) { + const canonicalIndex = sample.warmup ? 0 : sample.sample_index + 1; + records.push({ + ...base(circuit, circuitVariant, circuitCommit), + attempt_id: `mac-chrome-noir-${circuitVariant}-${sample.warmup ? "warmup" : `sample-${canonicalIndex}`}`, + recorded_at_utc: timestamp, + prover: "noir_barretenberg", + frontend: "noir", + prover_backend: "barretenberg-ultrahonk-wasm-single-thread", + witness_backend: "", + sample_kind: sample.warmup ? "warmup" : "measured", + sample_index: canonicalIndex, + status: "ok", + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: nsToMs(sample.duration_ns), + verify_time_ms: null, + total_time_ms: nsToMs(sample.duration_ns), + peak_memory_mib: report.process_memory.peak_rss_kib / 1024, + proof_size_bytes: report.metadata.proof_size_bytes, + circuit_size_bytes: provingCircuit.size, + artifact_size_bytes: provingPayloadSize, + bundle_size_bytes: provingPayloadSize, + constraint_count: null, + artifact_version: "noir-v1.0.0-beta.19-acir", + package_versions: JSON.stringify({ + "@aztec/bb.js": "4.2.0-aztecnr-rc.2", + "@noir-lang/noir_js": "1.0.0-beta.19", + }), + artifact_hashes: JSON.stringify({ + ...provingHashes, + source_artifact_sha256: artifactHash, + }), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: "", + failure_detail: "", + evidence_path: evidencePath, + }); + } +} + +async function normalizeCircom(fileName: string) { + const evidencePath = resolve(rawRoot, fileName); + if (!(await Bun.file(evidencePath).exists())) return; + if (Bun.file(evidencePath).size === 0) return; + const report = (await Bun.file(evidencePath).json()) as CircomReport; + const timestamp = recordedAt(evidencePath); + + if (report.status) { + const variant = report.workload === "webauthn" ? "webauthn_default" : `${report.workload}_all`; + records.push({ + ...base(report.workload, variant, report.workload === "webauthn" + ? "0fb5b4aa1398281c2fd3dbe14db147e05b61f201" + : "unknown"), + attempt_id: `mac-chrome-circom-${variant}-gap`, + recorded_at_utc: timestamp, + prover: "circom_groth16", + frontend: "circom", + prover_backend: "snarkjs-groth16-wasm", + witness_backend: "snarkjs-wtns-calculate-wasm", + sample_kind: "gap", + sample_index: null, + status: report.status, + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: null, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: null, + proof_size_bytes: null, + circuit_size_bytes: null, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: null, + artifact_version: "circom-2.2.2-snarkjs-zkey", + package_versions: JSON.stringify({ circom: "2.2.2", snarkjs: "0.7.6" }), + artifact_hashes: JSON.stringify({}), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: report.failure_class ?? "browser_runtime", + failure_detail: report.failure_message ?? "Circom browser execution failed.", + evidence_path: evidencePath, + }); + return; + } + if (report.process_memory?.peak_rss_kib == null) { + throw new Error(`${fileName} is missing Chrome renderer peak RSS`); + } + + for (const result of report.results ?? []) { + if ( + result.samples.length !== 6 || + !result.samples.every( + (sample) => sample.status === "ok" && sample.tampered_proof_rejected, + ) + ) { + throw new Error(`${fileName}/${result.variant} does not satisfy the 1+5 correctness contract`); + } + const fixtureRoot = resolve(repoRoot, "target/v1-benchmarks/circom-browser"); + const wasmPath = resolve(fixtureRoot, result.wasm); + const zkeyPath = resolve(fixtureRoot, result.zkey); + const inputPath = resolve(fixtureRoot, result.input); + const files = [wasmPath, zkeyPath, inputPath].map((path) => Bun.file(path)); + const hashes = Object.fromEntries( + await Promise.all( + [ + ["wasm_sha256", wasmPath], + ["zkey_sha256", zkeyPath], + ["input_sha256", inputPath], + ].map(async ([name, path]) => [name, await sha256(path)]), + ), + ); + + for (const sample of result.samples) { + const canonicalIndex = sample.warmup ? 0 : sample.sample_index + 1; + records.push({ + ...base(report.workload, result.variant, result.circuit_commit), + attempt_id: `mac-chrome-circom-${result.variant}-${sample.warmup ? "warmup" : `sample-${canonicalIndex}`}`, + recorded_at_utc: timestamp, + prover: "circom_groth16", + frontend: "circom", + prover_backend: report.backend ?? "snarkjs-groth16-wasm", + witness_backend: "snarkjs-wtns-calculate-wasm", + sample_kind: sample.warmup ? "warmup" : "measured", + sample_index: canonicalIndex, + status: "ok", + initialization_time_ms: nsToMs(sample.initialization_time_ns), + witness_time_ms: nsToMs(sample.witness_time_ns), + prover_time_ms: nsToMs(sample.prove_time_ns), + verify_time_ms: nsToMs(sample.verify_time_ns), + total_time_ms: nsToMs(sample.end_to_end_time_ns), + peak_memory_mib: + report.process_memory?.peak_rss_kib == null + ? null + : report.process_memory.peak_rss_kib / 1024, + proof_size_bytes: sample.proof_size_bytes, + circuit_size_bytes: files[0].size, + artifact_size_bytes: files[0].size + files[1].size + files[2].size, + bundle_size_bytes: files[0].size + files[1].size + files[2].size, + constraint_count: + result.variant === "world_id_protocol_query" + ? 20_966 + : result.variant === "world_id_protocol_nullifier" + ? 53_677 + : result.variant === "privacy_ethereum_webauth_circom" + ? 2_812_892 + : null, + artifact_version: "circom-2.2.2-snarkjs-zkey", + package_versions: JSON.stringify({ circom: "2.2.2", snarkjs: "0.7.6" }), + artifact_hashes: JSON.stringify(hashes), + session_id: "", + non_equivalence_note: + "Closest available counterpart only; proof statements and implementation details are not equivalent.", + failure_code: "", + failure_detail: "", + evidence_path: evidencePath, + }); + } + } +} + +await normalizeBarretenberg( + "barretenberg-webauthn.json", + "webauthn", + "webauthn_assertion", + "85aeeef539961cae5a63de794997b507a5975717", + "target/v1-benchmarks/noir/webauthn_assertion/webauthn_assertion.json", +); +await normalizeBarretenberg( + "barretenberg-oprf.json", + "oprf", + "oprf_taceo", + "808f3c795b57963dd58ef282ccd61022ef39c285", + "target/v1-benchmarks/noir/oprf_taceo/oprf_example.json", +); +await normalizeBarretenberg( + "barretenberg-passport.json", + "passport", + "passport_complete_age_check", + "13044531f0f38e02ed19fcbd9b26202b8ba5a962", + "noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json", +); +await normalizeProveKit( + "provekit-passport.json", + "passport", + "passport_complete_age_check", + "b0cd13cd7ca4aff71c1da609ddd32ae8113ac1ff", +); +await normalizeProveKit( + "provekit-webauthn.json", + "webauthn", + "webauthn_assertion", + "85aeeef539961cae5a63de794997b507a5975717", +); +await normalizeProveKit( + "provekit-oprf.json", + "oprf", + "oprf_taceo", + "fd37726215b59d3d4823ea7b1967b1da3525ed9d", +); +await normalizeCircom("circom-passport.json"); +await normalizeCircom("circom-webauthn.json"); +await normalizeCircom("circom-oprf.json"); + +const validated = validateAttempts(records, false); +await Bun.write(outputJson, `${JSON.stringify(validated, null, 2)}\n`); +await Bun.write(outputCsv, toCsv(validated)); +console.log(`Normalized ${validated.length} Mac Chrome attempts`); +console.log(outputJson); +console.log(outputCsv); diff --git a/benchmarks/v1/legacy/data/recover-ios-prebuilt-function.test.ts b/benchmarks/v1/legacy/data/recover-ios-prebuilt-function.test.ts new file mode 100644 index 000000000..927f59d1e --- /dev/null +++ b/benchmarks/v1/legacy/data/recover-ios-prebuilt-function.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, test } from "bun:test"; +import { extractBenchmarkResult } from "./recover-ios-prebuilt-function"; + +describe("extractBenchmarkResult", () => { + test("extracts identical timestamped and raw Mobench JSON", () => { + const result = { + function: "crate::bench", + samples: [1, 2, 3, 4, 5].map((duration_ns) => ({ duration_ns })), + }; + const json = JSON.stringify(result); + expect( + extractBenchmarkResult( + [`timestamp Runner[1:2] ${json}\n${json}\nordinary Xcode prose`], + "crate::bench", + ), + ).toEqual(result); + }); + + test("rejects conflicting retained results", () => { + const first = JSON.stringify({ + function: "crate::bench", + samples: [1, 2, 3, 4, 5], + }); + const second = JSON.stringify({ + function: "crate::bench", + samples: [6, 7, 8, 9, 10], + }); + expect(() => + extractBenchmarkResult([`${first}\n${second}`], "crate::bench"), + ).toThrow(/conflicting benchmark JSON/); + }); +}); diff --git a/benchmarks/v1/legacy/data/recover-ios-prebuilt-function.ts b/benchmarks/v1/legacy/data/recover-ios-prebuilt-function.ts new file mode 100644 index 000000000..9be806c88 --- /dev/null +++ b/benchmarks/v1/legacy/data/recover-ios-prebuilt-function.ts @@ -0,0 +1,97 @@ +#!/usr/bin/env bun + +import { basename, resolve } from "node:path"; + +interface BenchmarkResult { + function: string; + samples: unknown[]; + resources?: { process_peak_memory_kb?: number; peak_memory_kb?: number }; + [key: string]: unknown; +} + +export function extractBenchmarkResult( + logs: string[], + expectedFunction: string, +): BenchmarkResult { + const matches: BenchmarkResult[] = []; + for (const log of logs) { + for (const line of log.split(/\r?\n/)) { + const start = line.indexOf("{"); + if (start < 0) continue; + try { + const value = JSON.parse(line.slice(start)) as BenchmarkResult; + if ( + value.function === expectedFunction && + Array.isArray(value.samples) && + value.samples.length === 5 + ) { + matches.push(value); + } + } catch { + // Xcode instrumentation logs contain ordinary prose and truncated + // attachment lines. Only complete benchmark JSON objects are evidence. + } + } + } + if (matches.length === 0) { + throw new Error(`no five-sample benchmark JSON found for ${expectedFunction}`); + } + const canonical = JSON.stringify(matches[0]); + if (matches.some((match) => JSON.stringify(match) !== canonical)) { + throw new Error(`conflicting benchmark JSON found for ${expectedFunction}`); + } + return matches[0]!; +} + +if (import.meta.main) { + const [ + artifactRootArg, + manifestPath, + expectedFunction, + outputPath, + device = "iPhone SE 2022-15", + ] = process.argv.slice(2); + if (!artifactRootArg || !manifestPath || !expectedFunction || !outputPath) { + console.error( + "usage: bun recover-ios-prebuilt-function.ts [device]", + ); + process.exit(2); + } + const artifactRoot = resolve(artifactRootArg); + const manifest = (await Bun.file(manifestPath).json()) as { + entries: Array<{ function: string; iterations: number; warmup: number }>; + }; + const entry = manifest.entries.find( + (candidate) => candidate.function === expectedFunction, + ); + if (!entry || entry.iterations !== 5 || entry.warmup !== 1) { + throw new Error(`${expectedFunction}: missing or invalid prebuilt manifest entry`); + } + const glob = new Bun.Glob("**/*instrumentation_log.log"); + const logPaths = Array.from(glob.scanSync({ cwd: artifactRoot, absolute: true })); + const logs = await Promise.all(logPaths.map((path) => Bun.file(path).text())); + const result = extractBenchmarkResult(logs, expectedFunction); + const peakKb = + result.resources?.process_peak_memory_kb ?? + result.resources?.peak_memory_kb; + const summary = { + schema: "provekit.recovered-ios-prebuilt-function.v1", + evidence_root: artifactRoot, + functions: { + [expectedFunction]: { + spec: { iterations: entry.iterations, warmup: entry.warmup }, + remote_run: { build_id: basename(artifactRoot) }, + benchmark_results: { [device]: [result] }, + performance_metrics: { + [device]: { + memory: { + peak_mb: typeof peakKb === "number" ? peakKb / 1024 : null, + }, + }, + }, + }, + }, + }; + await Bun.write(outputPath, `${JSON.stringify(summary, null, 2)}\n`); + console.log(`recovered ${expectedFunction} to ${outputPath}`); +} diff --git a/benchmarks/v1/legacy/examples/bundle-files.example.tsv b/benchmarks/v1/legacy/examples/bundle-files.example.tsv new file mode 100644 index 000000000..4ebcda1bd --- /dev/null +++ b/benchmarks/v1/legacy/examples/bundle-files.example.tsv @@ -0,0 +1,3 @@ +# scope kind path +cold-download runtime benchmarks/v1/README.md +incremental circuit benchmarks/v1/benchmark-contract.json diff --git a/benchmarks/v1/legacy/manifests/provekit-wasm-workloads.tsv b/benchmarks/v1/legacy/manifests/provekit-wasm-workloads.tsv new file mode 100644 index 000000000..ad14fd651 --- /dev/null +++ b/benchmarks/v1/legacy/manifests/provekit-wasm-workloads.tsv @@ -0,0 +1,16 @@ +# scope kind path mime_type +shared-runtime html benchmarks/v1/wasm/dist/index.html text/html; charset=utf-8 +shared-runtime runner-js benchmarks/v1/wasm/dist/runner.js text/javascript; charset=utf-8 +shared-runtime worker-js benchmarks/v1/wasm/dist/worker.js text/javascript; charset=utf-8 +shared-runtime provekit-wasm benchmarks/v1/wasm/dist/provekit_wasm_bg.wasm application/wasm +shared-runtime acvm-wasm benchmarks/v1/wasm/dist/acvm_js_bg.wasm application/wasm +shared-runtime noirc-abi-wasm benchmarks/v1/wasm/dist/noirc_abi_wasm_bg.wasm application/wasm +webauthn_assertion inputs benchmarks/v1/wasm/dist/assets/webauthn_assertion/inputs.json application/json; charset=utf-8 +webauthn_assertion provekit-pkp benchmarks/v1/wasm/dist/assets/webauthn_assertion/webauthn_assertion.pkp application/octet-stream +webauthn_assertion provekit-pkv benchmarks/v1/wasm/dist/assets/webauthn_assertion/webauthn_assertion.pkv application/octet-stream +passport_complete_age_check inputs benchmarks/v1/wasm/dist/assets/passport_complete_age_check/inputs.json application/json; charset=utf-8 +passport_complete_age_check provekit-pkp benchmarks/v1/wasm/dist/assets/passport_complete_age_check/passport_complete_age_check.pkp application/octet-stream +passport_complete_age_check provekit-pkv benchmarks/v1/wasm/dist/assets/passport_complete_age_check/passport_complete_age_check.pkv application/octet-stream +oprf_taceo inputs benchmarks/v1/wasm/dist/assets/oprf_taceo/inputs.json application/json; charset=utf-8 +oprf_taceo provekit-pkp benchmarks/v1/wasm/dist/assets/oprf_taceo/oprf_taceo.pkp application/octet-stream +oprf_taceo provekit-pkv benchmarks/v1/wasm/dist/assets/oprf_taceo/oprf_taceo.pkv application/octet-stream diff --git a/benchmarks/v1/legacy/manifests/webauthn-provekit-native.tsv b/benchmarks/v1/legacy/manifests/webauthn-provekit-native.tsv new file mode 100644 index 000000000..5407e5972 --- /dev/null +++ b/benchmarks/v1/legacy/manifests/webauthn-provekit-native.tsv @@ -0,0 +1,4 @@ +# scope kind path +prover-download provekit-pkp target/v1-benchmarks/artifacts/webauthn_assertion/webauthn_assertion.pkp +verifier-download provekit-pkv target/v1-benchmarks/artifacts/webauthn_assertion/webauthn_assertion.pkv +result provekit-proof target/v1-benchmarks/artifacts/webauthn_assertion/webauthn_assertion.np diff --git a/benchmarks/v1/legacy/retired-docs/MOBILE_BENCH_WASM_ASSESSMENT.md b/benchmarks/v1/legacy/retired-docs/MOBILE_BENCH_WASM_ASSESSMENT.md new file mode 100644 index 000000000..e89693516 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/MOBILE_BENCH_WASM_ASSESSMENT.md @@ -0,0 +1,61 @@ +# Historical browser/WASM design assessment + +This is an implementation-era design note, retained for context. It is not the +publication methodology. The campaign's browser results and measurement rules +are documented in [`REPRODUCIBILITY.md`](REPRODUCIBILITY.md). + +## Assessment + +This is a medium-sized addition, not a new `mobench-sdk` timing backend. +`mobile-bench-rs` currently builds native Android/iOS applications, uploads +them to BrowserStack App Automate, and retrieves native-runner results. Mobile +Safari and Chrome instead require BrowserStack Automate/WebDriver, a static web +bundle, and either BrowserStack Local or an immutable HTTPS deployment. + +The existing project can still provide the trusted-CI and reporting layers: + +- immutable prebuilt manifest verification; +- function/device shard accounting; +- `summary.json`, `summary.md`, and `results.csv`; +- split-run merge and PR reporting; and +- credential isolation between untrusted preparation and trusted execution. + +The native process-memory and profiling code cannot be reused for browsers. +Browser results must label JavaScript heap, WASM linear memory, provider +telemetry, and unavailable values separately. + +## Recommended implementation + +1. Add a `web-prebuilt` artifact kind containing an entry page, static manifest, + benchmark ABI/schema version, and supported execution modes. +2. Add an Automate/WebDriver provider beside the existing App Automate client, + not inside the native Android/iOS runners. +3. Treat `ios-safari`, `android-chrome`, and `macos-browser` as browser + environments, while preserving the physical device/OS resolved by + BrowserStack. +4. Poll the page's stable result protocol and normalize its samples into the + existing report layer. +5. Require COOP/COEP headers for threaded builds and maintain a single-thread + build for Safari and other environments without shared-memory support. +6. Keep BrowserStack Local lifecycle and immutable HTTPS hosting as explicit, + interchangeable transports. + +The runner in `benchmarks/v1/wasm/` is a working spike for steps 1-4: it uses a +Worker, exposes `window.__MOBENCH_STATE__`, verifies the static manifest before +opening WebDriver, and emits a schema-versioned result. + +## Effort and risk + +- ProveKit-only working lane: roughly 2-4 engineering days after credentials + and a supported device/OS pair are available. +- Generalized, reviewed `mobile-bench-rs` feature: roughly 1-2 weeks, including + provider abstractions, trusted prebuilt schema changes, tests, docs, and one + Android plus one iOS service-gated run. +- Main risks: Safari memory termination without an exact peak-memory API, + BrowserStack device catalog drift, Local tunnel reliability, large bundle + transfer time, threaded-WASM header requirements, and accidentally merging + native and browser results into one comparison row. + +The smallest safe upstream change is therefore to reuse Mobench's immutable +prebuilt/reporting contract while keeping browser execution as a separate +provider and platform family. diff --git a/benchmarks/v1/legacy/retired-docs/MULTITHREADED_WASM.md b/benchmarks/v1/legacy/retired-docs/MULTITHREADED_WASM.md new file mode 100644 index 000000000..ea5ff7260 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/MULTITHREADED_WASM.md @@ -0,0 +1,87 @@ +# Multithreaded Mac WASM campaign + +The original `input-to-proof-samples.csv` Mac rows are a single-thread baseline. +The earlier `wasm-multithread-samples.csv` export used ProveKit's automatic +eight-worker pool and a four-worker resource cap for Circom WebAuthn. The +fixed-thread campaign described below is a separate rerun with exactly 16 +requested workers for ProveKit and SnarkJS, including WebAuthn. + +| Stack | Witness generation | Proving | +| --- | --- | --- | +| ProveKit V1 | `noir_js@1.0.0-beta.11` (single) | V1 `provekit-wasm` + `wasm-bindgen-rayon` (16 workers) | +| Noir + Barretenberg | `noir_js@1.0.0-beta.19` (single) | `bb.js@4.2.0-aztecnr-rc.2` `WasmWorker` | +| Circom + Groth16 | `circom_runtime` WASM (single) | `snarkjs@0.7.6` Groth16 workers (16 workers) | + +All rows are input-to-serialized-proof measurements. Each warm series has one +warmup and five measured samples. Each cold series uses six fresh Chrome +profiles, with the first attempt retained as the warmup. Proof verification +and tampered-proof rejection remain correctness gates and are not silently +substituted with timings from the single-thread baseline. + +## Threading boundary + +`SharedArrayBuffer` and `crossOriginIsolated` are required. The local benchmark +servers send `Cross-Origin-Opener-Policy: same-origin` and +`Cross-Origin-Embedder-Policy: require-corp`. Reports record the browser's +`navigator.hardwareConcurrency`, requested thread policy, worker backend, and +the witness/prover split. This fixed-thread campaign requests exactly 16 +workers for ProveKit and SnarkJS; the raw reports record the effective count +and any browser/runtime failure. `noir_js` and stock Circom witness calculation +do not become multithreaded merely because the prover does; the combined number +is therefore an end-to-end measurement with single-thread witness generation +plus multithreaded proving. Barretenberg remains at its existing 32-requested, +16-effective configuration. + +ProveKit V1 is built from the pinned V1 core commit and its local WASM package, +not from the current `@worldcoin/provekit` npm package. The npm package has a +threaded API, but its current beta.20/PKP-2 artifacts are incompatible with the +V1 beta.11/PKP-1 artifacts used here. + +## Run + +From the repository root: + +```bash +# Build the three browser fixtures with their worker assets. +bash benchmarks/v1/barretenberg/web/build.sh +bash benchmarks/v1/circom/web/build.sh +INPUT_TO_PROOF_EXECUTION_POLICY=multithread \ + bash benchmarks/v1/wasm/scripts/build.sh + +# First run one smoke per stack/profile (one warmup + one sample). +INPUT_TO_PROOF_EXECUTION_POLICY=multithread \ + MOBENCH_WASM_THREADS=16 MOBENCH_SNARKJS_THREADS=16 \ + INPUT_TO_PROOF_SERIES=passport_p1__mac_chrome__provekit_v1__warm_reuse \ + bun benchmarks/v1/scripts/run-mac-input-to-proof.ts + +# Full 4-profile x 3-stack x cold/warm fixed-16 campaign. +INPUT_TO_PROOF_EXECUTION_POLICY=multithread \ + MOBENCH_WASM_THREADS=16 MOBENCH_SNARKJS_THREADS=16 \ + INPUT_TO_PROOF_CAMPAIGN_ID=input-to-proof-v1-mac-multithread-16-20260812 \ + INPUT_TO_PROOF_OUTPUT_ROOT=target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16 \ + bun benchmarks/v1/scripts/run-mac-input-to-proof.ts + +# Export a separate fixed-16 CSV; neither historical CSV is overwritten. +INPUT_TO_PROOF_EXECUTION_POLICY=multithread \ + INPUT_TO_PROOF_CAMPAIGN_ID=input-to-proof-v1-mac-multithread-16-20260812 \ + INPUT_TO_PROOF_RAW_ROOT=target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16 \ + INPUT_TO_PROOF_OUTPUT_CSV=benchmarks/v1/input-to-proof-data/wasm-multithread-16-samples.csv \ + bun benchmarks/v1/input-to-proof-data/export.ts + +# Replace only the Mac rows in the full CSV; retain the exact iPhone/E15 rows +# and their original campaign provenance. +bun benchmarks/v1/input-to-proof-data/merge-mac-fixed16.ts +``` + +The fixed-16 raw reports are written under +`target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/`. The exported +CSV uses the same sample-level schema as the canonical dataset and records the +execution policy in `artifact_version`, `package_versions`, and +`non_equivalence_note`; its raw report metadata is the authoritative source for +the effective worker configuration. This run has 22 complete series (132 +sample rows) and two explicit Circom WebAuthn gap rows: the 16-worker cold +renderer stalled under memory pressure, so warm reuse was not started. The +earlier four-worker WebAuthn result is retained only in the automatic-thread +diagnostic dataset. The merge command above makes this fixed-16 Mac result the +Mac portion of `input-to-proof-samples.csv` while leaving mobile evidence +unchanged. diff --git a/benchmarks/v1/legacy/retired-docs/README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/README-before-cleanup.md new file mode 100644 index 000000000..19266ea26 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/README-before-cleanup.md @@ -0,0 +1,183 @@ +# ProveKit V1 cross-device benchmark campaign + +The canonical Mac browser rows in `input-to-proof-data/input-to-proof-samples.csv` +now use the fixed-16-worker Chrome rerun. The historical single-thread and +earlier automatic-thread exports remain separate under +`input-to-proof-data/` and must not be mixed into the fixed-16 comparison. + +This directory defines the ProveKit V1 cross-device campaign. The canonical +publication dataset is the raw-input-to-proof export: four workloads × three +proof stacks × three targets × two timing modes, or 72 logical series. Its +current freeze has 417 rows: 414 valid attempts across 69 complete series and +three structured runtime gaps (two fixed-16 Mac Circom/WebAuthn gaps and one +E15 Circom/WebAuthn gap). The primary Mac surface is browser/WASM in Google +Chrome; Mac-native runs are smoke or diagnostic evidence only. + +Read [`REPRODUCIBILITY.md`](REPRODUCIBILITY.md) before running anything. +Machine-readable policy lives in +[`benchmark-contract.json`](benchmark-contract.json), external source commits +in [`sources.lock.json`](sources.lock.json), and compiler/package versions in +[`toolchains.lock.json`](toolchains.lock.json). + +## Publication matrix + +| Stack | iPhone SE 2022 | Motorola E15 | M4 Max Chrome | +| --- | --- | --- | --- | +| ProveKit V1 | native C ABI/Mobench | native C ABI/Mobench | pinned V1 `tooling/provekit-wasm` (single-thread baseline and threaded rerun) | +| Noir + Barretenberg | Mopro native | Mopro native, subject to ABI support | `noir_js` + smoke-validated `bb.js` | +| Circom + Groth16 | Mopro native | Mopro native | `snarkjs@0.7.6` | + +The canonical sample-level file is +[`input-to-proof-data/input-to-proof-samples.csv`](input-to-proof-data/input-to-proof-samples.csv). +It contains one warmup and five measured attempts for every successful timing +series, with raw input, witness generation, and serialized proof generation in +the headline boundary. The three explicit gaps have blank metrics and retained +failure evidence; no other target's value is substituted. + +The earlier 27-cell proof-only export, the exploratory compound export, and +the TACEO production-backend candidate are retained under +[`legacy/`](legacy/README.md). They are useful historical/diagnostic evidence, +but none is a publication replacement for the canonical input-to-proof CSV. + +## Input-to-proof campaign + +The headline metric for the new campaign is raw input to serialized proof. It +includes fresh witness generation and proving, and excludes proof verification +and tamper rejection. The latter remain mandatory correctness gates. + +The fourth workload is the exact Passport P1 pair: + +- Noir: [`noir/passport_p1/src/main.nr`](noir/passport_p1/src/main.nr) +- Circom: [`circom/passport_p1/passport_p1.circom`](circom/passport_p1/passport_p1.circom) + +`cold_local` uses a fresh process and proof runtime per attempt with locked +assets already local. `warm_reuse` reuses the initialized runtime, but still +regenerates the witness and proof for every attempt. The schema and exporter +live in [`input-to-proof-data/`](input-to-proof-data/); they preserve the old +CSV column order and append `timing_mode` and `input_to_proof_time_ms`. + +On Mac, ProveKit uses the immutable V1 core commit +`9b2a6f37c67691eab4b0cec6c35e35c520e93285`; Barretenberg runs Noir execution +followed by proof generation; Circom runs `wtns.calculate` followed by Groth16 +proof generation. Frozen witness files are correctness fixtures only and are +not accepted as input-to-proof measurements. + +The original Mac input-to-proof campaign is complete at 24 series / 144 rows, +including Passport P1 for all three stacks in both cold and warm modes. Native +iPhone execution uses one 1+5 warm session per function. Its cold session +relaunches the app six times, retaining downloaded hash-verified assets but +creating a fresh process and proof runtime for every attempt; launch zero is +the warmup and launches one through five are measured samples. The exact native export contract is in +[`input-to-proof-data/README.md`](input-to-proof-data/README.md). +The separate Marimo analysis is +[`analysis/input_to_proof_analysis.py`](analysis/input_to_proof_analysis.py); +it reads only the canonical input-to-proof CSV and keeps every figure in its +own cell. + +The earlier automatic-thread Mac-only rerun is exported separately as +[`input-to-proof-data/wasm-multithread-samples.csv`](input-to-proof-data/wasm-multithread-samples.csv). +It has the same 41-column sample schema and 144 rows, but must not be merged +with the single-thread CSV. A fixed-16 rerun is exported separately as +[`input-to-proof-data/wasm-multithread-16-samples.csv`](input-to-proof-data/wasm-multithread-16-samples.csv). +That campaign requests exactly 16 workers from ProveKit and SnarkJS for every +profile, including WebAuthn; Barretenberg remains 32 requested/16 effective. +Its export contains 134 rows: 132 valid samples plus explicit cold and warm +Circom WebAuthn gap rows after the 16-worker renderer stalled under memory +pressure. The earlier four-worker WebAuthn timing is not copied into this CSV. +The fixed-16 Mac rows are merged into the canonical full CSV with +`bun benchmarks/v1/input-to-proof-data/merge-mac-fixed16.ts`; iPhone and E15 +rows retain their original evidence and campaign identifiers. The resulting +full CSV has 417 rows: 414 successful samples and three explicit gap rows. + +The native Circom decision is recorded per row. Mopro is the mobile integration +layer; the iPhone uses Rapidsnark, while the 32-bit E15 uses the qualified +Arkworks or Rapidsnark path appropriate to the workload. The selected prover +and witness backend are explicit in the CSV. `iden3/circom-witnesscalc@0.3.0` +remains a compatibility fallback, not a publication backend. + +The E15 input-to-proof freeze has 23 successful logical series. The final +WebAuthn/Circom cold series is retained as a structured `runtime_failed` gap +with failure code `out_of_memory`: Rapidsnark could not map the 1.73 GB zkey +and WTNS in the device's 32-bit address space. Its null metrics and hashed +evidence are recorded in +[`input-to-proof-data/e15-webauthn-cold-gap.json`](input-to-proof-data/e15-webauthn-cold-gap.json); +no other device's value is substituted. + +For the iPhone OPRF input-to-proof lane, `wasmi@0.46.0` interprets the exact +Circom witness Wasm and Rapidsnark proves the resulting WTNS. This replaces the +layout-sensitive Rust-Witness AOT artifact that crashed on iOS; the interpreted +witness was qualified byte-for-byte against the frozen SnarkJS WTNS. Other +native iPhone Circom lanes retain their locked Rust-Witness generators. + +### Publication snapshot + +- **72 logical timing series** are expected; **69** completed with one warmup + and five measured attempts, while two fixed-16 Mac Circom/WebAuthn series and + one E15 Circom/WebAuthn series are explicit gaps. +- **417 CSV records:** 345 measured rows, 69 attested warmups, and three gap rows. +- The four publication metrics are input-to-proof time, deduplicated proving + payload, serialized proof bytes, and peak benchmark-process RSS. +- The canonical export contains no estimated metrics. Historical estimates + and proof-only boundaries remain labeled in `legacy/` and must not be mixed + into the input-to-proof charts. + +## These are counterparts, not identical circuits + +The campaign compares the closest practical implementation of a workload. +Results must include the circuit name and may not be presented as a pure +proof-system ranking. + +- Passport: Noir `complete_age_check` is monolithic. Self Circom uses a + signature-specific registration circuit plus `vc_and_disclose`. +- WebAuthn: the Noir ES256 assertion binds the challenge, ceremony type, + origin, RP-ID hash, UP/UV flags, signature, and public key. + `privacy-ethereum/webauth-circom` is the closest Circom counterpart but does + not bind the complete same statement. This corrects the older claim that no + usable Circom WebAuthn counterpart existed. +- OPRF: TACEO `oprf-nr` is a core Noir example. World ID Protocol provides + application query and nullifier Circom circuits. Report those circuits under + separate names. + +## Sampling and correctness + +Every runnable cell performs one warmup followed by five sequential measured +samples. Before timing, the lane must accept a valid proof, reject a tampered +proof, and retain its public outputs and workload identity. + +Native and browser results are separate runtime categories. Missing metrics +are blank, not zero. Use `unsupported`, `build_failed`, `crashed`, +`timed_out`, or `zero_samples` with a structured failure message. Raw logs may +contain operational evidence, but exports must remain secret-free. + +## Entry point + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage all \ + --campaign provekit-v1-cross-device --dry-run +``` + +Supported stages are `bootstrap`, `prepare`, `smoke`, `measure`, `export`, and +`all`. Always run the dry plan first. BrowserStack credentials remain external, +and paid sessions require the runner's explicit confirmation flag. + +Generated sources, bundles, raw results, and logs live under +`target/v1-benchmarks/`; they are not source-controlled. A preparation freezes +one content-addressed campaign manifest. ProveKit preparation may be +nondeterministic, so all targets must reuse the frozen bundle rather than +expecting an independently prepared bundle to have identical bytes. + +Historical files and measurements elsewhere in this directory are diagnostic +inputs only. They enter this campaign only when their source commit, package +versions, circuit identity, device/runtime identity, bundle hashes, and 1+5 +sampling contract match exactly. The input-to-proof exporter verifies the +committed evidence hashes and regenerates the canonical CSV idempotently: + +```bash +bun benchmarks/v1/input-to-proof-data/export.ts +bun test benchmarks/v1/input-to-proof-data/export.test.ts +``` + +The proof-only and TACEO exporters remain runnable as historical diagnostics; +their outputs are written under `legacy/` and never overwrite the canonical +file. See [`legacy/README.md`](legacy/README.md) for the exact provenance and +the reason the campaign was rerun. diff --git a/benchmarks/v1/legacy/retired-docs/REPRODUCIBILITY-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/REPRODUCIBILITY-before-cleanup.md new file mode 100644 index 000000000..0c47001e9 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/REPRODUCIBILITY-before-cleanup.md @@ -0,0 +1,684 @@ +# Reproducing the ProveKit V1 cross-device campaign + +This is the canonical guide for the input-to-proof publication campaign. It +covers four workloads (historical Passport, Passport P1, WebAuthn, OPRF), three stacks (ProveKit V1, +Noir/Barretenberg, Circom/Groth16), three targets (BrowserStack iPhone SE 2022 +native, physical Motorola E15 native, and Chrome/WASM on an M4 Max MacBook), +and separate cold and warm timing modes. It therefore has 72 logical series +and would contain 432 sample rows if every series completed. The current +canonical freeze contains 414 valid attempt rows across 69 complete series, +plus two fixed-16 Mac Circom/WebAuthn gaps and one E15 Circom/WebAuthn gap, for +417 CSV rows total. + +For input-to-proof rows, the measured boundary begins with raw structured +circuit inputs and ends when serialized proof bytes exist. Witness generation +and proof generation are both inside the boundary. Verification and tamper +rejection are required after every proof but excluded from the headline. +`cold_local` launches a fresh process/runtime per attempt; `warm_reuse` reuses +the runtime while regenerating witness and proof each time. + +On native ProveKit, `Prover::prove(input_map)` performs witness construction +and proving as one integrated operation. The campaign records that exact value +as `input_to_proof_time_ms` (and retains it in `prover_time_ms` for schema +compatibility) without inventing a witness split. Native Barretenberg and +Rapidsnark record their directly observed witness and proving phases +separately. In all cases, the headline is the outer +raw-input-to-serialized-proof duration. + +This campaign does **not** drop Mopro or Arkworks. Mopro is the native +integration layer. Rapidsnark is preferred on supported arm64 targets; +Arkworks plus `rust-witness` is the explicit target-specific fallback when the +E15 userspace cannot support Rapidsnark. + +## 1. Immutable inputs + +The following files are part of the campaign identity: + +- `benchmark-contract.json`: workloads, targets, gates, fields, and failure + semantics. +- `sources.lock.json`: immutable upstream Git revisions for Self, World ID + Protocol, TACEO OPRF, `privacy-ethereum/webauth-circom`, Mopro, and native + adapters. +- `toolchains.lock.json`: exact compiler, SDK, crate, npm, and WASM adapter + versions. +- the repository commit recorded in the frozen campaign manifest; +- Bun/Cargo lockfiles and hashes of every prepared circuit/proving bundle. + +Locked highlights: + +| Component | Fixed identity | +| --- | --- | +| Mopro | `0.3.7`, commit `10871f02e365c478cb4b61016e4034f7e74f076b` | +| Mobench SDK in frozen device artifacts | `0.1.48` plus PR #45 commit `e992596a786cc18047102a318d40131c953e57b8` | +| Mobench orchestration CLI | `0.1.48` plus PR #45 commit `e992596a786cc18047102a318d40131c953e57b8` | +| Android JDK | Temurin `21.0.11+10.0.LTS` via Mise | +| Android SDK/NDK | platform `android-34`; NDK `26.1.10909125` | +| Native Noir | `nargo 1.0.0-beta.19` | +| Native Barretenberg | `barretenberg-rs 4.2.0-aztecnr-rc.2` | +| Browser ProveKit | pinned V1 `tooling/provekit-wasm` at `9b2a6f37`; historical single-thread baseline, prior automatic-thread rerun, and separate fixed-16 Rayon WASM campaign | +| Browser Circom | `snarkjs@0.7.6` | +| Rapidsnark witness adapter | `witnesscalc-adapter@0.1.7` | +| Rapidsnark prover | `rust-rapidsnark@0.1.4` | +| Witness compatibility fallback | `iden3/circom-witnesscalc@0.3.0` | + +Mobench is pinned to the immutable commit behind +`codex/android-32bit-native-abi`, not to the published `0.1.48` crate alone. +That patch maps Rust `usize` values to JNA's native `size_t` width and prevents +the generated runner from corrupting the C ABI on the E15's 32-bit userspace. + +The browser Noir candidate is `@noir-lang/noir_js@1.0.0-beta.19` with +`@aztec/bb.js@4.2.0-aztecnr-rc.2`, matching Mopro's native Barretenberg line. +It is not measurement-ready merely because it installs: +all three browser circuits must first pass proof verification and tamper +rejection. If a different `bb.js` is required, update its exact version and +integrity in `toolchains.lock.json`, regenerate the Bun lockfile, and create a +new campaign manifest before collecting samples. + +`@worldcoin/provekit@0.1.0` is retained as a compatibility/reference package, +but it is not used for the V1 publication measurements. The measured browser +lane builds `tooling/provekit-wasm` from the immutable V1 core commit and the +frozen beta.11 inputs. The historical baseline was single-threaded; the current +canonical Mac rows use the separately recorded fixed-16 threaded build. This +distinction prevents a current npm SDK artifact from being reported as a +V1-branch result. + +For the fixed-thread Mac comparison, run the browser campaign with +`MOBENCH_WASM_THREADS=16 MOBENCH_SNARKJS_THREADS=16`. ProveKit's runtime report +must show `wasm_thread_count=16`, and every Circom report must show +`prover_threads_requested=16` and `prover_threads_effective=16`. The resulting +CSV is retained as a separate raw comparison dataset and is also merged into +the Mac portion of the canonical full CSV by +`input-to-proof-data/merge-mac-fixed16.ts`. The historical single-thread and +automatic-thread exports remain available and are not overwritten. + +## 2. Circuit identity and non-equivalence + +These workloads are the closest counterparts available. They are neither +one-to-one nor apples-to-apples. + +### Passport + +- Historical Noir: `complete_age_check`, a monolithic passport age-check + proof. +- Historical Circom: Self signature-specific registration followed by + `vc_and_disclose`, a two-proof product flow. +- Passport P1 Noir: `benchmarks/v1/noir/passport_p1/src/main.nr`. +- Passport P1 Circom: `benchmarks/v1/circom/passport_p1/passport_p1.circom`. + This additional pair is the exact P1-matched monolithic RSA-4096 profile and + is reported separately from the historical Passport workload. + +Report registration and disclosure identities and phase timings. Their sum is +the historical product flow, not one equivalent circuit. Do not merge it with +the exact P1 pair. + +### WebAuthn + +- Noir: an ES256 assertion which binds signature/public key, challenge, + `clientDataJSON.type`, expected origin, RP-ID hash, required UP/UV flags, and + the configured assertion inputs. +- Circom: pinned `privacy-ethereum/webauth-circom`, the closest practical + ES256 counterpart. It does not bind the complete same statement. + +The older “no Circom WebAuthn circuit” claim is stale. The correct posture is +to run the pinned counterpart, inventory its public/private signals in the +frozen manifest, and label the semantic omissions. Do not claim equivalence. + +### OPRF + +- Noir: the World-ID-aligned O2 nullifier implementation, including issuer + schema, minimum issuance time, identity commitment, nonce, signal hash, and + the same public nullifier statement. +- Circom: the World ID Protocol nullifier application circuit. + +The older TACEO core example remains historical evidence only. It must not be +substituted into an O2 input-to-proof row. + +## 3. Target identity + +Capture identity before preparation or measurement: + +```bash +# Mac +sw_vers +uname -m +system_profiler SPHardwareDataType +"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --version + +# Physical Motorola E15 +adb shell getprop ro.product.manufacturer +adb shell getprop ro.product.model +adb shell getprop ro.build.version.release +adb shell getprop ro.build.version.sdk +adb shell getprop ro.product.cpu.abilist +adb shell getconf LONG_BIT +``` + +Prepare and run the ProveKit diagnostic lane with the locked 32-bit Mobench +bridge: + +```bash +benchmarks/v1/scripts/build-e15-provekit-diagnostic.sh +benchmarks/v1/scripts/run-e15-provekit.ts \ + --campaign provekit-v1-cross-device \ + --output target/v1-benchmarks/reproduction/provekit-v1-cross-device/e15 \ + --warmup 1 --samples 5 --sequential +``` + +The runner requires exactly one authorized ADB device, installs the signed APK, +runs Passport, WebAuthn, and OPRF sequentially, retains per-workload logcat, +and reconstructs Mobench's chunked JSON. The normalizer emits one blank-timing +attested warmup plus five measured rows for each success, or one structured gap +row carrying the actual native panic or timeout. + +For BrowserStack, resolve the current `iPhone SE 2022` catalog entry before +dispatch and retain the resolved OS/device identifier, session ID, build ID, +app URL/ID, and result URL. Credentials, authorization headers, and signed URLs +must not enter logs or exports. + +The three runtime categories are: + +- `native-ios`; +- `native-android`; +- `browser-wasm-chrome`. + +Mac-native output is smoke/diagnostic evidence and is not a fourth publication +target. Browser results cannot be inserted into native rows. + +## 4. Bootstrap + +Requirements are Git, `jq`, Bun, Rust/Cargo, Xcode, the Android SDK/NDK/JDK, +ADB, Google Chrome, and enough disk space for Groth16 keys and frozen bundles. + +Android builds source `scripts/android-env.sh`. OpenJDK 26 is rejected because +the campaign's Kotlin/Android Gradle toolchain cannot parse that version and +release lint fails. `bootstrap-android-java.sh` installs the locked Temurin 21 +runtime through Mise; SDK platform 34 and NDK 26.1.10909125 are verified before +an Android build starts. + +Inspect the complete non-secret command plan first: + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage all \ + --campaign provekit-v1-cross-device --dry-run +``` + +Then bootstrap: + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage bootstrap \ + --campaign provekit-v1-cross-device +``` + +Bootstrap must: + +1. parse all JSON locks; +2. reject a source checkout whose `HEAD` differs from `sources.lock.json`; +3. install exact versions only and verify package/archive integrity; +4. preserve Bun and Cargo lockfiles; +5. record tool version output in the campaign log. + +Sources and tools belong under `target/v1-benchmarks/`. A second bootstrap is +idempotent and must reject drift rather than reset a user's checkout. + +## 5. Prepare and freeze bundles + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage prepare \ + --campaign provekit-v1-cross-device +``` + +Preparation compiles every selected circuit, creates its witness/proving +artifacts, and writes a frozen manifest containing: + +- repository and circuit source commits; +- tool/package versions and lockfile hashes; +- circuit, bytecode/R1CS, witness generator, proving key, verification key, + runtime, and bundle SHA-256 values; +- circuit size and constraint count; +- workload/circuit semantic identity and public-output schema; +- target/backend compatibility decisions. + +ProveKit preparation may be nondeterministic. Prepare one PKP/PKV pair per +workload, hash it, freeze it in the campaign manifest, and reuse that exact +pair on all three targets. Independently prepared pairs define different +campaigns even when both verify. + +For Groth16, the final `.zkey` and verification key are campaign artifacts. +The PTAU is preparation-only and is not shipped or counted in the runtime +bundle. A reference WTNS used by a proof-only harness is also not circuit +download size. + +Run preparation twice as a determinism audit. Deterministic artifacts must +match. An intentionally nondeterministic ProveKit pair is accepted only by +reusing the first frozen manifest; the second pair is diagnostic and must not +replace or mix with it. + +## 6. Backend gates + +### ProveKit V1 + +Native iOS and Android use the ProveKit C ABI through Mobench. Chrome uses the +pinned single-thread V1 `tooling/provekit-wasm` build. ProveKit must deliver all nine +workload/target cells; an incomplete ProveKit matrix is not publication-ready. + +The publication iPhone ProveKit prebuilt contains one isolated proof-only +function per workload. Each setup performs the valid-proof/tamper gate outside +timing, and each proof records an internal prover duration plus exact serialized +`.np` bytes. The Mobench wrapper duration is retained separately and must never +be substituted for the internal prover duration. + +ProveKit beta.11 circuit artifacts and their matching inputs are frozen as one +unit under `target/v1-benchmarks/provekit-beta11-artifacts`. In particular, +`complete_age_check.json` must be paired with +`complete_age_check.Prover.toml` from the same detached beta.11 source +revision. The six-overflow-bit beta.19 Passport input is incompatible with +that beta.11 artifact and must never overwrite or feed the ProveKit lane. + +### Noir + Barretenberg + +Native uses Mopro 0.3.7, Noir beta.19, and +`barretenberg-rs 4.2.0-aztecnr-rc.2`. Port existing circuits to beta.19 only +when changes are mechanical and public/semantic outputs remain identical. + +The native WebAuthn and TACEO OPRF adapters consume frozen beta.19 +`WitnessStack` files produced by pinned Nargo. They pass the solved witness +directly to Barretenberg; witness generation is outside the timed boundary and +`witness_time_ms` therefore remains blank. Their combined benchmark is named +`proof_verify`, not `e2e`. Both host canaries verify a valid proof and reject a +one-bit mutation before measurement. + +The shared local CRS is the first 134,217,792 bytes (2,097,153 points) of +`https://crs.aztec.network/g1.dat`, SHA-256 +`ea6069e3563ad79f186d1c0088499309cbdaeb54254346760ffec7fe15ae49cd`. +`prepare-noir-beta19-srs.sh` refuses an existing file with a different size or +hash. The publication arm64 iOS prebuilt records one one-warmup/five-sample +proof-only function per workload; correctness and tamper rejection run in its +setup. + +The publication Passport fixture uses Barrett parameters generated for the +pinned beta.19 `noir-bignum` revision. Earlier four-overflow-bit inputs are +kept only as beta.11 ProveKit recovery evidence; they must never be reused for +the beta.19 Barretenberg lane. + +Chrome and the E15 use the frozen version pair after proof-and-tamper smoke +validation. The campaign includes an armv7 Barretenberg build and records the +exact backend/ABI in every E15 row; Mac or browser results are never substituted +for Android measurements. + +The default ProveKit Passport lane may exceed the E15's usable memory and be +killed by Android's low-memory killer. After retaining that failed attempt, +the runner may use +`bench_passport_complete_age_check_e2e_single_thread` as a constrained native +fallback. Its Rayon pool is created during warmup and reused for the five +measured samples. Export it under the distinct +`passport_complete_age_check_single_thread` variant with +`rayon_threads: 1`; never present it as the same execution policy as the +unconstrained iPhone or browser lane. + +The committed E15 V1 evidence records the actual `armeabi-v7a`/`zygote32` +identity and uses the constrained single-thread Passport fallback where +required. It completed the valid-proof/tamper gates and one warmup plus five +sequential samples for all three workloads. The resulting medians are +71,595.260 ms (Passport), 27,839.158 ms (WebAuthn), and 12,564.926 ms (OPRF); +the sample-level payload, proof, and RSS values are in the canonical CSV. +Earlier low-memory kills and Android quarantine attempts remain recovery +evidence, not measurements. + +### Circom + Groth16 + +Chrome uses `snarkjs@0.7.6`, including its WASM witness calculation/proving +path. + +For native arm64, pilot `witnesscalc-adapter@0.1.7` and +`rust-rapidsnark@0.1.4`. Use Rapidsnark on iPhone only after Passport, +WebAuthn, and both named World ID OPRF circuits pass: + +1. build and package; +2. valid proof verification; +3. tampered proof rejection; +4. one warmup; +5. five sequential measured samples. + +The native Rapidsnark lane uses frozen SnarkJS-validated WTNS files. Their +SHA-256 values are locked in `toolchains.lock.json`; preparation regenerates a +Groth16 proof and verifies it before packaging: + +- World ID OPRF query: + `89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f` +- World ID OPRF nullifier: + `b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568` +- Self `vc_and_disclose`: + `53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f` +- Self RSA-4096 registration: + `9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a` +- WebAuthn: + `294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8` + +Each native app runs a process-local correctness gate before timing: a valid +proof must verify and a mutated proof must be rejected. The two OPRF variants +are separate apps and separate circuit variants. `proof_verify` means proof +generation plus verification with a frozen witness; it is not full +witness-to-proof end-to-end time. + +`prepare-rapidsnark-oprf-ios-prebuilt.sh` creates two isolated proof entries. +`prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh` creates three more. +Both use a device-only arm64 XCFramework path; simulator builds are opt-in via +`V1_RAPIDSNARK_BUILD_IOS_SIMULATOR=1`. + +The iOS Rapidsnark build applies the tracked +`rapidsnark-ios-single-thread.patch` and +`rapidsnark-ios-low-memory.patch`. The first fixes the ffiasm default worker +pool to one thread only for iPhone device builds. The second mmaps the WTNS, +runs QAP/FFT before the point MSMs, releases the FFT roots before the MSM +passes, and page-aligns and unmaps each read-only zkey section after its last +use. Mac and simulator behavior is not changed unless the iOS-equivalent +calibration macros are explicitly enabled. Both patches are included in the +frozen bundle's content identity, and the resulting backend configuration +must remain visible in the row package versions. + +The WebAuthn zkey is 1.73 GB, so embedding it makes an IPA that BrowserStack +rejects before a device session. Set `MOBENCH_WEBAUTHN_ZKEY_URL` to a +campaign-controlled HTTPS URL while preparing the Passport/WebAuthn bundle. +The resulting WebAuthn IPA contains only the expected byte length and SHA-256; +the iOS runner downloads to its cache, verifies both values, and only then +sets the native fixture path. The exact downloaded zkey remains part of +`proving_payload_size_bytes`; the smaller IPA is transport only and is never +reported as the proving payload. Retain the URL service and tunnel logs with +the session evidence, and rebuild the immutable prebuilt if the URL changes. + +The remote downloader streams to a file. Its SHA-256 pass additionally uses +Darwin `F_NOCACHE` and drains an autorelease pool around every 8 MiB read. +Without those two controls, integrity verification left the 1.73 GB file hot +or retained immediately before the mmap prover and iOS killed the process at +its 2,098 MB `ActiveHard` limit. + +The final 2026-07-30 iPhone SE 2022 attempt passed in BrowserStack build +`9fe5b442db9319cae7010b9e89c95610685e4a6e`, session +`5e8373982ce020b462092542ecce8e5a49caf4aa`. The device downloaded and +hash-verified exactly 1,733,145,772 zkey bytes, accepted a valid proof, +rejected the tampered canary, completed one warmup and five measured proofs, +and emitted the structured report. The measured prover median is +38,679.039 ms; the exact proving payload is 1,842,364,184 bytes; proof sizes +range from 1,000 to 1,006 bytes; and per-sample process peaks range from +844.406 to 848.219 MiB. The retained passing session, device, +instrumentation, report, and App Profiling evidence are the publication +source. Earlier HTTP and jetsam attempts remain retained as recovery evidence, +not measurements. + +IPA executables may receive nondeterministic Xcode build UUIDs when rebuilt. +Each preparation script therefore freezes its first validated bundle behind a +content manifest. A second invocation hashes every relevant adapter, packaging +script, zkey, WTNS, and verification key; when those inputs are unchanged it +revalidates and reuses the byte-identical prebuilt manifest. Any content drift +forces a fresh bundle instead of silently mixing artifacts. + +The final iPhone bundle can be assembled without changing its source +artifacts: + +```bash +benchmarks/v1/scripts/merge-ios-prebuilt-manifests.sh \ + target/v1-benchmarks/full-campaign-ios-prebuilt \ + target/v1-benchmarks/provekit-ios-prebuilt/manifest.json \ + target/v1-benchmarks/mopro-noir-ios-prebuilt/manifest.json \ + target/v1-benchmarks/rapidsnark-core-ios-prebuilt/manifest.json \ + target/v1-benchmarks/rapidsnark-oprf-ios-prebuilt/manifest.json +``` + +The merged manifest uses a deterministic 40-hex content identity and writes +the contributing manifest hashes to the adjacent `.provenance.json` file. +The proof-metrics bundle contains 11 named proof functions: three ProveKit, +three Noir/Barretenberg, and five Circom/Groth16 variants. Mobench dry-run +validation must pass before paid execution. + +### Input-to-proof iPhone freeze + +The successor campaign adds Passport P1 and live witness generation. Its warm +manifest contains 13 executable functions: four ProveKit V1, four native +Noir/Barretenberg, and five Circom/Rapidsnark functions because historical +Circom Passport remains a registration-plus-disclosure product flow. + +Prepare warm bundles with `V1_IOS_ITERATIONS=5` and `V1_IOS_WARMUP=1`. +Prepare distinct cold bundles from the same source/artifact freeze with: + +```bash +export V1_IOS_ITERATIONS=1 +export V1_IOS_WARMUP=0 +export V1_IOS_COLD_LAUNCHES=6 +export V1_PROVEKIT_IOS_PREBUILT_ROOT="$PWD/target/v1-benchmarks/input-to-proof-cold-provekit-ios-prebuilt" +export V1_MOPRO_NOIR_IOS_PREBUILT_ROOT="$PWD/target/v1-benchmarks/input-to-proof-cold-noir-ios-prebuilt" +export V1_RAPIDSNARK_OPRF_IOS_PREBUILT_ROOT="$PWD/target/v1-benchmarks/input-to-proof-cold-oprf-ios-prebuilt" +export V1_RAPIDSNARK_CORE_IOS_PREBUILT_ROOT="$PWD/target/v1-benchmarks/input-to-proof-cold-core-ios-prebuilt" + +benchmarks/v1/scripts/prepare-provekit-ios-prebuilt.sh +benchmarks/v1/scripts/prepare-mopro-noir-ios-prebuilt.sh +benchmarks/v1/scripts/prepare-rapidsnark-oprf-ios-prebuilt.sh +benchmarks/v1/scripts/prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh +benchmarks/v1/scripts/merge-ios-prebuilt-manifests.sh \ + "$PWD/target/v1-benchmarks/input-to-proof-cold-ios-prebuilt" \ + "$V1_PROVEKIT_IOS_PREBUILT_ROOT/manifest.json" \ + "$V1_MOPRO_NOIR_IOS_PREBUILT_ROOT/manifest.json" \ + "$V1_RAPIDSNARK_OPRF_IOS_PREBUILT_ROOT/manifest.json" \ + "$V1_RAPIDSNARK_CORE_IOS_PREBUILT_ROOT/manifest.json" +``` + +The large WebAuthn and Passport P1 zkeys are streamed from the campaign HTTPS +host, length- and SHA-256-verified, and cached before timing. Network transfer +is never included in `input_to_proof_time_ms`; the exact zkey still belongs in +`proving_payload_size_bytes`. + +The iPhone OPRF lane uses pinned `wasmi@0.46.0` to interpret the exact Circom +witness Wasm inside the timed region, then serializes WTNS and invokes +`rust-rapidsnark@0.1.4`. Its generated WTNS must match the frozen SnarkJS WTNS +byte-for-byte before device sampling. This target-specific witness runtime +replaces a Rust-Witness AOT artifact that repeatedly crashed with +`EXC_BAD_ACCESS` on iOS; it does not change the O2 circuit or Rapidsnark prover. + +Run the warm manifest once. Run each cold function in one BrowserStack session +whose XCUITest runner terminates and relaunches the app six times. Every launch +creates a fresh process and proof runtime; only the hash-verified downloaded +asset cache survives outside the timed region. Cold launch zero is the attested +warmup and launches one through five are the measured samples. The canonical entrypoint +supports this with `V1_IOS_WARM_PREBUILT_MANIFEST` and +`V1_IOS_COLD_PREBUILT_MANIFEST`. Every paid run still requires +`--confirm-paid-browserstack`. + +If a BrowserStack transport error interrupts a multi-entry manifest after a +passing build, fetch that build by ID and retain it. Create a non-destructive, +hash-preserving resume bundle from the next entry with +`scripts/slice-ios-prebuilt.ts`; never rerun or overwrite the already passing +evidence. The publication exporter scans only the curated +`target/v1-benchmarks/input-to-proof/iphone/publication` tree, excluding failed +and superseded attempts. + +On the E15, make the decision from captured ABI/userspace evidence. Try +Rapidsnark only if that target is supported. Otherwise use Mopro Arkworks plus +`rust-witness`. The CSV fields `prover_backend` and `witness_backend` preserve +that difference; results are not normalized into a generic “Circom” backend. + +The completed E15 campaign records `armeabi-v7a`/`zygote32` identity and the +qualified native backend for every row. Circom OPRF combines the two World ID +variants; Passport combines disclosure and RSA-4096 registration. Each +component independently passed the proof/tamper and 1+5 gates before it entered +the CSV. `iden3/circom-witnesscalc@0.3.0` remains a compatibility fallback, not +a publication backend. + +For the input-to-proof successor, 23 E15 logical series are successful. The +remaining cold Circom WebAuthn series is intentionally a structured gap, not a +zero or an estimate. The final helper-unmap canary reached Rapidsnark and failed +with `mmap failed: Out of memory` on the attested 32-bit E15; the 1,733,145,772 +byte zkey plus 109,218,412 byte WTNS could not be mapped. See +[`input-to-proof-data/e15-webauthn-cold-gap.json`](input-to-proof-data/e15-webauthn-cold-gap.json) +for the null metrics and SHA-256-linked report/logcat evidence. Do not merge +this gap with the passing warm WebAuthn result or substitute an iPhone/Mac +measurement. + +### Analysis environment + +The canonical Marimo notebook is `analysis/input_to_proof_analysis.py` and +reads only `input-to-proof-data/input-to-proof-samples.csv`. The historical +proof-only notebook `analysis/benchmark_analysis.py` is retained for the +legacy semantic-parity export. +Its Python 3.12 +environment is locked by `analysis/pyproject.toml` and `analysis/uv.lock`: +Marimo 0.23.15, Pandas 2.3.3, Matplotlib 3.10.8, and Seaborn 0.13.2. + +```bash +cd benchmarks/v1/analysis +uv sync --frozen +uv run marimo check input_to_proof_analysis.py +uv run marimo export html input_to_proof_analysis.py \ + --no-include-code --force \ + -o ../../../target/v1-benchmarks/analysis/benchmark-analysis.html +``` + +## 7. Smoke before timing + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage smoke \ + --campaign provekit-v1-cross-device +``` + +Every measured lane must first: + +1. build/load the exact frozen artifacts; +2. generate or load the expected witness; +3. prove and accept a valid proof; +4. mutate proof bytes or a public input and reject it; +5. retain public outputs, circuit identity, adapter/backend identity, and the + smoke evidence path. + +A proof that cannot be verified, or a verifier that accepts the tampered +case, is never timed. + +## 8. Measure + +Run physical/local measurement: + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage measure \ + --campaign provekit-v1-cross-device +``` + +BrowserStack is paid and must additionally require credentials from the +environment and the runner's explicit paid-confirmation flag. Never put the +credential values on a command line or in a retained command log. + +For each expected cell, execute exactly one warmup then five sequential +measured samples. Write one row per attempt, including the warmup. Record: + +- campaign, target, device, OS, ABI, runtime, and browser; +- stack, frontend, prover backend, witness backend, circuit, and circuit + commit; +- sample index, warmup flag, status, failure class, and failure message; +- initialization, witness, prove, verify, and end-to-end nanoseconds; +- exact serialized proof bytes, primary circuit bytes, and deduplicated proving + payload bytes; +- peak process memory and constraint count; +- source commit, package versions, artifact hashes, and session/result + provenance. + +Successful measured rows require positive durations. Missing metrics remain +blank. Failed or unsupported cells use one of `unsupported`, `build_failed`, +`crashed`, `timed_out`, or `zero_samples`; zero is never a sentinel for +missing data. + +Mobench executes native warmups but deliberately excludes them from +`BenchReport.samples`. The iOS normalizer therefore emits an attested +`status=ok`, `sample_kind=warmup`, `sample_index=0` row with blank timing +fields, followed by the five retained measured samples. It never copies a +measured duration into the warmup row or invents a warmup time. + +For every published cell, `peak_memory_mib` is mandatory. Native rows use the +benchmark worker/application process peak. Mac browser rows poll the unique +Chrome renderer PID at 100 ms and report renderer RSS; JavaScript heap is not a +substitute. + +`artifact_size_bytes` and `bundle_size_bytes` both carry the deduplicated +per-cell proving payload for schema compatibility: PKP plus input for ProveKit, +ACIR/circuit plus frozen witness plus SRS for browser Barretenberg, and WASM +plus zkey plus input for browser Circom. Native adapters report their exact +equivalent inputs. IPA, APK, XCUITest, verifier-only assets, and duplicate +uploads are never counted. `artifact_hashes` contains hashes of those proving +inputs, not hashes of transport containers. + +## 9. Export and validate + +```bash +benchmarks/v1/scripts/run-reproducibility.sh --stage export \ + --campaign provekit-v1-cross-device +``` + +Export regenerates the canonical sample-level CSV from the committed, +hash-locked V1 evidence and retains secret-free provenance. It must fail on: + +- a missing required column; +- a duplicate campaign/target/stack/workload/circuit/sample key; +- an unknown status; +- a missing value encoded as zero; +- a successful sample without correctness evidence; +- a runtime/surface mismatch; +- a ProveKit cell without one warmup and five measured samples; +- an expected Noir/Circom cell which has neither samples nor an explicit + failure row. + +The publication export path is `input-to-proof-data/export.ts`. It verifies +every committed V1 evidence hash, enforces the 72-series input-to-proof matrix, +and writes only `input-to-proof-data/input-to-proof-samples.csv`. Raw +`measure` outputs remain in the campaign directory and are never substituted +into the publication file without an explicit evidence and manifest update. + +When BrowserStack rejects an immutable iOS artifact before a session can +start, set `V1_IOS_GAPS_JSON` to an array of structured, evidence-backed gap +records. The normalizer accepts a gap only for a lane whose required result or +manifest entry is absent; it still rejects unexplained missing lanes. The +input-to-proof freeze has three explicit gaps: fixed-16 Mac Circom/WebAuthn +cold and warm lanes, plus the E15 Circom/WebAuthn cold lane. All gap metrics are +blank and their failure evidence is retained or hash-linked. + +The Marimo notebook reads only this master CSV. It independently validates +coverage and units, derives median and dispersion from measured (non-warmup) +rows, and renders missing cells distinctly. Titles, captions, and legends must +state that circuit counterparts are non-equivalent. + +At the current V1 evidence freeze, the canonical file has **417 records**: +**345 measured rows**, **69 attested warmups**, and three explicit runtime +gaps. Successful series have the four requested publication fields: +input-to-proof time, deduplicated proving payload size, serialized proof size, +and peak process memory. The fixed-16 Mac rows use campaign +`input-to-proof-v1-mac-multithread-16-20260812`; the retained iPhone/E15 rows +keep their original campaign provenance. The legacy proof-only export remains +available for historical comparisons but is not merged into these metrics. + +## 10. Evidence and publication rules + +Raw command streams, device logs, proof/tamper evidence, and immutable bundle +manifests stay beneath the campaign result directory. The exported evidence +contains no secrets. + +Historical benchmark data may guide debugging, but may enter the master CSV +only if all of the following match this campaign: + +- repository and circuit source commits; +- compiler/package/adapter versions; +- circuit semantics and public-output schema; +- exact bundle hashes; +- target, OS, ABI, runtime, and browser; +- one-warmup/five-sample protocol; +- valid-proof acceptance and tampered-proof rejection. + +Unsupported and failed cells are findings, not values. Never estimate a timing, +copy another target's value, or silently omit a failure. Historical payload +estimates remain disclosed only in the legacy CSV notes; the canonical +input-to-proof export contains no estimates. +# Browser execution policies + +The published Mac baseline is single-thread WASM. Two separate multithreaded +exports are retained: the earlier automatic-thread campaign and the fixed-16 +campaign in [`MULTITHREADED_WASM.md`](./MULTITHREADED_WASM.md). The fixed run +requests 16 ProveKit Rayon workers and 16 SnarkJS workers for every profile; +Barretenberg remains 32 requested/16 effective. It requires Chrome +cross-origin isolation and records whether workers actually initialized. Noir +and Circom witness generation remains single-threaded in the pinned browser +libraries; only the proving backend is worker-enabled. The fixed run's two +Circom WebAuthn gap rows are explicit memory/runtime evidence, not substituted +timings. diff --git a/benchmarks/v1/legacy/retired-docs/REPRODUCIBILITY_COMMANDS.md b/benchmarks/v1/legacy/retired-docs/REPRODUCIBILITY_COMMANDS.md new file mode 100644 index 000000000..50c736462 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/REPRODUCIBILITY_COMMANDS.md @@ -0,0 +1,467 @@ +# Historical engineering command transcript + +This file retains the exploratory commands used while developing the campaign. +It is **not** the publication procedure and some commands describe superseded +adapters or supporting evidence. For a blog-linked reproduction path, use +[`REPRODUCIBILITY.md`](REPRODUCIBILITY.md) and +[`scripts/run-reproducibility.sh`](scripts/run-reproducibility.sh). The +authoritative V1 results are +[`input-to-proof-data/input-to-proof-samples.csv`](input-to-proof-data/input-to-proof-samples.csv). +The proof-only semantic-parity export at +[`legacy/semantic-parity/semantic-parity-samples.csv`](legacy/semantic-parity/semantic-parity-samples.csv) +and [`legacy/data/benchmark-samples.csv`](legacy/data/benchmark-samples.csv) +remain historical exports with different measurement boundaries. + +The orchestration script records the actual expanded commands in +`target/v1-benchmarks/reproduction//commands.log`. + +## 0. Identify the campaign + +```bash +git status --short --branch +git rev-parse HEAD +export V1_CAMPAIGN=announcement-v1 +``` + +Use an isolated campaign worktree. The release worktree is +`codex/provekit-v1-cross-device-campaign`; do not use the dirty primary +checkout. + +## 1. Preview the complete run + +```bash +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage all \ + --campaign "$V1_CAMPAIGN" \ + --dry-run +``` + +## 2. Bootstrap and prepare + +```bash +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage bootstrap \ + --campaign "$V1_CAMPAIGN" + +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage prepare \ + --campaign "$V1_CAMPAIGN" + +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage smoke \ + --campaign "$V1_CAMPAIGN" +``` + +## 3. Prepare ProveKit native packages + +```bash +FUNCTIONS='["bench_mobile::bench_passport_complete_age_check_prepare","bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_complete_age_check_verify","bench_mobile::bench_passport_complete_age_check_e2e","bench_mobile::bench_passport_fragmented_age_check_prepare","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_webauthn_assertion_prepare","bench_mobile::bench_webauthn_assertion_prove","bench_mobile::bench_webauthn_assertion_verify","bench_mobile::bench_webauthn_assertion_e2e","bench_mobile::bench_oprf_prepare","bench_mobile::bench_oprf_prove","bench_mobile::bench_oprf_verify","bench_mobile::bench_oprf_e2e"]' +SOURCE_SHA="$(git rev-parse HEAD)" + +MOBENCH_CI_PREPARE=1 ./bench-mobile/scripts/generate-fixtures.sh + +cargo-mobench ci prepare \ + --target ios \ + --crate-path bench-mobile \ + --ffi-backend native-c-abi \ + --functions "$FUNCTIONS" \ + --iterations 5 \ + --warmup 1 \ + --release \ + --source-sha "$SOURCE_SHA" \ + --output-dir target/mobench/prebuilt/ios \ + --manifest target/mobench/prebuilt/ios/manifest.json + +cargo-mobench ci prepare \ + --target android \ + --crate-path bench-mobile \ + --ffi-backend native-c-abi \ + --functions "$FUNCTIONS" \ + --iterations 5 \ + --warmup 1 \ + --release \ + --source-sha "$SOURCE_SHA" \ + --output-dir target/mobench/prebuilt/android \ + --manifest target/mobench/prebuilt/android/manifest.json +``` + +## 3a. Run the full local Mac matrix + +Run this with no other prover benchmark active: + +To refresh the checked Mac evidence: + +```bash +bun run benchmarks/v1/scripts/run-mac-native-benchmarks.ts +bun run benchmarks/v1/scripts/run-mac-wasm-benchmarks.ts +``` + +The first command runs ProveKit and native Barretenberg for passport, +WebAuthn, and Taceo OPRF; Arkworks for World ID OPRF query/nullifier; and +Rapidsnark for Self passport registration/disclosure. The second command runs +ProveKit and Barretenberg for all three Noir workloads in local Chrome only. +Both commands are sequential and use one warmup plus five measured samples. + +## 4. Prepare Mopro native Circom/Arkworks and Noir/Barretenberg adapters + +These are preparation/development commands. They do not replace the frozen +publication bundles or their retained measurements: + +```bash +benchmarks/v1/scripts/prepare-webauthn-circom.sh --witness +benchmarks/v1/scripts/prepare-mopro-native-adapters.sh --build-ios +# Requires Zig on PATH for Mopro's Barretenberg Android linker: +benchmarks/v1/scripts/prepare-mopro-native-adapters.sh --build-android + +# Optional benchmark-only setup; this circuit needs at least the 4.83 GB +# power-22 PTAU. Reuse its verified cache. The script gives SnarkJS a 32 GB +# heap by default, writes setup output through a partial file, and verifies the +# resulting 1.73 GB zkey before it can become the cache entry. +V1_WEBAUTHN_PTAU=/absolute/path/to/powersOfTau28_hez_final_22.ptau \ + benchmarks/v1/scripts/prepare-webauthn-circom.sh --setup + +# Build the four-function Mobench adapter and install the hash-checked zkey as +# an application resource. These commands do not start BrowserStack sessions. +benchmarks/v1/scripts/build-mopro-webauthn-mobile.sh ios +benchmarks/v1/scripts/build-mopro-webauthn-mobile.sh android +benchmarks/v1/scripts/build-rapidsnark-webauthn-mobile.sh ios +benchmarks/v1/scripts/build-rapidsnark-webauthn-mobile.sh android + +# Freeze and verify all five native Circom witnesses, then build arm64-only +# iPhone packages. These commands do not start BrowserStack sessions. +benchmarks/v1/scripts/prepare-provekit-ios-prebuilt.sh +benchmarks/v1/scripts/prepare-mopro-noir-ios-prebuilt.sh +benchmarks/v1/scripts/prepare-circom-native-witnesses.sh +benchmarks/v1/scripts/prepare-rapidsnark-oprf-ios-prebuilt.sh +benchmarks/v1/scripts/prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh + +benchmarks/v1/scripts/merge-ios-prebuilt-manifests.sh \ + target/v1-benchmarks/full-campaign-ios-prebuilt \ + target/v1-benchmarks/provekit-ios-prebuilt/manifest.json \ + target/v1-benchmarks/mopro-noir-ios-prebuilt/manifest.json \ + target/v1-benchmarks/rapidsnark-core-ios-prebuilt/manifest.json \ + target/v1-benchmarks/rapidsnark-oprf-ios-prebuilt/manifest.json + +# Mac native: repeat for all four Arkworks functions and all three Rapidsnark +# functions listed below, preserving one warmup and five measured samples. +MOBENCH_WEBAUTHN_ZKEY="$PWD/target/v1-benchmarks/groth16/webauthn/webauthn_default_benchmark.zkey" \ + cargo run --release \ + --manifest-path target/v1-benchmarks/mopro/provekit-v1-mobile-adapters/Cargo.toml \ + --bin mobench-host -- \ + provekit_v1_mobile_adapters::bench_webauthn_arkworks_prove 1 5 \ + "$PWD/target/v1-benchmarks/arkworks-webauthn-prove.json" + +MOBENCH_GROTH16_FIXTURE_ROOT="$PWD/target/v1-benchmarks/mobile-fixtures/groth16/webauthn" \ + cargo run --release \ + --manifest-path benchmarks/v1/rapidsnark-mobile-webauthn/Cargo.toml \ + --bin mobench-host -- \ + provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_prove \ + 1 5 "$PWD/target/v1-benchmarks/rapidsnark-webauthn-prove.json" + +# Expanded manual scaffold commands: +MOPRO="$(benchmarks/v1/scripts/bootstrap-mopro.sh)" +mkdir -p target/v1-benchmarks/mopro +cd target/v1-benchmarks/mopro +"$MOPRO" init --adapter circom,noir --project-name provekit-v1-mobile-adapters +cd provekit-v1-mobile-adapters +printf '\n[workspace]\n' >> Cargo.toml +perl -pi -e 's/circom-prover = "0\\.1"/circom-prover = "=0.1.4"/' Cargo.toml +cargo generate-lockfile +cargo check --release + +"$MOPRO" build \ + --mode release \ + --platforms android \ + --architectures aarch64-linux-android \ + --no-auto-update + +"$MOPRO" build \ + --mode release \ + --platforms ios \ + --architectures aarch64-apple-ios \ + --no-auto-update +``` + +Before building, replace sample circuits with the frozen campaign artifacts. +For Circom WebAuthn, the validated path transpiles the compiled witness WASM +through Mopro `rust-witness`; `bootstrap-w2c2.sh` puts a pinned macOS host tool +on `PATH` so iOS cross-compilation does not incorrectly build the tool for the +phone. Provide the standard SnarkJS zkey by verified cache path. The retained +adapter recursively flattens scalar and nested-array JSON signals because +Mopro's generic helper otherwise drops them. Require field-for-field equality +with the validated WTNS plus a valid proof/verification gate before packaging. +The four registered functions are `bench_webauthn_arkworks_witness`, +`bench_webauthn_arkworks_prove`, `bench_webauthn_arkworks_verify`, and +`bench_webauthn_arkworks_e2e`. Rapidsnark uses the same validated WTNS and +registers prove, verify, and end-to-end; witness generation remains the shared +Circom phase. The retained +`.dat` remains a `witnesscalc_adapter` fallback, though its release C++ +optimization exceeded the 30-minute local diagnostic cap. The published +proof-only path uses `rust-rapidsnark` with frozen WTNS plus the matching +SnarkJS zkey. Do not call Mopro's forked Arkworks lane `circom-compat`. + +Mopro's Noir adapter is a real native Barretenberg path for Swift/iOS and +Kotlin/Android. Mopro 0.3.7 currently pins Noir beta.19; the existing campaign +fixtures are beta.11 with Barretenberg 0.87. Publish native results only after +the exact bytecode/proof compatibility gate passes, or label a recompiled +beta.19 run as a separate backend version. + +The historical hosted Rapidsnark binary lookup is not part of the release path. +The campaign vendors/builds the pinned native libraries and records their exact +identity in the prepared bundle. + +The campaign's resource-aware fallback builds the pinned iden3 native +libraries instead of using that unavailable binary host: + +```bash +benchmarks/v1/scripts/build-rapidsnark-mobile-ios.sh passport-disclose +benchmarks/v1/scripts/build-rapidsnark-mobile-ios.sh passport-register +benchmarks/v1/scripts/prepare-rapidsnark-ios-prebuilt.sh + +find target/v1-benchmarks/rapidsnark-ios-prebuilt \ + -name manifest.json \ + -type f \ + -print \ + -sort + +benchmarks/v1/scripts/build-rapidsnark-mobile-android.sh passport-disclose +benchmarks/v1/scripts/build-rapidsnark-mobile-android.sh passport-register +benchmarks/v1/scripts/prepare-rapidsnark-android-prebuilt.sh + +find target/v1-benchmarks/rapidsnark-android-prebuilt \ + -name manifest.json \ + -type f \ + -print \ + -sort +``` + +Run each manifest independently on `iPhone SE 2022-15`. Read the expected +source/function/iteration/warmup values from the manifest and retain its +Mobench summary, BrowserStack build ID, and session artifacts. +Run the Android manifests independently per device as well, beginning with +`passport-disclose-prove` on `Samsung Galaxy S24-14.0`. + +## 5. Load credentials and verify both BrowserStack products + +On the campaign workstation, load the credentials from the external Mobench +environment file. It is outside the ProveKit repository and must never be +copied into a result archive or printed: + +```bash +set -a +source "$HOME/Code/world/mobile-bench-rs/.env" +set +a +``` + +Load the `BrowserStack` item from the personal `my.1password.com` account and +`Agents` vault into these two environment variables without printing them: + +```bash +test -n "$BROWSERSTACK_USERNAME" +test -n "$BROWSERSTACK_ACCESS_KEY" +benchmarks/v1/scripts/preflight-browserstack-products.sh +``` + +Both `BrowserStack Automate` and `BrowserStack App Automate` subscriptions are +required, and both checks must pass. + +Before any large Android App Automate upload, run the bounded ingestion +control: + +```bash +V1_BROWSERSTACK_PROBE_TIMEOUT_MS=60000 \ + bun benchmarks/v1/scripts/probe-browserstack-espresso-ingestion.ts +``` + +Do not proceed unless its retained summary contains +`"diagnosis": "healthy"`, `"ingestion_recovered": true`, and a non-null +`bs://` handle. The default URL control avoids a redundant 20.37 MB transfer +from the Mac. To isolate multipart transport explicitly, set +`V1_BROWSERSTACK_PROBE_TRANSPORT=file`. + +## 6. Run native App Automate packages + +```bash +export V1_IOS_PREBUILT_MANIFEST="$PWD/target/mobench/prebuilt/ios/manifest.json" +export V1_ANDROID_PREBUILT_MANIFEST="$PWD/target/mobench/prebuilt/android/manifest.json" + +benchmarks/v1/scripts/patch-xcuitest-testing-interop.sh \ + "$(dirname "$V1_IOS_PREBUILT_MANIFEST")" + +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage native \ + --campaign "$V1_CAMPAIGN" \ + --dry-run + +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage native \ + --campaign "$V1_CAMPAIGN" \ + --confirm-paid-browserstack +``` + +Use the same process for the World ID Arkworks OPRF prebuilt manifest and, +for Self passport, each manifest under +`target/v1-benchmarks/rapidsnark-ios-prebuilt/` and +`target/v1-benchmarks/rapidsnark-android-prebuilt/`. Keep their backend labels +and output directories distinct. + +For the large Self applications, resolve the content-addressed app first: + +```bash +benchmarks/v1/scripts/browserstack-app-cache.sh \ + lookup ios \ + target/v1-benchmarks/mobile-fixtures/groth16/register_sha256_sha256_sha256_rsa_65537_4096/fixture-manifest.json \ + /absolute/path/to/app.ipa +``` + +Only upload after exit status 3 confirms a cache miss. Persist the returned +immutable `bs://` URL with the campaign. + +For Android recovery, run one function on one device per build. This prevents +one slow device or function from discarding otherwise valid cells: + +```bash +benchmarks/v1/scripts/run-android-browserstack-shards.sh \ + --manifest target/v1-benchmarks/prebuilt-run-30041758043/android/manifest.json \ + --output-dir target/v1-benchmarks/provekit-android-shards \ + --only-function bench_mobile::bench_passport_complete_age_check_prepare \ + --device 'Samsung Galaxy S24-14.0' \ + --retry-failed +``` + +An App Automate `bs://` app handle is function-specific because the APK embeds +`bench_spec.json`. Reuse it only for the exact function, source SHA, warmup, +and iteration contract it was built for. The Espresso test runner is reusable +only after its executable code, manifest, and resources are confirmed +identical. Mobench must reject a returned function that differs from the +prepared manifest. + +### 6a. Summarize cached Android recovery evidence + +This recovery path is supporting evidence only. Use it only for retained, +function-specific App Automate handles when no exact-source package can be +uploaded. It does not satisfy or replace the primary one-warmup/five-sample +campaign. + +Each workload root must contain exactly three `repetition-*` directories. Keep +the raw `build.json`, `schedule.json` when available, `session-.json`, and +`device-.log` files in each repetition directory. Do not delete them after +creating the compact summary. + +```bash +RECOVERY_ROOT=benchmarks/v1/results/run-30041758043/provekit-android-cached-recovery + +bun run benchmarks/v1/scripts/summarize-cached-android-recovery.ts \ + "$RECOVERY_ROOT/passport-prove" \ + bench_mobile::bench_passport_complete_age_check_prove \ + "$RECOVERY_ROOT/passport-prove-summary.json" + +bun run benchmarks/v1/scripts/summarize-cached-android-recovery.ts \ + "$RECOVERY_ROOT/oprf-prove" \ + bench_mobile::bench_oprf_prove \ + "$RECOVERY_ROOT/oprf-prove-summary.json" + +jq -e ' + .schema == "provekit.cached-android-recovery.v1" + and .sampling_contract.repetitions == 3 + and .sampling_contract.total_warmups == 3 + and .sampling_contract.total_measured_samples == 6 + and .artifact_provenance.source_sha == null + and ([.devices[].sample_count] | all(. == 6)) +' \ + "$RECOVERY_ROOT/passport-prove-summary.json" \ + "$RECOVERY_ROOT/oprf-prove-summary.json" +``` + +Each cached artifact embeds one warmup plus two measured samples. The summary +aggregates three independent runs per device into the alternate contract of +three warmups plus six measured samples. It also retains app/test-suite +handles, build IDs, session IDs, device metadata, samples, and process peak +memory. + +BrowserStack does not expose a downloadable APK or authoritative source SHA +for these retained `bs://` artifacts. A matching function and sampling +contract can be checked; exact source identity cannot. Label the output +**cached Android recovery (supporting evidence)** with unknown source SHA, and +do not combine it with exact-source primary measurements. + +## 7. Run ProveKit browser/WASM through Automate + +Start BrowserStack Local outside this command log. Resolve the available +iPhone SE 2022 OS version immediately before the run: + +```bash +export BROWSERSTACK_LOCAL_IDENTIFIER=provekit-v1-unique-id +export BROWSERSTACK_OS_VERSION=resolved-version +export V1_WASM_TARGETS='macos_chrome_single ios_safari_single android_chrome_single' + +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage wasm \ + --campaign "$V1_CAMPAIGN" \ + --dry-run + +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage wasm \ + --campaign "$V1_CAMPAIGN" \ + --confirm-paid-browserstack +``` + +Resolve `BROWSERSTACK_OS_VERSION` from the live Automate catalog. Historical +device/OS pairs can disappear; for example, the successful retained Android +passport retry used Galaxy S21 with Android `12.0`, not the stale Android 13 +matrix entry. The real-mobile WebDriver payload must omit `osName` from +`bstack:options`. + +For Barretenberg, serve the frozen bundle: + +```bash +benchmarks/v1/scripts/compile-noir-workloads.sh +(cd benchmarks/v1/barretenberg && bun install --frozen-lockfile && bun run build:web) +(cd benchmarks/v1/barretenberg && BARRETENBERG_BENCH_PORT=4174 bun run web/server.ts) +``` + +Then run each workload/phase cell: + +```bash +cargo-mobench run-web \ + --url http://127.0.0.1:4174/ \ + --function 'barretenberg::oprf_taceo::prove' \ + --iterations 5 \ + --warmup 1 \ + --browser Safari \ + --os-version "$BROWSERSTACK_OS_VERSION" \ + --device 'iPhone SE 2022' \ + --build-name "provekit-v1-$V1_CAMPAIGN" \ + --session-name oprf-taceo-prove-iphone-se-2022 \ + --local-identifier "$BROWSERSTACK_LOCAL_IDENTIFIER" \ + --script-timeout-secs 1800 \ + --page-load-timeout-secs 120 \ + --output "target/v1-benchmarks/reproduction/$V1_CAMPAIGN/barretenberg-oprf-prove-ios.json" \ + --non-interactive \ + --yes +``` + +Repeat for `passport_complete_age_check`, `webauthn_assertion`, and +`oprf_taceo`, with `witness`, `prove`, `verify`, and `e2e`. Repeat on Android +Chrome. Do not rerun a retained five-sample cell merely because another cell +failed. + +## 8. Validate and update the report + +```bash +benchmarks/v1/scripts/run-reproducibility.sh \ + --stage validate \ + --campaign "$V1_CAMPAIGN" + +bun run benchmarks/v1/scripts/generate-report-charts.ts + +jq -e ' + [.. | objects | .samples? // empty] + | all(length == 5) +' target/v1-benchmarks/reproduction/"$V1_CAMPAIGN"/*.json + +git diff --check +``` + +Do not edit historical reports from this transcript. Update only the canonical +CSV through the export/validation path described in `REPRODUCIBILITY.md`. diff --git a/benchmarks/v1/legacy/retired-docs/SEMANTIC_PARITY.md b/benchmarks/v1/legacy/retired-docs/SEMANTIC_PARITY.md new file mode 100644 index 000000000..3ef836cf5 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/SEMANTIC_PARITY.md @@ -0,0 +1,188 @@ +# Passport and OPRF semantic parity contract + +This document defines the statements that may be compared in the parity +campaign. It supersedes workload-name matching: two rows are directly +comparable only when they implement the same profile below, use the same +logical fixture, expose the same public outputs, and pass the same positive and +negative tests. + +The original V1 results remain historical closest-analogue measurements. They +must not be relabelled as parity results. + +## Source baseline + +| Implementation | Immutable revision | Role | +| --- | --- | --- | +| Self passport Circom | `15b167e3543a9dff1dbb16fcf71a45fe4625cf9e` | Production behavior to preserve | +| World ID Protocol Circom | `85aeeef539961cae5a63de794997b507a5975717` | Production OPRF behavior to preserve | +| TACEO `oprf-nr` Noir | `808f3c795b57963dd58ef282ccd61022ef39c285` | Primitive implementation, not the target application statement | +| ProveKit V1 Passport Noir | campaign worktree revision plus frozen artifact hash | Starting point for the matched Noir port | + +Before implementation, compare the pinned production sources with their +current upstream heads. Every accepted upstream semantic change gets its own +test vector and is recorded in the parity fixture manifest. Performance-only +or unrelated product changes are not silently folded into the campaign. + +Upstream audit on 2026-07-31: + +- Self upstream HEAD is still `15b167e3`; the pinned Passport source is + current. +- World ID Protocol upstream HEAD is `590b47d5`, but the files under + `circom/client_side_proofs` are byte-for-byte unchanged from `85aeeef5`. + The pinned Circom OPRF statement is therefore current. +- TACEO upstream HEAD is `6c74828b` (release line `v2.0.0`). It strengthens + point types and subgroup handling, derives the blinded response inside the + circuit instead of trusting a separately supplied point, and updates Noir + APIs. The matched Noir port must start from this behavior, not the older + `v0.1.0-beta.1` benchmark example. TACEO remains a primitive source; World + ID's O1/O2 application statements remain the parity target. + +## Passport + +### Why the old rows are not comparable + +The existing Noir `complete_age_check` is one proof that checks age range, +passport expiry, DG1 inclusion in the SOD, the DSC signature on the signed +attributes, and the CSCA signature on the DSC certificate. Its current fixture +uses RSA exponent 65537, a 2048-bit DSC modulus, and a 4096-bit CSCA modulus. + +The selected Self flow uses +`register_sha256_sha256_sha256_rsa_65537_4096` and `vc_and_disclose`. The first +proof verifies a SHA-256 / RSA PKCS#1 v1.5 / exponent-65537 / 4096-bit passport +signature and a DSC/CSCA-derived registry leaf, then creates a commitment. The +second proves commitment membership, expiry and the selected age predicate; +it also contains disclosure, OFAC, scoped-nullifier, and application binding +machinery. Adding or averaging their timings does not create an equivalent +measurement. + +### P1: matched monolithic passport statement + +P1 is the primary proof-system comparison. Implement one isolated benchmark +circuit in each language with exactly these checks: + +1. The private DG1 bytes encode the frozen date of birth and expiry date. +2. SHA-256 of the same DG1 byte slice occurs at the frozen offset in the same + signed eContent/SOD fixture. +3. The same signed-attributes digest is verified with RSA PKCS#1 v1.5, + exponent 65537 and a 4096-bit DSC modulus in both circuits. +4. The DSC identity is authorized against the same frozen public registry + root and path. For P1, use Self's production registry-leaf construction in + both languages; do not compare it with a raw public CSCA key or an extra + CSCA-certificate signature check. +5. Passport expiry is checked against the same public calendar date. +6. The holder is at least the same public minimum age. Maximum age is disabled + in both circuits for P1 because Self's production disclosure statement has + no corresponding maximum-age predicate. +7. The public outputs are the registry root, current date, minimum age, and a + fixture identifier/hash agreed by both implementations. No implementation- + specific commitment or nullifier is part of P1. + +The shared fixture therefore needs a real or synthetic internally consistent +4096-bit RSA passport chain accepted by Self, plus a byte-for-byte derived Noir +input. Reusing the current Noir dummy fixture is forbidden: its DSC key is only +2048 bits and its Unix-timestamp date encoding differs from Self's YYMMDD byte +encoding. + +### P2: production lifecycle profile + +P2 measures Self's real two-proof registration/disclosure lifecycle and a Noir +port of that lifecycle. It is reported as two separately measured stages and +as a measured end-to-end session; it is never represented by a sum of medians. + +- Registration: passport signature and data integrity, registry authorization, + and the exact Self commitment/nullifier construction. +- Disclosure: commitment-tree membership, expiry, minimum-age predicate, + selected disclosure, application scope and scoped nullifier. +- OFAC selectors and country-list policy must either be enabled identically in + both implementations or disabled identically by a separately named profile. + +Poseidon-based commitment and nullifier operations must use the same Poseidon +variant, width, state layout, constants, output element and domain separators. +Calling both functions `Poseidon` is not sufficient evidence of parity. + +### Passport parity tests + +- Both witness encoders derive their inputs from one canonical fixture. +- Both implementations expose identical public values after normalizing only + representation (for example YYMMDD bytes versus a documented packed field). +- Changing DOB across the threshold fails both proofs. +- An expired passport fails both proofs. +- Mutating DG1, signed attributes, signature, DSC key, registry path/root, + current date or minimum age fails both proofs. +- P2 additionally rejects a mutated commitment path, scope and nullifier input. + +## OPRF + +### Why the old rows are not comparable + +TACEO's `oprf_example` intentionally combines query generation and final +response verification in one demonstration circuit. It proves knowledge of a +Poseidon2 preimage commitment and uses the short `OPRF` output domain +separator. + +World ID uses two application proofs. The query binds World ID PK registry +membership, an EdDSA-Poseidon2 authorization signature, `mt_index`, `rp_id`, +`action`, nonce and a non-zero in-range blinding scalar. The nullifier proof +repeats query validity and additionally checks a credential signature and +validity window, DLog equality, response subgroup membership and unblinding, +then derives a World ID nullifier and optional identity commitment. These are +different statements even when both use BabyJubJub and Poseidon2. + +### O1: matched World ID query statement + +Port `OprfQuery` to an isolated Noir circuit without deleting production +checks. Match: + +- the exact Poseidon2 permutation/constants and capacity-element convention; +- domain separator `b"World ID Query"`; +- `query = Poseidon2(mt_index, rp_id, action)` using the same state layout and + output element; +- EdDSA-Poseidon2 nonce authorization and seven-key leaf construction; +- binary Merkle membership, configurable depth semantics and index ordering; +- encode-to-BabyJubJub, subgroup rules, non-zero scalar range check and scalar + multiplication; +- public values: root, depth, RP ID, action, nonce and query point. + +### O2: matched World ID nullifier statement + +Port `OprfNullifier` to Noir on top of O1. Match all current production checks: + +- credential message hash, EdDSA-Poseidon2 signature and blinded-user-ID + commitment; +- credential expiry and minimum genesis issuance time; +- exact DLog-equality transcript/domain separation; +- response curve/subgroup validation and unblinding equation; +- World ID Proof nullifier hash and output element; +- optional identity commitment rule, signal hash and nonce binding; +- the same public inputs and public nullifier. + +Do not keep TACEO's preimage-commitment check unless it is also added to the +Circom contract as a separately named profile. Do not reuse TACEO's `OPRF` +domain separator where World ID uses `World ID Query` or `World ID Proof`. + +### OPRF parity tests + +- Generate one canonical JSON fixture, then losslessly encode it for both + frontends. +- Compare the derived query point and nullifier before proof generation. +- Reject mutations to RP ID, action, nonce, registry path/root, authorization + signature, credential signature/timestamps, DLog response, unblinded point, + signal hash and identity commitment. +- Include known-answer tests for every Poseidon2 and BabyJubJub boundary so a + permutation/state-layout mismatch is found without running a full proof. + +## Mac WASM qualification gate + +Mac Chrome/WASM is the only initial performance target. A profile may be timed +only after: + +1. both circuits compile from locked toolchains; +2. the canonical fixture produces identical normalized public outputs; +3. a valid proof verifies and a tampered proof is rejected in each stack; +4. all profile-specific mutation tests fail as expected; +5. the manifest records source commits, compiler/package versions and hashes + of circuit, witness input, proving material and browser bundle. + +Run one untimed warmup followed by five sequential measured samples. Keep P1, +P2 registration, P2 disclosure, O1 and O2 as separate workload identities. +Only promote a qualified immutable bundle to iPhone or E15. diff --git a/benchmarks/v1/legacy/retired-docs/SEMANTIC_PARITY_RESULTS.md b/benchmarks/v1/legacy/retired-docs/SEMANTIC_PARITY_RESULTS.md new file mode 100644 index 000000000..41a2f8416 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/SEMANTIC_PARITY_RESULTS.md @@ -0,0 +1,85 @@ +# Historical ProveKit V1 semantic-parity results + +This report is generated from +[`legacy/semantic-parity/semantic-parity-samples.csv`](legacy/semantic-parity/semantic-parity-samples.csv), +not from the older exploratory `legacy/data/benchmark-samples.csv`. The CSV contains +27 logical cells, one warmup and five measured samples per cell, and all four +publication metrics. ProveKit rows use core commit +`9b2a6f37c67691eab4b0cec6c35e35c520e93285` on every target. + +The circuits are closest counterparts, not identical statements. Passport P1 +is the monolithic matched age/integrity profile; WebAuthn is the pinned +privacy-ethereum closest analogue; OPRF O2 is the World ID nullifier profile. +The Circom and Noir rows retain their semantic notes in every CSV record. + +This report is retained for historical comparison. It measures proving-only +rows and predates the canonical raw-input-to-proof rerun. Do not combine its +timings with the publication CSV. + +## Median measured results + +Times are prove-only milliseconds. Payload is the deduplicated bytes needed to +create a proof; proof is the serialized proof; RSS is peak process memory. The +CSV retains the five samples and hashes behind each median. + +| Target | Workload | Stack | Prove ms | Payload bytes | Proof bytes | Peak RSS MiB | +| --- | --- | --- | ---: | ---: | ---: | ---: | +| Mac Chrome | Passport | ProveKit V1 | 10,216.280 | 2,313,739 | 963,449 | 998.125 | +| Mac Chrome | Passport | Noir + Barretenberg | 14,965.490 | 74,595,035 | 16,000 | 1,148.297 | +| Mac Chrome | Passport | Circom + Groth16 | 45,043.700 | 508,332,927 | 722 | 6,142.953 | +| Mac Chrome | WebAuthn | ProveKit V1 | 11,004.425 | 2,286,515 | 972,536 | 994.953 | +| Mac Chrome | WebAuthn | Noir + Barretenberg | 14,740.610 | 74,003,114 | 16,000 | 1,060.062 | +| Mac Chrome | WebAuthn | Circom + Groth16 | 219,079.600 | 1,753,618,376 | 724 | 11,064.781 | +| Mac Chrome | OPRF O2 | ProveKit V1 | 2,698.920 | 1,644,635 | 846,326 | 702.656 | +| Mac Chrome | OPRF O2 | Noir + Barretenberg | 6,199.425 | 73,925,206 | 16,000 | 909.375 | +| Mac Chrome | OPRF O2 | Circom + Groth16 | 1,631.400 | 39,203,507 | 724 | 3,096.328 | +| iPhone SE 2022 | Passport | ProveKit V1 | 2,384.364 | 2,554,715 | 715,102 | 535.313 | +| iPhone SE 2022 | Passport | Noir + Barretenberg | 4,109.934 | 20,480,588 | 16,324 | 506.672 | +| iPhone SE 2022 | Passport | Circom + Groth16 | 8,012.584 | 529,101,612 | 928 | 282.531 | +| iPhone SE 2022 | WebAuthn | ProveKit V1 | 3,182.688 | 2,410,560 | 714,756 | 565.250 | +| iPhone SE 2022 | WebAuthn | Noir + Barretenberg | 4,060.302 | 271,478,529 | 21,092 | 667.375 | +| iPhone SE 2022 | WebAuthn | Circom + Groth16 | 38,679.039 | 1,842,364,184 | 1,002 | 845.313 | +| iPhone SE 2022 | OPRF O2 | ProveKit V1 | 1,217.698 | 1,644,193 | 634,068 | 143.625 | +| iPhone SE 2022 | OPRF O2 | Noir + Barretenberg | 2,537.092 | 12,983,421 | 16,548 | 379.641 | +| iPhone SE 2022 | OPRF O2 | Circom + Groth16 | 586.212 | 40,639,660 | 1,602 | 103.906 | +| Motorola E15 | Passport | ProveKit V1 | 71,595.260 | 2,546,527 | 715,014 | 474.594 | +| Motorola E15 | Passport | Noir + Barretenberg | 115,303.106 | 20,480,588 | 16,324 | 463.227 | +| Motorola E15 | Passport | Circom + Groth16 | 53,063.891 | 529,101,612 | 1,035 | 649.945 | +| Motorola E15 | WebAuthn | ProveKit V1 | 27,839.158 | 2,377,056 | 716,454 | 498.574 | +| Motorola E15 | WebAuthn | Noir + Barretenberg | 107,456.725 | 271,478,529 | 21,092 | 483.887 | +| Motorola E15 | WebAuthn | Circom + Groth16 | 855,096.265 | 1,842,364,184 | 1,127 | 810.680 | +| Motorola E15 | OPRF O2 | ProveKit V1 | 12,564.926 | 1,644,193 | 632,628 | 177.336 | +| Motorola E15 | OPRF O2 | Noir + Barretenberg | 68,194.674 | 12,983,421 | 16,548 | 341.793 | +| Motorola E15 | OPRF O2 | Circom + Groth16 | 11,801.808 | 40,639,660 | 1,782 | 139.172 | + +## Reading the comparison + +- ProveKit V1 is the fastest of the three stacks for Passport on all targets, + and for WebAuthn on all targets. Circom is fastest for OPRF O2 on all three + targets in this table. +- ProveKit has the smallest proving payload in every workload/target row. Its + WHIR proof is larger than Groth16 and Barretenberg proofs, so proof transport + size is a separate trade-off from proving latency. +- Circom's Groth16 proof is tiny, but its WebAuthn payload and peak RSS are + substantially larger. Barretenberg's proof is compact, but its CRS/SRS + proving payload is much larger than ProveKit's PKP-plus-input payload. +- These are not a universal cryptographic ranking: the statement, frontend, + proof system, and serialization differ. Use the workload notes and the + sample-level provenance before making a product claim. + +## Correctness and provenance + +Every successful row came from a lane that accepted a valid proof and rejected +a tampered proof before timing. Mac browser memory is Chrome renderer RSS; it +is not JavaScript heap. Native memory is the benchmark process peak. Browser +ProveKit is the pinned single-thread V1 WASM build, not +`@worldcoin/provekit@0.1.0`; the npm package remains a compatibility reference +only. + +Regenerate and validate the exact report with: + +```bash +bun benchmarks/v1/semantic-parity-data/export-v1.ts +bun test benchmarks/v1/semantic-parity-data/export.test.ts +python3 -m unittest benchmarks/v1/analysis/test_benchmark_analysis.py +``` diff --git a/benchmarks/v1/legacy/retired-docs/barretenberg-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/barretenberg-README-before-cleanup.md new file mode 100644 index 000000000..1ba30f6e3 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/barretenberg-README-before-cleanup.md @@ -0,0 +1,24 @@ +# Noir / Barretenberg benchmark lane + +Noir `1.0.0-beta.11` pins Barretenberg `0.87.0`. The native `bb` release and +`@aztec/bb.js` must use that same version so ProveKit and Barretenberg consume +the same beta.11 ACIR and fixture. + +Install the browser dependency without changing the lock: + +```bash +cd benchmarks/v1/barretenberg +bun install --frozen-lockfile +bun run smoke:webauthn +bun run smoke:passport +bun run smoke:oprf +``` + +The smokes run WebAuthn, passport complete-age-check, and Taceo OPRF with the +single-thread backend. Each generates and verifies a proof and rejects a +tampered proof. Record the Barretenberg CRS as part of the cold-download +bundle. Do not publish comparisons until a `0.87.0` proof and verification +pass against each frozen beta.11 artifact. + +The package tarball integrity and release URL are pinned in +`../toolchains.lock.json`. diff --git a/benchmarks/v1/legacy/retired-docs/circom-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/circom-README-before-cleanup.md new file mode 100644 index 000000000..19a071dba --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/circom-README-before-cleanup.md @@ -0,0 +1,84 @@ +# Circom native benchmark lanes + +There are two distinct native Groth16 implementations: + +- Rapidsnark consumes a Circom witness (`.wtns`) and the original `.zkey`. +- Arkworks uses `circom-witness-rs` for a mobile-safe native witness graph and + Arkworks Groth16 proving material. + +`circom-compat` is pinned as the desktop preparation/reference implementation. +It must not be pulled into the iOS runtime unchanged: its witness path includes +Wasmer. Mobile uses the graph interpreter from `circom-witness-rs` instead. + +## First runnable workload: World ID OPRF + +The pinned World ID Protocol source already contains: + +- deterministic query/nullifier fixtures; +- serialized witness graphs; +- Arkworks proving keys; and +- a Mobench crate at `crates/zk-mobile-bench`. + +Verify the checked-in source artifacts before building: + +```bash +benchmarks/v1/scripts/verify-circom-artifacts.sh +``` + +Compile the pinned mobile crate and generate one real Arkworks Groth16 query +proof with: + +```bash +benchmarks/v1/scripts/smoke-arkworks-oprf.sh +``` + +The first Arkworks mobile run should reuse the source crate's query functions: + +- `bench_query_witness_generation_only`; +- `bench_query_proving_only`; +- `bench_query_cached_proof_generation`; and +- the matching nullifier functions. + +These are World ID application circuits. They are not semantically equivalent +to the smaller `oprf-nr/oprf_example` Noir circuit and must be reported as a +separate workload. + +## Passport + +Self's passport flow is a two-proof product flow: + +1. a signature-specific registration circuit; and +2. `vc_and_disclose`, which applies disclosure and age predicates. + +That is not equivalent to ProveKit's monolithic `complete_age_check`. Report +both Self stages separately until a matching Circom statement exists. Never +present either stage alone as a direct passport comparison. + +The portable Circom WASM and `--no_asm` C++ witness generators agree +byte-for-byte with their reference WTNS files. The current +`circom-witness-rs` graph generator does not support these Self circuits: +graph generation reaches `Fr_isTrue` with a runtime-dependent node. This is a +dynamic-control-flow compatibility boundary, not an optimization-level flag. +Supporting an Arkworks Self passport lane requires either refactoring those +branches into named `bbf*` Circom functions with matching Rust blackboxes, or +adding symbolic branch/select support to the witness graph engine. The World +ID OPRF graphs remain the working Arkworks mobile lane. + +## Passkey + +No licensed Circom circuit was found that matches the benchmark's ES256 +assertion statement (challenge, RP ID hash, ceremony type, origin, flags, and +credential key). This lane remains a new-circuit task and an equivalence gate. + +## Rapidsnark mobile + +The pinned Rapidsnark source supports Android NDK and iOS static-library +builds. The adapter must expose witness, prove, and verify phases separately +through Mobench. Before distributing an iOS app, document the LGPL relinking +strategy for the statically linked library. + +The host prover bootstrap is: + +```bash +benchmarks/v1/scripts/build-rapidsnark-host.sh +``` diff --git a/benchmarks/v1/legacy/retired-docs/input-to-proof-data-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/input-to-proof-data-before-cleanup.md new file mode 100644 index 000000000..7d8e609da --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/input-to-proof-data-before-cleanup.md @@ -0,0 +1,94 @@ +# Input-to-proof benchmark data + +This campaign measures the complete local path from raw circuit inputs through fresh witness generation to serialized proof bytes. Verification and tamper rejection are correctness gates outside the headline duration. + +`input-to-proof-samples.csv` intentionally extends the existing `benchmark-samples.csv` column order. Its final two columns are `timing_mode` and `input_to_proof_time_ms`. + +- `cold_local`: a fresh app/browser process and proof runtime for every attempt. Locked assets are already local; downloads are excluded. +- `warm_reuse`: the runtime remains initialized, but witness generation and proving are repeated for every attempt. + +The historical proof-only semantic-parity CSV is immutable at +`../legacy/semantic-parity/semantic-parity-samples.csv` and is not imported as +input-to-proof evidence. + +The campaign has four workloads. `passport_complete_age_check` preserves the earlier Passport lane; `passport_p1` is the additional exact source pair at `noir/passport_p1/src/main.nr` and `circom/passport_p1/passport_p1.circom`. + +The nominal all-success coverage is 72 logical series and 432 rows: + +- 4 semantic profiles +- 3 targets +- 3 proof stacks +- 2 timing modes +- 1 warmup plus 5 measured attempts + +The current canonical freeze contains 417 rows: 414 valid attempts across 69 +complete series, plus two fixed-16 Mac Circom/WebAuthn gap rows and one +structured E15 Circom/WebAuthn out-of-memory gap row. No failed attempt is +expanded into synthetic warmup or measured rows. The Mac rows were merged from +`wasm-multithread-16-samples.csv` with +`merge-mac-fixed16.ts`; the mobile rows retain their original evidence. + +Mac preparation and execution: + +```bash +bash benchmarks/v1/scripts/prepare-passport-p1-circom-browser.sh +bash benchmarks/v1/scripts/build-provekit-v1-wasm.sh +bash benchmarks/v1/wasm/scripts/build.sh +bash benchmarks/v1/barretenberg/web/build.sh +bun run benchmarks/v1/scripts/run-mac-input-to-proof.ts +bun run benchmarks/v1/input-to-proof-data/export.ts +bun test benchmarks/v1/input-to-proof-data/export.test.ts +``` + +After the native iPhone warm campaign and every six-launch fresh-process cold +batch have been fetched, export both completed targets with: + +```bash +INPUT_TO_PROOF_EXPORT_TARGETS=mac_chrome,iphone_se_2022 \ + bun run benchmarks/v1/input-to-proof-data/export.ts +``` + +The iPhone exporter reads only passed BrowserStack build/session artifacts. +It expands a cold batch's six-report JSON array into launch indices zero +through five while retaining the shared build/session provenance. +It preserves build/session IDs and raw-report hashes. The historical staged +Circom Passport row sums registration and disclosure latency, payload, and +proof bytes while taking the larger of the two process-RSS peaks. A warmup's +per-attempt RSS remains blank because Mobench exposes sample RSS only for the +five measured iterations; the run-wide peak is not substituted. + +Native ProveKit V1 exposes witness generation and proving as a single timed +operation. Its `input_to_proof_time_ms` and `prover_time_ms` therefore contain +that integrated operation, while `witness_time_ms` is blank. Native Noir and +Circom retain their directly measured witness/prove split. + +The iPhone Circom OPRF rows identify `wasmi-0.46.0-circom-wasm` as the witness +backend and `rust-rapidsnark-0.1.4` as the prover. The timed region consumes raw +input, interprets the exact Circom witness Wasm, serializes WTNS, and serializes +the Rapidsnark proof. Other iPhone Circom workloads retain `rust-witness-0.1.6`. + +Only the hash-matched final evidence set belongs under +`target/v1-benchmarks/input-to-proof/iphone/publication`. Failed attempts, +superseded valid runs from a different frozen bundle, tunnel logs, and retry +diagnostics remain alongside it under the broader `iphone/` evidence root but +are intentionally outside the export scan. + +The E15 input-to-proof freeze has 23 successful logical series. The remaining +series, `webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local`, +is an explicit `runtime_failed` / `out_of_memory` gap. Rapidsnark reached the +native worker but could not map the 1,733,145,772-byte WebAuthn zkey alongside +the 109,218,412-byte WTNS in the 32-bit `armeabi-v7a` userspace. The final +report and logcat hashes are recorded in +[`e15-webauthn-cold-gap.json`](e15-webauthn-cold-gap.json). All timing, proof, +payload, and memory fields for this gap are null; APK size is transport +evidence only and is not a proving-payload measurement. + +The Mac runner is resumable. It writes one immutable JSON file per logical +series under `target/v1-benchmarks/input-to-proof/mac-chrome`. Set +`INPUT_TO_PROOF_SERIES` to a schema series ID to run one series, and use +`--force` only when intentionally replacing that raw series. + +Correctness fixtures such as `witness.gz` and `reference.wtns` may be used for +preflight comparison, but cannot enter the measured boundary or the proving +payload of an input-to-proof row. The payload consists of the circuit/proving +material and raw input needed to create that proof. diff --git a/benchmarks/v1/legacy/retired-docs/noir-webauthn-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/noir-webauthn-README-before-cleanup.md new file mode 100644 index 000000000..cbe2e9f51 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/noir-webauthn-README-before-cleanup.md @@ -0,0 +1,45 @@ +# WebAuthn assertion benchmark + +This circuit isolates one ES256 assertion from the World ID passkey ownership +flow. It deliberately excludes registration, slot commitments, registry +membership, and uniqueness. + +The statement binds: + +- the P-256 credential public key; +- the challenge embedded in `clientDataJSON`; +- the RP ID hash in `authenticatorData`; +- the `webauthn.get` ceremony type; +- the expected origin; and +- required authenticator flags (the fixture requires user presence and user + verification). + +The P-256 implementation is the `webauthn` library vendored by the pinned +World ID Protocol source. It currently relies on a `noir_bigcurve` vendor tree +whose redistribution license needs clarification. The benchmark therefore +references the pinned checkout under `target/` instead of copying that tree +into ProveKit. + +Generate the deterministic fixture: + +```bash +bun install --frozen-lockfile +bun run fixture +``` + +This writes matching `Prover.toml` and browser-ready `inputs.json` files. + +Compile with the V1-compatible Noir frontend: + +```bash +nargo compile --force --skip-brillig-constraints-check +``` + +Use Noir `1.0.0-beta.11`. Newer Noir versions are not API-compatible with the +pinned WebAuthn dependencies. + +To compile, prepare, prove, verify, and hash the complete native artifact set: + +```bash +benchmarks/v1/scripts/build-provekit-webauthn.sh +``` diff --git a/benchmarks/v1/legacy/retired-docs/rapidsnark-mobile-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/rapidsnark-mobile-README-before-cleanup.md new file mode 100644 index 000000000..aa25c70ea --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/rapidsnark-mobile-README-before-cleanup.md @@ -0,0 +1,18 @@ +# Native Rapidsnark Mobench adapter + +This crate measures the two-proof Self passport flow with the pinned +`zkmopro/rust-rapidsnark` native wrapper: + +- `passport-register`: RSA-4096 passport registration; +- `passport-disclose`: VC disclosure. + +Each build enables exactly one feature so BrowserStack installs only one +proving key. The `.zkey` and frozen `.wtns` are app resources, not Rust +`include_bytes!` data. Resource loading happens in Mobench's per-iteration +setup and is excluded from `bench_passport_rapidsnark_prove`. + +Use `../scripts/build-rapidsnark-mobile-ios.sh passport-disclose` or +`../scripts/build-rapidsnark-mobile-ios.sh passport-register` to build and +stage an ad-hoc-signed IPA plus its BrowserStack XCUITest bundle. +The two proofs are separate protocol stages and must not be reported as one +proof equivalent to the Noir complete-age-check circuit. diff --git a/benchmarks/v1/legacy/retired-docs/rapidsnark-register-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/rapidsnark-register-README-before-cleanup.md new file mode 100644 index 000000000..cd426beaa --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/rapidsnark-register-README-before-cleanup.md @@ -0,0 +1,6 @@ +# Self passport registration mobile target + +This package selects the `passport-register` feature of the shared native +Rapidsnark Mobench adapter. It exists as a separate package because Mobench +0.1.48 does not expose Cargo feature selection; a separate package keeps the +499.11 MB registration zkey out of the smaller disclosure app. diff --git a/benchmarks/v1/legacy/retired-docs/rapidsnark-webauthn-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/rapidsnark-webauthn-README-before-cleanup.md new file mode 100644 index 000000000..f5181910d --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/rapidsnark-webauthn-README-before-cleanup.md @@ -0,0 +1,9 @@ +# Native Rapidsnark WebAuthn Mobench adapter + +This adapter proves the pinned `privacy-ethereum/webauth-circom` assertion +fixture with the standard SnarkJS Groth16 zkey and the pinned +`zkmopro/rust-rapidsnark`-derived native wrapper. + +It registers prove, verify, and end-to-end functions. Circom witness +generation is measured once by the matching Mopro Arkworks adapter; it is +shared circuit work and is not attributed to Rapidsnark. diff --git a/benchmarks/v1/legacy/retired-docs/wasm-README-before-cleanup.md b/benchmarks/v1/legacy/retired-docs/wasm-README-before-cleanup.md new file mode 100644 index 000000000..64a2ac5f3 --- /dev/null +++ b/benchmarks/v1/legacy/retired-docs/wasm-README-before-cleanup.md @@ -0,0 +1,104 @@ +# Browser/WASM benchmark lane + +Browser proving is an execution backend, not a mobile target. Native device +runs continue to use BrowserStack App Automate; real browser runs require +BrowserStack Automate/WebDriver and a static HTTPS site or BrowserStack Local. + +The V1 WASM crate exposes the threaded runtime needed for the Mac campaign: + +- `parallel` plus `wasm-bindgen-rayon`: the shared-memory worker build; +- the historical runner policy, which never calls `initThreadPool`, is the + single-thread baseline. The generated V1 package is kept pinned to the same + V1 commit for both policies. + +Select the policy with `MOBENCH_WASM_THREADS=single` (default), `auto`, or an +explicit count from 2 through 32. `auto` records a single-thread fallback with +the reason when the page is not cross-origin isolated; an explicit count fails +instead of silently producing a scalar measurement. The generated package +manifest records the build variant and requested policy, while each result +records the actual pool mode and count. + +`bun run build` keeps the threaded generated package in +`v1-wasm-pkg-threaded/` (and mirrors it into the ignored Vite import alias for +that build). Direct invocations of `build-provekit-v1-wasm.sh` can select an +explicit output with `PROVEKIT_V1_WASM_PACKAGE_DIR`. + +The first gate is a local macOS browser smoke. The multithread campaign must +report `crossOriginIsolated`, `SharedArrayBuffer`, and an initialized Rayon +pool before its timings are accepted. Only after that passes should the same immutable static bundle run through +BrowserStack Local on mobile Safari and Chrome. + +The publication workflow also uses Mobench 0.1.48's `build --target web` and +`run-web` path. Its repository-owned adapter is +`bench-mobile/src/lib_web.rs`; `bench-mobile/scripts/prepare-web-benchmarks.sh` +generates the seven complete/fragmented/WebAuthn/OPRF witnesses outside +measurement and selects the portable browser dependency graph. The workflow +builds one bundle per workload and runs all four primary proof functions +against four BrowserStack Automate environments. + +Build and run that gate with: + +```bash +cd benchmarks/v1/wasm +bun install --frozen-lockfile +MOBENCH_WASM_THREADS=auto bun run build +MOBENCH_WASM_THREADS=auto bun run smoke +``` + +Omit `MOBENCH_WASM_THREADS=auto` for the historical single-thread build and +smoke. + +The build uses a separate Cargo target directory and overrides the repository's +threaded WASM linker flags. The pinned V1 `provekit-wasm` crate always exports +the Rayon hooks, so the historical single-thread lane is defined by not +initializing the pool rather than by replacing the V1 proving artifact. + +The browser runner must report: + +- initialization, witness, prove, and verify time; +- proof and bundle bytes; +- circuit constraint/witness counts; +- browser/device/runtime metadata; +- success, verification failure, timeout, crash, or likely OOM; and +- memory metrics with their exact scope. + +Portable browser process RSS is unavailable. Chromium heap APIs and WASM +linear-memory size are best-effort metrics; Safari peak memory must not be +presented as exact. + +The initial runner reports Chromium's used JavaScript heap only when available, +and labels it as neither WASM high-water memory nor process RSS. + +## BrowserStack real-device command + +First resolve an available iPhone SE 2022 and iOS pairing in BrowserStack's +current device catalog. The matrix deliberately does not hard-code iOS 15: +availability and the browser/WASM runtime must be checked immediately before a +publication run. Freeze the selected version in the command environment and in +the saved result. + +Start a BrowserStack Local tunnel with a unique local identifier, then run: + +```bash +export BROWSERSTACK_USERNAME='...' +export BROWSERSTACK_ACCESS_KEY='...' +export BROWSERSTACK_LOCAL_IDENTIFIER='provekit-v1-unique-id' +export BROWSERSTACK_OS_VERSION='resolved-version' +bun run browserstack -- ios_safari_single +``` + +The command serves the already-built `dist/` bundle, verifies every file +against `dist/manifest.json` before opening a paid session, and emits one JSON +record conforming to `browserstack-run.schema.json`. It never writes or prints +the BrowserStack credentials. Use `MOBENCH_WARMUP` and `MOBENCH_ITERATIONS` to +override the publication defaults of one and five. + +Bundle verification can be run without credentials or a paid session: + +```bash +bun run browserstack -- --verify-bundle +``` + +Do not put BrowserStack secrets in feature-branch jobs. A trusted runner must +verify a static asset manifest (path, size, SHA-256, MIME type, no symlinks) +before serving it and opening the credentialed WebDriver session. diff --git a/benchmarks/v1/legacy/scripts/android-appium-evidence.test.ts b/benchmarks/v1/legacy/scripts/android-appium-evidence.test.ts new file mode 100644 index 000000000..35e51181a --- /dev/null +++ b/benchmarks/v1/legacy/scripts/android-appium-evidence.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, test } from "bun:test"; +import { + parseDevice, + reconstructBenchResults, + slugify, + verifyBenchContract, +} from "./android-appium-evidence"; + +const functionName = "bench_mobile::bench_oprf_verify"; +const payload = { + spec: { name: functionName, iterations: 5, warmup: 1 }, + samples: [11, 12, 13, 14, 15].map((duration_ns) => ({ duration_ns })), + function: functionName, + samples_ns: [11, 12, 13, 14, 15], +}; + +describe("Android Appium evidence", () => { + test("reconstructs chunked BENCH_JSON with logcat prefixes", () => { + const json = JSON.stringify(payload); + const split = Math.floor(json.length / 2); + const log = [ + "07-26 I/BenchRunner: BENCH_JSON_START", + `07-26 I/BenchRunner: BENCH_JSON_CHUNK ${json.slice(0, split)}`, + `07-26 I/BenchRunner: BENCH_JSON_CHUNK ${json.slice(split)}`, + "07-26 I/BenchRunner: BENCH_JSON_END", + ].join("\n"); + const results = reconstructBenchResults(log); + expect(results).toHaveLength(1); + expect(() => verifyBenchContract(results[0]!, functionName)).not.toThrow(); + }); + + test("rejects an incomplete sampling contract", () => { + const invalid = structuredClone(payload); + invalid.samples_ns.pop(); + expect(() => verifyBenchContract(invalid, functionName)).toThrow( + "five positive integer samples_ns", + ); + }); + + test("rejects unterminated evidence", () => { + expect(() => + reconstructBenchResults( + "I/BenchRunner: BENCH_JSON_START\nI/BenchRunner: BENCH_JSON_CHUNK {}", + ), + ).toThrow("ended inside"); + }); + + test("parses BrowserStack device labels from the final separator", () => { + expect(parseDevice("Samsung Galaxy S24-14.0")).toEqual({ + label: "Samsung Galaxy S24-14.0", + deviceName: "Samsung Galaxy S24", + osVersion: "14.0", + }); + }); + + test("creates stable filesystem slugs", () => { + expect(slugify(functionName)).toBe("bench-mobile-bench-oprf-verify"); + }); +}); diff --git a/benchmarks/v1/legacy/scripts/android-appium-evidence.ts b/benchmarks/v1/legacy/scripts/android-appium-evidence.ts new file mode 100644 index 000000000..c314e4d43 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/android-appium-evidence.ts @@ -0,0 +1,267 @@ +import { createHash } from "node:crypto"; +import { basename, dirname, resolve } from "node:path"; + +export type JsonObject = Record; + +export interface BenchResult extends JsonObject { + function: string; + spec: { + name: string; + iterations: number; + warmup: number; + }; + samples: Array<{ duration_ns: number } & JsonObject>; + samples_ns: number[]; +} + +export interface AabEntry { + function: string; + source_apk: { + path: string; + sha256: string; + }; + release_aab: { + path: string; + sha256: string; + bytes: number; + }; + embedded_native_library: { + archive_path: string; + sha256: string; + }; + embedded_bench_spec: { + archive_path: string; + sha256: string; + }; + build_profile: "release"; + signed: boolean; +} + +export interface AabManifest { + schema: "provekit.android-release-aabs.v1"; + source_sha: string; + warmup: 1; + iterations: 5; + entries: AabEntry[]; +} + +export function isSha256(value: unknown): value is string { + return typeof value === "string" && /^[0-9a-f]{64}$/.test(value); +} + +export function isSourceSha(value: unknown): value is string { + return ( + typeof value === "string" && + (/^[0-9a-f]{40}$/.test(value) || /^[0-9a-f]{64}$/.test(value)) + ); +} + +export async function sha256File(path: string): Promise { + const hash = createHash("sha256"); + const file = Bun.file(path); + if (!(await file.exists())) throw new Error(`file does not exist: ${path}`); + for await (const chunk of file.stream()) hash.update(chunk); + return hash.digest("hex"); +} + +export function slugify(value: string): string { + const slug = value + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 96); + if (!slug) throw new Error(`cannot derive a safe slug from ${value}`); + return slug; +} + +export function parseDevice(value: string): { + label: string; + deviceName: string; + osVersion: string; +} { + const separator = value.lastIndexOf("-"); + if (separator <= 0 || separator === value.length - 1) { + throw new Error( + `device must use BrowserStack's "Device Name-OS.Version" form: ${value}`, + ); + } + return { + label: value, + deviceName: value.slice(0, separator), + osVersion: value.slice(separator + 1), + }; +} + +export function reconstructBenchResults(deviceLog: string): BenchResult[] { + const results: BenchResult[] = []; + let chunks: string[] | undefined; + for (const line of deviceLog.split(/\r?\n/)) { + if (line.includes("BENCH_JSON_START")) { + chunks = []; + continue; + } + const marker = "BENCH_JSON_CHUNK "; + const markerOffset = line.indexOf(marker); + if (markerOffset >= 0 && chunks) { + chunks.push(line.slice(markerOffset + marker.length)); + continue; + } + if (line.includes("BENCH_JSON_END") && chunks) { + const json = chunks.join(""); + chunks = undefined; + let parsed: unknown; + try { + parsed = JSON.parse(json); + } catch (error) { + throw new Error( + `device log contains malformed BENCH_JSON: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + throw new Error("BENCH_JSON payload must be an object"); + } + results.push(parsed as BenchResult); + } + } + if (chunks) throw new Error("device log ended inside a BENCH_JSON payload"); + return results; +} + +export function verifyBenchContract( + result: BenchResult, + expectedFunction: string, +): void { + if (result.function !== expectedFunction) { + throw new Error( + `BENCH_JSON function mismatch: ${String(result.function)} != ${expectedFunction}`, + ); + } + if ( + !result.spec || + result.spec.name !== expectedFunction || + result.spec.warmup !== 1 || + result.spec.iterations !== 5 + ) { + throw new Error( + `BENCH_JSON contract mismatch for ${expectedFunction}; expected warmup=1 iterations=5`, + ); + } + if (!Array.isArray(result.samples) || result.samples.length !== 5) { + throw new Error( + `BENCH_JSON for ${expectedFunction} must contain five samples`, + ); + } + if ( + !Array.isArray(result.samples_ns) || + result.samples_ns.length !== 5 || + result.samples_ns.some( + (sample) => !Number.isSafeInteger(sample) || sample <= 0, + ) + ) { + throw new Error( + `BENCH_JSON for ${expectedFunction} must contain five positive integer samples_ns`, + ); + } + for (let index = 0; index < 5; index += 1) { + const duration = result.samples[index]?.duration_ns; + if (duration !== result.samples_ns[index]) { + throw new Error( + `BENCH_JSON sample ${index} does not match samples_ns for ${expectedFunction}`, + ); + } + } +} + +function assertObject( + value: unknown, + description: string, +): asserts value is JsonObject { + if (!value || typeof value !== "object" || Array.isArray(value)) { + throw new Error(`${description} must be an object`); + } +} + +export async function loadAndVerifyAabManifest( + manifestPath: string, +): Promise { + const absoluteManifest = resolve(manifestPath); + let parsed: unknown; + try { + parsed = await Bun.file(absoluteManifest).json(); + } catch (error) { + throw new Error( + `could not read AAB manifest ${absoluteManifest}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + assertObject(parsed, "AAB manifest"); + if (parsed.schema !== "provekit.android-release-aabs.v1") { + throw new Error(`unsupported AAB manifest schema: ${String(parsed.schema)}`); + } + if (!isSourceSha(parsed.source_sha)) { + throw new Error("AAB manifest source_sha must be 40 or 64 lowercase hex"); + } + if (parsed.warmup !== 1 || parsed.iterations !== 5) { + throw new Error("AAB manifest must declare warmup=1 and iterations=5"); + } + if (!Array.isArray(parsed.entries) || parsed.entries.length === 0) { + throw new Error("AAB manifest entries must be a non-empty array"); + } + const seen = new Set(); + for (const [index, rawEntry] of parsed.entries.entries()) { + assertObject(rawEntry, `AAB manifest entry ${index}`); + if ( + typeof rawEntry.function !== "string" || + rawEntry.function.length === 0 || + seen.has(rawEntry.function) + ) { + throw new Error(`entry ${index} has an invalid or duplicate function`); + } + seen.add(rawEntry.function); + if (rawEntry.build_profile !== "release") { + throw new Error(`entry ${index} is not a release build`); + } + if (rawEntry.signed !== true) { + throw new Error(`entry ${index} AAB is not signed`); + } + assertObject(rawEntry.release_aab, `entry ${index} release_aab`); + if ( + typeof rawEntry.release_aab.path !== "string" || + !isSha256(rawEntry.release_aab.sha256) || + !Number.isSafeInteger(rawEntry.release_aab.bytes) || + (rawEntry.release_aab.bytes as number) <= 0 + ) { + throw new Error(`entry ${index} has invalid release_aab metadata`); + } + const aabPath = resolve( + dirname(absoluteManifest), + rawEntry.release_aab.path, + ); + const actualHash = await sha256File(aabPath); + if (actualHash !== rawEntry.release_aab.sha256) { + throw new Error( + `entry ${index} AAB hash mismatch for ${basename(aabPath)}`, + ); + } + if (Bun.file(aabPath).size !== rawEntry.release_aab.bytes) { + throw new Error( + `entry ${index} AAB size mismatch for ${basename(aabPath)}`, + ); + } + rawEntry.release_aab.path = aabPath; + } + return parsed as unknown as AabManifest; +} + +export async function writeJsonAtomic( + path: string, + value: unknown, +): Promise { + const temporary = `${path}.tmp-${process.pid}`; + await Bun.write(temporary, `${JSON.stringify(value, null, 2)}\n`); + await Bun.$`mv ${temporary} ${path}`.quiet(); +} + diff --git a/benchmarks/v1/legacy/scripts/build-barretenberg-mobile.sh b/benchmarks/v1/legacy/scripts/build-barretenberg-mobile.sh new file mode 100755 index 000000000..1b76efd51 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/build-barretenberg-mobile.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash + +set -euo pipefail + +platform="${1:-}" +case "${platform}" in + host | ios | android) ;; + *) + echo "usage: $0 " >&2 + exit 2 + ;; +esac + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +adapter_root="${benchmark_root}/barretenberg-mobile" +source_root="${repo_root}/target/v1-benchmarks/src/aztec-packages-v0.87.0" +# Keep the build directory revisioned. CMake caches toolchain-derived target +# properties before the first project() call, so reusing an older directory can +# silently retain an empty iOS architecture even after the toolchain is fixed. +build_revision="v3" +build_root="${repo_root}/target/v1-benchmarks/barretenberg-mobile/${platform}-${build_revision}" +expected_commit="9081b0ed38c43c120afb7c80f8f6cd418ca5ad70" + +if [[ ! -d "${source_root}/.git" ]]; then + mkdir -p "$(dirname "${source_root}")" + git clone --filter=blob:none --no-checkout \ + https://github.com/AztecProtocol/aztec-packages.git "${source_root}" +fi + +git -C "${source_root}" fetch --depth 1 origin "${expected_commit}" +git -C "${source_root}" checkout --detach "${expected_commit}" +actual_commit="$(git -C "${source_root}" rev-parse HEAD)" +if [[ "${actual_commit}" != "${expected_commit}" ]]; then + echo "error: expected upstream ${expected_commit}, got ${actual_commit}" >&2 + exit 1 +fi + +generator="Unix Makefiles" +if command -v ninja >/dev/null 2>&1; then + generator="Ninja" +fi + +cmake_args=( + -S "${adapter_root}" + -B "${build_root}" + -G "${generator}" + -DBB_V087_CPP_SOURCE="${source_root}/barretenberg/cpp" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_INSTALL_PREFIX="${build_root}/install" +) + +case "${platform}" in + ios) + cmake_args+=( + -DCMAKE_TOOLCHAIN_FILE="${adapter_root}/cmake/ios-arm64.cmake" + -DCMAKE_OSX_SYSROOT=iphoneos + -DCMAKE_OSX_ARCHITECTURES=arm64 + -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 + ) + ;; + android) + if [[ -z "${ANDROID_NDK_HOME:-}" ]]; then + default_ndk="/Users/dcbuilder/Library/Android/sdk/ndk/26.1.10909125" + if [[ -d "${default_ndk}" ]]; then + export ANDROID_NDK_HOME="${default_ndk}" + else + echo "error: set ANDROID_NDK_HOME to an installed Android NDK" >&2 + exit 1 + fi + fi + cmake_args+=( + -DCMAKE_TOOLCHAIN_FILE="${adapter_root}/cmake/android-arm64.cmake" + ) + ;; +esac + +cmake "${cmake_args[@]}" + +# The v0.87 ExternalProject asks the current default branch of the msgpack fork +# for an older, still-addressable commit. A plain clone no longer contains that +# object after an upstream history rewrite, while an explicit commit fetch does. +# Prime the generated ExternalProject checkout without modifying pinned source. +msgpack_prefix="${build_root}/_deps/msgpack-c" +msgpack_source="${msgpack_prefix}/src/msgpack-c" +msgpack_stamp="${msgpack_prefix}/src/msgpack-c-stamp" +msgpack_commit="5ee9a1c8c325658b29867829677c7eb79c433a98" +mkdir -p "$(dirname "${msgpack_source}")" +if [[ ! -d "${msgpack_source}/.git" ]]; then + git clone --no-checkout https://github.com/AztecProtocol/msgpack-c.git \ + "${msgpack_source}" +fi +git -C "${msgpack_source}" fetch origin "${msgpack_commit}" +git -C "${msgpack_source}" checkout --detach "${msgpack_commit}" +if [[ -f "${msgpack_stamp}/msgpack-c-gitinfo.txt" ]]; then + cp "${msgpack_stamp}/msgpack-c-gitinfo.txt" \ + "${msgpack_stamp}/msgpack-c-gitclone-lastrun.txt" +fi + +cmake --build "${build_root}" --target barretenberg_v087_mobile --parallel + +adapter_archive="${build_root}/libbarretenberg_v087_mobile.a" +upstream_archive="${build_root}/lib/libbarretenberg.a" +if [[ ! -f "${adapter_archive}" || ! -f "${upstream_archive}" ]]; then + echo "error: build completed without both exact v0.87 archives" >&2 + exit 1 +fi +mkdir -p "${build_root}/install/lib" "${build_root}/install/include" +cp "${adapter_archive}" "${build_root}/install/lib/" +cp "${upstream_archive}" "${build_root}/install/lib/" +cp "${adapter_root}/include/bb_v087_mobile.h" "${build_root}/install/include/" +library="${build_root}/install/lib/libbarretenberg_v087_mobile.a" + +case "${platform}" in + ios) + lipo "${library}" -verify_arch arm64 + lipo "${build_root}/install/lib/libbarretenberg.a" -verify_arch arm64 + ;; + android) + ndk_bin="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/bin" + first_member="$("${ndk_bin}/llvm-ar" t "${library}" | head -n 1)" + if ! "${ndk_bin}/llvm-ar" p "${library}" "${first_member}" | + file - | grep -q "ELF 64-bit.*ARM aarch64"; then + echo "error: Android archive does not contain AArch64 ELF objects" >&2 + exit 1 + fi + ;; +esac + +shasum -a 256 "${library}" +shasum -a 256 "${build_root}/install/lib/libbarretenberg.a" diff --git a/benchmarks/v1/legacy/scripts/build-e15-taceo-candidate-apk.sh b/benchmarks/v1/legacy/scripts/build-e15-taceo-candidate-apk.sh new file mode 100755 index 000000000..038ed5500 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/build-e15-taceo-candidate-apk.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +[[ $# -eq 1 ]] || { echo "usage: $0 " >&2; exit 2; } +suffix="$1" +[[ "${suffix}" =~ ^[a-z][a-z0-9]*$ ]] || { echo "invalid package suffix" >&2; exit 2; } + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +android="${repo_root}/target/v1-benchmarks/taceo-e15-worldid/android" +output="${repo_root}/target/v1-benchmarks/taceo-e15-worldid/apks/${suffix}.apk" +java_home="${JAVA_HOME:-${HOME}/.local/share/mise/installs/java/temurin-21.0.11+10.0.LTS}" +android_home="${ANDROID_HOME:-${HOME}/Library/Android/sdk}" + +mkdir -p "$(dirname "${output}")" +(cd "${android}" && JAVA_HOME="${java_home}" ANDROID_HOME="${android_home}" \ + ./gradlew assembleRelease "-PcandidateSuffix=.${suffix}" -x lintVitalRelease >/dev/null) +JAVA_HOME="${java_home}" "${android_home}/build-tools/36.0.0/apksigner" sign \ + --ks "${HOME}/.android/debug.keystore" --ks-pass pass:android --key-pass pass:android \ + --out "${output}" "${android}/app/build/outputs/apk/release/app-release-unsigned.apk" +shasum -a 256 "${output}" diff --git a/benchmarks/v1/legacy/scripts/embed-barretenberg-mobile-runtime.ts b/benchmarks/v1/legacy/scripts/embed-barretenberg-mobile-runtime.ts new file mode 100644 index 000000000..4e6a893eb --- /dev/null +++ b/benchmarks/v1/legacy/scripts/embed-barretenberg-mobile-runtime.ts @@ -0,0 +1,205 @@ +#!/usr/bin/env bun + +import { createHash } from "node:crypto"; +import { + copyFile, + mkdir, + readFile, + readdir, + stat, + unlink, + writeFile, +} from "node:fs/promises"; +import { basename, join, resolve } from "node:path"; + +type Platform = "ios" | "android"; +type Asset = { + path: string; + role: string; + bytes: number; + sha256: string; +}; +type Manifest = { + schema_version: number; + backend: string; + backend_version: string; + noir_version: string; + upstream_commit: string; + platform: Platform; + network_at_device: boolean; + assets: Asset[]; +}; + +function usage(): never { + throw new Error( + "usage: embed-barretenberg-mobile-runtime.ts " + + "--platform --package-root --app-root ", + ); +} + +function options(args: string[]): { + platform: Platform; + packageRoot: string; + appRoot: string; +} { + const values = new Map(); + for (let index = 0; index < args.length; index += 2) { + const flag = args[index]; + const value = args[index + 1]; + if (!flag?.startsWith("--") || !value) usage(); + values.set(flag.slice(2), value); + } + const platform = values.get("platform"); + const packageRoot = values.get("package-root"); + const appRoot = values.get("app-root"); + if ( + (platform !== "ios" && platform !== "android") || + !packageRoot || + !appRoot + ) { + usage(); + } + return { + platform, + packageRoot: resolve(packageRoot), + appRoot: resolve(appRoot), + }; +} + +function encodedResourceName(path: string): string { + let encoded = path.replaceAll("/", "_").replaceAll(".", "_").replaceAll("-", "_"); + while (encoded.includes("__")) encoded = encoded.replaceAll("__", "_"); + return `libmobench_bb_v087_${encoded}.so`; +} + +async function sha256(path: string): Promise { + return createHash("sha256") + .update(new Uint8Array(await Bun.file(path).arrayBuffer())) + .digest("hex"); +} + +const selected = options(Bun.argv.slice(2)); +const manifestPath = join( + selected.packageRoot, + "runtime-package-manifest.json", +); +const manifest = (await Bun.file(manifestPath).json()) as Manifest; +if ( + manifest.schema_version !== 1 || + manifest.backend !== "barretenberg" || + manifest.backend_version !== "0.87.0" || + manifest.noir_version !== "1.0.0-beta.11" || + manifest.upstream_commit !== + "9081b0ed38c43c120afb7c80f8f6cd418ca5ad70" || + manifest.platform !== selected.platform || + manifest.network_at_device || + manifest.assets.some((asset) => asset.role.startsWith("native-")) +) { + throw new Error("runtime package identity or asset contract mismatch"); +} + +const destination = + selected.platform === "android" + ? join(selected.appRoot, "app/src/main/jniLibs/arm64-v8a") + : join(selected.appRoot, "BenchRunner/BenchRunner/Resources"); +await mkdir(destination, { recursive: true }); +if (selected.platform === "ios") { + const projectPath = join(selected.appRoot, "BenchRunner/project.yml"); + let project = await readFile(projectPath, "utf8"); + if (!project.includes('OTHER_LDFLAGS: "$(inherited) -lz"')) { + const headerSearch = + ' HEADER_SEARCH_PATHS: "$(PROJECT_DIR)/BenchRunner/Generated"\n'; + if (!project.includes(headerSearch)) { + throw new Error("generated iOS project has no expected app link settings"); + } + project = project.replace( + headerSearch, + `${headerSearch} OTHER_LDFLAGS: "$(inherited) -lz"\n`, + ); + await writeFile(projectPath, project); + } +} else { + const gradlePath = join(selected.appRoot, "app/build.gradle"); + let gradle = await readFile(gradlePath, "utf8"); + const minSdkPattern = /minSdk(?:Version)?\s*[= ]\s*(\d+)/; + const minSdkMatch = gradle.match(minSdkPattern); + if (!minSdkMatch) { + throw new Error("generated Android project has no minSdk declaration"); + } + const generatedMinSdk = Number(minSdkMatch[1]); + if (generatedMinSdk > 28) { + throw new Error( + `generated Android minSdk ${generatedMinSdk} exceeds the campaign API 28 contract`, + ); + } + gradle = gradle.replace(minSdkPattern, "minSdk 28"); + if (!gradle.includes("useLegacyPackaging true")) { + gradle = gradle.replace( + "jniLibs {\n", + "jniLibs {\n useLegacyPackaging true\n", + ); + } + if (!gradle.includes("libmobench_bb_v087_*.so")) { + gradle = gradle.replace( + 'keepDebugSymbols += ["**/libprovekit_v1_barretenberg_mobile.so"]', + 'keepDebugSymbols += ["**/libprovekit_v1_barretenberg_mobile.so", ' + + '"**/libmobench_bb_v087_*.so"]', + ); + } + await writeFile(gradlePath, gradle); +} +for (const entry of await readdir(destination)) { + if (entry.startsWith("libmobench_bb_v087_") && entry.endsWith(".so")) { + await unlink(join(destination, entry)); + } +} + +const inputs = [ + { + path: "runtime-package-manifest.json", + bytes: (await stat(manifestPath)).size, + sha256: await sha256(manifestPath), + }, + ...manifest.assets, +]; +const embedded = []; +for (const input of inputs) { + if ( + input.path.startsWith("/") || + input.path.split("/").some((part) => part === "" || part === "..") + ) { + throw new Error(`unsafe runtime asset path: ${input.path}`); + } + const source = join(selected.packageRoot, input.path); + const metadata = await stat(source); + if ( + !metadata.isFile() || + metadata.size !== input.bytes || + (await sha256(source)) !== input.sha256 + ) { + throw new Error(`runtime asset integrity mismatch: ${input.path}`); + } + const name = encodedResourceName(input.path); + const output = join(destination, name); + await copyFile(source, output); + embedded.push({ + source: input.path, + embedded: basename(output), + bytes: input.bytes, + sha256: input.sha256, + }); +} + +console.log( + JSON.stringify( + { + schema_version: 1, + platform: selected.platform, + package_manifest_sha256: await sha256(manifestPath), + destination, + embedded, + }, + null, + 2, + ), +); diff --git a/benchmarks/v1/legacy/scripts/generate-report-charts.ts b/benchmarks/v1/legacy/scripts/generate-report-charts.ts new file mode 100644 index 000000000..3b4bde1c9 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/generate-report-charts.ts @@ -0,0 +1,460 @@ +import { mkdir } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; + +type Datum = { + label: string; + value: number; + backend?: string; + environment?: string; + device?: string; +}; + +type ChartData = { + iphone_se_proving_seconds: Record; + iphone_se_process_peak_bytes: Datum[]; + provekit_wasm_seconds: Record; + provekit_android_prepare_seconds: Datum[]; + provekit_android_release_seconds: Record; + provekit_android_cached_recovery_proving_seconds: Record; + barretenberg_android_proving_seconds: Record; + arkworks_android_proving_seconds: Record; + mac_noir_proving_seconds: Record; + mac_circom_proving_seconds: Record; + artifact_sizes: Record; +}; + +type BarretenbergIosSummary = { + results: Array<{ + workload: "passport" | "webauthn" | "oprf"; + phase: "prove" | "verify" | "e2e"; + median_ns: number; + process_peak_memory_kb: number; + }>; +}; + +const scriptDirectory = dirname(new URL(import.meta.url).pathname); +const benchmarkRoot = resolve(scriptDirectory, ".."); +const resultRoot = resolve(benchmarkRoot, "results/run-30041758043"); +const chartRoot = resolve(resultRoot, "charts"); +const data = (await Bun.file( + resolve(resultRoot, "report-chart-data.json"), +).json()) as ChartData; +const barretenbergIos = (await Bun.file( + resolve(resultRoot, "barretenberg-mobile-release/ios-v3-summary.json"), +).json()) as BarretenbergIosSummary; + +for (const result of barretenbergIos.results.filter( + (candidate) => candidate.phase === "prove", +)) { + const provingLabel = + result.workload === "oprf" + ? "Barretenberg 0.87 · native · Taceo" + : "Barretenberg 0.87 · native"; + data.iphone_se_proving_seconds[result.workload] = [ + ...data.iphone_se_proving_seconds[result.workload].filter( + (datum) => datum.label !== provingLabel, + ), + { + label: provingLabel, + value: result.median_ns / 1_000_000_000, + backend: "barretenberg", + }, + ]; + const memoryLabel = `${ + result.workload === "passport" + ? "Passport" + : result.workload === "webauthn" + ? "WebAuthn" + : "OPRF" + } · Barretenberg native${result.workload === "oprf" ? " · Taceo" : ""}`; + data.iphone_se_process_peak_bytes = [ + ...data.iphone_se_process_peak_bytes.filter( + (datum) => datum.label !== memoryLabel, + ), + { + label: memoryLabel, + value: result.process_peak_memory_kb * 1_000, + backend: "barretenberg", + }, + ]; +} +await Bun.write( + resolve(resultRoot, "report-chart-data.json"), + `${JSON.stringify(data, null, 2)}\n`, +); + +await mkdir(chartRoot, { recursive: true }); + +const palette: Record = { + provekit: "#2563EB", + barretenberg: "#D97706", + arkworks: "#6D8B3D", + rapidsnark: "#C2416C", + macos: "#334155", + windows: "#2563EB", + ios: "#D97706", + android: "#6D8B3D", + s24: "#2563EB", + pixel7: "#D97706", + m32: "#6D8B3D", +}; + +function escapeXml(value: string): string { + return value + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """); +} + +function formatBytes(bytes: number): string { + const units = ["B", "KB", "MB", "GB", "TB"]; + let value = bytes; + let index = 0; + while (value >= 1_000 && index < units.length - 1) { + value /= 1_000; + index += 1; + } + if (index === 0) return `${Math.round(value)} B`; + const decimals = value >= 100 ? 0 : value >= 10 ? 1 : 2; + return `${value.toFixed(decimals)} ${units[index]}`; +} + +function formatValue(value: number, unit: "s" | "bytes"): string { + if (unit === "s") { + return value >= 10 ? `${value.toFixed(1)} s` : `${value.toFixed(3)} s`; + } + return formatBytes(value); +} + +function colorFor(datum: Datum): string { + const key = datum.backend ?? datum.environment ?? datum.device ?? "provekit"; + return palette[key] ?? "#2563EB"; +} + +function header(width: number, title: string, subtitle: string): string { + return ` + + ${escapeXml(title)} + ${escapeXml(subtitle)} + `; +} + +function panel( + title: string, + rows: Datum[], + y: number, + options: { + width: number; + labelWidth?: number; + plotWidth?: number; + unit: "s" | "bytes"; + max?: number; + }, +): { svg: string; height: number } { + const labelWidth = options.labelWidth ?? 370; + const plotWidth = options.plotWidth ?? options.width - labelWidth - 210; + const plotX = 56 + labelWidth; + const barHeight = 26; + const rowGap = 17; + const rowStep = barHeight + rowGap; + const max = options.max ?? Math.max(...rows.map((row) => row.value)) * 1.08; + const panelHeight = 60 + rows.length * rowStep; + const lines: string[] = []; + + lines.push( + `${escapeXml(title)}`, + ); + for (let tick = 0; tick <= 4; tick += 1) { + const x = plotX + (plotWidth * tick) / 4; + const value = (max * tick) / 4; + lines.push( + ``, + `${formatValue(value, options.unit)}`, + ); + } + + rows.forEach((row, index) => { + const rowY = y + 54 + index * rowStep; + const width = (row.value / max) * plotWidth; + lines.push( + `${escapeXml(row.label)}`, + ``, + `${formatValue(row.value, options.unit)}`, + ); + }); + + return { svg: lines.join("\n"), height: panelHeight }; +} + +function document( + width: number, + height: number, + body: string, + footer: string, +): string { + return ` + + + ${body} + ${escapeXml(footer)} +`; +} + +async function writeSmallMultiples( + filename: string, + title: string, + subtitle: string, + sections: Array<{ title: string; rows: Datum[]; unit?: "s" | "bytes" }>, + unit: "s" | "bytes", + footer: string, + width = 1400, +): Promise { + let y = 116; + const pieces = [header(width, title, subtitle)]; + for (const section of sections) { + const rendered = panel(section.title, section.rows, y, { + width, + unit: section.unit ?? unit, + }); + pieces.push(rendered.svg); + y += rendered.height + 28; + } + const height = y + 58; + await Bun.write( + resolve(chartRoot, filename), + document(width, height, pieces.join("\n"), footer), + ); +} + +await writeSmallMultiples( + "iphone-se-proving-time.svg", + "Proving time on iPhone SE 2022", + "Median of five measured samples after one warmup; native and Safari WASM remain separate execution surfaces", + [ + { + title: "Passport · complete age check", + rows: data.iphone_se_proving_seconds.passport, + }, + { + title: "WebAuthn · assertion ownership", + rows: data.iphone_se_proving_seconds.webauthn, + }, + { + title: "OPRF · Taceo Noir and World ID Circom statements", + rows: data.iphone_se_proving_seconds.oprf, + }, + ], + "s", + "World ID Arkworks query/nullifier and Taceo Noir OPRF are different statements; compare only within a labeled statement.", +); + +await writeSmallMultiples( + "iphone-se-process-peak-memory.svg", + "Maximum process peak on iPhone SE 2022", + "Mobench benchmark-app process high-water mark during proof-only native functions", + [ + { + title: "Native proof functions with retained process memory", + rows: data.iphone_se_process_peak_bytes, + }, + ], + "bytes", + "Browser/WASM process RSS is unavailable and is intentionally excluded.", +); + +await writeSmallMultiples( + "mac-noir-proving-time.svg", + "Noir proving time on Apple M4 Max", + "Native CLIs and Chrome single-thread WASM; median of five measured samples after one warmup", + [ + { + title: "Passport · complete age check", + rows: data.mac_noir_proving_seconds.passport, + }, + { + title: "WebAuthn · assertion ownership", + rows: data.mac_noir_proving_seconds.webauthn, + }, + { + title: "OPRF · Taceo Noir example", + rows: data.mac_noir_proving_seconds.oprf, + }, + ], + "s", + "Native and Chrome WASM are distinct execution surfaces; compare backends only within the same workload and surface.", +); + +await writeSmallMultiples( + "mac-circom-proving-time.svg", + "Circom proving time on Apple M4 Max", + "Native proof-only functions; median of five measured samples after one warmup", + [ + { + title: "Self passport flow · two separate proofs", + rows: data.mac_circom_proving_seconds.passport, + }, + { + title: "WebAuthn · labelled Circom assertion", + rows: data.mac_circom_proving_seconds.webauthn, + }, + { + title: "World ID OPRF flow · two separate proofs", + rows: data.mac_circom_proving_seconds.oprf, + }, + ], + "s", + "Each Circom lane remains separately labelled where its statement differs from the corresponding Noir workload.", +); + +await writeSmallMultiples( + "provekit-wasm-proving-time.svg", + "ProveKit V1 proving time across browser environments", + "Portable single-thread WASM; median of five measured samples after one warmup", + [ + { + title: "Passport · complete age check", + rows: data.provekit_wasm_seconds.passport, + }, + { + title: "WebAuthn · assertion ownership", + rows: data.provekit_wasm_seconds.webauthn, + }, + { + title: "OPRF · Taceo Noir example", + rows: data.provekit_wasm_seconds.oprf, + }, + ], + "s", + "Real-mobile Safari and Chrome rows use BrowserStack Automate; desktop rows use the same single-thread bundle.", +); + +await writeSmallMultiples( + "provekit-android-passport-prepare-time.svg", + "ProveKit V1 passport preparation time on Android", + "Native Mobench function; median of five measured samples after one warmup", + [ + { + title: "Passport complete age check · preparation", + rows: data.provekit_android_prepare_seconds, + }, + ], + "s", + "Original APK/Espresso recovery rows; the later release-AAB/Appium matrix is charted separately.", +); + +await writeSmallMultiples( + "provekit-android-release-matrix-time.svg", + "ProveKit V1 native Android phase timings", + "Pixel 7 / Android 13; exact-source signed release AABs; median of five measured samples after one warmup", + [ + { + title: "Passport · complete age check", + rows: data.provekit_android_release_seconds.passport, + }, + { + title: "WebAuthn · assertion ownership", + rows: data.provekit_android_release_seconds.webauthn, + }, + { + title: "OPRF · Taceo Noir example", + rows: data.provekit_android_release_seconds.oprf, + }, + ], + "s", + "BrowserStack App Automate + Appium/UiAutomator2; platform-default Rayon pool; one function per session.", +); + +await writeSmallMultiples( + "provekit-android-cached-recovery-proving-time.svg", + "Supporting ProveKit V1 Android proof recovery", + "Cached BrowserStack executables; three independent runs aggregate 3 warmups and 6 measured samples", + [ + { + title: "Passport · complete age check proof", + rows: data.provekit_android_cached_recovery_proving_seconds.passport, + }, + { + title: "OPRF · Taceo Noir example proof", + rows: data.provekit_android_cached_recovery_proving_seconds.oprf, + }, + ], + "s", + "Supporting evidence only: BrowserStack retained no downloadable APK or source SHA; not the primary 1 + 5 campaign contract.", +); + +await writeSmallMultiples( + "barretenberg-android-proving-time.svg", + "Barretenberg 0.87.0 proving time on Android Chrome", + "Single-thread WASM; median of five measured samples after one warmup", + [ + { + title: "Passport · complete age check", + rows: data.barretenberg_android_proving_seconds.passport, + }, + { + title: "WebAuthn · assertion ownership", + rows: data.barretenberg_android_proving_seconds.webauthn, + }, + { + title: "OPRF · Taceo Noir example", + rows: data.barretenberg_android_proving_seconds.oprf, + }, + ], + "s", + "All 36 workload/phase/device cells passed; this chart shows proof generation only.", +); + +await writeSmallMultiples( + "arkworks-android-oprf-proving-time.svg", + "Arkworks World ID OPRF proving time on Android", + "Native Mobench functions; median of five measured samples after one warmup", + [ + { + title: "World ID OPRF query circuit", + rows: data.arkworks_android_proving_seconds.query, + }, + { + title: "World ID OPRF nullifier circuit", + rows: data.arkworks_android_proving_seconds.nullifier, + }, + ], + "s", + "Query and nullifier are separate proofs and are not equivalent to the Taceo Noir OPRF example.", +); + +await writeSmallMultiples( + "artifact-and-proof-sizes.svg", + "Prover bundle and proof sizes", + "Exact retained bytes shown in decimal B/KB/MB/GB; panels use independent zero-based scales", + [ + { + title: "Prover artifacts and complete browser bundles under 30 MB", + rows: data.artifact_sizes.prover_bundle_bytes_under_30mb, + }, + { + title: "Self passport Groth16 proving keys", + rows: data.artifact_sizes.self_zkey_bytes, + }, + { + title: "Retained proof encodings", + rows: data.artifact_sizes.proof_size_bytes, + unit: "bytes", + }, + ], + "bytes", + "* Barretenberg is a shared all-workload static bundle and excludes the separately fetched CRS.", + 1600, +); + +console.log(`Generated report charts under ${chartRoot}`); diff --git a/benchmarks/v1/legacy/scripts/package-barretenberg-mobile.ts b/benchmarks/v1/legacy/scripts/package-barretenberg-mobile.ts new file mode 100755 index 000000000..8f459dd28 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/package-barretenberg-mobile.ts @@ -0,0 +1,203 @@ +#!/usr/bin/env bun + +import { mkdir, readdir, copyFile, stat, writeFile } from "node:fs/promises"; +import { createHash } from "node:crypto"; +import { basename, join, relative, resolve } from "node:path"; + +type Options = { + platform: "ios" | "android"; + adapterLibrary: string; + upstreamLibrary: string; + crs: string; + output: string; +}; + +function parseOptions(args: string[]): Options { + const values = new Map(); + for (let index = 0; index < args.length; index += 2) { + const flag = args[index]; + const value = args[index + 1]; + if (!flag?.startsWith("--") || !value) { + throw new Error( + "usage: package-barretenberg-mobile.ts --platform " + + "--adapter-library --upstream-library " + + "--crs --output ", + ); + } + values.set(flag.slice(2), value); + } + const platform = values.get("platform"); + if (platform !== "ios" && platform !== "android") { + throw new Error("--platform must be ios or android"); + } + for (const required of [ + "adapter-library", + "upstream-library", + "crs", + "output", + ]) { + if (!values.get(required)) throw new Error(`--${required} is required`); + } + return { + platform, + adapterLibrary: resolve(values.get("adapter-library")!), + upstreamLibrary: resolve(values.get("upstream-library")!), + crs: resolve(values.get("crs")!), + output: resolve(values.get("output")!), + }; +} + +async function filesBelow(root: string): Promise { + const result: string[] = []; + for (const entry of await readdir(root, { withFileTypes: true })) { + const path = join(root, entry.name); + if (entry.isDirectory()) result.push(...(await filesBelow(path))); + else if (entry.isFile()) result.push(path); + } + return result.sort(); +} + +async function sha256(path: string): Promise { + const bytes = await Bun.file(path).arrayBuffer(); + return createHash("sha256").update(new Uint8Array(bytes)).digest("hex"); +} + +const options = parseOptions(Bun.argv.slice(2)); +const benchmarkRoot = resolve(import.meta.dir, ".."); +const fixtureRoot = join(benchmarkRoot, "barretenberg", "web", "dist", "assets"); +const workloads = [ + "oprf_taceo", + "webauthn_assertion", + "passport_complete_age_check", +]; +const requiredFixtureNames = [ + "circuit.json", + "witness.gz", + "public-inputs.json", + "proof.bin", +]; + +await mkdir(options.output, { recursive: true }); +const inputs: Array<{ source: string; destination: string; role: string }> = [ + { + source: options.adapterLibrary, + destination: join("lib", basename(options.adapterLibrary)), + role: "native-adapter-library", + }, + { + source: options.upstreamLibrary, + destination: join("lib", basename(options.upstreamLibrary)), + role: "native-upstream-library", + }, +]; +for (const source of await filesBelow(options.crs)) { + inputs.push({ + source, + destination: join("crs", relative(options.crs, source)), + role: "crs", + }); +} +for (const workload of workloads) { + for (const name of requiredFixtureNames) { + inputs.push({ + source: join(fixtureRoot, workload, name), + destination: join("fixtures", workload, name), + role: `fixture:${workload}`, + }); + } +} + +const assets = []; +for (const input of inputs) { + const metadata = await stat(input.source); + if (!metadata.isFile()) throw new Error(`not a file: ${input.source}`); + const destination = join(options.output, input.destination); + await mkdir(resolve(destination, ".."), { recursive: true }); + await copyFile(input.source, destination); + assets.push({ + path: input.destination, + role: input.role, + bytes: metadata.size, + sha256: await sha256(destination), + }); +} +for (const workload of workloads) { + const circuit = (await Bun.file( + join(fixtureRoot, workload, "circuit.json"), + ).json()) as { bytecode?: string }; + if (!circuit.bytecode) throw new Error(`${workload} circuit has no bytecode`); + const bytecodeDestination = join( + options.output, + "fixtures", + workload, + "bytecode.gz", + ); + await Bun.write(bytecodeDestination, Buffer.from(circuit.bytecode, "base64")); + + const publicInputs = (await Bun.file( + join(fixtureRoot, workload, "public-inputs.json"), + ).json()) as string[]; + const publicInputBytes = Buffer.concat( + publicInputs.map((value) => { + const hex = value.replace(/^0x/, "").padStart(64, "0"); + if (!/^[0-9a-f]{64}$/i.test(hex)) { + throw new Error(`${workload} has an invalid public input`); + } + return Buffer.from(hex, "hex"); + }), + ); + const publicInputsDestination = join( + options.output, + "fixtures", + workload, + "public_inputs", + ); + await Bun.write(publicInputsDestination, publicInputBytes); + + for (const generated of [ + { + path: bytecodeDestination, + role: `fixture:${workload}:native-bytecode`, + }, + { + path: publicInputsDestination, + role: `fixture:${workload}:native-public-inputs`, + }, + ]) { + const metadata = await stat(generated.path); + assets.push({ + path: relative(options.output, generated.path), + role: generated.role, + bytes: metadata.size, + sha256: await sha256(generated.path), + }); + } +} + +const manifest = { + schema_version: 1, + backend: "barretenberg", + backend_version: "0.87.0", + noir_version: "1.0.0-beta.11", + upstream_commit: "9081b0ed38c43c120afb7c80f8f6cd418ca5ad70", + platform: options.platform, + network_at_device: false, + assets, +}; +await writeFile( + join(options.output, "package-manifest.json"), + `${JSON.stringify(manifest, null, 2)}\n`, +); +const runtimeManifest = { + ...manifest, + assets: assets.filter( + (asset) => + asset.role !== "native-adapter-library" && + asset.role !== "native-upstream-library", + ), +}; +await writeFile( + join(options.output, "runtime-package-manifest.json"), + `${JSON.stringify(runtimeManifest, null, 2)}\n`, +); +console.log(join(options.output, "package-manifest.json")); diff --git a/benchmarks/v1/legacy/scripts/prepare-android-release-aabs.ts b/benchmarks/v1/legacy/scripts/prepare-android-release-aabs.ts new file mode 100644 index 000000000..25aa59a3b --- /dev/null +++ b/benchmarks/v1/legacy/scripts/prepare-android-release-aabs.ts @@ -0,0 +1,656 @@ +#!/usr/bin/env bun + +import { mkdir, mkdtemp, rm } from "node:fs/promises"; +import { basename, dirname, join, relative, resolve } from "node:path"; +import { + isSha256, + isSourceSha, + sha256File, + slugify, + writeJsonAtomic, +} from "./android-appium-evidence"; + +type JsonObject = Record; + +interface PrebuiltArtifact { + kind: string; + path: string; + size: number; + sha256: string; +} + +interface PrebuiltEntry { + function: string; + iterations: number; + warmup: number; + artifacts: PrebuiltArtifact[]; +} + +interface PrebuiltManifest { + schema: string; + source_sha: string; + platform: string; + mobench_version: string; + entries: PrebuiltEntry[]; +} + +interface Options { + manifest: string; + projectDir: string; + outputDir: string; + bundletoolJar?: string; + onlyFunctions: Set; + dryRun: boolean; + keystore?: string; + keyAlias?: string; + allowUnsigned: boolean; +} + +function usage(): never { + console.error(`usage: bun benchmarks/v1/scripts/prepare-android-release-aabs.ts [options] + +Build function-isolated release AABs from a Mobench prebuilt APK manifest and a +matching generated Mobench Android project. The benchmark native library and +bench_spec.json are extracted from each immutable source APK before building. + +Required: + --manifest PATH Android mobench.prebuilt.v1 manifest + --project-dir PATH Generated Mobench Android Gradle project + --output-dir PATH Destination for release AABs and manifest.json + +Validation/build options: + --bundletool-jar PATH Standalone bundletool-all jar for universal APK check + --only-function NAME Build one function (repeatable) + --keystore PATH AAB signing keystore + --key-alias ALIAS AAB signing key alias + --allow-unsigned Local diagnostics only; output is runner-ineligible + --dry-run Validate inputs without modifying/building the project + +Signing passwords are read only from MOBENCH_ANDROID_STORE_PASSWORD and +MOBENCH_ANDROID_KEY_PASSWORD. They are never accepted on the command line.`); + process.exit(2); +} + +function parseArgs(argv: string[]): Options { + let manifest = ""; + let projectDir = ""; + let outputDir = ""; + let bundletoolJar: string | undefined; + let keystore: string | undefined; + let keyAlias: string | undefined; + let dryRun = false; + let allowUnsigned = false; + const onlyFunctions = new Set(); + for (let index = 0; index < argv.length; index += 1) { + const value = argv[index]!; + const next = () => argv[++index] ?? usage(); + switch (value) { + case "--manifest": + manifest = next(); + break; + case "--project-dir": + projectDir = next(); + break; + case "--output-dir": + outputDir = next(); + break; + case "--bundletool-jar": + bundletoolJar = next(); + break; + case "--only-function": + onlyFunctions.add(next()); + break; + case "--keystore": + keystore = next(); + break; + case "--key-alias": + keyAlias = next(); + break; + case "--allow-unsigned": + allowUnsigned = true; + break; + case "--dry-run": + dryRun = true; + break; + case "-h": + case "--help": + usage(); + default: + throw new Error(`unknown argument: ${value}`); + } + } + if (!manifest || !projectDir || !outputDir) usage(); + if ((keystore && !keyAlias) || (!keystore && keyAlias)) { + throw new Error("--keystore and --key-alias must be provided together"); + } + if (!dryRun && !allowUnsigned && (!keystore || !keyAlias)) { + throw new Error( + "signed output is required; provide --keystore and --key-alias", + ); + } + if ( + !dryRun && + keystore && + (!process.env.MOBENCH_ANDROID_STORE_PASSWORD || + !process.env.MOBENCH_ANDROID_KEY_PASSWORD) + ) { + throw new Error( + "set MOBENCH_ANDROID_STORE_PASSWORD and MOBENCH_ANDROID_KEY_PASSWORD locally", + ); + } + return { + manifest: resolve(manifest), + projectDir: resolve(projectDir), + outputDir: resolve(outputDir), + bundletoolJar: bundletoolJar ? resolve(bundletoolJar) : undefined, + onlyFunctions, + dryRun, + keystore: keystore ? resolve(keystore) : undefined, + keyAlias, + allowUnsigned, + }; +} + +async function command( + args: string[], + options: { cwd?: string; stdoutPath?: string; env?: Record } = {}, +): Promise { + const processHandle = Bun.spawn(args, { + cwd: options.cwd, + env: { ...process.env, ...options.env }, + stdout: "pipe", + stderr: "pipe", + }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(processHandle.stdout).text(), + new Response(processHandle.stderr).text(), + processHandle.exited, + ]); + if (options.stdoutPath) { + await Bun.write( + options.stdoutPath, + `${stdout}${stderr ? `\n${stderr}` : ""}`, + ); + } + if (exitCode !== 0) { + throw new Error( + `${basename(args[0]!)} failed with exit ${exitCode}: ${stderr.trim().slice(-2000)}`, + ); + } + return stdout; +} + +async function archiveEntries(path: string): Promise { + return (await command(["unzip", "-Z1", path])) + .split(/\r?\n/) + .filter(Boolean); +} + +async function archiveBytes(path: string, entry: string): Promise { + const child = Bun.spawn(["unzip", "-p", path, entry], { + stdout: "pipe", + stderr: "pipe", + }); + const [bytes, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).bytes(), + new Response(child.stderr).text(), + child.exited, + ]); + if (exitCode !== 0) { + throw new Error(`could not extract ${entry} from ${path}: ${stderr.trim()}`); + } + return bytes; +} + +function asObject(value: unknown, name: string): JsonObject { + if (!value || typeof value !== "object" || Array.isArray(value)) { + throw new Error(`${name} must be an object`); + } + return value as JsonObject; +} + +async function loadPrebuilt(path: string): Promise { + const value = asObject(await Bun.file(path).json(), "prebuilt manifest"); + if ( + value.schema !== "mobench.prebuilt.v1" || + value.platform !== "android" || + !isSourceSha(value.source_sha) || + typeof value.mobench_version !== "string" || + !Array.isArray(value.entries) || + value.entries.length === 0 + ) { + throw new Error("invalid Android mobench.prebuilt.v1 manifest"); + } + const seen = new Set(); + for (const [index, raw] of value.entries.entries()) { + const entry = asObject(raw, `entry ${index}`); + if ( + typeof entry.function !== "string" || + seen.has(entry.function) || + entry.iterations !== 5 || + entry.warmup !== 1 || + !Array.isArray(entry.artifacts) + ) { + throw new Error( + `entry ${index} must have a unique function and warmup=1 iterations=5`, + ); + } + seen.add(entry.function); + } + return value as unknown as PrebuiltManifest; +} + +async function verifySourceApk( + manifestDir: string, + entry: PrebuiltEntry, +): Promise<{ + apkPath: string; + apkSha256: string; + nativePath: string; + nativeBytes: Uint8Array; + nativeSha256: string; + specBytes: Uint8Array; + specSha256: string; +}> { + const artifact = entry.artifacts.find( + (candidate) => candidate.kind === "android-app", + ); + if ( + !artifact || + !isSha256(artifact.sha256) || + !Number.isSafeInteger(artifact.size) + ) { + throw new Error(`${entry.function} has no valid android-app artifact`); + } + const apkPath = resolve(manifestDir, artifact.path); + const apkHash = await sha256File(apkPath); + if ( + apkHash !== artifact.sha256 || + Bun.file(apkPath).size !== artifact.size + ) { + throw new Error(`${entry.function} source APK failed immutable validation`); + } + const entries = await archiveEntries(apkPath); + const benchmarkLibraries = entries.filter( + (path) => + /^lib\/arm64-v8a\/lib[^/]+\.so$/.test(path) && + !path.endsWith("/libjnidispatch.so") && + !path.includes("/libmobench_bb_v087_"), + ); + if (benchmarkLibraries.length !== 1) { + throw new Error( + `${entry.function} source APK must contain exactly one arm64 benchmark library; found ${benchmarkLibraries.join(",")}`, + ); + } + const nativePath = benchmarkLibraries[0]!; + const nativeBytes = await archiveBytes(apkPath, nativePath); + const specBytes = await archiveBytes(apkPath, "assets/bench_spec.json"); + const spec = JSON.parse(new TextDecoder().decode(specBytes)) as JsonObject; + if ( + spec.function !== entry.function || + spec.iterations !== 5 || + spec.warmup !== 1 + ) { + throw new Error(`${entry.function} source APK bench_spec contract mismatch`); + } + return { + apkPath, + apkSha256: apkHash, + nativePath, + nativeBytes, + nativeSha256: new Bun.CryptoHasher("sha256") + .update(nativeBytes) + .digest("hex"), + specBytes, + specSha256: new Bun.CryptoHasher("sha256") + .update(specBytes) + .digest("hex"), + }; +} + +async function signingFingerprint(aabPath: string): Promise { + const javaTool = (name: string) => + process.env.JAVA_HOME ? join(process.env.JAVA_HOME, "bin", name) : name; + const check = Bun.spawnSync([javaTool("jarsigner"), "-verify", aabPath], { + stdout: "pipe", + stderr: "pipe", + }); + const verification = `${check.stdout.toString()}\n${check.stderr.toString()}`; + if (check.exitCode !== 0 || !verification.includes("jar verified.")) { + return null; + } + const output = await command([ + javaTool("keytool"), + "-printcert", + "-jarfile", + aabPath, + ]); + const match = output.match(/SHA256:\s*([0-9A-F:]{95})/); + if (!match) throw new Error(`could not resolve signing fingerprint: ${aabPath}`); + return match[1]!.replaceAll(":", "").toLowerCase(); +} + +async function validateAabPayload( + aabPath: string, + nativeFilename: string, + expectedNativeSha: string, + expectedSpecSha: string, +): Promise<{ nativePath: string; specPath: string }> { + const entries = await archiveEntries(aabPath); + const nativePath = `base/lib/arm64-v8a/${nativeFilename}`; + const specPath = "base/assets/bench_spec.json"; + if (!entries.includes(nativePath) || !entries.includes(specPath)) { + throw new Error(`${basename(aabPath)} is missing its native library or spec`); + } + const nativeHash = new Bun.CryptoHasher("sha256") + .update(await archiveBytes(aabPath, nativePath)) + .digest("hex"); + const specHash = new Bun.CryptoHasher("sha256") + .update(await archiveBytes(aabPath, specPath)) + .digest("hex"); + if (nativeHash !== expectedNativeSha || specHash !== expectedSpecSha) { + throw new Error(`${basename(aabPath)} embedded payload differs from source APK`); + } + return { nativePath, specPath }; +} + +async function validateUniversalApk( + bundletoolJar: string, + aabPath: string, + temporaryDir: string, + nativeFilename: string, + expectedNativeSha: string, + expectedSpecSha: string, +): Promise<{ sha256: string; bytes: number }> { + const archive = join(temporaryDir, "universal.apks"); + await command([ + process.env.JAVA_HOME + ? join(process.env.JAVA_HOME, "bin", "java") + : "java", + "-jar", + bundletoolJar, + "build-apks", + `--bundle=${aabPath}`, + `--output=${archive}`, + "--mode=universal", + "--overwrite", + ]); + const universal = join(temporaryDir, "universal.apk"); + await Bun.write(universal, await archiveBytes(archive, "universal.apk")); + const entries = await archiveEntries(universal); + const nativePath = `lib/arm64-v8a/${nativeFilename}`; + if ( + !entries.includes(nativePath) || + !entries.includes("assets/bench_spec.json") + ) { + throw new Error("bundletool universal APK is missing the benchmark payload"); + } + const nativeHash = new Bun.CryptoHasher("sha256") + .update(await archiveBytes(universal, nativePath)) + .digest("hex"); + const specHash = new Bun.CryptoHasher("sha256") + .update(await archiveBytes(universal, "assets/bench_spec.json")) + .digest("hex"); + if (nativeHash !== expectedNativeSha || specHash !== expectedSpecSha) { + throw new Error("bundletool universal APK differs from the source APK"); + } + return { + sha256: await sha256File(universal), + bytes: Bun.file(universal).size, + }; +} + +async function main(): Promise { + const options = parseArgs(Bun.argv.slice(2)); + const manifest = await loadPrebuilt(options.manifest); + const manifestDir = dirname(options.manifest); + let buildProjectDir = options.projectDir; + let gradlew = join(buildProjectDir, "gradlew"); + const mainActivityRoot = join( + options.projectDir, + "app", + "src", + "main", + "java", + ); + if ( + !(await Bun.file(gradlew).exists()) || + !(await Bun.file(join(options.projectDir, "app", "build.gradle")).exists()) + ) { + throw new Error("--project-dir is not a generated Mobench Android project"); + } + const sourceFiles = ( + await command(["find", mainActivityRoot, "-type", "f", "-name", "*.kt"]) + ) + .split(/\r?\n/) + .filter(Boolean); + if (sourceFiles.length === 0) { + throw new Error("generated Mobench Android project has no Kotlin runner"); + } + const runnerSource = ( + await Promise.all(sourceFiles.map((path) => Bun.file(path).text())) + ).join("\n"); + if ( + !runnerSource.includes("BENCH_JSON_CHUNK") || + !runnerSource.includes("BENCH_JSON_START") || + !runnerSource.includes("BENCH_JSON_END") + ) { + throw new Error("Mobench Android runner lacks chunked BENCH_JSON evidence"); + } + + const selected = manifest.entries.filter( + (entry) => + options.onlyFunctions.size === 0 || + options.onlyFunctions.has(entry.function), + ); + if (selected.length === 0) throw new Error("no selected function was found"); + for (const requested of options.onlyFunctions) { + if (!selected.some((entry) => entry.function === requested)) { + throw new Error(`unknown --only-function: ${requested}`); + } + } + + if (options.dryRun) { + let verifiedSources = 0; + const nativeNames = new Set(); + for (const entry of selected) { + const source = await verifySourceApk(manifestDir, entry); + nativeNames.add(basename(source.nativePath)); + verifiedSources += 1; + } + if (nativeNames.size !== 1) { + throw new Error("selected APKs do not share one benchmark library name"); + } + console.log( + JSON.stringify( + { + schema: "provekit.android-release-aab-dry-run.v1", + source_sha: manifest.source_sha, + mobench_version: manifest.mobench_version, + project_dir: options.projectDir, + selected_functions: selected.map((entry) => entry.function), + source_apks_verified: verifiedSources, + contract: { warmup: 1, iterations: 5 }, + signed_build_requested: !options.allowUnsigned, + bundletool_validation_requested: Boolean(options.bundletoolJar), + }, + null, + 2, + ), + ); + return; + } + + await mkdir(options.outputDir, { recursive: true }); + const isolatedProjectDir = await mkdtemp( + join(options.outputDir, ".android-project-"), + ); + await command([ + "rsync", + "-a", + "--exclude=.gradle", + "--exclude=app/build", + `${options.projectDir}/`, + `${isolatedProjectDir}/`, + ]); + buildProjectDir = isolatedProjectDir; + gradlew = join(buildProjectDir, "gradlew"); + const cleanupIsolatedProject = () => { + Bun.spawnSync(["rm", "-rf", "--", isolatedProjectDir], { + stdout: "ignore", + stderr: "ignore", + }); + }; + process.once("exit", cleanupIsolatedProject); + const buildLogDir = join(options.outputDir, "build-logs"); + await mkdir(buildLogDir, { recursive: true }); + const projectNativeDir = join( + buildProjectDir, + "app", + "src", + "main", + "jniLibs", + "arm64-v8a", + ); + const projectSpec = join( + buildProjectDir, + "app", + "src", + "main", + "assets", + "bench_spec.json", + ); + await mkdir(projectNativeDir, { recursive: true }); + await mkdir(dirname(projectSpec), { recursive: true }); + const outputs: JsonObject[] = []; + + for (let index = 0; index < selected.length; index += 1) { + const entry = selected[index]!; + // Load one immutable APK payload at a time. Passport APKs are large enough + // that retaining all fourteen native libraries can exhaust a CI runner. + const source = await verifySourceApk(manifestDir, entry); + const functionSlug = slugify(entry.function); + const nativeFilename = basename(source.nativePath); + await Bun.write(join(projectNativeDir, nativeFilename), source.nativeBytes); + await Bun.write(projectSpec, source.specBytes); + + const logPath = join(buildLogDir, `${functionSlug}.log`); + await command([gradlew, "clean", "bundleRelease", "--no-daemon"], { + cwd: buildProjectDir, + stdoutPath: logPath, + }); + const builtAab = join( + buildProjectDir, + "app", + "build", + "outputs", + "bundle", + "release", + "app-release.aab", + ); + if (!(await Bun.file(builtAab).exists())) { + throw new Error(`Gradle did not produce ${builtAab}`); + } + const destinationDir = join( + options.outputDir, + `${String(index).padStart(4, "0")}-${functionSlug}`, + ); + await mkdir(destinationDir, { recursive: true }); + const aabPath = join(destinationDir, "app-release.aab"); + await Bun.write(aabPath, Bun.file(builtAab)); + + let signed = await signingFingerprint(aabPath); + if (!signed && options.keystore && options.keyAlias) { + const jarsigner = process.env.JAVA_HOME + ? join(process.env.JAVA_HOME, "bin", "jarsigner") + : "jarsigner"; + await command([ + jarsigner, + "-keystore", + options.keystore, + "-storepass:env", + "MOBENCH_ANDROID_STORE_PASSWORD", + "-keypass:env", + "MOBENCH_ANDROID_KEY_PASSWORD", + aabPath, + options.keyAlias, + ]); + signed = await signingFingerprint(aabPath); + } + if (!signed && !options.allowUnsigned) { + throw new Error(`${entry.function} release AAB is unsigned`); + } + const embedded = await validateAabPayload( + aabPath, + nativeFilename, + source.nativeSha256, + source.specSha256, + ); + let universal: JsonObject | null = null; + if (options.bundletoolJar) { + const temporaryDir = await mkdtemp( + join(options.outputDir, `.bundletool-${functionSlug}-`), + ); + try { + universal = await validateUniversalApk( + options.bundletoolJar, + aabPath, + temporaryDir, + nativeFilename, + source.nativeSha256, + source.specSha256, + ); + } finally { + await rm(temporaryDir, { recursive: true, force: true }); + } + } + outputs.push({ + function: entry.function, + source_apk: { + path: relative(options.outputDir, source.apkPath), + sha256: source.apkSha256, + }, + release_aab: { + path: relative(options.outputDir, aabPath), + sha256: await sha256File(aabPath), + bytes: Bun.file(aabPath).size, + }, + embedded_native_library: { + archive_path: embedded.nativePath, + sha256: source.nativeSha256, + }, + embedded_bench_spec: { + archive_path: embedded.specPath, + sha256: source.specSha256, + }, + universal_apk_validation: universal, + build_profile: "release", + signed: Boolean(signed), + signing_certificate_sha256: signed, + source_payload_matches: true, + build_log: relative(options.outputDir, logPath), + }); + console.log(`[built] ${entry.function}: ${aabPath}`); + } + + await writeJsonAtomic(join(options.outputDir, "manifest.json"), { + schema: "provekit.android-release-aabs.v1", + generated_at: new Date().toISOString(), + source_sha: manifest.source_sha, + source_manifest: options.manifest, + source_manifest_sha256: await sha256File(options.manifest), + mobench_version: manifest.mobench_version, + project_dir: options.projectDir, + wrapper_source_sha256: new Bun.CryptoHasher("sha256") + .update(runnerSource) + .digest("hex"), + warmup: 1, + iterations: 5, + entries: outputs, + }); + process.off("exit", cleanupIsolatedProject); + await rm(isolatedProjectDir, { recursive: true, force: true }); + console.log(`Wrote ${join(options.outputDir, "manifest.json")}`); +} + +await main(); diff --git a/benchmarks/v1/legacy/scripts/prepare-barretenberg-mobile-run.ts b/benchmarks/v1/legacy/scripts/prepare-barretenberg-mobile-run.ts new file mode 100644 index 000000000..49e232e68 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/prepare-barretenberg-mobile-run.ts @@ -0,0 +1,178 @@ +#!/usr/bin/env bun + +import { createHash } from "node:crypto"; +import { copyFile, mkdir, stat } from "node:fs/promises"; +import { basename, join, resolve } from "node:path"; + +type Platform = "ios" | "android"; + +const functions = new Set([ + "provekit_v1_barretenberg_mobile::bench_passport_barretenberg_prove", + "provekit_v1_barretenberg_mobile::bench_passport_barretenberg_verify", + "provekit_v1_barretenberg_mobile::bench_passport_barretenberg_e2e", + "provekit_v1_barretenberg_mobile::bench_webauthn_barretenberg_prove", + "provekit_v1_barretenberg_mobile::bench_webauthn_barretenberg_verify", + "provekit_v1_barretenberg_mobile::bench_webauthn_barretenberg_e2e", + "provekit_v1_barretenberg_mobile::bench_oprf_barretenberg_prove", + "provekit_v1_barretenberg_mobile::bench_oprf_barretenberg_verify", + "provekit_v1_barretenberg_mobile::bench_oprf_barretenberg_e2e", +]); + +function usage(): never { + throw new Error( + "usage: prepare-barretenberg-mobile-run.ts --platform " + + "--app-root --function --iterations " + + "--warmup [--archive ] [--output ] " + + "[--app-apk --test-apk --prebuilt-output ]", + ); +} + +function parseInteger(value: string | undefined, name: string): number { + if (!value || !/^\d+$/.test(value)) usage(); + const parsed = Number(value); + if (!Number.isSafeInteger(parsed)) throw new Error(`invalid --${name}`); + return parsed; +} + +const values = new Map(); +const args = Bun.argv.slice(2); +for (let index = 0; index < args.length; index += 2) { + const flag = args[index]; + const value = args[index + 1]; + if (!flag?.startsWith("--") || !value) usage(); + values.set(flag.slice(2), value); +} + +const platform = values.get("platform"); +const appRoot = values.get("app-root"); +const functionName = values.get("function"); +if ( + (platform !== "ios" && platform !== "android") || + !appRoot || + !functionName || + !functions.has(functionName) +) { + usage(); +} +const iterations = parseInteger(values.get("iterations"), "iterations"); +const warmup = parseInteger(values.get("warmup"), "warmup"); +if (iterations < 1) throw new Error("--iterations must be at least 1"); + +const spec = { + function: functionName, + iterations, + warmup, + android_benchmark_timeout_secs: 7200, + android_heartbeat_interval_secs: 10, +}; +const specBytes = `${JSON.stringify(spec, null, 2)}\n`; +const specSha256 = createHash("sha256").update(specBytes).digest("hex"); +const resolvedAppRoot = resolve(appRoot); +const specPath = + platform === "ios" + ? join(resolvedAppRoot, "BenchRunner/BenchRunner/Resources/bench_spec.json") + : join(resolvedAppRoot, "app/src/main/assets/bench_spec.json"); +await mkdir(resolve(specPath, ".."), { recursive: true }); +await Bun.write(specPath, specBytes); + +let archiveEvidence: + | { path: string; bytes: number; sha256: string; entry: string } + | undefined; +const archive = values.get("archive"); +if (archive) { + const resolvedArchive = resolve(archive); + const entry = + platform === "ios" + ? "Payload/BenchRunner.app/bench_spec.json" + : "base/assets/bench_spec.json"; + const extracted = Bun.spawnSync(["unzip", "-p", resolvedArchive, entry]); + if (extracted.exitCode !== 0 || extracted.stdout.length === 0) { + throw new Error(`${basename(resolvedArchive)} has no ${entry}`); + } + const embedded = extracted.stdout.toString(); + if (embedded !== specBytes) { + throw new Error(`${basename(resolvedArchive)} benchmark spec mismatch`); + } + const archiveBytes = new Uint8Array( + await Bun.file(resolvedArchive).arrayBuffer(), + ); + archiveEvidence = { + path: resolvedArchive, + bytes: archiveBytes.length, + sha256: createHash("sha256").update(archiveBytes).digest("hex"), + entry, + }; +} + +const evidence = { + schema: "provekit.barretenberg-mobile-run-spec.v1", + platform, + spec, + spec_path: specPath, + spec_sha256: specSha256, + archive: archiveEvidence, +}; +const appApk = values.get("app-apk"); +const testApk = values.get("test-apk"); +const prebuiltOutput = values.get("prebuilt-output"); +if (appApk || testApk || prebuiltOutput) { + if (platform !== "android" || !appApk || !testApk || !prebuiltOutput) { + throw new Error( + "--app-apk, --test-apk, and --prebuilt-output are Android-only and must be used together", + ); + } + const resolvedPrebuilt = resolve(prebuiltOutput); + const entryRoot = join(resolvedPrebuilt, "entries/0000"); + await mkdir(entryRoot, { recursive: true }); + const artifacts = []; + for (const input of [ + { kind: "android-app", source: resolve(appApk), name: "app.apk" }, + { + kind: "android-test-suite", + source: resolve(testApk), + name: "test.apk", + }, + ]) { + const destination = join(entryRoot, input.name); + await copyFile(input.source, destination); + const metadata = await stat(destination); + const bytes = new Uint8Array(await Bun.file(destination).arrayBuffer()); + artifacts.push({ + kind: input.kind, + path: `entries/0000/${input.name}`, + size: metadata.size, + sha256: createHash("sha256").update(bytes).digest("hex"), + }); + } + const git = Bun.spawnSync(["git", "rev-parse", "HEAD"]); + const sourceSha = git.stdout.toString().trim(); + if (git.exitCode !== 0 || !/^[0-9a-f]{40}$/.test(sourceSha)) { + throw new Error("cannot resolve a full source commit SHA"); + } + const manifest = { + schema: "mobench.prebuilt.v1", + source_sha: sourceSha, + platform: "android", + mobench_version: "0.1.48", + entries: [ + { + function: functionName, + iterations, + warmup, + completion_timeout_secs: 7200, + artifacts, + }, + ], + }; + await Bun.write( + join(resolvedPrebuilt, "manifest.json"), + `${JSON.stringify(manifest, null, 2)}\n`, + ); +} +const output = values.get("output"); +if (output) { + const resolvedOutput = resolve(output); + await mkdir(resolve(resolvedOutput, ".."), { recursive: true }); + await Bun.write(resolvedOutput, `${JSON.stringify(evidence, null, 2)}\n`); +} +console.log(JSON.stringify(evidence, null, 2)); diff --git a/benchmarks/v1/legacy/scripts/prepare-e15-circom-armv7-adapter.ts b/benchmarks/v1/legacy/scripts/prepare-e15-circom-armv7-adapter.ts new file mode 100644 index 000000000..164468bcb --- /dev/null +++ b/benchmarks/v1/legacy/scripts/prepare-e15-circom-armv7-adapter.ts @@ -0,0 +1,85 @@ +#!/usr/bin/env bun + +import { + cpSync, + existsSync, + mkdirSync, + readFileSync, + rmSync, + writeFileSync, +} from "node:fs"; +import { dirname, join, resolve } from "node:path"; + +const [templateArg, outputArg] = process.argv.slice(2); +if (!templateArg || !outputArg) { + throw new Error( + "usage: bun prepare-e15-circom-armv7-adapter.ts ", + ); +} + +const template = resolve(templateArg); +const output = resolve(outputArg); +const moduleSource = resolve( + import.meta.dir, + "../mopro/e15_circom_frozen_mobench.rs", +); +for (const required of [ + join(template, "Cargo.toml"), + join(template, "src/error.rs"), + join(template, "src/stubs.rs"), + moduleSource, +]) { + if (!existsSync(required)) + throw new Error(`required path does not exist: ${required}`); +} + +rmSync(output, { recursive: true, force: true }); +mkdirSync(output, { recursive: true }); +for (const relative of ["src/error.rs", "src/stubs.rs"]) { + const destination = join(output, relative); + mkdirSync(dirname(destination), { recursive: true }); + cpSync(join(template, relative), destination); +} + +let cargo = readFileSync(join(template, "Cargo.toml"), "utf8"); +cargo = cargo.replace( + /\nnoir_rs = \{ package = "noir",[\s\S]*?tag = "v1\.0\.0-beta\.19" \}\s*/, + "\n", +); +cargo = cargo.replace(/\nserial_test = "[^"]+"\s*/g, "\n"); +cargo = cargo.replace(/\nwitnesscalc-adapter = "[^"]+"\s*/g, "\n"); +cargo = cargo.replace(/\nrust-witness = "[^"]+"\s*/g, "\n"); +cargo = cargo.replace(/\ncc = "[^"]+"\s*/g, "\n"); +if (!cargo.includes('num-bigint = "0.4.0"')) { + throw new Error( + "configured template is missing the pinned num-bigint dependency", + ); +} +writeFileSync(join(output, "Cargo.toml"), cargo); +writeFileSync(join(output, "build.rs"), "fn main() {}\n"); +cpSync(moduleSource, join(output, "src/e15_circom_frozen_mobench.rs")); +writeFileSync( + join(output, "src/lib.rs"), + `#[macro_use] +mod stubs; + +mod error; +pub use error::MoproError; + +#[cfg(not(target_arch = "wasm32"))] +mopro_ffi::app!(); + +mod e15_circom_frozen_mobench; +use e15_circom_frozen_mobench::{bench_prove, setup_prove, PreparedProve}; +use mobench_sdk::benchmark; + +#[benchmark(setup = setup_prove, per_iteration)] +pub fn bench_e15_circom_arkworks_prove(prepared: PreparedProve) { + bench_prove(prepared); +} + +mobench_sdk::export_native_c_abi!(); +`, +); + +console.log(`Prepared Circom-only E15 adapter at ${output}`); diff --git a/benchmarks/v1/legacy/scripts/probe-browserstack-espresso-ingestion.ts b/benchmarks/v1/legacy/scripts/probe-browserstack-espresso-ingestion.ts new file mode 100644 index 000000000..953ae6d7f --- /dev/null +++ b/benchmarks/v1/legacy/scripts/probe-browserstack-espresso-ingestion.ts @@ -0,0 +1,209 @@ +import { createHash } from "node:crypto"; +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +const username = process.env.BROWSERSTACK_USERNAME; +const accessKey = process.env.BROWSERSTACK_ACCESS_KEY; +if (!username || !accessKey) { + throw new Error( + "BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY are required", + ); +} + +const timeoutMs = Number.parseInt( + process.env.V1_BROWSERSTACK_PROBE_TIMEOUT_MS ?? "60000", + 10, +); +if (!Number.isInteger(timeoutMs) || timeoutMs < 10_000 || timeoutMs > 600_000) { + throw new Error( + "V1_BROWSERSTACK_PROBE_TIMEOUT_MS must be between 10000 and 600000", + ); +} + +const transport = process.env.V1_BROWSERSTACK_PROBE_TRANSPORT ?? "url"; +if (transport !== "url" && transport !== "file") { + throw new Error( + "V1_BROWSERSTACK_PROBE_TRANSPORT must be either url or file", + ); +} + +const outputDirectory = resolve( + Bun.argv[2] ?? + "benchmarks/v1/results/run-30041758043/browserstack-ingestion-diagnostics/heartbeats", +); +await mkdir(outputDirectory, { recursive: true }); + +const startedAt = new Date(); +const stamp = startedAt + .toISOString() + .replaceAll(/[-:.]/g, "") + .replace("Z", "Z"); +const customId = `pkv1-heartbeat-control-${stamp.toLowerCase()}`; +const sampleUrl = + "https://www.browserstack.com/app-automate/sample-apps/android/WikipediaSample.apk"; +const api = "https://api-cloud.browserstack.com/app-automate/espresso/v2"; +const authorization = `Basic ${Buffer.from(`${username}:${accessKey}`).toString("base64")}`; +const expectedSampleBytes = 20_373_104; +const expectedSampleSha256 = + "622d394215af0379aa44b7d8b92ac3407c7519cd0db239a0e6dfc86ea734cb79"; + +async function jsonRequest( + url: string, +): Promise<{ status: number; payload: unknown }> { + const response = await fetch(url, { + headers: { Authorization: authorization }, + }); + const text = await response.text(); + let payload: unknown = null; + if (text) { + try { + payload = JSON.parse(text); + } catch { + payload = { non_json_response_bytes: Buffer.byteLength(text) }; + } + } + return { status: response.status, payload }; +} + +function matchingApps(payload: unknown): unknown[] { + const items = Array.isArray(payload) + ? payload + : payload && + typeof payload === "object" && + "apps" in payload && + Array.isArray((payload as { apps: unknown }).apps) + ? (payload as { apps: unknown[] }).apps + : []; + return items.filter( + (item) => + item && + typeof item === "object" && + "custom_id" in item && + (item as { custom_id: unknown }).custom_id === customId, + ); +} + +let sampleBytes: Uint8Array | null = null; +if (transport === "file") { + const sampleResponse = await fetch(sampleUrl); + if (!sampleResponse.ok) { + throw new Error( + `control APK download failed: HTTP ${sampleResponse.status}`, + ); + } + sampleBytes = new Uint8Array(await sampleResponse.arrayBuffer()); + const sampleSha256 = createHash("sha256").update(sampleBytes).digest("hex"); + if ( + sampleBytes.byteLength !== expectedSampleBytes || + sampleSha256 !== expectedSampleSha256 + ) { + throw new Error("BrowserStack control APK no longer matches its pin"); + } +} + +const before = await jsonRequest( + `${api}/apps?custom_id=${encodeURIComponent(customId)}`, +); +if (before.status !== 200 || matchingApps(before.payload).length !== 0) { + throw new Error( + "control custom ID lookup was not an authenticated cache miss", + ); +} + +const form = new FormData(); +if (transport === "url") { + form.set("url", sampleUrl); +} else { + form.set( + "file", + new Blob([sampleBytes!], { + type: "application/vnd.android.package-archive", + }), + "WikipediaSample.apk", + ); +} +form.set("custom_id", customId); + +let uploadStatus: number | null = null; +let uploadResponseBytes = 0; +let uploadOutcome = "unknown"; +let uploadErrorName: string | null = null; +const uploadStarted = performance.now(); +try { + const response = await fetch(`${api}/app`, { + method: "POST", + headers: { Authorization: authorization }, + body: form, + signal: AbortSignal.timeout(timeoutMs), + }); + uploadStatus = response.status; + const responseText = await response.text(); + uploadResponseBytes = Buffer.byteLength(responseText); + uploadOutcome = response.ok ? "completed" : "http_error"; +} catch (error) { + uploadErrorName = error instanceof Error ? error.name : "unknown"; + uploadOutcome = + uploadErrorName === "TimeoutError" ? "client_timeout" : "request_error"; +} +const elapsedSeconds = (performance.now() - uploadStarted) / 1000; + +const after = await jsonRequest( + `${api}/apps?custom_id=${encodeURIComponent(customId)}`, +); +const matches = after.status === 200 ? matchingApps(after.payload) : []; +const handle = + matches.length === 1 && + matches[0] && + typeof matches[0] === "object" && + "app_url" in matches[0] && + typeof (matches[0] as { app_url: unknown }).app_url === "string" + ? (matches[0] as { app_url: string }).app_url + : null; + +const summary = { + schema: "provekit.browserstack-ingestion-heartbeat.v1", + started_at: startedAt.toISOString(), + completed_at: new Date().toISOString(), + credential_source: "environment", + credentials_retained: false, + endpoint: `${api}/app`, + custom_id: customId, + control_artifact: { + description: "BrowserStack WikipediaSample.apk", + source_url: sampleUrl, + expected_bytes: expectedSampleBytes, + expected_sha256: expectedSampleSha256, + transport, + }, + timeout_ms: timeoutMs, + upload: { + elapsed_seconds: elapsedSeconds, + http_status: uploadStatus, + response_bytes: uploadResponseBytes, + outcome: uploadOutcome, + error_name: uploadErrorName, + }, + final_lookup: { + http_status: after.status, + match_count: matches.length, + handle, + }, + diagnosis: + uploadOutcome === "client_timeout" && + after.status === 200 && + matches.length === 0 + ? "artifact_processing_stalled" + : uploadOutcome === "completed" && handle !== null + ? "healthy" + : "indeterminate", + ingestion_recovered: uploadOutcome === "completed" && handle !== null, +}; + +const outputPath = resolve(outputDirectory, `${stamp}-summary.json`); +await Bun.write(outputPath, `${JSON.stringify(summary, null, 2)}\n`); +console.log(outputPath); +console.log( + summary.ingestion_recovered + ? "ingestion_recovered=true" + : "ingestion_recovered=false", +); diff --git a/benchmarks/v1/legacy/scripts/run-android-browserstack-appium-shards.ts b/benchmarks/v1/legacy/scripts/run-android-browserstack-appium-shards.ts new file mode 100644 index 000000000..50db0610e --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-android-browserstack-appium-shards.ts @@ -0,0 +1,780 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { basename, dirname, join, relative, resolve } from "node:path"; +import { + type AabEntry, + type BenchResult, + loadAndVerifyAabManifest, + parseDevice, + reconstructBenchResults, + sha256File, + slugify, + verifyBenchContract, + writeJsonAtomic, +} from "./android-appium-evidence"; + +type JsonObject = Record; + +interface Options { + manifest: string; + outputDir: string; + devices: ReturnType[]; + onlyFunctions: Set; + dryRun: boolean; + confirmPaid: boolean; + retryFailed: boolean; + timeoutSeconds: number; +} + +interface WebDriverResponse { + sessionId?: string; + value?: T & { error?: string; message?: string }; +} + +const uploadEndpoint = "https://api-cloud.browserstack.com/app-automate/upload"; +const apiRoot = "https://api-cloud.browserstack.com/app-automate"; +const hubRoot = "https://hub-cloud.browserstack.com/wd/hub"; + +function usage(): never { + console.error(`usage: bun benchmarks/v1/scripts/run-android-browserstack-appium-shards.ts [options] + +Run one generic App Automate AAB in one Appium session per function/device. +Completed shards resume safely and all retained evidence is credential-free. + +Required: + --manifest PATH prepare-android-release-aabs manifest + --output-dir PATH persistent evidence directory + +Selection/control: + --device "Device Name-OS.Version" repeatable (default: Google Pixel 7-13.0) + --only-function NAME repeatable + --timeout-secs N per-session cap (default: 7200) + --retry-failed retry failed shards + --dry-run validate all selected AABs, no network + --confirm-paid-browserstack required for uploads/device sessions + +Credentials are read only from BROWSERSTACK_USERNAME and +BROWSERSTACK_ACCESS_KEY. They are never written to evidence.`); + process.exit(2); +} + +function parseArgs(argv: string[]): Options { + let manifest = ""; + let outputDir = ""; + const devices: ReturnType[] = []; + const onlyFunctions = new Set(); + let dryRun = false; + let confirmPaid = false; + let retryFailed = false; + let timeoutSeconds = 7200; + for (let index = 0; index < argv.length; index += 1) { + const value = argv[index]!; + const next = () => argv[++index] ?? usage(); + switch (value) { + case "--manifest": + manifest = next(); + break; + case "--output-dir": + outputDir = next(); + break; + case "--device": + devices.push(parseDevice(next())); + break; + case "--only-function": + onlyFunctions.add(next()); + break; + case "--timeout-secs": + timeoutSeconds = Number.parseInt(next(), 10); + break; + case "--retry-failed": + retryFailed = true; + break; + case "--dry-run": + dryRun = true; + break; + case "--confirm-paid-browserstack": + confirmPaid = true; + break; + case "-h": + case "--help": + usage(); + default: + throw new Error(`unknown argument: ${value}`); + } + } + if (!manifest || !outputDir) usage(); + if ( + !Number.isSafeInteger(timeoutSeconds) || + timeoutSeconds < 60 || + timeoutSeconds > 14400 + ) { + throw new Error("--timeout-secs must be an integer from 60 to 14400"); + } + if (dryRun && confirmPaid) { + throw new Error("--dry-run and --confirm-paid-browserstack conflict"); + } + if (!dryRun && !confirmPaid) { + throw new Error( + "refusing paid calls without --confirm-paid-browserstack; use --dry-run first", + ); + } + return { + manifest: resolve(manifest), + outputDir: resolve(outputDir), + devices: + devices.length > 0 ? devices : [parseDevice("Google Pixel 7-13.0")], + onlyFunctions, + dryRun, + confirmPaid, + retryFailed, + timeoutSeconds, + }; +} + +function requiredEnvironment(name: string): string { + const value = process.env[name]; + if (!value) throw new Error(`set ${name} locally`); + return value; +} + +function basicAuthorization(username: string, accessKey: string): string { + return `Basic ${Buffer.from(`${username}:${accessKey}`).toString("base64")}`; +} + +async function parseResponse(response: Response): Promise { + const text = await response.text(); + if (!text) return {}; + try { + return JSON.parse(text); + } catch { + return text; + } +} + +async function request( + url: string, + authorization: string, + init: RequestInit = {}, +): Promise { + const response = await fetch(url, { + ...init, + headers: { Authorization: authorization, ...init.headers }, + }); + const payload = await parseResponse(response); + if (!response.ok) { + const object = + payload && typeof payload === "object" ? (payload as JsonObject) : {}; + const message = + typeof object.message === "string" + ? object.message + : typeof object.error === "string" + ? object.error + : response.statusText; + throw new Error(`${response.status} ${message}`); + } + return payload; +} + +async function webdriver( + path: string, + authorization: string, + method: "GET" | "POST" | "DELETE", + body?: unknown, +): Promise> { + const payload = (await request(`${hubRoot}${path}`, authorization, { + method, + headers: body === undefined ? undefined : { "Content-Type": "application/json" }, + body: body === undefined ? undefined : JSON.stringify(body), + })) as WebDriverResponse; + if (payload.value?.error) { + throw new Error( + `WebDriver ${method} ${path} failed: ${payload.value.message ?? payload.value.error}`, + ); + } + return payload; +} + +async function archiveBytes(path: string, entry: string): Promise { + const child = Bun.spawn(["unzip", "-p", path, entry], { + stdout: "pipe", + stderr: "pipe", + }); + const [bytes, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).bytes(), + new Response(child.stderr).text(), + child.exited, + ]); + if (exitCode !== 0) { + throw new Error(`could not extract ${entry} from ${path}: ${stderr.trim()}`); + } + return bytes; +} + +async function verifyEmbeddedPayload(entry: AabEntry): Promise { + const nativeHash = new Bun.CryptoHasher("sha256") + .update( + await archiveBytes( + entry.release_aab.path, + entry.embedded_native_library.archive_path, + ), + ) + .digest("hex"); + const specBytes = await archiveBytes( + entry.release_aab.path, + entry.embedded_bench_spec.archive_path, + ); + const specHash = new Bun.CryptoHasher("sha256") + .update(specBytes) + .digest("hex"); + if ( + nativeHash !== entry.embedded_native_library.sha256 || + specHash !== entry.embedded_bench_spec.sha256 + ) { + throw new Error(`${entry.function} embedded payload hash mismatch`); + } + const spec = JSON.parse(new TextDecoder().decode(specBytes)) as JsonObject; + if ( + spec.function !== entry.function || + spec.warmup !== 1 || + spec.iterations !== 5 + ) { + throw new Error(`${entry.function} embedded bench_spec contract mismatch`); + } +} + +async function uploadAab( + entry: AabEntry, + sourceSha: string, + authorization: string, + shardDir: string, +): Promise<{ appHandle: string; customId: string }> { + const started = performance.now(); + const customId = + `pkv1-${slugify(entry.function).slice(-48)}-` + + new Date().toISOString().replaceAll(/[-:.]/g, "").toLowerCase(); + const form = new FormData(); + form.set("file", Bun.file(entry.release_aab.path), basename(entry.release_aab.path)); + form.set("custom_id", customId); + const payload = (await request(uploadEndpoint, authorization, { + method: "POST", + body: form, + })) as JsonObject; + const appHandle = + typeof payload.app_url === "string" + ? payload.app_url + : typeof payload.app_handle === "string" + ? payload.app_handle + : undefined; + if (!appHandle?.startsWith("bs://")) { + throw new Error("BrowserStack upload returned no app handle"); + } + await writeJsonAtomic(join(shardDir, "upload.json"), { + schema: "provekit.browserstack-appium-aab-upload.v1", + uploaded_at: new Date().toISOString(), + endpoint: uploadEndpoint, + custom_id: customId, + source_sha: sourceSha, + function: entry.function, + artifact: { + filename: basename(entry.release_aab.path), + bytes: entry.release_aab.bytes, + sha256: entry.release_aab.sha256, + embedded_native_library_sha256: + entry.embedded_native_library.sha256, + embedded_bench_spec_sha256: entry.embedded_bench_spec.sha256, + build_profile: "release", + signed: entry.signed, + }, + upload: { + elapsed_seconds: (performance.now() - started) / 1000, + app_handle: appHandle, + }, + }); + return { appHandle, customId }; +} + +async function fetchDeviceLog( + rawSession: unknown, + authorization: string, +): Promise { + const session = sessionObject(rawSession); + const rawUrl = session.device_logs_url; + if (typeof rawUrl !== "string") { + throw new Error("BrowserStack session returned no device log URL"); + } + const deviceLogUrl = new URL(rawUrl); + if (deviceLogUrl.protocol !== "https:") { + throw new Error("BrowserStack session returned a non-HTTPS device log URL"); + } + let lastError: unknown; + for (let attempt = 0; attempt < 20; attempt += 1) { + try { + let response = await fetch(deviceLogUrl); + if ( + (response.status === 401 || response.status === 403) && + deviceLogUrl.hostname.endsWith("browserstack.com") + ) { + response = await fetch(deviceLogUrl, { + headers: { Authorization: authorization }, + }); + } + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + const payload = await response.text(); + if (payload.includes("BenchRunner")) { + return payload; + } + lastError = new Error("device log did not yet contain BenchRunner output"); + } catch (error) { + lastError = error; + } + await Bun.sleep(3000); + } + throw new Error( + `device log was unavailable after session completion: ${ + lastError instanceof Error ? lastError.message : String(lastError ?? "") + }`, + ); +} + +function sessionObject(payload: unknown): JsonObject { + if (!payload || typeof payload !== "object" || Array.isArray(payload)) return {}; + const object = payload as JsonObject; + if ( + object.automation_session && + typeof object.automation_session === "object" && + !Array.isArray(object.automation_session) + ) { + return object.automation_session as JsonObject; + } + return object; +} + +function allowlistedSessionSummary(payload: unknown): JsonObject { + const session = sessionObject(payload); + const allowed = [ + "name", + "duration", + "os", + "os_version", + "device", + "status", + "reason", + "hashed_id", + "build_name", + "project_name", + "build_hashed_id", + "browserstack_status", + "created_at", + ] as const; + const sanitized: JsonObject = {}; + for (const field of allowed) { + const value = session[field]; + if ( + typeof value === "string" || + typeof value === "number" || + typeof value === "boolean" || + value === null + ) { + sanitized[field] = value; + } + } + if ( + session.app_details && + typeof session.app_details === "object" && + !Array.isArray(session.app_details) + ) { + const app = session.app_details as JsonObject; + const allowedApp = [ + "app_name", + "app_version", + "app_custom_id", + "uploaded_at", + "app_filename", + ] as const; + const sanitizedApp: JsonObject = {}; + for (const field of allowedApp) { + const value = app[field]; + if ( + typeof value === "string" || + typeof value === "number" || + typeof value === "boolean" || + value === null + ) { + sanitizedApp[field] = value; + } + } + sanitized.app_details = sanitizedApp; + } + return sanitized; +} + +async function runSession( + entry: AabEntry, + sourceSha: string, + device: ReturnType, + options: Options, + authorization: string, + username: string, + accessKey: string, + shardDir: string, +): Promise<{ + sessionId: string; + buildId: string | null; + result: BenchResult; +}> { + const { appHandle, customId } = await uploadAab( + entry, + sourceSha, + authorization, + shardDir, + ); + const buildName = `provekit-v1-aab-${sourceSha.slice(0, 12)}`; + const sessionName = `${entry.function} ${device.label}`; + let sessionId: string | undefined; + let completionObserved = false; + let lastSourceBytes = 0; + let deleted = false; + try { + const created = await webdriver<{ + sessionId?: string; + capabilities?: JsonObject; + }>("/session", authorization, "POST", { + capabilities: { + alwaysMatch: { + platformName: "Android", + "appium:automationName": "UiAutomator2", + "appium:app": appHandle, + "bstack:options": { + userName: username, + accessKey, + deviceName: device.deviceName, + osVersion: device.osVersion, + projectName: "ProveKit V1 native Android benchmarks", + buildName, + sessionName, + deviceLogs: true, + appiumLogs: true, + }, + }, + }, + }); + sessionId = created.value?.sessionId ?? created.sessionId; + if (!sessionId) throw new Error("BrowserStack returned no Appium session ID"); + await writeJsonAtomic(join(shardDir, "session.json"), { + schema: "provekit.browserstack-appium-session-created.v1", + created_at: new Date().toISOString(), + app_handle: appHandle, + app_custom_id: customId, + session_id: sessionId, + source_sha: sourceSha, + function: entry.function, + requested_device: device, + project_name: "ProveKit V1 native Android benchmarks", + build_name: buildName, + session_name: sessionName, + credential_source: "env", + }); + + const deadline = Date.now() + options.timeoutSeconds * 1000; + while (Date.now() < deadline) { + const source = await webdriver( + `/session/${sessionId}/source`, + authorization, + "GET", + ); + const text = typeof source.value === "string" ? source.value : ""; + lastSourceBytes = text.length; + if ( + text.includes(entry.function) && + (text.includes("Iterations: 5") || + text.includes("Benchmark worker completed") || + text.includes("Benchmark Results")) + ) { + completionObserved = true; + break; + } + await Bun.sleep(2000); + } + if (!completionObserved) { + throw new Error( + `${entry.function} timed out after ${options.timeoutSeconds}s`, + ); + } + await webdriver(`/session/${sessionId}`, authorization, "DELETE"); + deleted = true; + } finally { + if (sessionId && !deleted) { + await webdriver(`/session/${sessionId}`, authorization, "DELETE").catch( + () => undefined, + ); + } + } + if (!sessionId) throw new Error("Appium session was not created"); + + const rawSummary = await request( + `${apiRoot}/sessions/${sessionId}.json`, + authorization, + ); + const summary = allowlistedSessionSummary(rawSummary); + await writeJsonAtomic(join(shardDir, "session-summary.json"), { + schema: "provekit.browserstack-appium-session.v1", + session: summary, + }); + const buildId = + typeof summary.build_hashed_id === "string" + ? summary.build_hashed_id + : null; + await writeJsonAtomic(join(shardDir, "build.json"), { + schema: "provekit.browserstack-appium-build.v1", + build_id: buildId, + build_name: + typeof summary.build_name === "string" ? summary.build_name : buildName, + session_id: sessionId, + source_sha: sourceSha, + }); + + const deviceLog = await fetchDeviceLog(rawSummary, authorization); + await Bun.write(join(shardDir, "device.log"), deviceLog); + const candidates = reconstructBenchResults(deviceLog).filter( + (candidate) => candidate.function === entry.function, + ); + if (candidates.length !== 1) { + throw new Error( + `expected exactly one BENCH_JSON result for ${entry.function}; found ${candidates.length}`, + ); + } + const result = candidates[0]!; + verifyBenchContract(result, entry.function); + await writeJsonAtomic(join(shardDir, "bench-report.json"), result); + await writeJsonAtomic(join(shardDir, "result.json"), { + schema: "provekit.browserstack-appium-result.v1", + completed_at: new Date().toISOString(), + source_sha: sourceSha, + function: entry.function, + requested_device: device, + app_handle: appHandle, + session_id: sessionId, + build_id: buildId, + completion_observed: completionObserved, + last_source_bytes: lastSourceBytes, + warmup: result.spec.warmup, + measured_samples: result.samples.length, + samples_ns: result.samples_ns, + artifact_sha256: entry.release_aab.sha256, + artifact_build_profile: entry.build_profile, + }); + return { sessionId, buildId, result }; +} + +async function writeIndex( + outputDir: string, + sourceSha: string, + manifestPath: string, +): Promise { + const find = Bun.spawn( + ["find", join(outputDir, "shards"), "-type", "f", "-name", "status.json"], + { stdout: "pipe", stderr: "pipe" }, + ); + const [stdout, exitCode] = await Promise.all([ + new Response(find.stdout).text(), + find.exited, + ]); + const statuses: unknown[] = []; + if (exitCode === 0) { + for (const path of stdout.split(/\r?\n/).filter(Boolean).sort()) { + statuses.push(await Bun.file(path).json()); + } + } + statuses.sort((left, right) => { + const a = left as { function?: string; device?: string }; + const b = right as { function?: string; device?: string }; + return `${a.function ?? ""}\0${a.device ?? ""}`.localeCompare( + `${b.function ?? ""}\0${b.device ?? ""}`, + ); + }); + await writeJsonAtomic(join(outputDir, "index.json"), { + schema: "provekit.android-browserstack-appium-shards.v1", + updated_at: new Date().toISOString(), + source_sha: sourceSha, + source_manifest: manifestPath, + shards: statuses, + }); +} + +async function main(): Promise { + const options = parseArgs(Bun.argv.slice(2)); + const manifest = await loadAndVerifyAabManifest(options.manifest); + const selected = manifest.entries.filter( + (entry) => + options.onlyFunctions.size === 0 || + options.onlyFunctions.has(entry.function), + ); + if (selected.length === 0) throw new Error("no selected function was found"); + for (const requested of options.onlyFunctions) { + if (!selected.some((entry) => entry.function === requested)) { + throw new Error(`unknown --only-function: ${requested}`); + } + } + for (const entry of selected) await verifyEmbeddedPayload(entry); + + if (options.dryRun) { + console.log( + JSON.stringify( + { + schema: "provekit.android-browserstack-appium-dry-run.v1", + source_sha: manifest.source_sha, + source_manifest_sha256: await sha256File(options.manifest), + selected_functions: selected.map((entry) => entry.function), + devices: options.devices.map((device) => device.label), + contract: { warmup: 1, iterations: 5 }, + release_aabs_verified: selected.length, + paid_calls: 0, + }, + null, + 2, + ), + ); + return; + } + + const username = requiredEnvironment("BROWSERSTACK_USERNAME"); + const accessKey = requiredEnvironment("BROWSERSTACK_ACCESS_KEY"); + const authorization = basicAuthorization(username, accessKey); + await mkdir(join(options.outputDir, "shards"), { recursive: true }); + + for (const entry of selected) { + for (const device of options.devices) { + const shardDir = join( + options.outputDir, + "shards", + slugify(entry.function), + slugify(device.label), + ); + await mkdir(shardDir, { recursive: true }); + const statusPath = join(shardDir, "status.json"); + if (await Bun.file(statusPath).exists()) { + const status = (await Bun.file(statusPath).json()) as JsonObject; + if (status.outcome === "success") { + const resultPath = join(shardDir, "bench-report.json"); + const identityPath = join(shardDir, "result.json"); + if ( + status.source_sha === manifest.source_sha && + status.artifact_sha256 === entry.release_aab.sha256 && + (await Bun.file(resultPath).exists()) && + (await Bun.file(identityPath).exists()) + ) { + const retained = (await Bun.file(resultPath).json()) as BenchResult; + const identity = (await Bun.file(identityPath).json()) as JsonObject; + if ( + identity.source_sha !== manifest.source_sha || + identity.artifact_sha256 !== entry.release_aab.sha256 || + identity.function !== entry.function + ) { + throw new Error( + `completed shard identity mismatch: ${shardDir}`, + ); + } + verifyBenchContract(retained, entry.function); + console.log( + `[skip completed] ${entry.function} on ${device.label}`, + ); + continue; + } + throw new Error( + `successful status lacks bench-report.json: ${shardDir}`, + ); + } + if (status.outcome === "failed" && !options.retryFailed) { + console.log( + `[skip failed; pass --retry-failed] ${entry.function} on ${device.label}`, + ); + continue; + } + } + const startedAt = new Date().toISOString(); + await writeJsonAtomic(join(shardDir, "request.json"), { + schema: "provekit.android-browserstack-appium-request.v1", + requested_at: startedAt, + source_sha: manifest.source_sha, + source_manifest: options.manifest, + source_manifest_sha256: await sha256File(options.manifest), + function: entry.function, + device, + artifact_sha256: entry.release_aab.sha256, + artifact_build_profile: "release", + signed: entry.signed, + warmup: 1, + iterations: 5, + credential_source: "env", + paid_confirmation: true, + }); + console.log(`[run] ${entry.function} on ${device.label}`); + try { + const completed = await runSession( + entry, + manifest.source_sha, + device, + options, + authorization, + username, + accessKey, + shardDir, + ); + await writeJsonAtomic(statusPath, { + schema: "provekit.android-browserstack-appium-status.v1", + source_sha: manifest.source_sha, + artifact_sha256: entry.release_aab.sha256, + function: entry.function, + device: device.label, + outcome: "success", + session_id: completed.sessionId, + build_id: completed.buildId, + started_at: startedAt, + finished_at: new Date().toISOString(), + result: relative(options.outputDir, join(shardDir, "result.json")), + bench_report: relative( + options.outputDir, + join(shardDir, "bench-report.json"), + ), + }); + } catch (error) { + const retainedSessionPath = join(shardDir, "session.json"); + const retainedSession = (await Bun.file(retainedSessionPath).exists()) + ? ((await Bun.file(retainedSessionPath).json()) as JsonObject) + : {}; + await writeJsonAtomic(statusPath, { + schema: "provekit.android-browserstack-appium-status.v1", + source_sha: manifest.source_sha, + artifact_sha256: entry.release_aab.sha256, + function: entry.function, + device: device.label, + outcome: "failed", + session_id: + typeof retainedSession.session_id === "string" + ? retainedSession.session_id + : null, + started_at: startedAt, + finished_at: new Date().toISOString(), + error: + error instanceof Error ? error.message : "unknown Appium failure", + }); + console.error( + `[failed] ${entry.function} on ${device.label}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + await writeIndex( + options.outputDir, + manifest.source_sha, + options.manifest, + ); + } + } + await writeIndex(options.outputDir, manifest.source_sha, options.manifest); +} + +await main(); diff --git a/benchmarks/v1/legacy/scripts/run-android-browserstack-shards.sh b/benchmarks/v1/legacy/scripts/run-android-browserstack-shards.sh new file mode 100755 index 000000000..036257ddc --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-android-browserstack-shards.sh @@ -0,0 +1,344 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + cat <<'EOF' +usage: run-android-browserstack-shards.sh [options] + +Run one BrowserStack build per Android function/device. Completed shards are +skipped; logs, build IDs, diagnostics, and results survive later failures. + +Options: + --manifest PATH Mobench prebuilt manifest.json + --output-dir PATH Persistent shard output directory + --device LABEL BrowserStack device label (repeatable) + --only-function NAME Fully-qualified function to run (repeatable) + --mobench-bin PATH cargo-mobench binary (default: cargo-mobench) + --retry-failed Retry previously failed paid shards + --dry-run Verify bundles without spending BrowserStack capacity + -h, --help Show this help +EOF +} + +manifest="" +output_dir="" +mobench_bin="${MOBENCH_BIN:-cargo-mobench}" +dry_run=0 +retry_failed=0 +devices=() +only_functions=() + +while [[ "$#" -gt 0 ]]; do + case "$1" in + --manifest) manifest="${2:?missing --manifest value}"; shift 2 ;; + --output-dir) output_dir="${2:?missing --output-dir value}"; shift 2 ;; + --device) devices+=("${2:?missing --device value}"); shift 2 ;; + --only-function) only_functions+=("${2:?missing --only-function value}"); shift 2 ;; + --mobench-bin) mobench_bin="${2:?missing --mobench-bin value}"; shift 2 ;; + --retry-failed) retry_failed=1; shift ;; + --dry-run) dry_run=1; shift ;; + -h | --help) usage; exit 0 ;; + *) echo "error: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done + +for command in jq shasum stat; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done +command -v "${mobench_bin}" >/dev/null 2>&1 || { + echo "error: Mobench binary not found: ${mobench_bin}" >&2 + exit 1 +} +[[ -n "${manifest}" && -f "${manifest}" ]] || { + echo "error: --manifest must name a regular manifest.json" >&2 + exit 1 +} +[[ "$(basename "${manifest}")" == "manifest.json" ]] || { + echo "error: Mobench requires the manifest to be named manifest.json" >&2 + exit 1 +} + +manifest="$(cd "$(dirname "${manifest}")" && pwd -P)/manifest.json" +manifest_root="$(dirname "${manifest}")" +output_dir="${output_dir:-${manifest_root}/android-sharded-results}" +mkdir -p "${output_dir}/bundles" "${output_dir}/shards" +output_dir="$(cd "${output_dir}" && pwd -P)" + +schema="$(jq -er '.schema' "${manifest}")" +platform="$(jq -er '.platform' "${manifest}")" +source_sha="$(jq -er '.source_sha | select(test("^[0-9a-f]{40}$"))' "${manifest}")" +mobench_version="$(jq -er '.mobench_version' "${manifest}")" +entry_count="$(jq -er '.entries | length | select(. > 0)' "${manifest}")" +iterations="$(jq -er '.entries[0].iterations' "${manifest}")" +warmup="$(jq -er '.entries[0].warmup' "${manifest}")" + +[[ "${schema}" == "mobench.prebuilt.v1" && "${platform}" == "android" ]] || { + echo "error: expected an Android mobench.prebuilt.v1 manifest" >&2 + exit 1 +} +jq -e --argjson iterations "${iterations}" --argjson warmup "${warmup}" \ + 'all(.entries[]; .iterations == $iterations and .warmup == $warmup)' \ + "${manifest}" >/dev/null || { + echo "error: every entry must use one iterations/warmup contract" >&2 + exit 1 +} + +if [[ "${#devices[@]}" -eq 0 ]]; then + devices=( + "Samsung Galaxy S24-14.0" + "Google Pixel 7-13.0" + "Samsung Galaxy M32-11.0" + ) +fi +if [[ "${dry_run}" -eq 0 ]] && + { [[ -z "${BROWSERSTACK_USERNAME:-}" ]] || [[ -z "${BROWSERSTACK_ACCESS_KEY:-}" ]]; }; then + echo "error: set BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY locally" >&2 + exit 1 +fi + +slugify() { + printf '%s' "$1" | + tr '[:upper:]' '[:lower:]' | + sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//' | + cut -c1-96 +} + +is_selected_function() { + local candidate="$1" + local selected + [[ "${#only_functions[@]}" -eq 0 ]] && return 0 + for selected in "${only_functions[@]}"; do + [[ "${candidate}" == "${selected}" ]] && return 0 + done + return 1 +} + +copy_clone() { + cp -c "$1" "$2" 2>/dev/null || cp "$1" "$2" +} + +sha256_file() { + shasum -a 256 "$1" | awk '{print $1}' +} + +file_size() { + stat -f '%z' "$1" 2>/dev/null || stat -c '%s' "$1" +} + +write_index() { + local index_tmp="${output_dir}/index.json.tmp" + local status_files=() + local status_file + while IFS= read -r status_file; do + status_files+=("${status_file}") + done < <(find "${output_dir}/shards" -type f -name status.json -print | sort) + + if [[ "${#status_files[@]}" -eq 0 ]]; then + jq -n --arg source_sha "${source_sha}" --arg version "${mobench_version}" \ + --arg manifest "${manifest}" '{ + schema: "provekit.android-browserstack-shards.v1", + source_sha: $source_sha, + mobench_version: $version, + source_manifest: $manifest, + shards: [] + }' >"${index_tmp}" + else + jq -s --arg source_sha "${source_sha}" --arg version "${mobench_version}" \ + --arg manifest "${manifest}" '{ + schema: "provekit.android-browserstack-shards.v1", + source_sha: $source_sha, + mobench_version: $version, + source_manifest: $manifest, + shards: sort_by(.function, .device) + }' "${status_files[@]}" >"${index_tmp}" + fi + mv "${index_tmp}" "${output_dir}/index.json" +} + +capture_stream() { + local log_path="$1" + local build_id_path="$2" + local line + while IFS= read -r line; do + printf '%s\n' "${line}" | tee -a "${log_path}" + case "${line}" in + *"Build ID: "*) + printf '%s\n' "${line##*Build ID: }" >"${build_id_path}.tmp" + mv "${build_id_path}.tmp" "${build_id_path}" + ;; + esac + done +} + +manifest_sha256="$(sha256_file "${manifest}")" +selected_count=0 + +for ((entry_index = 0; entry_index < entry_count; entry_index++)); do + function="$(jq -er --argjson index "${entry_index}" '.entries[$index].function' "${manifest}")" + is_selected_function "${function}" || continue + selected_count=$((selected_count + 1)) + + function_slug="$(slugify "${function}")" + bundle_dir="${output_dir}/bundles/$(printf '%04d' "${entry_index}")-${function_slug}" + bundle_manifest="${bundle_dir}/manifest.json" + source_entry_dir="${manifest_root}/entries/$(printf '%04d' "${entry_index}")" + bundle_entry_dir="${bundle_dir}/entries/0000" + + if [[ ! -f "${bundle_manifest}" ]]; then + mkdir -p "${bundle_entry_dir}" + copy_clone "${source_entry_dir}/app.apk" "${bundle_entry_dir}/app.apk" + copy_clone "${source_entry_dir}/test.apk" "${bundle_entry_dir}/test.apk" + jq --argjson index "${entry_index}" ' + .entries = [.entries[$index]] + | .entries[0].artifacts |= map( + .path |= sub("^entries/[0-9]{4}/"; "entries/0000/") + ) + ' "${manifest}" >"${bundle_manifest}.tmp" + mv "${bundle_manifest}.tmp" "${bundle_manifest}" + fi + + for artifact in app test; do + if [[ "${artifact}" == "app" ]]; then + artifact_kind="android-app" + else + artifact_kind="android-test-suite" + fi + expected_size="$(jq -er --arg kind "${artifact_kind}" \ + '.entries[0].artifacts[] | select(.kind == $kind) | .size' "${bundle_manifest}")" + expected_sha="$(jq -er --arg kind "${artifact_kind}" \ + '.entries[0].artifacts[] | select(.kind == $kind) | .sha256' "${bundle_manifest}")" + actual_path="${bundle_entry_dir}/${artifact}.apk" + [[ "$(file_size "${actual_path}")" == "${expected_size}" && + "$(sha256_file "${actual_path}")" == "${expected_sha}" ]] || { + echo "error: immutable bundle verification failed for ${function}" >&2 + exit 1 + } + done + + if [[ "${dry_run}" -eq 1 ]]; then + echo "[dry-run] verify function=${function}" + "${mobench_bin}" --dry-run ci run-prebuilt \ + --manifest "${bundle_manifest}" \ + --expected-source-sha "${source_sha}" \ + --expected-platform android \ + --expected-functions "${function}" \ + --expected-iterations "${iterations}" \ + --expected-warmup "${warmup}" \ + --devices "${devices[0]}" \ + --max-completion-timeout-secs 7200 + continue + fi + + for device in "${devices[@]}"; do + device_slug="$(slugify "${device}")" + shard_dir="${output_dir}/shards/$(printf '%04d' "${entry_index}")-${function_slug}/${device_slug}" + result_dir="${shard_dir}/result" + fetch_dir="${shard_dir}/browserstack" + status_path="${shard_dir}/status.json" + log_path="${shard_dir}/attempt.log" + build_id_path="${shard_dir}/build-id.txt" + mkdir -p "${shard_dir}" + + if [[ -f "${result_dir}/summary.json" ]] && + jq -e --arg function "${function}" --arg device "${device}" ' + (.functions[$function].summary.function == $function) + and (.functions[$function].summary.devices == [$device]) + ' "${result_dir}/summary.json" >/dev/null; then + echo "[skip completed] ${function} on ${device}" + continue + fi + if [[ -f "${status_path}" && "${retry_failed}" -eq 0 ]] && + jq -e '.outcome == "failed"' "${status_path}" >/dev/null; then + echo "[skip failed; pass --retry-failed] ${function} on ${device}" + continue + fi + + started_at="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + jq -n --arg function "${function}" --arg device "${device}" \ + --arg source_sha "${source_sha}" --arg manifest_sha256 "${manifest_sha256}" \ + --arg started_at "${started_at}" '{ + schema: "provekit.android-browserstack-shard-request.v1", + function: $function, + device: $device, + source_sha: $source_sha, + source_manifest_sha256: $manifest_sha256, + credential_source: "env", + started_at: $started_at + }' >"${shard_dir}/request.json.tmp" + mv "${shard_dir}/request.json.tmp" "${shard_dir}/request.json" + : >"${log_path}" + + echo "[run] ${function} on ${device}" + command_args=( + "${mobench_bin}" ci run-prebuilt + --manifest "${bundle_manifest}" + --expected-source-sha "${source_sha}" + --expected-platform android + --expected-functions "${function}" + --expected-iterations "${iterations}" + --expected-warmup "${warmup}" + --devices "${device}" + --output-dir "${result_dir}" + --fetch + --fetch-output-dir "${fetch_dir}" + --fetch-poll-interval-secs 10 + --fetch-timeout-secs 7200 + --max-completion-timeout-secs 7200 + ) + + set +e + "${command_args[@]}" 2>&1 | capture_stream "${log_path}" "${build_id_path}" + command_status="${PIPESTATUS[0]}" + set -e + + finished_at="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + build_id="" + [[ ! -f "${build_id_path}" ]] || build_id="$(tr -d '\r\n' <"${build_id_path}")" + if [[ "${command_status}" -eq 0 && -f "${result_dir}/summary.json" ]]; then + outcome="success" + else + outcome="failed" + fi + jq -n --arg function "${function}" --arg device "${device}" \ + --arg source_sha "${source_sha}" --arg build_id "${build_id}" \ + --arg outcome "${outcome}" --arg started_at "${started_at}" \ + --arg finished_at "${finished_at}" --arg log "${log_path}" \ + --arg summary "${result_dir}/summary.json" --argjson exit_code "${command_status}" '{ + schema: "provekit.android-browserstack-shard-status.v1", + function: $function, + device: $device, + source_sha: $source_sha, + build_id: ($build_id | if length > 0 then . else null end), + outcome: $outcome, + exit_code: $exit_code, + started_at: $started_at, + finished_at: $finished_at, + log: $log, + summary: (if $outcome == "success" then $summary else null end) + }' >"${status_path}.tmp" + mv "${status_path}.tmp" "${status_path}" + write_index + + [[ "${command_status}" -eq 0 ]] || + echo "[failed] ${function} on ${device}; inspect ${log_path}" >&2 + done +done + +[[ "${selected_count}" -gt 0 ]] || { + echo "error: no selected function exists in the manifest" >&2 + exit 1 +} +write_index +if [[ "${dry_run}" -eq 1 ]]; then + echo "Dry run complete: ${selected_count} function bundle(s) verified." +else + jq -r ' + ([.shards[] | select(.outcome == "success")] | length) as $success + | ([.shards[] | select(.outcome == "failed")] | length) as $failed + | "Android shard index updated: \($success) success, \($failed) failed" + ' "${output_dir}/index.json" +fi diff --git a/benchmarks/v1/legacy/scripts/run-e15-barretenberg-cold.sh b/benchmarks/v1/legacy/scripts/run-e15-barretenberg-cold.sh new file mode 100755 index 000000000..06b2e0f9d --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-e15-barretenberg-cold.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_root="$(cd "${script_dir}/../../.." && pwd)" +adb="${ADB:-${HOME}/Library/Android/sdk/platform-tools/adb}" +serial="${ANDROID_SERIAL:-ZY32M6782K}" +apk="${repo_root}/target/v1-benchmarks/e15-noir-barretenberg-armv7-build/android/app/build/outputs/apk/debug/app-debug.apk" +output_root="${repo_root}/target/v1-benchmarks/input-to-proof/e15/publication/cold" +package_id="dev.world.provekitv1mobileadapters.paritypassportnoirarmv7" +activity="dev.world.provekitv1mobileadapters.MainActivity" + +device_adb=("${adb}" -s "${serial}") + +wait_for_boot() { + "${device_adb[@]}" wait-for-device + until [[ "$("${device_adb[@]}" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" == "1" ]]; do + sleep 1 + done + "${device_adb[@]}" shell input keyevent 82 >/dev/null + # Android's native bad-process quarantine can survive boot completion. + sleep 60 +} + +valid_result() { + local result="$1" + [[ -f "${result}" ]] && + jq -e '.results | length == 1 and .[0].status == "ok" and (.[0].report.samples | length) == 1' \ + "${result}" >/dev/null +} + +run_series() { + local name="$1" + local workload="$2" + local timeout="$3" + local run output + for run in 0 1 2 3 4 5; do + output="${output_root}/barretenberg-${name}/run-${run}" + if valid_result "${output}/results.json"; then + echo "skip valid ${name} run-${run}" + continue + fi + mkdir -p "${output}" + "${device_adb[@]}" reboot + wait_for_boot + ANDROID_SERIAL="${serial}" ADB="${adb}" bun "${script_dir}/run-e15-provekit.ts" \ + --output "${output}" \ + --campaign input-to-proof-e15-barretenberg-cold \ + --apk "${apk}" \ + --package-id "${package_id}" \ + --activity-class "${activity}" \ + --worker-process-suffix :mobench_worker \ + --workloads "${workload}" \ + --warmup 0 \ + --samples 1 \ + --timeout-seconds "${timeout}" + valid_result "${output}/results.json" || { + echo "invalid ${name} run-${run}; retained at ${output}" >&2 + return 1 + } + done +} + +run_series oprf bb_oprf_input_to_proof 3600 +run_series webauthn bb_webauthn_input_to_proof 3600 +run_series passport-p1 bb_passport_p1_input_to_proof 5400 +run_series passport bb_passport_input_to_proof 7200 diff --git a/benchmarks/v1/legacy/scripts/run-e15-circom-input-to-proof.sh b/benchmarks/v1/legacy/scripts/run-e15-circom-input-to-proof.sh new file mode 100755 index 000000000..79a7d46f4 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-e15-circom-input-to-proof.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +set -euo pipefail + +mode="${1:-all}" +[[ "${mode}" == "warm" || "${mode}" == "cold" || "${mode}" == "all" ]] || { + echo "usage: $0 [warm|cold|all]" >&2 + exit 2 +} + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_root="$(cd "${script_dir}/../../.." && pwd)" +adb="${ADB:-${HOME}/Library/Android/sdk/platform-tools/adb}" +serial="${ANDROID_SERIAL:-ZY32M6782K}" +evidence_root="${repo_root}/target/v1-benchmarks/input-to-proof/e15/publication" +activity="dev.world.provekitv1mobileadapters.MainActivity" +device_adb=("${adb}" -s "${serial}") + +wait_for_boot() { + "${device_adb[@]}" wait-for-device + until [[ "$("${device_adb[@]}" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" == "1" ]]; do + sleep 1 + done + "${device_adb[@]}" shell input keyevent 82 >/dev/null + sleep 60 +} + +valid_result() { + local result="$1" + local measured="$2" + [[ -f "${result}" ]] && + jq -e --argjson measured "${measured}" \ + '.results | length == 1 and .[0].status == "ok" and (.[0].report.samples | length) == $measured' \ + "${result}" >/dev/null +} + +run_attempt() { + local name="$1" + local workload="$2" + local package_suffix="$3" + local warmup="$4" + local measured="$5" + local timeout="$6" + local output="$7" + local apk="${repo_root}/target/v1-benchmarks/e15-circom-${name}-input-to-proof-build/android/app/build/outputs/apk/debug/app-debug.apk" + local package_id="dev.world.provekitv1mobileadapters.${package_suffix}" + + if valid_result "${output}/results.json" "${measured}"; then + echo "skip valid ${name} ${output##*/}" + return + fi + mkdir -p "${output}" + "${device_adb[@]}" reboot + wait_for_boot + ANDROID_SERIAL="${serial}" ADB="${adb}" bun "${script_dir}/run-e15-provekit.ts" \ + --output "${output}" \ + --campaign input-to-proof-e15-circom-rapidsnark \ + --apk "${apk}" \ + --package-id "${package_id}" \ + --activity-class "${activity}" \ + --worker-process-suffix :mobench_worker \ + --workloads "${workload}" \ + --warmup "${warmup}" \ + --samples "${measured}" \ + --timeout-seconds "${timeout}" + valid_result "${output}/results.json" "${measured}" || { + echo "invalid ${name} attempt retained at ${output}" >&2 + return 1 + } +} + +run_workload() { + local name="$1" + local workload="$2" + local package_suffix="$3" + local timeout="$4" + local run + if [[ "${mode}" == "warm" || "${mode}" == "all" ]]; then + run_attempt "${name}" "${workload}" "${package_suffix}" 1 5 "${timeout}" \ + "${evidence_root}/warm/circom-${name}" + fi + if [[ "${mode}" == "cold" || "${mode}" == "all" ]]; then + for run in 0 1 2 3 4 5; do + run_attempt "${name}" "${workload}" "${package_suffix}" 0 1 "${timeout}" \ + "${evidence_root}/cold/circom-${name}/run-${run}" + done + fi +} + +run_workload oprf circom_oprf_input_to_proof rapidsnarkoprfinputtoproof 7200 +run_workload passport-disclose circom_passport_disclose_input_to_proof rapidsnarkpassportdiscloseinputtoproof 7200 +run_workload passport-register circom_passport_register_input_to_proof rapidsnarkpassportregisterinputtoproof 10800 +run_workload passport-p1 circom_passport_p1_input_to_proof rapidsnarkpassportp1inputtoproof 10800 +run_workload webauthn circom_webauthn_input_to_proof rapidsnarkwebauthninputtoproof 10800 diff --git a/benchmarks/v1/legacy/scripts/run-e15-taceo-candidate.ts b/benchmarks/v1/legacy/scripts/run-e15-taceo-candidate.ts new file mode 100755 index 000000000..f9a12c047 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-e15-taceo-candidate.ts @@ -0,0 +1,460 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +interface Options { + output: string; + campaign: string; + apk: string; + packageId: string; + activityClass: string; + warmup: number; + samples: number; + timeoutSeconds: number; + workloads: string[]; + rebootBeforeEach: boolean; + passportSingleThread: boolean; + workerProcessSuffix: string; +} + +const workloads = [ + ["taceo_oprf_query", "zk_mobile_bench::bench_query_cached_proof_generation"], + ["taceo_oprf_nullifier", "zk_mobile_bench::bench_nullifier_cached_proof_generation"], + ["taceo_correctness_canary", "zk_mobile_bench::bench_taceo_correctness_canary"], + ["oprf", "bench_mobile::bench_oprf_prove"], + ["webauthn", "bench_mobile::bench_webauthn_assertion_prove"], + ["passport", "bench_mobile::bench_passport_complete_age_check_prove"], + ["oprf_input_to_proof", "bench_mobile::bench_oprf_input_to_proof"], + ["webauthn_input_to_proof", "bench_mobile::bench_webauthn_assertion_input_to_proof"], + ["passport_input_to_proof", "bench_mobile::bench_passport_complete_age_check_input_to_proof"], + ["passport_p1_input_to_proof", "bench_mobile::bench_passport_p1_input_to_proof"], + ["bb_oprf_input_to_proof", "provekit_v1_mobile_adapters::bench_oprf_barretenberg_input_to_proof"], + ["bb_webauthn_input_to_proof", "provekit_v1_mobile_adapters::bench_webauthn_barretenberg_input_to_proof"], + ["bb_passport_input_to_proof", "provekit_v1_mobile_adapters::bench_passport_barretenberg_input_to_proof"], + ["bb_passport_p1_input_to_proof", "provekit_v1_mobile_adapters::bench_passport_p1_barretenberg_input_to_proof"], + ["circom_oprf_input_to_proof", "provekit_v1_rapidsnark_mobile_oprf::bench_oprf_nullifier_rapidsnark_input_to_proof"], + ["circom_webauthn_input_to_proof", "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_input_to_proof"], + ["circom_passport_p1_input_to_proof", "provekit_v1_rapidsnark_mobile::bench_passport_p1_rapidsnark_input_to_proof"], + ["circom_passport_disclose_input_to_proof", "provekit_v1_rapidsnark_mobile::bench_passport_rapidsnark_input_to_proof"], + ["circom_passport_register_input_to_proof", "provekit_v1_rapidsnark_mobile_register::bench_passport_rapidsnark_input_to_proof"], +] as const; + +export function parseBenchJson(log: string): unknown { + const lines = log.split(/\r?\n/); + const end = lines.findLastIndex((line) => line.includes("BENCH_JSON_END")); + const start = lines.findLastIndex( + (line, index) => index < end && line.includes("BENCH_JSON_START"), + ); + if (start < 0 || end < 0) throw new Error("logcat contains no complete BENCH_JSON record"); + const chunks = lines + .slice(start + 1, end) + .filter((line) => line.includes("BENCH_JSON_CHUNK ")) + .map((line) => line.slice(line.indexOf("BENCH_JSON_CHUNK ") + "BENCH_JSON_CHUNK ".length)); + if (chunks.length === 0) throw new Error("logcat contains no BENCH_JSON_CHUNK records"); + return JSON.parse(chunks.join("")); +} + +export function parseFailureJson(log: string): unknown | null { + const line = log + .split(/\r?\n/) + .findLast((candidate) => candidate.includes("BENCH_FAILURE_JSON ")); + if (!line) return null; + return JSON.parse( + line.slice(line.indexOf("BENCH_FAILURE_JSON ") + "BENCH_FAILURE_JSON ".length), + ); +} + +export function orchestrationFailure( + workload: string, + functionName: string, + error: unknown, + evidencePath: string, +) { + return { + workload, + function: functionName, + status: "not_run", + failure: { + schema_version: 1, + kind: "device_orchestration_failed", + message: error instanceof Error ? error.message : String(error), + }, + evidence_path: evidencePath, + }; +} + +function positiveInteger(value: string, flag: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed <= 0) throw new Error(`${flag} must be positive`); + return parsed; +} + +function nonNegativeInteger(value: string, flag: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 0) throw new Error(`${flag} must be non-negative`); + return parsed; +} + +function parseArgs(args: string[]): Options { + const repoRoot = resolve(import.meta.dir, "../../.."); + const options: Options = { + output: resolve(repoRoot, "target/v1-benchmarks/reproduction/e15-provekit"), + campaign: "provekit-v1-cross-device", + apk: resolve( + repoRoot, + "target/v1-benchmarks/e15-diagnostic-build/android/app/build/outputs/apk/debug/app-debug.apk", + ), + packageId: "dev.world.benchmobile", + activityClass: ".MainActivity", + warmup: 1, + samples: 5, + timeoutSeconds: 7200, + workloads: workloads.map(([name]) => name), + rebootBeforeEach: false, + passportSingleThread: false, + workerProcessSuffix: ":input_to_proof", + }; + for (let index = 0; index < args.length; index++) { + const flag = args[index]!; + if (flag === "--sequential") continue; + if (flag === "--reboot-before-each") { + options.rebootBeforeEach = true; + continue; + } + if (flag === "--passport-single-thread") { + options.passportSingleThread = true; + continue; + } + const value = args[++index]; + if (!value) throw new Error(`missing value for ${flag}`); + if (flag === "--output") options.output = resolve(value); + else if (flag === "--campaign") options.campaign = value; + else if (flag === "--apk") options.apk = resolve(value); + else if (flag === "--package-id") options.packageId = value; + else if (flag === "--activity-class") options.activityClass = value; + else if (flag === "--warmup") options.warmup = nonNegativeInteger(value, flag); + else if (flag === "--samples") options.samples = positiveInteger(value, flag); + else if (flag === "--timeout-seconds") { + options.timeoutSeconds = positiveInteger(value, flag); + } else if (flag === "--workloads") { + const selected = value.split(",").filter(Boolean); + const known = new Set(workloads.map(([name]) => name)); + const unknown = selected.filter((name) => !known.has(name)); + if (selected.length === 0 || unknown.length > 0) { + throw new Error( + `${flag} must be a comma-separated subset of ${[...known].join(",")}`, + ); + } + options.workloads = selected; + } else if (flag === "--worker-process-suffix") { + if (!/^:[A-Za-z0-9_]+$/.test(value)) { + throw new Error(`${flag} must match :[A-Za-z0-9_]+`); + } + options.workerProcessSuffix = value; + } else { + throw new Error(`unknown argument: ${flag}`); + } + } + return options; +} + +function adbCommand(): string[] { + const adb = + process.env.ADB ?? + resolve( + process.env.ANDROID_HOME ?? + process.env.ANDROID_SDK_ROOT ?? + resolve(process.env.HOME!, "Library/Android/sdk"), + "platform-tools/adb", + ); + const command = [adb]; + if (process.env.ANDROID_SERIAL) command.push("-s", process.env.ANDROID_SERIAL); + return command; +} + +async function command( + args: string[], + allowFailure = false, + timeoutMs?: number, +): Promise { + const child = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + let timedOut = false; + const timer = + timeoutMs === undefined + ? undefined + : setTimeout(() => { + timedOut = true; + child.kill(); + }, timeoutMs); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + if (timer !== undefined) clearTimeout(timer); + if (timedOut) { + throw new Error(`${args.join(" ")} timed out after ${timeoutMs} ms`); + } + if (exitCode !== 0 && !allowFailure) { + throw new Error(`${args.join(" ")} failed (${exitCode})\n${stderr}\n${stdout}`); + } + return `${stdout}${stderr}`; +} + +async function logcat(adb: string[]): Promise { + return command( + [ + ...adb, + "logcat", + "-d", + "-v", + "epoch", + "BenchRunner:I", + "lowmemorykiller:I", + "ActivityManager:I", + "AndroidRuntime:E", + "libc:E", + "DEBUG:I", + "*:S", + ], + false, + 120_000, + ); +} + +async function workerPid( + adb: string[], + packageId: string, + workerProcessSuffix: string, +): Promise { + return ( + await command( + [...adb, "shell", "pidof", `${packageId}${workerProcessSuffix}`], + true, + ) + ).trim(); +} + +async function waitForPackageRemoval(adb: string[], packageId: string): Promise { + for (let attempt = 0; attempt < 60; attempt++) { + const path = await command( + [...adb, "shell", "pm", "path", packageId], + true, + ); + if (path.trim() === "") return; + await Bun.sleep(500); + } + throw new Error(`timed out waiting for ${packageId} removal`); +} + +async function rebootDevice(adb: string[]): Promise { + await command([...adb, "reboot"]); + await command([...adb, "wait-for-device"]); + for (let attempt = 0; attempt < 180; attempt++) { + const completed = await command( + [...adb, "shell", "getprop", "sys.boot_completed"], + true, + ); + if (completed.trim() === "1") { + await command([...adb, "shell", "input", "keyevent", "82"], true); + await Bun.sleep(3000); + return; + } + await Bun.sleep(1000); + } + throw new Error("timed out waiting for the E15 to finish rebooting"); +} + +async function runWorkload( + adb: string[], + options: Options, + workload: string, + functionName: string, +) { + // Android marks a process as bad after a native crash and may refuse to + // launch the worker for later workloads even after `am force-stop` or an + // in-place reinstall. A fresh package install clears that quarantine and is + // outside every measured benchmark interval. + await command([...adb, "uninstall", options.packageId], true); + await command([...adb, "uninstall", `${options.packageId}.test`], true); + await waitForPackageRemoval(adb, options.packageId); + await command([...adb, "install", "-r", "-t", options.apk]); + const startCommand = [ + ...adb, + "shell", + "am", + "start", + "-W", + "-n", + `${options.packageId}/${options.activityClass}`, + "--es", + "bench_function", + functionName, + "--ei", + "bench_iterations", + String(options.samples), + "--ei", + "bench_warmup", + String(options.warmup), + "--el", + "bench_timeout_secs", + String(options.timeoutSeconds), + "--el", + "bench_heartbeat_interval_secs", + "10", + ]; + let log = ""; + let workerDied = false; + for (let launchAttempt = 0; launchAttempt < 2; launchAttempt++) { + await command([...adb, "logcat", "-c"]); + await command([...adb, "shell", "am", "force-stop", options.packageId]); + await command(startCommand); + const deadline = Date.now() + options.timeoutSeconds * 1000; + let observedWorker = false; + while (Date.now() < deadline) { + log = await logcat(adb); + if (log.includes("BENCH_JSON_END") || log.includes("BENCH_FAILURE_JSON ")) break; + const pid = await workerPid(adb, options.packageId, options.workerProcessSuffix); + if (pid !== "") { + observedWorker = true; + } else if (observedWorker) { + await Bun.sleep(2000); + log = await logcat(adb); + if (!log.includes("BENCH_JSON_END") && !log.includes("BENCH_FAILURE_JSON ")) { + workerDied = true; + } + break; + } + await Bun.sleep(2000); + } + const failure = parseFailureJson(log) as { message?: string } | null; + if ( + launchAttempt === 0 && + failure?.message?.includes("process is bad") + ) { + // ActivityManager's bad-process quarantine is keyed by process name and + // can survive reinstall/reboot briefly. Its backoff expires after about + // one minute; retrying the same installed APK preserves artifact identity. + await Bun.sleep(65_000); + workerDied = false; + continue; + } + break; + } + const logPath = resolve(options.output, `${workload}.logcat.txt`); + await Bun.write(logPath, log); + if (log.includes("BENCH_JSON_END")) { + return { + workload, + function: functionName, + status: "ok", + report: parseBenchJson(log), + evidence_path: logPath, + }; + } + const failure = parseFailureJson(log); + return { + workload, + function: functionName, + status: failure ? "runtime_failed" : workerDied ? "crashed" : "timed_out", + failure: + failure ?? + (workerDied + ? { + schema_version: 1, + kind: "worker_died", + message: + "isolated benchmark worker exited before emitting a result; inspect retained logcat for LMK or crash evidence", + } + : null), + evidence_path: logPath, + }; +} + +if (import.meta.main) { + const options = parseArgs(process.argv.slice(2)); + if (!(await Bun.file(options.apk).exists())) throw new Error(`missing APK: ${options.apk}`); + await mkdir(options.output, { recursive: true }); + const adb = adbCommand(); + const devices = await command([...adb, "devices", "-l"]); + const selectedSerial = process.env.ANDROID_SERIAL; + const connected = devices + .split(/\r?\n/) + .filter( + (line) => + /\sdevice(?:\s|$)/.test(line) && + (!selectedSerial || line.startsWith(`${selectedSerial}\t`) || line.startsWith(`${selectedSerial} `)), + ); + if (connected.length !== 1) { + throw new Error( + `expected exactly one authorized E15${selectedSerial ? ` matching ${selectedSerial}` : ""}, found ${connected.length}\n${devices}`, + ); + } + const identity = Object.fromEntries( + await Promise.all( + [ + ["manufacturer", "ro.product.manufacturer"], + ["model", "ro.product.model"], + ["os", "ro.build.version.release"], + ["abi", "ro.product.cpu.abi"], + ["abilist", "ro.product.cpu.abilist"], + ["abilist64", "ro.product.cpu.abilist64"], + ["zygote", "ro.zygote"], + ].map(async ([key, property]) => [ + key, + (await command([...adb, "shell", "getprop", property])).trim(), + ]), + ), + ); + await Bun.write( + resolve(options.output, "device.json"), + `${JSON.stringify({ captured_at_utc: new Date().toISOString(), ...identity }, null, 2)}\n`, + ); + const results = []; + for (const [workload, functionName] of workloads.filter(([name]) => + options.workloads.includes(name) + )) { + const selectedFunction = + options.passportSingleThread && workload === "passport" + ? "bench_mobile::bench_passport_complete_age_check_prove_single_thread" + : options.passportSingleThread && workload === "passport_input_to_proof" + ? "bench_mobile::bench_passport_complete_age_check_input_to_proof_single_thread" + : functionName; + try { + if (options.rebootBeforeEach) await rebootDevice(adb); + results.push(await runWorkload(adb, options, workload, selectedFunction)); + } catch (error) { + const evidencePath = resolve(options.output, `${workload}.orchestration-failure.json`); + const failure = orchestrationFailure( + workload, + selectedFunction, + error, + evidencePath, + ); + await Bun.write(evidencePath, `${JSON.stringify(failure, null, 2)}\n`); + results.push(failure); + } + } + const output = { + schema_version: 1, + campaign_id: options.campaign, + generated_at_utc: new Date().toISOString(), + sampling: { warmup: options.warmup, measured: options.samples, sequential: true }, + device: identity, + apk: { + path: options.apk, + sha256: new Bun.CryptoHasher("sha256").update(await Bun.file(options.apk).bytes()).digest("hex"), + bytes: Bun.file(options.apk).size, + }, + android_package: { + id: options.packageId, + activity: options.activityClass, + worker_process_suffix: options.workerProcessSuffix, + }, + results, + }; + const outputPath = resolve(options.output, "results.json"); + await Bun.write(outputPath, `${JSON.stringify(output, null, 2)}\n`); + console.log(outputPath); +} diff --git a/benchmarks/v1/legacy/scripts/run-ios-browserstack-appium.ts b/benchmarks/v1/legacy/scripts/run-ios-browserstack-appium.ts new file mode 100644 index 000000000..418f37bd0 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-ios-browserstack-appium.ts @@ -0,0 +1,101 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +const [ipaArg, outputArg, countArg = "6"] = process.argv.slice(2); +if (!ipaArg || !outputArg) { + throw new Error("usage: run-ios-browserstack-appium.ts [count]"); +} +const username = process.env.BROWSERSTACK_USERNAME; +const accessKey = process.env.BROWSERSTACK_ACCESS_KEY; +if (!username || !accessKey) throw new Error("BrowserStack credentials are required"); +const ipa = resolve(ipaArg); +const output = resolve(outputArg); +const count = Number(countArg); +if (!Number.isInteger(count) || count < 1) throw new Error("count must be positive"); +await mkdir(output, { recursive: true }); + +const authorization = `Basic ${Buffer.from(`${username}:${accessKey}`).toString("base64")}`; +let appUrl = process.env.BROWSERSTACK_APP_URL; +if (!appUrl) { + const upload = new FormData(); + upload.set("file", Bun.file(ipa)); + const uploaded = await fetch("https://api-cloud.browserstack.com/app-automate/upload", { + method: "POST", + headers: { authorization }, + body: upload, + }); + if (!uploaded.ok) throw new Error(`BrowserStack app upload failed: HTTP ${uploaded.status}`); + appUrl = (await uploaded.json() as { app_url: string }).app_url; +} +await Bun.write(resolve(output, "upload.json"), `${JSON.stringify({ app_url: appUrl }, null, 2)}\n`); + +async function webdriver(path: string, init?: RequestInit) { + const response = await fetch(`https://hub-cloud.browserstack.com/wd/hub${path}`, { + ...init, + headers: { authorization, "content-type": "application/json", ...(init?.headers ?? {}) }, + }); + const body = await response.json().catch(() => null); + if (!response.ok) throw new Error(`WebDriver ${path} failed: HTTP ${response.status} ${JSON.stringify(body)}`); + return body; +} + +for (let index = 0; index < count; index++) { + const created = await webdriver("/session", { + method: "POST", + body: JSON.stringify({ + capabilities: { + alwaysMatch: { + platformName: "iOS", + "appium:app": appUrl, + "bstack:options": { + deviceName: "iPhone SE 2022", + osVersion: "15", + projectName: "ProveKit V1 input-to-proof recovery", + buildName: "iPhone Circom registration cold Appium", + sessionName: `registration cold ${index}`, + deviceLogs: true, + appProfiling: true, + idleTimeout: 900, + }, + }, + }, + }), + }); + const sessionId = created.value?.sessionId ?? created.sessionId; + if (!sessionId) throw new Error(`BrowserStack returned no session id: ${JSON.stringify(created)}`); + const evidence = { index, session_id: sessionId, app_url: appUrl }; + await Bun.write(resolve(output, `session-${index}.json`), `${JSON.stringify(evidence, null, 2)}\n`); + try { + const deadline = Date.now() + 7_200_000; + let report: unknown; + while (Date.now() < deadline) { + const found = await webdriver(`/session/${sessionId}/elements`, { + method: "POST", + body: JSON.stringify({ using: "accessibility id", value: "benchmarkReportJSON" }), + }); + const element = found.value?.[0]; + const elementId = element?.["element-6066-11e4-a52e-4f735466cecf"] ?? element?.ELEMENT; + if (elementId) { + for (const attribute of ["value", "label"]) { + const value = await webdriver(`/session/${sessionId}/element/${elementId}/attribute/${attribute}`); + if (typeof value.value === "string" && value.value.startsWith("{")) { + report = JSON.parse(value.value); + break; + } + } + } + if (report) break; + await Bun.sleep(5_000); + } + if (!report) throw new Error("timed out waiting for benchmarkReportJSON"); + await Bun.write(resolve(output, `report-${index}.json`), `${JSON.stringify(report, null, 2)}\n`); + await webdriver(`/session/${sessionId}/execute/sync`, { + method: "POST", + body: JSON.stringify({ script: "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\": \"passed\", \"reason\": \"structured Mobench report captured\"}}", args: [] }), + }).catch(() => null); + } finally { + await webdriver(`/session/${sessionId}`, { method: "DELETE", body: "{}" }).catch(() => null); + } +} diff --git a/benchmarks/v1/legacy/scripts/run-mac-native-benchmarks.ts b/benchmarks/v1/legacy/scripts/run-mac-native-benchmarks.ts new file mode 100644 index 000000000..7b912e96f --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-mac-native-benchmarks.ts @@ -0,0 +1,538 @@ +import { mkdir, rm } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; + +type Sample = { + iteration: number; + duration_ms: number; + max_rss_bytes: number | null; + proof_size_bytes: number; +}; + +const scriptDirectory = dirname(new URL(import.meta.url).pathname); +const benchmarkRoot = resolve(scriptDirectory, ".."); +const repoRoot = resolve(benchmarkRoot, "../.."); +const campaign = + process.env.MAC_BENCHMARK_CAMPAIGN ?? + new Date().toISOString().replaceAll(":", "").replaceAll(".", "-"); +const outputRoot = resolve( + process.env.MAC_BENCHMARK_OUTPUT ?? + `${repoRoot}/target/v1-benchmarks/results/mac-benchmarks/${campaign}/native`, +); +const publicationOutput = resolve( + process.env.MAC_BENCHMARK_JSON ?? + `${benchmarkRoot}/results/run-30041758043/mac-native-benchmarks.json`, +); +const timeBinary = "/usr/bin/time"; +const warmup = 1; +const iterations = 5; + +async function command( + args: string[], + options: { cwd?: string; stdout?: "inherit" | "pipe"; stderr?: "inherit" | "pipe" } = {}, +): Promise<{ stdout: string; stderr: string; exitCode: number }> { + const process = Bun.spawn(args, { + cwd: options.cwd ?? repoRoot, + stdout: options.stdout ?? "pipe", + stderr: options.stderr ?? "pipe", + env: processEnv(), + }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(process.stdout).text(), + new Response(process.stderr).text(), + process.exited, + ]); + return { stdout, stderr, exitCode }; +} + +function processEnv(): Record { + return Object.fromEntries( + Object.entries(process.env).filter((entry): entry is [string, string] => entry[1] !== undefined), + ); +} + +async function checked(args: string[], cwd = repoRoot): Promise { + const result = await command(args, { cwd }); + if (result.exitCode !== 0) { + throw new Error( + `${args.join(" ")} failed (${result.exitCode})\n${result.stdout}\n${result.stderr}`, + ); + } + return result.stdout.trim(); +} + +async function measured( + args: string[], + timePath: string, + cwd = repoRoot, +): Promise<{ + durationMs: number; + maxRssBytes: number | null; + stdout: string; + stderr: string; +}> { + const result = await command([timeBinary, "-l", "-o", timePath, ...args], { cwd }); + if (result.exitCode !== 0) { + throw new Error( + `${args.join(" ")} failed (${result.exitCode})\n${result.stdout}\n${result.stderr}`, + ); + } + const timing = await Bun.file(timePath).text(); + const real = /^\s*([0-9.]+)\s+real/m.exec(timing); + const rss = /^\s*([0-9]+)\s+maximum resident set size/m.exec(timing); + if (!real) throw new Error(`could not parse elapsed time from ${timePath}`); + return { + durationMs: Number.parseFloat(real[1]) * 1_000, + maxRssBytes: rss ? Number.parseInt(rss[1], 10) : null, + stdout: result.stdout, + stderr: result.stderr, + }; +} + +async function size(path: string): Promise { + return Bun.file(path).size; +} + +function median(values: number[]): number { + const sorted = [...values].sort((left, right) => left - right); + return sorted[Math.floor(sorted.length / 2)]; +} + +function summary(samples: Sample[]) { + const durations = samples.map(({ duration_ms }) => duration_ms); + const rss = samples + .map(({ max_rss_bytes }) => max_rss_bytes) + .filter((value): value is number => value !== null); + const proofSizes = samples.map(({ proof_size_bytes }) => proof_size_bytes); + return { + median_ms: median(durations), + min_ms: Math.min(...durations), + max_ms: Math.max(...durations), + max_process_peak_bytes: rss.length === 0 ? null : Math.max(...rss), + proof_size_bytes: median(proofSizes), + proof_sizes_bytes: proofSizes, + }; +} + +async function tamperBinary(source: string, destination: string): Promise { + const bytes = new Uint8Array(await Bun.file(source).arrayBuffer()); + bytes[Math.floor(bytes.byteLength / 2)] ^= 1; + await Bun.write(destination, bytes); +} + +async function runProveKit() { + const cli = resolve(repoRoot, "target/release/provekit-cli"); + if (!(await Bun.file(cli).exists())) { + await checked(["cargo", "build", "--release", "-p", "provekit-cli"]); + } + const definitions = [ + { + workload: "passport_complete_age_check", + input: resolve( + repoRoot, + "noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml", + ), + }, + { + workload: "webauthn_assertion", + input: resolve(benchmarkRoot, "noir/webauthn_assertion/Prover.toml"), + }, + { + workload: "oprf_taceo", + input: resolve(repoRoot, "target/v1-benchmarks/sources/oprf-nr/oprf_example/Prover.toml"), + }, + ]; + const results = []; + for (const definition of definitions) { + console.error(`[native] ProveKit ${definition.workload}`); + const artifactRoot = resolve( + repoRoot, + `target/v1-benchmarks/artifacts/${definition.workload}`, + ); + const pkp = resolve(artifactRoot, `${definition.workload}.pkp`); + const pkv = resolve(artifactRoot, `${definition.workload}.pkv`); + const work = resolve(outputRoot, `provekit/${definition.workload}`); + await mkdir(work, { recursive: true }); + const samples: Sample[] = []; + let lastProof = ""; + for (let run = 0; run < warmup + iterations; run += 1) { + const proof = resolve(work, `proof-${run}.np`); + const timing = resolve(work, `prove-${run}.time`); + const measuredRun = await measured([ + cli, + "prove", + "--prover", + pkp, + "--input", + definition.input, + "--out", + proof, + ], timing); + await checked([cli, "verify", "--verifier", pkv, "--proof", proof]); + lastProof = proof; + if (run >= warmup) { + samples.push({ + iteration: run - warmup, + duration_ms: measuredRun.durationMs, + max_rss_bytes: measuredRun.maxRssBytes, + proof_size_bytes: await size(proof), + }); + } + } + const tampered = resolve(work, "proof-tampered.np"); + await tamperBinary(lastProof, tampered); + const tamperResult = await command([cli, "verify", "--verifier", pkv, "--proof", tampered]); + if (tamperResult.exitCode === 0) { + throw new Error(`ProveKit accepted a tampered ${definition.workload} proof`); + } + results.push({ + workload: definition.workload, + backend: "provekit_v1_native", + sampling: { warmup, iterations }, + samples, + summary: summary(samples), + artifacts: { + prover_bundle_bytes: await size(pkp), + verifier_bytes: await size(pkv), + }, + verification: { valid_proofs_verified: true, tampered_proof_rejected: true }, + }); + } + return results; +} + +async function runBarretenberg() { + const bootstrap = resolve(scriptDirectory, "bootstrap-barretenberg.sh"); + const bb = (await checked([bootstrap])).split("\n").at(-1)!; + const version = await checked([bb, "--version"]); + const crs = resolve(repoRoot, "target/v1-benchmarks/tools/barretenberg-0.87.0/crs"); + await mkdir(crs, { recursive: true }); + const definitions = [ + "passport_complete_age_check", + "webauthn_assertion", + "oprf_taceo", + ]; + const results = []; + for (const workload of definitions) { + console.error(`[native] Barretenberg ${workload}`); + const assets = resolve(benchmarkRoot, `barretenberg/web/dist/assets/${workload}`); + const circuit = (await Bun.file(resolve(assets, "circuit.json")).json()) as { + bytecode: string; + }; + const work = resolve(outputRoot, `barretenberg/${workload}`); + await mkdir(work, { recursive: true }); + const bytecode = resolve(work, "bytecode.gz"); + await Bun.write(bytecode, Uint8Array.from(Buffer.from(circuit.bytecode, "base64"))); + const witness = resolve(assets, "witness.gz"); + const vk = resolve(work, "vk"); + const setupRoot = resolve(work, "setup"); + await rm(setupRoot, { recursive: true, force: true }); + await mkdir(setupRoot, { recursive: true }); + await checked([ + bb, + "prove", + "-s", + "ultra_honk", + "-b", + bytecode, + "-w", + witness, + "-o", + setupRoot, + "-c", + crs, + "--output_format", + "bytes", + "--write_vk", + ]); + await Bun.write(vk, Bun.file(resolve(setupRoot, "vk"))); + + const samples: Sample[] = []; + let lastProof = ""; + let lastPublic = ""; + for (let run = 0; run < warmup + iterations; run += 1) { + const runRoot = resolve(work, `run-${run}`); + await mkdir(runRoot, { recursive: true }); + const timing = resolve(runRoot, "prove.time"); + const measuredRun = await measured([ + bb, + "prove", + "-s", + "ultra_honk", + "-b", + bytecode, + "-w", + witness, + "-o", + runRoot, + "-c", + crs, + "--output_format", + "bytes", + ], timing); + const proof = resolve(runRoot, "proof"); + const publicInputs = resolve(runRoot, "public_inputs"); + await checked([ + bb, + "verify", + "-s", + "ultra_honk", + "-i", + publicInputs, + "-p", + proof, + "-k", + vk, + "-c", + crs, + ]); + lastProof = proof; + lastPublic = publicInputs; + if (run >= warmup) { + samples.push({ + iteration: run - warmup, + duration_ms: measuredRun.durationMs, + max_rss_bytes: measuredRun.maxRssBytes, + proof_size_bytes: await size(proof), + }); + } + } + const tampered = resolve(work, "proof-tampered"); + await tamperBinary(lastProof, tampered); + const tamperResult = await command([ + bb, + "verify", + "-s", + "ultra_honk", + "-i", + lastPublic, + "-p", + tampered, + "-k", + vk, + "-c", + crs, + ]); + if (tamperResult.exitCode === 0) { + throw new Error(`Barretenberg accepted a tampered ${workload} proof`); + } + const crsFiles = await Array.fromAsync( + new Bun.Glob("*").scan({ cwd: crs, absolute: true, onlyFiles: true }), + ); + const crsBytes = ( + await Promise.all(crsFiles.map(async (path) => ({ path, bytes: await size(path) }))) + ).reduce((total, file) => total + file.bytes, 0); + results.push({ + workload, + backend: "barretenberg_native", + backend_version: version, + threads: 16, + sampling: { warmup, iterations }, + samples, + summary: summary(samples), + artifacts: { + circuit_bytecode_bytes: await size(bytecode), + crs_bytes: crsBytes, + prover_bundle_bytes: (await size(bytecode)) + crsBytes, + verification_key_bytes: await size(vk), + }, + verification: { valid_proofs_verified: true, tampered_proof_rejected: true }, + }); + } + return results; +} + +async function runRapidsnark() { + await checked([resolve(scriptDirectory, "build-rapidsnark-host.sh")]); + const source = resolve(repoRoot, "target/v1-benchmarks/sources/rapidsnark"); + const prover = resolve(source, "package_macos_arm64/bin/prover"); + const verifier = resolve(source, "package_macos_arm64/bin/verifier"); + const definitions = [ + "register_sha256_sha256_sha256_rsa_65537_4096", + "vc_and_disclose", + ]; + const results = []; + for (const workload of definitions) { + console.error(`[native] Rapidsnark ${workload}`); + const sourceRoot = resolve(repoRoot, `target/v1-benchmarks/groth16/self/${workload}`); + const zkey = resolve(sourceRoot, `${workload}_0000.zkey`); + const witness = resolve( + repoRoot, + `target/v1-benchmarks/circom-witnesses/self/${workload}/wasm.wtns`, + ); + const verificationKey = resolve(sourceRoot, "verification_key.json"); + const work = resolve(outputRoot, `rapidsnark/${workload}`); + await mkdir(work, { recursive: true }); + const samples: Sample[] = []; + let lastProof = ""; + let lastPublic = ""; + for (let run = 0; run < warmup + iterations; run += 1) { + const proof = resolve(work, `proof-${run}.json`); + const publicInputs = resolve(work, `public-${run}.json`); + const timing = resolve(work, `prove-${run}.time`); + const measuredRun = await measured([prover, zkey, witness, proof, publicInputs], timing); + await checked([verifier, verificationKey, publicInputs, proof]); + lastProof = proof; + lastPublic = publicInputs; + if (run >= warmup) { + samples.push({ + iteration: run - warmup, + duration_ms: measuredRun.durationMs, + max_rss_bytes: measuredRun.maxRssBytes, + proof_size_bytes: await size(proof), + }); + } + } + const proofJson = (await Bun.file(lastProof).json()) as { + pi_a: string[]; + }; + proofJson.pi_a[0] = proofJson.pi_a[0] === "1" ? "2" : "1"; + const tampered = resolve(work, "proof-tampered.json"); + await Bun.write(tampered, `${JSON.stringify(proofJson)}\n`); + const tamperResult = await command([verifier, verificationKey, lastPublic, tampered]); + if (tamperResult.exitCode === 0) { + throw new Error(`Rapidsnark accepted a tampered ${workload} proof`); + } + results.push({ + workload: + workload === "register_sha256_sha256_sha256_rsa_65537_4096" + ? "self_passport_registration" + : "self_passport_disclosure", + source_workload: workload, + backend: "rapidsnark_groth16_native", + sampling: { warmup, iterations }, + samples, + summary: summary(samples), + artifacts: { + proving_key_bytes: await size(zkey), + verification_key_bytes: await size(verificationKey), + prover_bundle_lower_bound_bytes: await size(zkey), + }, + verification: { valid_proofs_verified: true, tampered_proof_rejected: true }, + }); + } + return results; +} + +async function runArkworks() { + console.error("[native] Arkworks World ID OPRF query and nullifier"); + const crate = resolve(benchmarkRoot, "arkworks-host"); + const target = resolve(repoRoot, "target/v1-benchmarks/arkworks-host"); + await checked(["cargo", "build", "--release", "--target-dir", target], crate); + const binary = resolve(target, "release/provekit-v1-arkworks-host-bench"); + const artifactLock = (await Bun.file(resolve(benchmarkRoot, "circom/artifacts.lock.json")).json()) as { + artifacts: Array<{ workload: string; size: number }>; + }; + const definitions = [ + { + workload: "world_id_oprf_query", + function: "zk_mobile_bench::bench_query_proving_only", + }, + { + workload: "world_id_oprf_nullifier", + function: "zk_mobile_bench::bench_nullifier_proving_only", + }, + ]; + const results = []; + for (const definition of definitions) { + const work = resolve(outputRoot, `arkworks/${definition.workload}`); + await mkdir(work, { recursive: true }); + const timing = resolve(work, "process.time"); + const processMeasurement = await measured( + [binary, definition.function], + timing, + crate, + ); + const report = JSON.parse(processMeasurement.stdout) as { + samples: Array<{ duration_ns: number; process_peak_memory_kb?: number }>; + resource_usage?: { process_peak_memory_kb?: number }; + }; + const bundleBytes = artifactLock.artifacts + .filter(({ workload }) => workload === definition.workload) + .reduce((total, artifact) => total + artifact.size, 0); + results.push({ + workload: definition.workload, + backend: "circom_compat_arkworks_native", + sampling: { warmup, iterations }, + samples: report.samples.map((sample, iteration) => ({ + iteration, + duration_ms: sample.duration_ns / 1_000_000, + process_peak_bytes: + sample.process_peak_memory_kb === undefined + ? null + : sample.process_peak_memory_kb * 1_000, + })), + summary: { + median_ms: median(report.samples.map(({ duration_ns }) => duration_ns / 1_000_000)), + min_ms: Math.min(...report.samples.map(({ duration_ns }) => duration_ns / 1_000_000)), + max_ms: Math.max(...report.samples.map(({ duration_ns }) => duration_ns / 1_000_000)), + max_process_peak_bytes: + report.resource_usage?.process_peak_memory_kb === undefined + ? processMeasurement.maxRssBytes + : report.resource_usage.process_peak_memory_kb * 1_000, + proof_size_bytes: null, + }, + artifacts: { prover_bundle_bytes: bundleBytes }, + verification: { + valid_proofs_verified: null, + tampered_proof_rejected: null, + limitation: "The pinned Mobench proof-only functions discard proof bytes.", + }, + }); + } + return results; +} + +await mkdir(outputRoot, { recursive: true }); +const output = { + schema_version: 1, + campaign, + generated_at: new Date().toISOString(), + environment: { + hardware: (await checked(["sysctl", "-n", "machdep.cpu.brand_string"])) || "Apple Silicon", + memory_bytes: Number.parseInt(await checked(["sysctl", "-n", "hw.memsize"]), 10), + os: (await checked(["sw_vers", "-productName"])) + " " + (await checked(["sw_vers", "-productVersion"])), + os_build: await checked(["sw_vers", "-buildVersion"]), + architecture: await checked(["uname", "-m"]), + }, + contract: { + sequential: true, + warmup, + measured_iterations: iterations, + duration: "fresh-process wall clock for native CLI lanes; Mobench duration for Arkworks", + memory: "maximum resident set size where available", + }, + results: { + provekit: await runProveKit(), + barretenberg: await runBarretenberg(), + arkworks: await runArkworks(), + rapidsnark: await runRapidsnark(), + }, + unavailable: [ + { + workload: "passport", + backend: "circom_compat_arkworks_native", + reason: "Self passport circuits use dynamic Circom control flow unsupported by circom-compat.", + }, + { + workload: "webauthn", + backend: "circom_compat_arkworks_native", + reason: + "privacy-ethereum/webauth-circom is compiled, but the Arkworks adapter and benchmark zkey are not prepared.", + }, + { + workload: "webauthn", + backend: "rapidsnark_groth16_native", + reason: + "privacy-ethereum/webauth-circom is compiled, but the Rapidsnark adapter and benchmark zkey are not prepared.", + }, + { + workload: "oprf", + backend: "rapidsnark_groth16_native", + reason: "No Rapidsnark-compatible prepared World ID OPRF zkey is retained.", + }, + ], +}; + +await mkdir(dirname(publicationOutput), { recursive: true }); +await Bun.write(publicationOutput, `${JSON.stringify(output, null, 2)}\n`); +console.log(publicationOutput); diff --git a/benchmarks/v1/legacy/scripts/run-mac-wasm-benchmarks.ts b/benchmarks/v1/legacy/scripts/run-mac-wasm-benchmarks.ts new file mode 100644 index 000000000..c3a384978 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-mac-wasm-benchmarks.ts @@ -0,0 +1,145 @@ +import { mkdir } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; + +const scriptDirectory = dirname(new URL(import.meta.url).pathname); +const benchmarkRoot = resolve(scriptDirectory, ".."); +const repoRoot = resolve(benchmarkRoot, "../.."); +const output = resolve( + process.env.MAC_WASM_BENCHMARK_JSON ?? + `${benchmarkRoot}/results/run-30041758043/mac-chrome-wasm-benchmarks.json`, +); +const chrome = + process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; +const workloads = [ + "passport_complete_age_check", + "webauthn_assertion", + "oprf_taceo", +]; + +function environment(extra: Record = {}): Record { + return { + ...Object.fromEntries( + Object.entries(process.env).filter( + (entry): entry is [string, string] => entry[1] !== undefined, + ), + ), + CHROME_PATH: chrome, + MOBENCH_WARMUP: "1", + MOBENCH_ITERATIONS: "5", + ...extra, + }; +} + +async function runJson( + args: string[], + cwd: string, + extraEnvironment: Record, +): Promise { + const child = Bun.spawn(args, { + cwd, + env: environment(extraEnvironment), + stdout: "pipe", + stderr: "pipe", + }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + if (exitCode !== 0) { + throw new Error(`${args.join(" ")} failed (${exitCode})\n${stdout}\n${stderr}`); + } + return JSON.parse(stdout); +} + +async function checked(args: string[]): Promise { + const child = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + if (exitCode !== 0) throw new Error(`${args.join(" ")} failed\n${stderr}`); + return stdout.trim(); +} + +if (!(await Bun.file(chrome).exists())) { + throw new Error(`Google Chrome was not found at ${chrome}`); +} +for (const required of [ + resolve(benchmarkRoot, "wasm/dist/manifest.json"), + resolve(benchmarkRoot, "barretenberg/web/dist/index.html"), + resolve(benchmarkRoot, "circom/web/dist/assets/manifest.json"), +]) { + if (!(await Bun.file(required).exists())) { + throw new Error(`missing built browser fixture ${required}; follow REPRODUCIBILITY.md`); + } +} + +const provekit = []; +for (const workload of workloads) { + console.error(`[Chrome WASM] ProveKit ${workload}`); + provekit.push( + await runJson( + ["bun", "run", "scripts/smoke.ts"], + resolve(benchmarkRoot, "wasm"), + { MOBENCH_WORKLOAD: workload }, + ), + ); +} + +const barretenberg = []; +for (const workload of workloads) { + console.error(`[Chrome WASM] Barretenberg ${workload}`); + barretenberg.push( + await runJson( + ["bun", "run", "web/smoke.ts"], + resolve(benchmarkRoot, "barretenberg"), + { MOBENCH_WORKLOAD: workload, BARRETENBERG_BENCH_PORT: "0" }, + ), + ); +} + +const circom = []; +for (const workload of ["passport", "webauthn", "oprf"]) { + console.error(`[Chrome WASM] Circom/SnarkJS ${workload}`); + circom.push( + await runJson( + ["bun", "run", "smoke.ts"], + resolve(benchmarkRoot, "circom/web"), + { MOBENCH_WORKLOAD: workload }, + ), + ); +} + +const report = { + schema_version: 1, + generated_at: new Date().toISOString(), + environment: { + hardware: await checked(["sysctl", "-n", "machdep.cpu.brand_string"]), + memory_bytes: Number.parseInt(await checked(["sysctl", "-n", "hw.memsize"]), 10), + os: `${await checked(["sw_vers", "-productName"])} ${await checked([ + "sw_vers", + "-productVersion", + ])}`, + os_build: await checked(["sw_vers", "-buildVersion"]), + architecture: await checked(["uname", "-m"]), + browser: await checked([chrome, "--version"]), + headless: true, + }, + contract: { + sequential: true, + browser: "Google Chrome only", + warmup: 1, + measured_iterations: 5, + wasm_threads: false, + process_peak_memory: null, + memory_limitation: + "Chrome does not expose reliable renderer-process peak RSS to page JavaScript.", + }, + results: { provekit, barretenberg, circom }, +}; + +await mkdir(dirname(output), { recursive: true }); +await Bun.write(output, `${JSON.stringify(report, null, 2)}\n`); +console.log(output); diff --git a/benchmarks/v1/legacy/scripts/run-passport-p1-circom-browser.ts b/benchmarks/v1/legacy/scripts/run-passport-p1-circom-browser.ts new file mode 100644 index 000000000..8aad651d3 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/run-passport-p1-circom-browser.ts @@ -0,0 +1,92 @@ +import { mkdir } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; + +const benchmarkRoot = resolve(import.meta.dir, ".."); +const repoRoot = resolve(benchmarkRoot, "../.."); +const webRoot = resolve(benchmarkRoot, "circom/web"); +const browserRoot = resolve( + process.env.P1_CIRCOM_BROWSER_ROOT ?? + `${repoRoot}/target/v1-benchmarks/semantic-parity/passport-p1/browser`, +); +const dist = resolve(browserRoot, "dist"); +const output = resolve( + process.env.P1_CIRCOM_BROWSER_REPORT ?? + `${repoRoot}/target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json`, +); +const chrome = + process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; + +async function commandOutput(args: string[]): Promise { + const process = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(process.stdout).text(), + new Response(process.stderr).text(), + process.exited, + ]); + if (exitCode !== 0) throw new Error(`${args.join(" ")} failed: ${stderr}`); + return stdout.trim(); +} + +for (const required of [ + resolve(dist, "index.html"), + resolve(dist, "assets/manifest.json"), + resolve(browserRoot, "fixtures/passport_p1_final.zkey"), +]) { + if (!(await Bun.file(required).exists())) { + throw new Error(`missing P1 browser artifact ${required}; run prepare-passport-p1-circom-browser.sh`); + } +} + +const environment = { + ...Object.fromEntries( + Object.entries(process.env).filter( + (entry): entry is [string, string] => entry[1] !== undefined, + ), + ), + CHROME_PATH: chrome, + CIRCOM_WEB_DIST: dist, + MOBENCH_WORKLOAD: "passport", + MOBENCH_WARMUP: "1", + MOBENCH_ITERATIONS: "5", + MOBENCH_SNARKJS_SINGLE_THREAD: "1", + MOBENCH_TIMEOUT_MS: process.env.MOBENCH_TIMEOUT_MS ?? "900000", +}; +const child = Bun.spawn(["bun", "run", "smoke.ts"], { + cwd: webRoot, + env: environment, + stdout: "pipe", + stderr: "pipe", +}); +const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, +]); +if (exitCode !== 0) { + throw new Error(`P1 Chrome runner failed (${exitCode})\n${stdout}\n${stderr}`); +} + +const report = JSON.parse(stdout) as Record; +const manifest = await Bun.file(resolve(dist, "assets/manifest.json")).json(); +const enriched = { + ...report, + semantic_profile: "P1", + benchmark_contract: { + warmup: 1, + measured_iterations: 5, + sequential: true, + snarkjs_single_thread: true, + valid_proof_verified_per_sample: true, + tampered_proof_rejected_per_sample: true, + }, + browser: { + name: "Google Chrome", + version: await commandOutput([chrome, "--version"]), + headless: true, + }, + browser_fixture_manifest: manifest, + runner_stderr: stderr, +}; +await mkdir(dirname(output), { recursive: true }); +await Bun.write(output, `${JSON.stringify(enriched, null, 2)}\n`); +console.log(output); diff --git a/benchmarks/v1/legacy/scripts/summarize-android-appium-release.ts b/benchmarks/v1/legacy/scripts/summarize-android-appium-release.ts new file mode 100644 index 000000000..855850c6f --- /dev/null +++ b/benchmarks/v1/legacy/scripts/summarize-android-appium-release.ts @@ -0,0 +1,200 @@ +#!/usr/bin/env bun + +import { dirname, join, resolve } from "node:path"; +import { + type BenchResult, + isSha256, + isSourceSha, + verifyBenchContract, + writeJsonAtomic, +} from "./android-appium-evidence"; + +type JsonObject = Record; + +const expectedFunctions = [ + "bench_mobile::bench_passport_complete_age_check_prepare", + "bench_mobile::bench_passport_complete_age_check_prove", + "bench_mobile::bench_passport_complete_age_check_verify", + "bench_mobile::bench_passport_complete_age_check_e2e", + "bench_mobile::bench_webauthn_assertion_prepare", + "bench_mobile::bench_webauthn_assertion_prove", + "bench_mobile::bench_webauthn_assertion_verify", + "bench_mobile::bench_webauthn_assertion_e2e", + "bench_mobile::bench_oprf_prepare", + "bench_mobile::bench_oprf_prove", + "bench_mobile::bench_oprf_verify", + "bench_mobile::bench_oprf_e2e", +] as const; + +function asObject(value: unknown, name: string): JsonObject { + if (!value || typeof value !== "object" || Array.isArray(value)) { + throw new Error(`${name} must be an object`); + } + return value as JsonObject; +} + +function numericSamples( + report: BenchResult, + field: "cpu_time_ms" | "process_peak_memory_kb", +): number[] { + return report.samples.flatMap((sample) => { + const value = sample[field]; + return typeof value === "number" && Number.isFinite(value) ? [value] : []; + }); +} + +function median(values: number[]): number { + if (values.length === 0) throw new Error("cannot compute an empty median"); + const sorted = [...values].sort((left, right) => left - right); + return sorted[Math.floor(sorted.length / 2)]!; +} + +async function main(): Promise { + const outputDir = resolve(Bun.argv[2] ?? ""); + if (!Bun.argv[2]) { + throw new Error( + "usage: bun benchmarks/v1/scripts/summarize-android-appium-release.ts OUTPUT_DIR", + ); + } + const indexPath = join(outputDir, "index.json"); + const index = asObject(await Bun.file(indexPath).json(), "index"); + if ( + index.schema !== "provekit.android-browserstack-appium-shards.v1" || + !isSourceSha(index.source_sha) || + !Array.isArray(index.shards) + ) { + throw new Error("invalid Android Appium shard index"); + } + + const byFunction = new Map(); + for (const rawStatus of index.shards) { + const status = asObject(rawStatus, "shard status"); + if ( + status.outcome !== "success" || + typeof status.function !== "string" || + typeof status.device !== "string" + ) { + continue; + } + if (status.device !== "Google Pixel 7-13.0") continue; + if (byFunction.has(status.function)) { + throw new Error(`duplicate successful shard: ${status.function}`); + } + byFunction.set(status.function, status); + } + + const missing = expectedFunctions.filter((name) => !byFunction.has(name)); + if (missing.length > 0) { + throw new Error(`release matrix is incomplete: ${missing.join(", ")}`); + } + + const rows: JsonObject[] = []; + for (const functionName of expectedFunctions) { + const status = byFunction.get(functionName)!; + if ( + status.source_sha !== index.source_sha || + !isSha256(status.artifact_sha256) || + typeof status.bench_report !== "string" || + typeof status.result !== "string" || + typeof status.session_id !== "string" || + typeof status.build_id !== "string" + ) { + throw new Error(`${functionName} status lacks publication identity`); + } + const reportPath = resolve(outputDir, status.bench_report); + const resultPath = resolve(outputDir, status.result); + const shardDir = dirname(reportPath); + const report = (await Bun.file(reportPath).json()) as BenchResult; + const identity = asObject(await Bun.file(resultPath).json(), "result"); + const request = asObject( + await Bun.file(join(shardDir, "request.json")).json(), + "request", + ); + const upload = asObject( + await Bun.file(join(shardDir, "upload.json")).json(), + "upload", + ); + const uploadArtifact = asObject(upload.artifact, "upload artifact"); + verifyBenchContract(report, functionName); + if ( + identity.source_sha !== index.source_sha || + identity.function !== functionName || + identity.artifact_sha256 !== status.artifact_sha256 || + identity.artifact_build_profile !== "release" || + identity.measured_samples !== 5 || + identity.warmup !== 1 + ) { + throw new Error(`${functionName} result identity mismatch`); + } + if ( + request.source_sha !== index.source_sha || + !isSha256(request.source_manifest_sha256) || + request.artifact_sha256 !== status.artifact_sha256 || + request.artifact_build_profile !== "release" || + request.signed !== true || + upload.source_sha !== index.source_sha || + upload.function !== functionName || + uploadArtifact.sha256 !== status.artifact_sha256 || + !Number.isSafeInteger(uploadArtifact.bytes) || + (uploadArtifact.bytes as number) <= 0 || + uploadArtifact.build_profile !== "release" || + uploadArtifact.signed !== true || + !isSha256(uploadArtifact.embedded_native_library_sha256) || + !isSha256(uploadArtifact.embedded_bench_spec_sha256) + ) { + throw new Error(`${functionName} request/upload provenance mismatch`); + } + const samples = report.samples_ns; + const cpu = numericSamples(report, "cpu_time_ms"); + const processPeak = numericSamples(report, "process_peak_memory_kb"); + rows.push({ + function: functionName, + device: status.device, + source_sha: index.source_sha, + artifact_sha256: status.artifact_sha256, + artifact_bytes: uploadArtifact.bytes, + embedded_native_library_sha256: + uploadArtifact.embedded_native_library_sha256, + embedded_bench_spec_sha256: uploadArtifact.embedded_bench_spec_sha256, + source_manifest_sha256: request.source_manifest_sha256, + session_id: status.session_id, + build_id: status.build_id, + warmup: 1, + measured_samples: 5, + samples_ns: samples, + median_ns: median(samples), + mean_ns: samples.reduce((sum, value) => sum + value, 0) / samples.length, + min_ns: Math.min(...samples), + max_ns: Math.max(...samples), + median_cpu_time_ms: cpu.length === 5 ? median(cpu) : null, + max_process_peak_memory_kb: + processPeak.length === 5 ? Math.max(...processPeak) : null, + bench_report: status.bench_report, + }); + } + + await writeJsonAtomic(join(outputDir, "summary.json"), { + schema: "provekit.android-appium-release-summary.v1", + generated_at: new Date().toISOString(), + source_sha: index.source_sha, + device: "Google Pixel 7", + os_version: "13.0", + control_plane: "BrowserStack App Automate + Appium/UiAutomator2", + wrapper: "signed release AAB", + contract: { warmup: 1, measured_samples: 5 }, + expected_functions: expectedFunctions.length, + completed_functions: rows.length, + publication_gate: { + exact_source: true, + release_wrapper: true, + function_isolated: true, + valid_proof_verification: true, + tampered_proof_rejected_by_retained_host_gate: true, + }, + rows, + source_index: "index.json", + evidence_root: ".", + }); +} + +await main(); diff --git a/benchmarks/v1/legacy/scripts/summarize-barretenberg-ios.ts b/benchmarks/v1/legacy/scripts/summarize-barretenberg-ios.ts new file mode 100644 index 000000000..4ceb4efdd --- /dev/null +++ b/benchmarks/v1/legacy/scripts/summarize-barretenberg-ios.ts @@ -0,0 +1,109 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { join, resolve } from "node:path"; + +type Benchmark = { + function: string; + samples: number; + mean_ns: number; + median_ns: number; + p95_ns: number; + min_ns: number; + max_ns: number; + resource_usage: { + peak_memory_kb: number; + peak_memory_growth_kb: number; + process_peak_memory_kb: number; + }; +}; + +type Run = { + spec: { + function: string; + iterations: number; + warmup: number; + devices: string[]; + ios_deployment_target: string; + }; + remote_run: { build_id: string }; + summary: { + device_summaries: Array<{ + device: string; + benchmarks: Benchmark[]; + }>; + }; +}; + +const resultRoot = resolve( + Bun.argv[2] ?? + "benchmarks/v1/results/run-30041758043/barretenberg-mobile-release", +); +const output = resolve( + Bun.argv[3] ?? join(resultRoot, "ios-v3-summary.json"), +); +const cases = [ + ["passport", "prove", "ios-passport-prove-v3-1x5.json"], + ["passport", "verify", "ios-passport-verify-v3-1x5.json"], + ["passport", "e2e", "ios-passport-e2e-v3-1x5.json"], + ["webauthn", "prove", "ios-webauthn-prove-v3-1x5.json"], + ["webauthn", "verify", "ios-webauthn-verify-v3-1x5.json"], + ["webauthn", "e2e", "ios-webauthn-e2e-v3-1x5.json"], + ["oprf", "prove", "ios-oprf-prove-v3-1x5.json"], + ["oprf", "verify", "ios-oprf-verify-v3-1x5.json"], + ["oprf", "e2e", "ios-oprf-e2e-v3-1x5.json"], +] as const; + +const results = []; +for (const [workload, phase, filename] of cases) { + const path = join(resultRoot, filename); + const run = (await Bun.file(path).json()) as Run; + const benchmark = run.summary.device_summaries[0]?.benchmarks[0]; + if ( + run.spec.iterations !== 5 || + run.spec.warmup !== 1 || + run.spec.devices.length !== 1 || + run.spec.ios_deployment_target !== "15.0" || + !benchmark || + benchmark.function !== run.spec.function || + benchmark.samples !== 5 + ) { + throw new Error(`${filename} does not satisfy the iOS 1+5 contract`); + } + results.push({ + workload, + phase, + function: benchmark.function, + device: run.summary.device_summaries[0]!.device, + iterations: run.spec.iterations, + warmup: run.spec.warmup, + mean_ns: benchmark.mean_ns, + median_ns: benchmark.median_ns, + p95_ns: benchmark.p95_ns, + min_ns: benchmark.min_ns, + max_ns: benchmark.max_ns, + peak_memory_kb: benchmark.resource_usage.peak_memory_kb, + peak_memory_growth_kb: benchmark.resource_usage.peak_memory_growth_kb, + process_peak_memory_kb: benchmark.resource_usage.process_peak_memory_kb, + browserstack_build_id: run.remote_run.build_id, + source: filename, + }); +} + +const summary = { + schema: "provekit.barretenberg-v087-ios-summary.v1", + campaign: "provekit-v1", + backend: "barretenberg", + backend_version: "0.87.0", + noir_version: "1.0.0-beta.11", + platform: "ios", + device: "iPhone SE 2022", + os: "15.4", + warmup: 1, + iterations: 5, + timing_unit: "ns", + results, +}; +await mkdir(resolve(output, ".."), { recursive: true }); +await Bun.write(output, `${JSON.stringify(summary, null, 2)}\n`); +console.log(output); diff --git a/benchmarks/v1/legacy/scripts/summarize-cached-android-recovery.ts b/benchmarks/v1/legacy/scripts/summarize-cached-android-recovery.ts new file mode 100644 index 000000000..84579072e --- /dev/null +++ b/benchmarks/v1/legacy/scripts/summarize-cached-android-recovery.ts @@ -0,0 +1,233 @@ +#!/usr/bin/env bun + +import { readdirSync, readFileSync, writeFileSync } from "node:fs"; +import { basename, join } from "node:path"; + +type BenchReport = { + function: string; + spec: { + name: string; + iterations: number; + warmup: number; + }; + samples_ns: number[]; + samples: Array<{ + duration_ns: number; + cpu_time_ms?: number; + process_peak_memory_kb?: number; + }>; + resources: { + process_peak_memory_kb?: number; + }; +}; + +type SessionRef = { + id: string; + status: string; +}; + +type Build = { + id: string; + status: string; + input_capabilities: { + app: string; + testSuite: string; + }; + devices: Array<{ + device: string; + os: string; + os_version: string; + sessions: SessionRef[]; + }>; +}; + +type Run = { + repetition: string; + build_id: string; + session_id: string; + device: string; + os: string; + os_version: string; + samples_ns: number[]; + sample_cpu_time_ms: number[]; + process_peak_memory_kb: number; +}; + +function usage(): never { + console.error( + "usage: summarize-cached-android-recovery.ts ROOT EXPECTED_FUNCTION OUTPUT", + ); + process.exit(2); +} + +function extractBenchReport(log: string): BenchReport { + const chunks: string[] = []; + let collecting = false; + + for (const line of log.split(/\r?\n/)) { + if (line.includes("BENCH_JSON_START")) { + collecting = true; + chunks.length = 0; + continue; + } + if (line.includes("BENCH_JSON_END")) { + break; + } + if (!collecting) continue; + const marker = "BENCH_JSON_CHUNK "; + const markerIndex = line.indexOf(marker); + if (markerIndex >= 0) chunks.push(line.slice(markerIndex + marker.length)); + } + + if (chunks.length === 0) { + throw new Error("device log does not contain a complete BENCH_JSON report"); + } + return JSON.parse(chunks.join("")) as BenchReport; +} + +function median(values: number[]): number { + const sorted = [...values].sort((a, b) => a - b); + const middle = Math.floor(sorted.length / 2); + return sorted.length % 2 === 0 + ? Math.round((sorted[middle - 1] + sorted[middle]) / 2) + : sorted[middle]; +} + +const [, , root, expectedFunction, output] = Bun.argv; +if (!root || !expectedFunction || !output) usage(); + +const repetitions = readdirSync(root, { withFileTypes: true }) + .filter( + (entry) => entry.isDirectory() && entry.name.startsWith("repetition-"), + ) + .map((entry) => entry.name) + .sort(); + +if (repetitions.length === 0) { + throw new Error(`no repetition directories found under ${root}`); +} + +const runs: Run[] = []; +const buildIds: string[] = []; +const appUrls = new Set(); +const testSuiteUrls = new Set(); + +for (const repetition of repetitions) { + const repetitionRoot = join(root, repetition); + const build = JSON.parse( + readFileSync(join(repetitionRoot, "build.json"), "utf8"), + ) as Build; + if (build.status !== "passed") { + throw new Error(`${repetition} build ${build.id} is ${build.status}`); + } + + buildIds.push(build.id); + appUrls.add(build.input_capabilities.app); + testSuiteUrls.add(build.input_capabilities.testSuite); + + for (const device of build.devices) { + for (const session of device.sessions) { + if (session.status !== "passed") { + throw new Error( + `${repetition} session ${session.id} is ${session.status}`, + ); + } + const logPath = join(repetitionRoot, `device-${session.id}.log`); + const report = extractBenchReport(readFileSync(logPath, "utf8")); + if ( + report.function !== expectedFunction || + report.spec.name !== expectedFunction + ) { + throw new Error( + `${logPath} returned ${report.function}, expected ${expectedFunction}`, + ); + } + if ( + report.spec.iterations !== 2 || + report.spec.warmup !== 1 || + report.samples_ns.length !== 2 + ) { + throw new Error( + `${logPath} does not satisfy the cached 1 warmup + 2 sample contract`, + ); + } + + const samplePeaks = report.samples + .map((sample) => sample.process_peak_memory_kb ?? 0) + .filter((value) => value > 0); + const reportPeak = report.resources.process_peak_memory_kb ?? 0; + runs.push({ + repetition, + build_id: build.id, + session_id: session.id, + device: device.device, + os: device.os, + os_version: device.os_version, + samples_ns: report.samples_ns, + sample_cpu_time_ms: report.samples + .map((sample) => sample.cpu_time_ms) + .filter((value): value is number => value !== undefined), + process_peak_memory_kb: Math.max(reportPeak, ...samplePeaks), + }); + } + } +} + +const devices = [...new Set(runs.map((run) => run.device))] + .sort() + .map((device) => { + const deviceRuns = runs.filter((run) => run.device === device); + const samples = deviceRuns.flatMap((run) => run.samples_ns); + const cpuTimes = deviceRuns.flatMap((run) => run.sample_cpu_time_ms); + if (deviceRuns.length !== repetitions.length || samples.length !== 6) { + throw new Error( + `${device} has ${deviceRuns.length} repetitions and ${samples.length} samples`, + ); + } + return { + device, + os: deviceRuns[0].os, + os_version: deviceRuns[0].os_version, + repetitions: deviceRuns.length, + warmups: deviceRuns.length, + sample_count: samples.length, + samples_ns: samples, + median_ns: median(samples), + min_ns: Math.min(...samples), + max_ns: Math.max(...samples), + median_cpu_time_ms: + cpuTimes.length === samples.length ? median(cpuTimes) : null, + process_peak_memory_kb: Math.max( + ...deviceRuns.map((run) => run.process_peak_memory_kb), + ), + build_ids: deviceRuns.map((run) => run.build_id), + session_ids: deviceRuns.map((run) => run.session_id), + }; + }); + +const summary = { + schema: "provekit.cached-android-recovery.v1", + function: expectedFunction, + sampling_contract: { + repetitions: repetitions.length, + warmups_per_repetition: 1, + measured_samples_per_repetition: 2, + total_warmups: repetitions.length, + total_measured_samples: 6, + note: "This differs from the primary 1 warmup + 5 sample campaign contract.", + }, + threading: "Android platform-default uncapped Rayon pool", + artifact_provenance: { + app_urls: [...appUrls], + test_suite_urls: [...testSuiteUrls], + source_sha: null, + limitation: + "BrowserStack retained the executable artifacts but not a source SHA or downloadable APK.", + }, + build_ids: buildIds, + devices, + raw_root: basename(root), +}; + +writeFileSync(output, `${JSON.stringify(summary, null, 2)}\n`); +console.log(`Wrote ${output}`); diff --git a/benchmarks/v1/legacy/scripts/validate-barretenberg-mobile-apps.ts b/benchmarks/v1/legacy/scripts/validate-barretenberg-mobile-apps.ts new file mode 100644 index 000000000..fafa1c039 --- /dev/null +++ b/benchmarks/v1/legacy/scripts/validate-barretenberg-mobile-apps.ts @@ -0,0 +1,166 @@ +#!/usr/bin/env bun + +import { createHash } from "node:crypto"; +import { mkdtemp, stat, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; + +type Platform = "ios" | "android"; +type Asset = { path: string; bytes: number; sha256: string }; +type RuntimeManifest = { platform: Platform; assets: Asset[] }; + +function parseOptions(args: string[]) { + const values = new Map(); + for (let index = 0; index < args.length; index += 2) { + const flag = args[index]; + const value = args[index + 1]; + if (!flag?.startsWith("--") || !value) { + throw new Error( + "usage: validate-barretenberg-mobile-apps.ts --ipa " + + "--aab --ios-package " + + "--android-package --output ", + ); + } + values.set(flag.slice(2), value); + } + for (const name of [ + "ipa", + "aab", + "ios-package", + "android-package", + "output", + ]) { + if (!values.has(name)) throw new Error(`--${name} is required`); + } + return Object.fromEntries( + [...values].map(([key, value]) => [key, resolve(value)]), + ) as Record; +} + +function sha256(bytes: Uint8Array): string { + return createHash("sha256").update(bytes).digest("hex"); +} + +async function fileIdentity(path: string) { + const bytes = new Uint8Array(await Bun.file(path).arrayBuffer()); + return { bytes: bytes.length, sha256: sha256(bytes) }; +} + +function archiveEntry(archive: string, entry: string): Uint8Array { + const result = Bun.spawnSync(["unzip", "-p", archive, entry]); + if (result.exitCode !== 0 || result.stdout.length === 0) { + throw new Error(`missing archive entry ${entry}`); + } + return result.stdout; +} + +function encodedResourceName(path: string): string { + let encoded = path.replaceAll("/", "_").replaceAll(".", "_").replaceAll("-", "_"); + while (encoded.includes("__")) encoded = encoded.replaceAll("__", "_"); + return `libmobench_bb_v087_${encoded}.so`; +} + +async function validateRuntime( + platform: Platform, + archive: string, + packageRoot: string, +) { + const manifestPath = join(packageRoot, "runtime-package-manifest.json"); + const manifest = (await Bun.file(manifestPath).json()) as RuntimeManifest; + if (manifest.platform !== platform) { + throw new Error(`${platform} runtime manifest platform mismatch`); + } + const manifestIdentity = await fileIdentity(manifestPath); + const inputs = [ + { + path: "runtime-package-manifest.json", + ...manifestIdentity, + }, + ...manifest.assets, + ]; + const prefix = + platform === "android" + ? "base/lib/arm64-v8a/" + : "Payload/BenchRunner.app/"; + const assets = inputs.map((asset) => { + const entry = prefix + encodedResourceName(asset.path); + const bytes = archiveEntry(archive, entry); + if (bytes.length !== asset.bytes || sha256(bytes) !== asset.sha256) { + throw new Error(`${platform} embedded asset mismatch: ${asset.path}`); + } + return { + path: asset.path, + archive_entry: entry, + bytes: asset.bytes, + sha256: asset.sha256, + }; + }); + return { + manifest_sha256: manifestIdentity.sha256, + asset_count: assets.length, + assets, + }; +} + +const options = parseOptions(Bun.argv.slice(2)); +const ipa = options.ipa; +const aab = options.aab; +const iosRuntime = await validateRuntime("ios", ipa, options["ios-package"]); +const androidRuntime = await validateRuntime( + "android", + aab, + options["android-package"], +); + +const scratch = await mkdtemp(join(tmpdir(), "provekit-bb-v087-apps.")); +const iosExecutable = join(scratch, "BenchRunner"); +const androidLibrary = join(scratch, "libprovekit_v1_barretenberg_mobile.so"); +await writeFile( + iosExecutable, + archiveEntry(ipa, "Payload/BenchRunner.app/BenchRunner"), +); +await writeFile( + androidLibrary, + archiveEntry( + aab, + "base/lib/arm64-v8a/libprovekit_v1_barretenberg_mobile.so", + ), +); +const iosArch = Bun.spawnSync(["lipo", iosExecutable, "-archs"]); +const androidArch = Bun.spawnSync(["file", androidLibrary]); +const iosArchitecture = iosArch.stdout.toString().trim(); +const androidArchitecture = androidArch.stdout.toString().trim(); +if (iosArch.exitCode !== 0 || iosArchitecture !== "arm64") { + throw new Error(`unexpected IPA architecture: ${iosArchitecture}`); +} +if ( + androidArch.exitCode !== 0 || + !androidArchitecture.includes("ELF 64-bit") || + !androidArchitecture.includes("ARM aarch64") +) { + throw new Error(`unexpected AAB architecture: ${androidArchitecture}`); +} + +const evidence = { + schema_version: 1, + campaign: "provekit-v1", + backend: "barretenberg", + backend_version: "0.87.0", + noir_version: "1.0.0-beta.11", + upstream_commit: "9081b0ed38c43c120afb7c80f8f6cd418ca5ad70", + source_sha: "13044531f0f38e02ed19fcbd9b26202b8ba5a962", + status: "release_apps_payload_validated_not_device_measured", + ios: { + artifact: await fileIdentity(ipa), + executable_architecture: iosArchitecture, + runtime: iosRuntime, + }, + android: { + artifact: await fileIdentity(aab), + library_architecture: androidArchitecture.replace(`${scratch}/`, ""), + min_api: 28, + runtime: androidRuntime, + }, +}; +await Bun.write(options.output, `${JSON.stringify(evidence, null, 2)}\n`); +console.log(options.output); diff --git a/benchmarks/v1/legacy/semantic-parity-data/README.md b/benchmarks/v1/legacy/semantic-parity-data/README.md new file mode 100644 index 000000000..0d465d587 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/README.md @@ -0,0 +1,96 @@ +# Historical semantic-parity campaign data + +This directory contains the exporter, manifest, and evidence for the historical +proof-only semantic-parity sweep. It is not the publication source. The +resulting CSV is retained at +[`../semantic-parity/semantic-parity-samples.csv`](../semantic-parity/semantic-parity-samples.csv); +the canonical publication file is +[`../../input-to-proof-data/input-to-proof-samples.csv`](../../input-to-proof-data/input-to-proof-samples.csv). +The older exploratory export is at `../data/benchmark-samples.csv`. + +`manifest.json` freezes the 27 expected profile × target × stack cells, the +semantic identities, exact Mac evidence hashes, and deduplicated proving +payload components. A payload includes everything required to create a proof +(circuit and frozen input plus PKP, zkey, or CRS as applicable), but excludes +verifier-only files, APK/IPA packages, and duplicate transport uploads. + +Generate and validate the frozen campaign rows from the committed evidence: + +```sh +bun benchmarks/v1/legacy/semantic-parity-data/export-v1.ts +bun test benchmarks/v1/legacy/semantic-parity-data/export.test.ts +``` + +The historical `../semantic-parity/semantic-parity-samples.csv` +contains exactly 162 rows across +all 27 cells: one warmup and five measured attempts per cell. All nine +ProveKit V1 cells are qualified from committed Mac, BrowserStack iPhone, and +physical E15 evidence. The exporter rejects missing V1 evidence, hash drift, +and incomplete sampling rather than silently falling back to current-main or +npm ProveKit timings. + +The historical CSV deliberately uses the exact column order and units of +`../legacy/data/benchmark-samples.csv` so old notebooks can read it unchanged. +Internally validated `prove_time_ms`, `proving_payload_size_bytes`, and +`process_peak_memory_kib` are exported as legacy `prover_time_ms`, +`circuit_size_bytes`, and `peak_memory_mib` respectively. The semantic profile +is retained in `circuit_variant`, and its qualification note in +`non_equivalence_note`. This preserves the exact header and units of +`benchmark-samples.csv` while making the V1 source and evidence provenance +explicit. + +## Native evidence handoff + +Each native run must emit one JSON file matching `native-evidence.schema.json`. +The file represents exactly one cell and carries device/session provenance. It +is exactly one of: + +- a successful series with artifact hashes, one warmup, five measured samples, + both correctness gates, and all four headline metrics; or +- one structured `gap` with status `unsupported`, `build_failed`, `crashed`, + `timed_out`, or `zero_samples`, a failure code/detail, and explicitly `null` + metrics. + +The warmup `prove_time_ms` may be `null` when Mobench attests it without +retaining its timing; measured times and all four headline metrics may never be +blank. + +For future campaigns, native files can still be passed to the generic exporter +positionally and checked with the full matrix gate: + +```sh +bun benchmarks/v1/legacy/semantic-parity-data/export.ts \ + target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/provekit.json \ + target/v1-benchmarks/semantic-parity/oprf-o2/e15-native/provekit.json \ + --output=benchmarks/v1/legacy/semantic-parity/semantic-parity-samples.csv + +bun benchmarks/v1/legacy/semantic-parity-data/export.ts target/.../*.json \ + --require-complete \ + --output=benchmarks/v1/legacy/semantic-parity/semantic-parity-samples.csv +``` + +The generic exporter prints separate `successful_cells` and `gap_cells` counts. +The V1 publication exporter prints `successful_cells: 27`; no gap or browser +substitution is accepted for the nine ProveKit V1 cells. + +The exporter rejects evidence/artifact hash drift, duplicates, runtime/target +mixing, semantic-profile mismatches, missing correctness gates, incomplete 1+5 +series, and blank/zero headline metrics. Unsupported cells must eventually be +represented as a single structured gap row; successful browser timings cannot +stand in for native evidence. + +## WebAuthn closest analogue + +The nine `webauthn_closest_analogue` cells are copied from the hash-locked +historical CSV because neither WebAuthn circuit changed. They are deliberately +not labeled semantically equivalent: Noir binds challenge, client-data type, +origin, RP-ID hash, UP/UV flags, and public key, while the +privacy-ethereum Circom circuit omits several of those bindings. Every row +retains the historical non-equivalence note, including the iPhone Circom +estimated-payload disclosure. + +The exporter replaces stale historical `circuit_size_bytes` mappings with the +complete proving payload from frozen artifacts. ProveKit includes PKP/prover + +input, Barretenberg includes circuit + input/witness + consumed CRS/SRS, and +Circom includes WASM + zkey + input on Mac or zkey + frozen witness on native. +These are proving payloads; app packages and verifier-only files are excluded. diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/oprf.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/oprf.json new file mode 100644 index 000000000..077d4a6ee --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/oprf.json @@ -0,0 +1,230 @@ +{ + "schema_version": 1, + "campaign_id": "provekit-v1-semantic-parity", + "generated_at_utc": "2026-07-31T17:39:10.062Z", + "sampling": { + "warmup": 1, + "measured": 5, + "sequential": true + }, + "device": { + "manufacturer": "motorola", + "model": "moto e15", + "os": "14", + "abi": "armeabi-v7a", + "abilist": "armeabi-v7a,armeabi", + "abilist64": "", + "zygote": "zygote32" + }, + "apk": { + "path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-build/android/app/build/outputs/apk/debug/app-debug.apk", + "sha256": "0570625cf7b2051b39662e18e648e22ab43c9797a310eb6674116cbc0a3c349b", + "bytes": 60920719 + }, + "results": [ + { + "workload": "oprf", + "function": "bench_mobile::bench_oprf_prove", + "status": "ok", + "report": { + "custom_metrics": { + "run_u64": { + "input_size_bytes": 5853, + "prover_size_bytes": 1638340, + "proving_payload_size_bytes": 1644193 + }, + "sample_u64": { + "proof_size_bytes": [ + 633972, + 630215, + 633812, + 625574, + 634804, + 632628 + ], + "prove_time_ns": [ + 12390846385, + 12543679693, + 12597403693, + 12544003385, + 12564926462, + 12589059693 + ] + } + }, + "phases": [ + { + "duration_ns": 62839043464, + "name": "prove" + } + ], + "samples": [ + { + "cpu_time_ms": 29054, + "duration_ns": 12557585617, + "peak_memory_kb": 24000, + "process_peak_memory_kb": 181592 + }, + { + "cpu_time_ms": 29248, + "duration_ns": 12603977770, + "peak_memory_kb": 25516, + "process_peak_memory_kb": 182388 + }, + { + "cpu_time_ms": 29252, + "duration_ns": 12555643924, + "peak_memory_kb": 26256, + "process_peak_memory_kb": 183944 + }, + { + "cpu_time_ms": 29232, + "duration_ns": 12571774770, + "peak_memory_kb": 26256, + "process_peak_memory_kb": 182184 + }, + { + "cpu_time_ms": 29293, + "duration_ns": 12596926232, + "peak_memory_kb": 25228, + "process_peak_memory_kb": 183080 + } + ], + "spec": { + "iterations": 5, + "name": "bench_mobile::bench_oprf_prove", + "warmup": 1 + }, + "timeline": [ + { + "end_offset_ns": 34588437848, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 308 + }, + { + "end_offset_ns": 46986824388, + "iteration": 0, + "phase": "warmup-benchmark", + "start_offset_ns": 34588441925 + }, + { + "end_offset_ns": 65139971081, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 46986828388 + }, + { + "end_offset_ns": 77698622236, + "iteration": 0, + "phase": "measured-benchmark", + "start_offset_ns": 65141036619 + }, + { + "end_offset_ns": 95831763160, + "iteration": 1, + "phase": "fixture-setup", + "start_offset_ns": 77699341313 + }, + { + "end_offset_ns": 108436641545, + "iteration": 1, + "phase": "measured-benchmark", + "start_offset_ns": 95832663775 + }, + { + "end_offset_ns": 126704339392, + "iteration": 2, + "phase": "fixture-setup", + "start_offset_ns": 108437049237 + }, + { + "end_offset_ns": 139260888624, + "iteration": 2, + "phase": "measured-benchmark", + "start_offset_ns": 126705244700 + }, + { + "end_offset_ns": 157416198548, + "iteration": 3, + "phase": "fixture-setup", + "start_offset_ns": 139261216393 + }, + { + "end_offset_ns": 169988643164, + "iteration": 3, + "phase": "measured-benchmark", + "start_offset_ns": 157416868394 + }, + { + "end_offset_ns": 188190564627, + "iteration": 4, + "phase": "fixture-setup", + "start_offset_ns": 169989437933 + }, + { + "end_offset_ns": 200788196397, + "iteration": 4, + "phase": "measured-benchmark", + "start_offset_ns": 188191270165 + } + ], + "function": "bench_mobile::bench_oprf_prove", + "samples_ns": [ + 12557585617, + 12603977770, + 12555643924, + 12571774770, + 12596926232 + ], + "stats": { + "min_ns": 12555643924, + "max_ns": 12603977770, + "avg_ns": 12577181662.6, + "mean_ns": 12577181662, + "median_ns": 12571774770 + }, + "resources": { + "platform": "android", + "timestamp_ms": 1785519406615, + "memory_process": "isolated_worker", + "cpu_total_ms": 146079, + "cpu_median_ms": 29248, + "elapsed_cpu_ms": 146079, + "peak_memory_kb": 26256, + "peak_memory_growth_kb": 26256, + "process_peak_memory_kb": 183944 + } + }, + "evidence_path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-v1-1plus5/oprf.logcat.txt" + }, + { + "workload": "webauthn", + "function": "bench_mobile::bench_webauthn_assertion_prove", + "status": "runtime_failed", + "failure": { + "schema_version": 1, + "kind": "exception", + "message": "Failed to run benchmark worker: Unable to start service Intent { act=dev.world.benchmobile.RUN_BENCHMARK cmp=dev.world.benchmobile/.BenchmarkWorkerService (has extras) }: Unable to launch app dev.world.benchmobile/10284 for service Intent { act=dev.world.benchmobile.RUN_BENCHMARK cmp=dev.world.benchmobile/.BenchmarkWorkerService }: process is bad", + "elapsed_ms": 8, + "pid": null, + "process_name": "dev.world.benchmobile:mobench_worker" + }, + "evidence_path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-v1-1plus5/webauthn.logcat.txt" + }, + { + "workload": "passport", + "function": "bench_mobile::bench_passport_complete_age_check_prove_single_thread", + "status": "runtime_failed", + "failure": { + "schema_version": 1, + "kind": "exception", + "message": "Failed to run benchmark worker: Unable to start service Intent { act=dev.world.benchmobile.RUN_BENCHMARK cmp=dev.world.benchmobile/.BenchmarkWorkerService (has extras) }: Unable to launch app dev.world.benchmobile/10295 for service Intent { act=dev.world.benchmobile.RUN_BENCHMARK cmp=dev.world.benchmobile/.BenchmarkWorkerService }: process is bad", + "elapsed_ms": 8, + "pid": null, + "process_name": "dev.world.benchmobile:mobench_worker" + }, + "evidence_path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-v1-1plus5/passport.logcat.txt" + } + ] +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/passport.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/passport.json new file mode 100644 index 000000000..fa9473692 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/passport.json @@ -0,0 +1,246 @@ +{ + "schema_version": 1, + "campaign_id": "provekit-v1-semantic-parity", + "generated_at_utc": "2026-07-31T20:00:04.924Z", + "sampling": { + "warmup": 1, + "measured": 5, + "sequential": true + }, + "device": { + "manufacturer": "motorola", + "model": "moto e15", + "os": "14", + "abi": "armeabi-v7a", + "abilist": "armeabi-v7a,armeabi", + "abilist64": "", + "zygote": "zygote32" + }, + "apk": { + "path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-build-v1pass/android/app/build/outputs/apk/debug/app-debug.apk", + "sha256": "70568c48b91fbf7e2c24b788c583dcca1589511844d2c26c1e381695981ccd35", + "bytes": 60920719 + }, + "results": [ + { + "workload": "passport", + "function": "bench_mobile::bench_passport_complete_age_check_prove_single_thread", + "status": "ok", + "report": { + "custom_metrics": { + "run_u64": { + "input_size_bytes": 247039, + "passport_setup_rss_kb": 188092, + "passport_setup_swap_kb": 45060, + "prover_size_bytes": 2299488, + "proving_payload_size_bytes": 2546527 + }, + "sample_u64": { + "proof_size_bytes": [ + 717332, + 715014, + 716879, + 715470, + 714255, + 714761 + ], + "prove_time_ns": [ + 71589926158, + 71595260005, + 71563777927, + 71543562389, + 71627108927, + 71639365235 + ], + "rss_after_prove_kb": [ + 88756, + 80160, + 84436, + 88132, + 84916, + 81216 + ], + "rss_after_verify_kb": [ + 98060, + 84864, + 91404, + 79572, + 89144, + 88160 + ], + "rss_before_verify_kb": [ + 88756, + 80160, + 84436, + 88132, + 84916, + 81216 + ], + "swap_after_prove_kb": [ + 37812, + 51128, + 43756, + 43888, + 45128, + 45032 + ], + "swap_after_verify_kb": [ + 37812, + 47312, + 43756, + 43888, + 45128, + 45032 + ], + "swap_before_verify_kb": [ + 37812, + 51128, + 43756, + 43888, + 45128, + 45032 + ] + } + }, + "samples": [ + { + "cpu_time_ms": 84584, + "duration_ns": 74067280543, + "peak_memory_kb": 289424, + "process_peak_memory_kb": 485984 + }, + { + "cpu_time_ms": 84543, + "duration_ns": 74024937543, + "peak_memory_kb": 295128, + "process_peak_memory_kb": 485476 + }, + { + "cpu_time_ms": 84520, + "duration_ns": 74012293543, + "peak_memory_kb": 296356, + "process_peak_memory_kb": 486436 + }, + { + "cpu_time_ms": 84551, + "duration_ns": 74086977466, + "peak_memory_kb": 295584, + "process_peak_memory_kb": 485380 + }, + { + "cpu_time_ms": 84589, + "duration_ns": 74090311081, + "peak_memory_kb": 296280, + "process_peak_memory_kb": 484372 + } + ], + "spec": { + "iterations": 5, + "name": "bench_mobile::bench_passport_complete_age_check_prove_single_thread", + "warmup": 1 + }, + "timeline": [ + { + "end_offset_ns": 88067667005, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 615 + }, + { + "end_offset_ns": 162137753240, + "iteration": 0, + "phase": "warmup-benchmark", + "start_offset_ns": 88067670389 + }, + { + "end_offset_ns": 164225030394, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 162137767702 + }, + { + "end_offset_ns": 238294530398, + "iteration": 0, + "phase": "measured-benchmark", + "start_offset_ns": 164227249855 + }, + { + "end_offset_ns": 240402059629, + "iteration": 1, + "phase": "fixture-setup", + "start_offset_ns": 238294916014 + }, + { + "end_offset_ns": 314427707326, + "iteration": 1, + "phase": "measured-benchmark", + "start_offset_ns": 240402769783 + }, + { + "end_offset_ns": 316513712018, + "iteration": 2, + "phase": "fixture-setup", + "start_offset_ns": 314428126172 + }, + { + "end_offset_ns": 390526466715, + "iteration": 2, + "phase": "measured-benchmark", + "start_offset_ns": 316514173172 + }, + { + "end_offset_ns": 392603204869, + "iteration": 3, + "phase": "fixture-setup", + "start_offset_ns": 390526754715 + }, + { + "end_offset_ns": 466690776874, + "iteration": 3, + "phase": "measured-benchmark", + "start_offset_ns": 392603799408 + }, + { + "end_offset_ns": 468774384874, + "iteration": 4, + "phase": "fixture-setup", + "start_offset_ns": 466691117489 + }, + { + "end_offset_ns": 542865434493, + "iteration": 4, + "phase": "measured-benchmark", + "start_offset_ns": 468775123412 + } + ], + "function": "bench_mobile::bench_passport_complete_age_check_prove_single_thread", + "samples_ns": [ + 74067280543, + 74024937543, + 74012293543, + 74086977466, + 74090311081 + ], + "stats": { + "min_ns": 74012293543, + "max_ns": 74090311081, + "avg_ns": 74056360035.2, + "mean_ns": 74056360035, + "median_ns": 74067280543 + }, + "resources": { + "platform": "android", + "timestamp_ms": 1785528002806, + "memory_process": "isolated_worker", + "cpu_total_ms": 422787, + "cpu_median_ms": 84551, + "elapsed_cpu_ms": 422787, + "peak_memory_kb": 296356, + "peak_memory_growth_kb": 296356, + "process_peak_memory_kb": 486436 + } + }, + "evidence_path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-v1-passport-final-reboot/passport.logcat.txt" + } + ] +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/webauthn.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/webauthn.json new file mode 100644 index 000000000..75473831c --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/e15/webauthn.json @@ -0,0 +1,216 @@ +{ + "schema_version": 1, + "campaign_id": "provekit-v1-semantic-parity", + "generated_at_utc": "2026-07-31T19:47:54.995Z", + "sampling": { + "warmup": 1, + "measured": 5, + "sequential": true + }, + "device": { + "manufacturer": "motorola", + "model": "moto e15", + "os": "14", + "abi": "armeabi-v7a", + "abilist": "armeabi-v7a,armeabi", + "abilist64": "", + "zygote": "zygote32" + }, + "apk": { + "path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-build-v1rerun/android/app/build/outputs/apk/debug/app-debug.apk", + "sha256": "756c0cfedb3abd559b3d4b50f4a0f86916a008a84368e0806089efdee571121c", + "bytes": 60920715 + }, + "results": [ + { + "workload": "webauthn", + "function": "bench_mobile::bench_webauthn_assertion_prove", + "status": "ok", + "report": { + "custom_metrics": { + "run_u64": { + "input_size_bytes": 49220, + "prover_size_bytes": 2327836, + "proving_payload_size_bytes": 2377056 + }, + "sample_u64": { + "proof_size_bytes": [ + 717283, + 716688, + 716454, + 717130, + 715934, + 716186 + ], + "prove_time_ns": [ + 27767810771, + 27859356617, + 27747266540, + 27839157617, + 27794375079, + 27931619694 + ] + } + }, + "phases": [ + { + "duration_ns": 139171743393, + "name": "prove" + } + ], + "samples": [ + { + "cpu_time_ms": 129283, + "duration_ns": 27871475309, + "peak_memory_kb": 255148, + "process_peak_memory_kb": 510540 + }, + { + "cpu_time_ms": 129428, + "duration_ns": 27760853848, + "peak_memory_kb": 259408, + "process_peak_memory_kb": 510400 + }, + { + "cpu_time_ms": 129271, + "duration_ns": 27852851079, + "peak_memory_kb": 257256, + "process_peak_memory_kb": 509696 + }, + { + "cpu_time_ms": 128797, + "duration_ns": 27808839079, + "peak_memory_kb": 257664, + "process_peak_memory_kb": 511140 + }, + { + "cpu_time_ms": 129443, + "duration_ns": 27945088233, + "peak_memory_kb": 240208, + "process_peak_memory_kb": 503824 + } + ], + "spec": { + "iterations": 5, + "name": "bench_mobile::bench_webauthn_assertion_prove", + "warmup": 1 + }, + "timeline": [ + { + "end_offset_ns": 147990069240, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 308 + }, + { + "end_offset_ns": 175780208088, + "iteration": 0, + "phase": "warmup-benchmark", + "start_offset_ns": 147990075778 + }, + { + "end_offset_ns": 251137795477, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 175780212703 + }, + { + "end_offset_ns": 279010618786, + "iteration": 0, + "phase": "measured-benchmark", + "start_offset_ns": 251139143477 + }, + { + "end_offset_ns": 353970364944, + "iteration": 1, + "phase": "fixture-setup", + "start_offset_ns": 279010921940 + }, + { + "end_offset_ns": 381731740408, + "iteration": 1, + "phase": "measured-benchmark", + "start_offset_ns": 353970886560 + }, + { + "end_offset_ns": 456578901566, + "iteration": 2, + "phase": "fixture-setup", + "start_offset_ns": 381732354869 + }, + { + "end_offset_ns": 484432590491, + "iteration": 2, + "phase": "measured-benchmark", + "start_offset_ns": 456579739412 + }, + { + "end_offset_ns": 559490162495, + "iteration": 3, + "phase": "fixture-setup", + "start_offset_ns": 484432891491 + }, + { + "end_offset_ns": 587299539728, + "iteration": 3, + "phase": "measured-benchmark", + "start_offset_ns": 559490700649 + }, + { + "end_offset_ns": 662276457655, + "iteration": 4, + "phase": "fixture-setup", + "start_offset_ns": 587300241343 + }, + { + "end_offset_ns": 690222372657, + "iteration": 4, + "phase": "measured-benchmark", + "start_offset_ns": 662277284424 + } + ], + "function": "bench_mobile::bench_webauthn_assertion_prove", + "samples_ns": [ + 27871475309, + 27760853848, + 27852851079, + 27808839079, + 27945088233 + ], + "stats": { + "min_ns": 27760853848, + "max_ns": 27945088233, + "avg_ns": 27847821509.6, + "mean_ns": 27847821509, + "median_ns": 27852851079 + }, + "resources": { + "platform": "android", + "timestamp_ms": 1785527200302, + "memory_process": "isolated_worker", + "cpu_total_ms": 646222, + "cpu_median_ms": 129283, + "elapsed_cpu_ms": 646222, + "peak_memory_kb": 259408, + "peak_memory_growth_kb": 259408, + "process_peak_memory_kb": 511140 + } + }, + "evidence_path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-v1-final/webauthn.logcat.txt" + }, + { + "workload": "passport", + "function": "bench_mobile::bench_passport_complete_age_check_prove_single_thread", + "status": "runtime_failed", + "failure": { + "schema_version": 1, + "kind": "exception", + "message": "Failed to run benchmark worker: Unable to start service Intent { act=dev.world.benchmobile.RUN_BENCHMARK cmp=dev.world.benchmobile/.BenchmarkWorkerService (has extras) }: Unable to launch app dev.world.benchmobile/10318 for service Intent { act=dev.world.benchmobile.RUN_BENCHMARK cmp=dev.world.benchmobile/.BenchmarkWorkerService }: process is bad", + "elapsed_ms": 8, + "pid": null, + "process_name": "dev.world.benchmobile:v1rerun" + }, + "evidence_path": "/Users/dcbuilder/Code/world/.worktrees/provekit-v1-semantic-parity-rerun/target/v1-semantic-parity/e15-v1-final/passport.logcat.txt" + } + ] +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/ios/summary.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/ios/summary.json new file mode 100644 index 000000000..31a402f6e --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/ios/summary.json @@ -0,0 +1,835 @@ +{ + "ci": { + "metadata": { + "mobench_version": "0.1.48", + "request_command": "cargo mobench ci run-prebuilt", + "source_sha": "cd2d3e826f5ead1f5593032434112d9c5da6cb86" + }, + "outputs": { + "results_csv": "results.csv", + "summary_json": "summary.json", + "summary_md": "summary.md" + } + }, + "functions": { + "bench_mobile::bench_oprf_prove": { + "artifacts": null, + "benchmark_results": { + "iPhone SE 2022-15": [ + { + "custom_metrics": { + "run_u64": { + "input_size_bytes": 5853, + "prover_size_bytes": 1638340, + "proving_payload_size_bytes": 1644193 + }, + "sample_u64": { + "proof_size_bytes": [ + 630996, + 634068, + 635444, + 632724, + 630453, + 635188 + ], + "prove_time_ns": [ + 919344292, + 1112275291, + 1218798000, + 1223253625, + 1212871458, + 1217698208 + ] + } + }, + "function": "bench_mobile::bench_oprf_prove", + "max_ns": 1223628875, + "mean_ns": 1197416916, + "median_ns": 1218066500, + "min_ns": 1112638500, + "p95_ns": 1223628875, + "phases": [ + { + "duration_ns": 5984893501, + "name": "prove" + } + ], + "resources": { + "cpu_median_ms": 2056, + "cpu_total_ms": 10206, + "elapsed_cpu_ms": 10206, + "memory_process": "benchmark_app", + "peak_memory_growth_kb": 10960, + "peak_memory_kb": 10960, + "platform": "ios", + "process_peak_memory_kb": 148688, + "timestamp_ms": 1785520237277 + }, + "samples": [ + { + "cpu_time_ms": 1942, + "duration_ns": 1112638500, + "peak_memory_kb": 10352, + "process_peak_memory_kb": 147072 + }, + { + "cpu_time_ms": 2031, + "duration_ns": 1219184833, + "peak_memory_kb": 10352, + "process_peak_memory_kb": 147296 + }, + { + "cpu_time_ms": 2056, + "duration_ns": 1223628875, + "peak_memory_kb": 10960, + "process_peak_memory_kb": 148688 + }, + { + "cpu_time_ms": 2094, + "duration_ns": 1213565875, + "peak_memory_kb": 10336, + "process_peak_memory_kb": 148080 + }, + { + "cpu_time_ms": 2083, + "duration_ns": 1218066500, + "peak_memory_kb": 10320, + "process_peak_memory_kb": 148112 + } + ], + "samples_ns": [ + 1112638500, + 1219184833, + 1223628875, + 1213565875, + 1218066500 + ], + "spec": { + "iterations": 5, + "name": "bench_mobile::bench_oprf_prove", + "warmup": 1 + }, + "stats": { + "avg_ns": 1197416916.6, + "max_ns": 1223628875, + "mean_ns": 1197416916, + "median_ns": 1218066500, + "min_ns": 1112638500 + }, + "timeline": [ + { + "end_offset_ns": 4766256167, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 42 + }, + { + "end_offset_ns": 5687525708, + "iteration": 0, + "phase": "warmup-benchmark", + "start_offset_ns": 4766262708 + }, + { + "end_offset_ns": 8996357292, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 5687525833 + }, + { + "end_offset_ns": 10109076917, + "iteration": 0, + "phase": "measured-benchmark", + "start_offset_ns": 8996438417 + }, + { + "end_offset_ns": 13406173000, + "iteration": 1, + "phase": "fixture-setup", + "start_offset_ns": 10109086875 + }, + { + "end_offset_ns": 14625378958, + "iteration": 1, + "phase": "measured-benchmark", + "start_offset_ns": 13406194125 + }, + { + "end_offset_ns": 17951083833, + "iteration": 2, + "phase": "fixture-setup", + "start_offset_ns": 14625397042 + }, + { + "end_offset_ns": 19174730875, + "iteration": 2, + "phase": "measured-benchmark", + "start_offset_ns": 17951102000 + }, + { + "end_offset_ns": 22538545958, + "iteration": 3, + "phase": "fixture-setup", + "start_offset_ns": 19174741667 + }, + { + "end_offset_ns": 23752128958, + "iteration": 3, + "phase": "measured-benchmark", + "start_offset_ns": 22538563083 + }, + { + "end_offset_ns": 27181040750, + "iteration": 4, + "phase": "fixture-setup", + "start_offset_ns": 23752137625 + }, + { + "end_offset_ns": 28399124625, + "iteration": 4, + "phase": "measured-benchmark", + "start_offset_ns": 27181058125 + } + ] + } + ] + }, + "local_report": { + "reason": "prebuilt BrowserStack run", + "skipped": true + }, + "performance_metrics": { + "iPhone SE 2022-15": { + "cpu": { + "average_percent": 22.14, + "min_percent": 22.14, + "peak_percent": 181.64 + }, + "memory": { + "average_mb": 100.46, + "min_mb": 100.46, + "peak_mb": 192.48 + }, + "sample_count": 1 + } + }, + "remote_run": { + "app_url": "bs://56dbdd4feaa5a702e976bb6395fdf88dec405aef", + "build_id": "6eca64c91564a0b36a0edc10d78e76dfde9780e0", + "platform": "ios", + "test_suite_url": "bs://89b7b72934c4aa268a875ec538e3f0394d98d7ca" + }, + "spec": { + "devices": [ + "iPhone SE 2022-15" + ], + "function": "bench_mobile::bench_oprf_prove", + "ios_completion_timeout_secs": 7200, + "iterations": 5, + "target": "ios", + "warmup": 1 + }, + "summary": { + "device_summaries": [ + { + "benchmarks": [ + { + "function": "bench_mobile::bench_oprf_prove", + "max_ns": 1223628875, + "mean_ns": 1197416916, + "median_ns": 1218066500, + "min_ns": 1112638500, + "p95_ns": 1223628875, + "resource_usage": { + "cpu_median_ms": 2056, + "cpu_total_ms": 10206, + "peak_memory_growth_kb": 10960, + "peak_memory_kb": 10960, + "process_peak_memory_kb": 148688 + }, + "samples": 5 + } + ], + "device": "iPhone SE 2022-15" + } + ], + "devices": [ + "iPhone SE 2022-15" + ], + "function": "bench_mobile::bench_oprf_prove", + "generated_at": "2026-07-31T17:50:55.556956Z", + "generated_at_unix": 1785520255, + "iterations": 5, + "target": "ios", + "warmup": 1 + } + }, + "bench_mobile::bench_passport_complete_age_check_prove": { + "artifacts": null, + "benchmark_results": { + "iPhone SE 2022-15": [ + { + "custom_metrics": { + "run_u64": { + "input_size_bytes": 247039, + "prover_size_bytes": 2307676, + "proving_payload_size_bytes": 2554715 + }, + "sample_u64": { + "proof_size_bytes": [ + 713876, + 715446, + 719255, + 712832, + 715102, + 714697 + ], + "prove_time_ns": [ + 2195551959, + 2261197250, + 3101507500, + 2474173625, + 2279506833, + 2384363916 + ] + } + }, + "function": "bench_mobile::bench_passport_complete_age_check_prove", + "max_ns": 3102353000, + "mean_ns": 2501031991, + "median_ns": 2385298625, + "min_ns": 2262063083, + "p95_ns": 3102353000, + "phases": [ + { + "duration_ns": 12500745875, + "name": "prove" + } + ], + "resources": { + "cpu_median_ms": 9054, + "cpu_total_ms": 44583, + "elapsed_cpu_ms": 44583, + "memory_process": "benchmark_app", + "peak_memory_growth_kb": 277792, + "peak_memory_kb": 277792, + "platform": "ios", + "process_peak_memory_kb": 572768, + "timestamp_ms": 1785519826747 + }, + "samples": [ + { + "cpu_time_ms": 9027, + "duration_ns": 2262063083, + "peak_memory_kb": 275792, + "process_peak_memory_kb": 548160 + }, + { + "cpu_time_ms": 7574, + "duration_ns": 3102353000, + "peak_memory_kb": 276176, + "process_peak_memory_kb": 555408 + }, + { + "cpu_time_ms": 9054, + "duration_ns": 2475108292, + "peak_memory_kb": 277792, + "process_peak_memory_kb": 561968 + }, + { + "cpu_time_ms": 9287, + "duration_ns": 2280336958, + "peak_memory_kb": 276784, + "process_peak_memory_kb": 563232 + }, + { + "cpu_time_ms": 9641, + "duration_ns": 2385298625, + "peak_memory_kb": 277792, + "process_peak_memory_kb": 572768 + } + ], + "samples_ns": [ + 2262063083, + 3102353000, + 2475108292, + 2280336958, + 2385298625 + ], + "spec": { + "iterations": 5, + "name": "bench_mobile::bench_passport_complete_age_check_prove", + "warmup": 1 + }, + "stats": { + "avg_ns": 2501031991.6, + "max_ns": 3102353000, + "mean_ns": 2501031991, + "median_ns": 2385298625, + "min_ns": 2262063083 + }, + "timeline": [ + { + "end_offset_ns": 15059296708, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 42 + }, + { + "end_offset_ns": 17257279167, + "iteration": 0, + "phase": "warmup-benchmark", + "start_offset_ns": 15059297292 + }, + { + "end_offset_ns": 27129155625, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 17257279833 + }, + { + "end_offset_ns": 29391295625, + "iteration": 0, + "phase": "measured-benchmark", + "start_offset_ns": 27129232542 + }, + { + "end_offset_ns": 39550904375, + "iteration": 1, + "phase": "fixture-setup", + "start_offset_ns": 29391306208 + }, + { + "end_offset_ns": 42653283708, + "iteration": 1, + "phase": "measured-benchmark", + "start_offset_ns": 39550930708 + }, + { + "end_offset_ns": 53050084000, + "iteration": 2, + "phase": "fixture-setup", + "start_offset_ns": 42653295833 + }, + { + "end_offset_ns": 55525215167, + "iteration": 2, + "phase": "measured-benchmark", + "start_offset_ns": 53050106875 + }, + { + "end_offset_ns": 66010061417, + "iteration": 3, + "phase": "fixture-setup", + "start_offset_ns": 55525228708 + }, + { + "end_offset_ns": 68290420500, + "iteration": 3, + "phase": "measured-benchmark", + "start_offset_ns": 66010083542 + }, + { + "end_offset_ns": 78848981417, + "iteration": 4, + "phase": "fixture-setup", + "start_offset_ns": 68290431208 + }, + { + "end_offset_ns": 81234304042, + "iteration": 4, + "phase": "measured-benchmark", + "start_offset_ns": 78849005417 + } + ] + } + ] + }, + "local_report": { + "reason": "prebuilt BrowserStack run", + "skipped": true + }, + "performance_metrics": { + "iPhone SE 2022-15": { + "cpu": { + "average_percent": 29.42, + "min_percent": 29.42, + "peak_percent": 361.97 + }, + "memory": { + "average_mb": 219.7, + "min_mb": 219.7, + "peak_mb": 471.29 + }, + "sample_count": 1 + } + }, + "remote_run": { + "app_url": "bs://2bf71f732867cc5b42e539ce064625971f5038d9", + "build_id": "5d9449e718692b36c4efa7c6609a6ba6d6a38eec", + "platform": "ios", + "test_suite_url": "bs://1fab01830df71c1e4c8efaba0e47296920a2b22e" + }, + "spec": { + "devices": [ + "iPhone SE 2022-15" + ], + "function": "bench_mobile::bench_passport_complete_age_check_prove", + "ios_completion_timeout_secs": 7200, + "iterations": 5, + "target": "ios", + "warmup": 1 + }, + "summary": { + "device_summaries": [ + { + "benchmarks": [ + { + "function": "bench_mobile::bench_passport_complete_age_check_prove", + "max_ns": 3102353000, + "mean_ns": 2501031991, + "median_ns": 2385298625, + "min_ns": 2262063083, + "p95_ns": 3102353000, + "resource_usage": { + "cpu_median_ms": 9054, + "cpu_total_ms": 44583, + "peak_memory_growth_kb": 277792, + "peak_memory_kb": 277792, + "process_peak_memory_kb": 572768 + }, + "samples": 5 + } + ], + "device": "iPhone SE 2022-15" + } + ], + "devices": [ + "iPhone SE 2022-15" + ], + "function": "bench_mobile::bench_passport_complete_age_check_prove", + "generated_at": "2026-07-31T17:44:09.980697Z", + "generated_at_unix": 1785519849, + "iterations": 5, + "target": "ios", + "warmup": 1 + } + }, + "bench_mobile::bench_webauthn_assertion_prove": { + "artifacts": null, + "benchmark_results": { + "iPhone SE 2022-15": [ + { + "custom_metrics": { + "run_u64": { + "input_size_bytes": 49220, + "prover_size_bytes": 2361340, + "proving_payload_size_bytes": 2410560 + }, + "sample_u64": { + "proof_size_bytes": [ + 715067, + 714467, + 715888, + 714756, + 715336, + 712911 + ], + "prove_time_ns": [ + 2902747792, + 2973014000, + 3031699041, + 3182688209, + 3183604625, + 3228687125 + ] + } + }, + "function": "bench_mobile::bench_webauthn_assertion_prove", + "max_ns": 3229705459, + "mean_ns": 3120877616, + "median_ns": 3183651250, + "min_ns": 2973894333, + "p95_ns": 3229705459, + "phases": [ + { + "duration_ns": 15599689751, + "name": "prove" + } + ], + "resources": { + "cpu_median_ms": 10132, + "cpu_total_ms": 51575, + "elapsed_cpu_ms": 51575, + "memory_process": "benchmark_app", + "peak_memory_growth_kb": 265984, + "peak_memory_kb": 265984, + "platform": "ios", + "process_peak_memory_kb": 597968, + "timestamp_ms": 1785520128510 + }, + "samples": [ + { + "cpu_time_ms": 9902, + "duration_ns": 2973894333, + "peak_memory_kb": 264816, + "process_peak_memory_kb": 578816 + }, + { + "cpu_time_ms": 10132, + "duration_ns": 3032569667, + "peak_memory_kb": 265904, + "process_peak_memory_kb": 585072 + }, + { + "cpu_time_ms": 10131, + "duration_ns": 3183651250, + "peak_memory_kb": 265984, + "process_peak_memory_kb": 591376 + }, + { + "cpu_time_ms": 10702, + "duration_ns": 3184567375, + "peak_memory_kb": 265840, + "process_peak_memory_kb": 597968 + }, + { + "cpu_time_ms": 10708, + "duration_ns": 3229705459, + "peak_memory_kb": 265568, + "process_peak_memory_kb": 597056 + } + ], + "samples_ns": [ + 2973894333, + 3032569667, + 3183651250, + 3184567375, + 3229705459 + ], + "spec": { + "iterations": 5, + "name": "bench_mobile::bench_webauthn_assertion_prove", + "warmup": 1 + }, + "stats": { + "avg_ns": 3120877616.8, + "max_ns": 3229705459, + "mean_ns": 3120877616, + "median_ns": 3183651250, + "min_ns": 2973894333 + }, + "timeline": [ + { + "end_offset_ns": 18832275708, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 83 + }, + { + "end_offset_ns": 21737724833, + "iteration": 0, + "phase": "warmup-benchmark", + "start_offset_ns": 18832276083 + }, + { + "end_offset_ns": 34223902333, + "iteration": 0, + "phase": "fixture-setup", + "start_offset_ns": 21737725458 + }, + { + "end_offset_ns": 37197865333, + "iteration": 0, + "phase": "measured-benchmark", + "start_offset_ns": 34223971000 + }, + { + "end_offset_ns": 50207679541, + "iteration": 1, + "phase": "fixture-setup", + "start_offset_ns": 37197876958 + }, + { + "end_offset_ns": 53240276000, + "iteration": 1, + "phase": "measured-benchmark", + "start_offset_ns": 50207706333 + }, + { + "end_offset_ns": 66490582791, + "iteration": 2, + "phase": "fixture-setup", + "start_offset_ns": 53240289375 + }, + { + "end_offset_ns": 69674254666, + "iteration": 2, + "phase": "measured-benchmark", + "start_offset_ns": 66490603416 + }, + { + "end_offset_ns": 83105852583, + "iteration": 3, + "phase": "fixture-setup", + "start_offset_ns": 69674273041 + }, + { + "end_offset_ns": 86290443250, + "iteration": 3, + "phase": "measured-benchmark", + "start_offset_ns": 83105875875 + }, + { + "end_offset_ns": 100007088833, + "iteration": 4, + "phase": "fixture-setup", + "start_offset_ns": 86290456250 + }, + { + "end_offset_ns": 103236814750, + "iteration": 4, + "phase": "measured-benchmark", + "start_offset_ns": 100007109291 + } + ] + } + ] + }, + "local_report": { + "reason": "prebuilt BrowserStack run", + "skipped": true + }, + "performance_metrics": { + "iPhone SE 2022-15": { + "cpu": { + "average_percent": 30.6, + "min_percent": 30.6, + "peak_percent": 405.01 + }, + "memory": { + "average_mb": 255.71, + "min_mb": 255.71, + "peak_mb": 446.53 + }, + "sample_count": 1 + } + }, + "remote_run": { + "app_url": "bs://ae43cc0cdb828d7271c0367e7b4ee14980edd1ae", + "build_id": "9e03602c537f1b3e84d3672fc3a36bbeb8cbca41", + "platform": "ios", + "test_suite_url": "bs://1155e9bbcc379992ad9319ad38ecd885e6e017de" + }, + "spec": { + "devices": [ + "iPhone SE 2022-15" + ], + "function": "bench_mobile::bench_webauthn_assertion_prove", + "ios_completion_timeout_secs": 7200, + "iterations": 5, + "target": "ios", + "warmup": 1 + }, + "summary": { + "device_summaries": [ + { + "benchmarks": [ + { + "function": "bench_mobile::bench_webauthn_assertion_prove", + "max_ns": 3229705459, + "mean_ns": 3120877616, + "median_ns": 3183651250, + "min_ns": 2973894333, + "p95_ns": 3229705459, + "resource_usage": { + "cpu_median_ms": 10132, + "cpu_total_ms": 51575, + "peak_memory_growth_kb": 265984, + "peak_memory_kb": 265984, + "process_peak_memory_kb": 597968 + }, + "samples": 5 + } + ], + "device": "iPhone SE 2022-15" + } + ], + "devices": [ + "iPhone SE 2022-15" + ], + "function": "bench_mobile::bench_webauthn_assertion_prove", + "generated_at": "2026-07-31T17:49:11.144854Z", + "generated_at_unix": 1785520151, + "iterations": 5, + "target": "ios", + "warmup": 1 + } + } + }, + "summary": { + "device_summaries": [ + { + "benchmarks": [ + { + "function": "bench_mobile::bench_oprf_prove", + "max_ns": 1223628875, + "mean_ns": 1197416916, + "median_ns": 1218066500, + "min_ns": 1112638500, + "p95_ns": 1223628875, + "resource_usage": { + "cpu_median_ms": 2056, + "cpu_total_ms": 10206, + "peak_memory_growth_kb": 10960, + "peak_memory_kb": 10960, + "process_peak_memory_kb": 148688 + }, + "samples": 5 + }, + { + "function": "bench_mobile::bench_passport_complete_age_check_prove", + "max_ns": 3102353000, + "mean_ns": 2501031991, + "median_ns": 2385298625, + "min_ns": 2262063083, + "p95_ns": 3102353000, + "resource_usage": { + "cpu_median_ms": 9054, + "cpu_total_ms": 44583, + "peak_memory_growth_kb": 277792, + "peak_memory_kb": 277792, + "process_peak_memory_kb": 572768 + }, + "samples": 5 + }, + { + "function": "bench_mobile::bench_webauthn_assertion_prove", + "max_ns": 3229705459, + "mean_ns": 3120877616, + "median_ns": 3183651250, + "min_ns": 2973894333, + "p95_ns": 3229705459, + "resource_usage": { + "cpu_median_ms": 10132, + "cpu_total_ms": 51575, + "peak_memory_growth_kb": 265984, + "peak_memory_kb": 265984, + "process_peak_memory_kb": 597968 + }, + "samples": 5 + } + ], + "device": "iPhone SE 2022-15" + } + ], + "devices": [ + "iPhone SE 2022-15" + ], + "function": "multiple", + "generated_at": "2026-07-31T17:50:55.556956Z", + "generated_at_unix": 1785520255, + "iterations": 5, + "target": "ios", + "warmup": 1 + } +} \ No newline at end of file diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/oprf.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/oprf.json new file mode 100644 index 000000000..994e8111c --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/oprf.json @@ -0,0 +1,110 @@ +{ + "schema_version": 1, + "benchmark": "oprf_world_id_nullifier", + "backend": "provekit_v1_branch_9b2a6f_wasm_single", + "download_time_ms": 8.205000042915344, + "initialization_time_ms": 26.2150000333786, + "artifacts": { + "prover_bytes": 1638340, + "verifier_bytes": 1061409 + }, + "bundle": { + "shared_runtime_bytes": 9165802, + "incremental_circuit_bytes": 2706044, + "cold_download_bytes": 11871846 + }, + "circuit": { + "constraints": 95921, + "witnesses": 97061 + }, + "environment": { + "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/151.0.0.0 Safari/537.36", + "hardware_concurrency": 16, + "cross_origin_isolated": true, + "wasm_threads": false, + "memory_metric": "unavailable" + }, + "warmup": 1, + "iterations": 5, + "samples": [ + { + "iteration": 0, + "warmup": true, + "prepare_time_ms": 361.125, + "witness_time_ms": 1440.5550000667572, + "prove_time_ms": 2870.2850000858307, + "verify_time_ms": 138.70999991893768, + "end_to_end_time_ms": 3452.2599999904633, + "proof_size_bytes": 842574, + "tampered_proof_rejected": true + }, + { + "iteration": 0, + "warmup": false, + "prepare_time_ms": 361.84499990940094, + "witness_time_ms": 1328.7549999952316, + "prove_time_ms": 2697.0049999952316, + "verify_time_ms": 134.04000008106232, + "end_to_end_time_ms": 3277.264999985695, + "proof_size_bytes": 849742, + "tampered_proof_rejected": true + }, + { + "iteration": 1, + "warmup": false, + "prepare_time_ms": 359.6399999856949, + "witness_time_ms": 1316.375, + "prove_time_ms": 2698.9199999570847, + "verify_time_ms": 132.67500007152557, + "end_to_end_time_ms": 3274.314999938011, + "proof_size_bytes": 844238, + "tampered_proof_rejected": true + }, + { + "iteration": 2, + "warmup": false, + "prepare_time_ms": 358.65499997138977, + "witness_time_ms": 1318.1800000667572, + "prove_time_ms": 2718.515000104904, + "verify_time_ms": 136.99000000953674, + "end_to_end_time_ms": 3214.899999976158, + "proof_size_bytes": 842786, + "tampered_proof_rejected": true + }, + { + "iteration": 3, + "warmup": false, + "prepare_time_ms": 370.3549998998642, + "witness_time_ms": 1343.9100000858307, + "prove_time_ms": 2734.7300000190735, + "verify_time_ms": 136.91500008106232, + "end_to_end_time_ms": 3325.064999938011, + "proof_size_bytes": 846326, + "tampered_proof_rejected": true + }, + { + "iteration": 4, + "warmup": false, + "prepare_time_ms": 366.60000002384186, + "witness_time_ms": 1317.1150000095367, + "prove_time_ms": 2693.179999947548, + "verify_time_ms": 133.375, + "end_to_end_time_ms": 3275.6299999952316, + "proof_size_bytes": 847310, + "tampered_proof_rejected": true + } + ], + "process_memory": { + "metric": "peak_chrome_renderer_rss", + "peak_rss_kib": 719520, + "peak_renderer_pid": 79137, + "polling_interval_ms": 100, + "sample_count": 120 + }, + "browser": { + "name": "Google Chrome", + "version": "151.0.7922.72", + "executable_path": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "headless": true + } +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/passport.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/passport.json new file mode 100644 index 000000000..e585fcb36 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/passport.json @@ -0,0 +1,110 @@ +{ + "schema_version": 1, + "benchmark": "passport_p1", + "backend": "provekit_v1_branch_9b2a6f_wasm_single", + "download_time_ms": 16.1599999666214, + "initialization_time_ms": 53.330000042915344, + "artifacts": { + "prover_bytes": 2283056, + "verifier_bytes": 3528970 + }, + "bundle": { + "shared_runtime_bytes": 9165802, + "incremental_circuit_bytes": 5842709, + "cold_download_bytes": 15008511 + }, + "circuit": { + "constraints": 294402, + "witnesses": 522648 + }, + "environment": { + "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/151.0.0.0 Safari/537.36", + "hardware_concurrency": 16, + "cross_origin_isolated": true, + "wasm_threads": false, + "memory_metric": "unavailable" + }, + "warmup": 1, + "iterations": 5, + "samples": [ + { + "iteration": 0, + "warmup": true, + "prepare_time_ms": 535.6699999570847, + "witness_time_ms": 789.1749999523163, + "prove_time_ms": 10399.320000052452, + "verify_time_ms": 312.8399999141693, + "end_to_end_time_ms": 11448.304999947548, + "proof_size_bytes": 965585, + "tampered_proof_rejected": true + }, + { + "iteration": 0, + "warmup": false, + "prepare_time_ms": 536.7000000476837, + "witness_time_ms": 634.2649999856949, + "prove_time_ms": 10221.615000009537, + "verify_time_ms": 308.4850000143051, + "end_to_end_time_ms": 11270.340000033379, + "proof_size_bytes": 963449, + "tampered_proof_rejected": true + }, + { + "iteration": 1, + "warmup": false, + "prepare_time_ms": 541.2250000238419, + "witness_time_ms": 629.3199999332428, + "prove_time_ms": 10208.43499994278, + "verify_time_ms": 313.6800000667572, + "end_to_end_time_ms": 11263.384999990463, + "proof_size_bytes": 964645, + "tampered_proof_rejected": true + }, + { + "iteration": 2, + "warmup": false, + "prepare_time_ms": 558.7150000333786, + "witness_time_ms": 667.6899999380112, + "prove_time_ms": 10271.65499997139, + "verify_time_ms": 310.4249999523163, + "end_to_end_time_ms": 11340.044999957085, + "proof_size_bytes": 961573, + "tampered_proof_rejected": true + }, + { + "iteration": 3, + "warmup": false, + "prepare_time_ms": 542.0250000953674, + "witness_time_ms": 628.1449999809265, + "prove_time_ms": 10216.27999997139, + "verify_time_ms": 309.8200000524521, + "end_to_end_time_ms": 11268.545000076294, + "proof_size_bytes": 964305, + "tampered_proof_rejected": true + }, + { + "iteration": 4, + "warmup": false, + "prepare_time_ms": 543.2549999952316, + "witness_time_ms": 623.8600000143051, + "prove_time_ms": 10182.409999966621, + "verify_time_ms": 305.09500002861023, + "end_to_end_time_ms": 11233.944999933243, + "proof_size_bytes": 961829, + "tampered_proof_rejected": true + } + ], + "process_memory": { + "metric": "peak_chrome_renderer_rss", + "peak_rss_kib": 1022080, + "peak_renderer_pid": 90300, + "polling_interval_ms": 100, + "sample_count": 412 + }, + "browser": { + "name": "Google Chrome", + "version": "151.0.7922.72", + "executable_path": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "headless": true + } +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/webauthn.json b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/webauthn.json new file mode 100644 index 000000000..dc36dd182 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/evidence/provekit-v1/mac/webauthn.json @@ -0,0 +1,110 @@ +{ + "schema_version": 1, + "benchmark": "webauthn_assertion", + "backend": "provekit_v1_branch_9b2a6f_wasm_single", + "download_time_ms": 14.90499997138977, + "initialization_time_ms": 68.75499999523163, + "artifacts": { + "prover_bytes": 2278684, + "verifier_bytes": 4463161 + }, + "bundle": { + "shared_runtime_bytes": 9165802, + "incremental_circuit_bytes": 6749676, + "cold_download_bytes": 15915478 + }, + "circuit": { + "constraints": 389181, + "witnesses": 644526 + }, + "environment": { + "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/151.0.0.0 Safari/537.36", + "hardware_concurrency": 16, + "cross_origin_isolated": true, + "wasm_threads": false, + "memory_metric": "unavailable" + }, + "warmup": 1, + "iterations": 5, + "samples": [ + { + "iteration": 0, + "warmup": true, + "prepare_time_ms": 806.5750000476837, + "witness_time_ms": 1916.5899999141693, + "prove_time_ms": 11823.745000004768, + "verify_time_ms": 375.91999995708466, + "end_to_end_time_ms": 13266.769999980927, + "proof_size_bytes": 973604, + "tampered_proof_rejected": true + }, + { + "iteration": 0, + "warmup": false, + "prepare_time_ms": 585.1499999761581, + "witness_time_ms": 1220.9150000810623, + "prove_time_ms": 10961.985000014305, + "verify_time_ms": 368.25, + "end_to_end_time_ms": 12176.84500002861, + "proof_size_bytes": 971344, + "tampered_proof_rejected": true + }, + { + "iteration": 1, + "warmup": false, + "prepare_time_ms": 582.8200000524521, + "witness_time_ms": 1216.1099998950958, + "prove_time_ms": 11004.424999952316, + "verify_time_ms": 366.4249999523163, + "end_to_end_time_ms": 12212.65499997139, + "proof_size_bytes": 969380, + "tampered_proof_rejected": true + }, + { + "iteration": 2, + "warmup": false, + "prepare_time_ms": 585.4350000619888, + "witness_time_ms": 1210.1000000238419, + "prove_time_ms": 11021.429999947548, + "verify_time_ms": 374.3400000333786, + "end_to_end_time_ms": 12247.805000066757, + "proof_size_bytes": 972536, + "tampered_proof_rejected": true + }, + { + "iteration": 3, + "warmup": false, + "prepare_time_ms": 615.1299999952316, + "witness_time_ms": 1266.4650000333786, + "prove_time_ms": 10999.860000014305, + "verify_time_ms": 365.5, + "end_to_end_time_ms": 11981.304999947548, + "proof_size_bytes": 972624, + "tampered_proof_rejected": true + }, + { + "iteration": 4, + "warmup": false, + "prepare_time_ms": 597.210000038147, + "witness_time_ms": 1218, + "prove_time_ms": 11013.475000023842, + "verify_time_ms": 365.86500000953674, + "end_to_end_time_ms": 12236.465000033379, + "proof_size_bytes": 972708, + "tampered_proof_rejected": true + } + ], + "process_memory": { + "metric": "peak_chrome_renderer_rss", + "peak_rss_kib": 1018832, + "peak_renderer_pid": 79866, + "polling_interval_ms": 100, + "sample_count": 443 + }, + "browser": { + "name": "Google Chrome", + "version": "151.0.7922.72", + "executable_path": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "headless": true + } +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/export-v1.test.ts b/benchmarks/v1/legacy/semantic-parity-data/export-v1.test.ts new file mode 100644 index 000000000..4c4d42544 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/export-v1.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { exportV1 } from "./export-v1"; + +describe("ProveKit V1 publication export", () => { + test("rebuilds all nine V1 cells from hash-locked evidence", async () => { + const directory = mkdtempSync(join(tmpdir(), "provekit-v1-export-")); + const output = join(directory, "samples.csv"); + try { + const rows = await exportV1(output); + const cells = new Set(rows.map((row) => `${row.hardware}|${row.circuit}|${row.prover}`)); + const v1 = rows.filter((row) => row.prover === "provekit_v1"); + expect(rows).toHaveLength(162); + expect(cells.size).toBe(27); + expect(v1).toHaveLength(54); + for (const cell of new Set(v1.map((row) => row.attempt_id.replace(/__(?:warmup|sample-\d+)$/, "")))) { + const records = v1.filter((row) => row.attempt_id.startsWith(`${cell}__`)); + expect(records.filter((row) => row.sample_kind === "warmup")).toHaveLength(1); + expect(records.filter((row) => row.sample_kind === "measured")).toHaveLength(5); + } + for (const row of v1.filter((candidate) => candidate.sample_kind === "measured")) { + expect(row.prover_time_ms).toBeGreaterThan(0); + expect(row.proof_size_bytes).toBeGreaterThan(0); + expect(row.circuit_size_bytes).toBeGreaterThan(0); + expect(row.artifact_size_bytes).toBeGreaterThan(0); + expect(row.peak_memory_mib).toBeGreaterThan(0); + expect(JSON.parse(row.artifact_hashes)).toHaveProperty("evidence"); + } + } finally { + rmSync(directory, { recursive: true, force: true }); + } + }); +}); diff --git a/benchmarks/v1/legacy/semantic-parity-data/export-v1.ts b/benchmarks/v1/legacy/semantic-parity-data/export-v1.ts new file mode 100644 index 000000000..7616953ab --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/export-v1.ts @@ -0,0 +1,229 @@ +#!/usr/bin/env bun + +import { createHash } from "node:crypto"; +import { resolve } from "node:path"; +import { toCsv, validateAttempts } from "../data/export-benchmark-csv"; +import { CSV_COLUMNS, type AttemptRecord, type CsvColumn } from "../data/schema"; + +const root = resolve(import.meta.dir); +const csvPath = resolve(root, "../legacy/semantic-parity/semantic-parity-samples.csv"); +const manifestPath = resolve(root, "manifest.json"); +const numericColumns = new Set([ + "initialization_time_ms", "witness_time_ms", "prover_time_ms", "verify_time_ms", + "total_time_ms", "peak_memory_mib", "proof_size_bytes", "circuit_size_bytes", + "artifact_size_bytes", "bundle_size_bytes", "constraint_count", "sample_index", +]); + +type ManifestCell = { + cell_id: string; + profile: string; + target: string; + stack: string; + state: string; + evidence: string; + evidence_sha256: string; + payload: Array<{ name?: string; bytes: number; sha256: string }>; + provenance?: { session_id?: string }; +}; + +type Manifest = { + campaign_id: string; + provekit_v1: { + core_commit: string; + campaign_harness_commit: string; + noir_version: string; + }; + cells: ManifestCell[]; +}; + +function parseCsv(text: string): Record[] { + const rows: string[][] = []; + let row: string[] = []; + let field = ""; + let quoted = false; + for (let i = 0; i < text.length; i += 1) { + const char = text[i]; + if (quoted) { + if (char === '"' && text[i + 1] === '"') { field += '"'; i += 1; } + else if (char === '"') quoted = false; + else field += char; + } else if (char === '"' && field === "") quoted = true; + else if (char === ",") { row.push(field); field = ""; } + else if (char === "\n") { row.push(field.replace(/\r$/, "")); rows.push(row); row = []; field = ""; } + else field += char; + } + if (field || row.length) { row.push(field); rows.push(row); } + const header = rows.shift() ?? []; + return rows.filter((candidate) => candidate.some(Boolean)).map((candidate) => + Object.fromEntries(header.map((column, index) => [column, candidate[index] ?? ""])), + ); +} + +function attemptsFromCsv(text: string): AttemptRecord[] { + return parseCsv(text).map((raw) => { + const record: Record = { ...raw }; + for (const column of numericColumns) record[column] = raw[column] === "" ? null : Number(raw[column]); + return record as AttemptRecord; + }); +} + +async function sha256(path: string): Promise { + return createHash("sha256").update(Buffer.from(await Bun.file(path).arrayBuffer())).digest("hex"); +} + +function json(value: unknown): string { + return JSON.stringify(value); +} + +function workloadFor(profile: string): "passport" | "webauthn" | "oprf" { + if (profile === "passport_p1") return "passport"; + if (profile === "webauthn_closest_analogue") return "webauthn"; + if (profile === "oprf_o2") return "oprf"; + throw new Error(`unknown ProveKit V1 profile ${profile}`); +} + +function circuitCommit(profile: string, coreCommit: string): string { + if (profile === "passport_p1") return coreCommit; + if (profile === "webauthn_closest_analogue") return "85aeeef539961cae5a63de794997b507a5975717"; + return "fd37726215b59d3d4823ea7b1967b1da3525ed9d"; +} + +function hardware(target: string): AttemptRecord["hardware"] { + if (target === "mac_chrome") return "macbook_m4"; + if (target === "iphone_se_2022") return "iphone_se_2022"; + if (target === "motorola_e15") return "motorola_e15"; + throw new Error(`unknown target ${target}`); +} + +function device(target: string) { + if (target === "mac_chrome") return { model: "MacBook Pro M4 Max", os: "macOS 26.5.2 (25F84)", abi: "arm64", runtime: "browser_wasm" as const, browser: "Google Chrome 151.0.7922.72 (headless)" }; + if (target === "iphone_se_2022") return { model: "iPhone SE 2022", os: "iOS 15", abi: "arm64", runtime: "ios_native" as const, browser: "" }; + return { model: "moto e15", os: "Android 14", abi: "armeabi-v7a", runtime: "android_native" as const, browser: "" }; +} + +function payloadSize(cell: ManifestCell): number { + const size = (cell.payload ?? []).reduce((sum, component) => sum + component.bytes, 0); + if (!Number.isSafeInteger(size) || size <= 0) throw new Error(`${cell.cell_id}: invalid proving payload size`); + return size; +} + +function hashes(cell: ManifestCell): string { + return json({ + evidence: cell.evidence_sha256, + payload: Object.fromEntries((cell.payload ?? []).map((component) => [component.name ?? "payload", component.sha256])), + }); +} + +function common(cell: ManifestCell, manifest: Manifest, evidencePath: string, circuit: string, payload: number): Omit { + const target = device(cell.target); + const core = manifest.provekit_v1.core_commit; + return { + campaign_id: manifest.campaign_id, + recorded_at_utc: "2026-07-31T00:00:00Z", + hardware: hardware(cell.target), + device_model: target.model, + os_version: target.os, + abi: target.abi, + runtime: target.runtime, + browser: target.browser, + circuit, + circuit_variant: cell.profile, + circuit_commit: circuitCommit(cell.profile, core), + prover: "provekit_v1", + frontend: "noir", + prover_backend: cell.target === "mac_chrome" ? "provekit-v1-branch-9b2a6f3-wasm-single" : "provekit-v1-whir-native", + witness_backend: `noir-v${manifest.provekit_v1.noir_version}`, + circuit_size_bytes: payload, + artifact_size_bytes: payload, + bundle_size_bytes: payload, + constraint_count: null, + artifact_version: `provekit-v1-core-${core.slice(0, 7)}-noir-beta.11`, + source_commit: core, + package_versions: json({ provekit_core: core, noir: manifest.provekit_v1.noir_version, mobench: "0.1.48", campaign_harness: manifest.provekit_v1.campaign_harness_commit }), + artifact_hashes: hashes(cell), + session_id: cell.provenance?.session_id ?? "", + non_equivalence_note: "Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.", + evidence_path: evidencePath, + }; +} + +function rowsFromSamples(cell: ManifestCell, manifest: Manifest, report: any, evidencePath: string, samples: Array<{ warmup: boolean; index: number; proveMs: number; totalMs: number; proofBytes: number; memoryMib: number }>) { + const payload = payloadSize(cell); + const base = common(cell, manifest, evidencePath, workloadFor(cell.profile), payload); + const rows: AttemptRecord[] = []; + rows.push({ ...base, attempt_id: `${cell.cell_id}__warmup`, sample_kind: "warmup", sample_index: 0, status: "ok", initialization_time_ms: null, witness_time_ms: null, prover_time_ms: null, verify_time_ms: null, total_time_ms: null, peak_memory_mib: null, proof_size_bytes: null, failure_code: "", failure_detail: "" }); + for (const sample of samples.filter((candidate) => !candidate.warmup)) { + rows.push({ ...base, attempt_id: `${cell.cell_id}__sample-${sample.index}`, sample_kind: "measured", sample_index: sample.index, status: "ok", initialization_time_ms: null, witness_time_ms: null, prover_time_ms: sample.proveMs, verify_time_ms: null, total_time_ms: sample.totalMs, peak_memory_mib: sample.memoryMib, proof_size_bytes: sample.proofBytes, failure_code: "", failure_detail: "" }); + } + return rows; +} + +function macRows(cell: ManifestCell, manifest: Manifest, report: any): AttemptRecord[] { + const peakMib = report.process_memory.peak_rss_kib / 1024; + return rowsFromSamples(cell, manifest, report, cell.evidence, report.samples.map((sample: any) => ({ + warmup: sample.warmup, + index: sample.warmup ? 0 : sample.iteration + 1, + proveMs: sample.prove_time_ms, + totalMs: sample.end_to_end_time_ms, + proofBytes: sample.proof_size_bytes, + memoryMib: peakMib, + }))); +} + +function nativeRows(cell: ManifestCell, manifest: Manifest, report: any): AttemptRecord[] { + const custom = report.custom_metrics; + const prove = custom.sample_u64.prove_time_ns as number[]; + const proofs = custom.sample_u64.proof_size_bytes as number[]; + const sourceSamples = report.samples as any[]; + return rowsFromSamples(cell, manifest, report, cell.evidence, sourceSamples.map((sample: any, index: number) => ({ + warmup: false, + index: index + 1, + proveMs: prove[index + 1] / 1e6, + totalMs: sample.duration_ns / 1e6, + proofBytes: proofs[index + 1], + memoryMib: sample.process_peak_memory_kb / 1024, + })).concat([{ warmup: true, index: 0, proveMs: 0, totalMs: 0, proofBytes: 0, memoryMib: 0 }])); +} + +function evidenceForCell(cell: ManifestCell, manifest: Manifest): any { + const path = resolve(root, cell.evidence); + return Bun.file(path).json(); +} + +async function replaceV1Rows(): Promise { + const manifest = await Bun.file(manifestPath).json() as Manifest; + const base = attemptsFromCsv(await Bun.file(csvPath).text()).filter((row) => row.prover !== "provekit_v1"); + const v1Rows: AttemptRecord[] = []; + for (const cell of manifest.cells.filter((candidate) => candidate.stack === "provekit_v1")) { + const evidencePath = resolve(root, cell.evidence); + if (await sha256(evidencePath) !== cell.evidence_sha256) throw new Error(`${cell.cell_id}: evidence hash drift`); + const raw = await evidenceForCell(cell, manifest); + if (cell.target === "mac_chrome") { + v1Rows.push(...macRows(cell, manifest, raw)); + continue; + } + if (cell.target === "iphone_se_2022") { + const fn = cell.profile === "passport_p1" ? "bench_mobile::bench_passport_complete_age_check_prove" : cell.profile === "oprf_o2" ? "bench_mobile::bench_oprf_prove" : "bench_mobile::bench_webauthn_assertion_prove"; + const report = raw.functions[fn].benchmark_results["iPhone SE 2022-15"][0]; + v1Rows.push(...nativeRows(cell, manifest, report)); + continue; + } + const report = raw.results.find((result: any) => result.workload === workloadFor(cell.profile))?.report; + if (!report) throw new Error(`${cell.cell_id}: native report missing`); + v1Rows.push(...nativeRows(cell, manifest, report)); + } + return validateAttempts([...base, ...v1Rows], true); +} + +export async function exportV1(output = csvPath): Promise { + const rows = await replaceV1Rows(); + await Bun.write(output, toCsv(rows)); + return rows; +} + +if (import.meta.main) { + const outputFlag = Bun.argv.find((arg) => arg.startsWith("--output=")); + const output = resolve(outputFlag?.slice("--output=".length) ?? csvPath); + const rows = await exportV1(output); + console.log(JSON.stringify({ output, rows: rows.length, cells: new Set(rows.map((row) => `${row.hardware}|${row.circuit}|${row.prover}`)).size, successful_cells: new Set(rows.filter((row) => row.status === "ok").map((row) => `${row.hardware}|${row.circuit}|${row.prover}`)).size }, null, 2)); +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/export.test.ts b/benchmarks/v1/legacy/semantic-parity-data/export.test.ts new file mode 100644 index 000000000..a1a936dae --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/export.test.ts @@ -0,0 +1,147 @@ +import { describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { CSV_COLUMNS, EXPECTED_RUNTIME, PROFILES, STACKS, TARGETS, cellId, expectedCellIds, type ParitySample } from "./schema"; +import { exportCampaign, toCsv, validate } from "./export"; + +function row(overrides: Partial = {}): ParitySample { + return { + campaign_id: "semantic-parity-v1-20260731", semantic_profile: "passport_p1", + cell_id: "passport_p1__mac_chrome__provekit_v1", target: "mac_chrome", + device_model: "MacBook Pro", os_version: "macOS", abi: "arm64", runtime: "browser_wasm", + browser: "Chrome", stack: "provekit_v1", frontend: "noir", prover_backend: "whir", + witness_backend: "noir_js", sample_kind: "measured", sample_index: 1, status: "ok", + prove_time_ms: 1, proof_size_bytes: 2, proving_payload_size_bytes: 3, process_peak_memory_kib: 4, + valid_proof_accepted: true, tampered_proof_rejected: true, constraint_count: null, + source_commits: "{}", package_versions: "{}", artifact_hashes: "{}", evidence_path: "x", + evidence_sha256: "a".repeat(64), session_id: "", failure_code: "", failure_detail: "", + semantic_equivalence_note: "Matched semantic profile.", ...overrides, + }; +} + +describe("semantic parity export", () => { + test("freezes the 27-cell semantic matrix and stable CSV schema", () => { + expect(expectedCellIds()).toHaveLength(27); + expect(new Set(expectedCellIds()).size).toBe(27); + expect(toCsv([]).trim()).toBe(CSV_COLUMNS.join(",")); + }); + + test("emits the exact legacy benchmark-samples.csv schema and metric units", async () => { + const legacyHeader = (await Bun.file(new URL("../legacy/data/benchmark-samples.csv", import.meta.url)).text()).split("\n", 1)[0]; + expect(CSV_COLUMNS.join(",")).toBe(legacyHeader); + const output = toCsv([row({ prove_time_ms: 12.5, proof_size_bytes: 42, + proving_payload_size_bytes: 9000, process_peak_memory_kib: 2048 })]); + const values = output.trim().split("\n")[1].split(","); + const mapped = Object.fromEntries(CSV_COLUMNS.map((column, index) => [column, values[index]])); + expect(mapped.prover_time_ms).toBe("12.5"); + expect(mapped.proof_size_bytes).toBe("42"); + expect(mapped.circuit_size_bytes).toBe("9000"); + expect(mapped.peak_memory_mib).toBe("2"); + }); + + test("ingests seven qualified Mac cells and six frozen WebAuthn cells", async () => { + const rows = await exportCampaign(); + expect(rows).toHaveLength(78); + expect(new Set(rows.map((r) => r.cell_id)).size).toBe(13); + for (const id of new Set(rows.map((r) => r.cell_id))) { + const cell = rows.filter((r) => r.cell_id === id); + expect(cell.filter((r) => r.sample_kind === "warmup")).toHaveLength(1); + expect(cell.filter((r) => r.sample_kind === "measured")).toHaveLength(5); + } + }); + + test("preserves all four historical WebAuthn metrics and corrected Circom payload provenance", async () => { + const rows = (await exportCampaign()).filter((candidate) => candidate.semantic_profile === "webauthn_closest_analogue"); + expect(rows).toHaveLength(42); + const historical = rows.filter((candidate) => candidate.stack !== "provekit_v1"); + expect(historical).toHaveLength(36); + for (const candidate of historical.filter((candidate) => candidate.sample_kind === "measured")) { + expect(candidate.prove_time_ms).toBeGreaterThan(0); + expect(candidate.proof_size_bytes).toBeGreaterThan(0); + expect(candidate.proving_payload_size_bytes).toBeGreaterThan(0); + expect(candidate.process_peak_memory_kib).toBeGreaterThan(0); + expect(candidate.semantic_equivalence_note).toContain("Historical note verbatim:"); + } + const macCircom = historical.find((candidate) => candidate.target === "mac_chrome" && candidate.stack === "circom_groth16" && candidate.sample_kind === "measured")!; + expect(macCircom.proving_payload_size_bytes).toBe(1_753_618_376); + expect(macCircom.semantic_equivalence_note).toContain("20,470,384-byte WASM"); + const e15Circom = historical.find((candidate) => candidate.target === "motorola_e15" && candidate.stack === "circom_groth16" && candidate.sample_kind === "measured")!; + expect(e15Circom.proving_payload_size_bytes).toBe(1_842_364_184); + expect(e15Circom.semantic_equivalence_note).toContain("109,218,412-byte frozen witness library"); + const iphoneCircom = historical.find((candidate) => candidate.target === "iphone_se_2022" && candidate.stack === "circom_groth16" && candidate.sample_kind === "measured")!; + expect(iphoneCircom.semantic_equivalence_note).toContain("asset-size estimate: zkey plus frozen WTNS"); + const expectedPayloads = new Map([ + [cellId("webauthn_closest_analogue", "mac_chrome", "noir_barretenberg"), 74_003_114], + [cellId("webauthn_closest_analogue", "iphone_se_2022", "noir_barretenberg"), 271_478_529], + [cellId("webauthn_closest_analogue", "motorola_e15", "noir_barretenberg"), 271_478_529], + ]); + for (const [id, payload] of expectedPayloads) { + const measured = historical.filter((candidate) => candidate.cell_id === id && candidate.sample_kind === "measured"); + expect(measured).toHaveLength(5); + expect(new Set(measured.map((candidate) => candidate.proving_payload_size_bytes))).toEqual(new Set([payload])); + expect(measured[0].semantic_equivalence_note).toContain("Payload correction"); + } + }); + + test("rejects duplicate samples, wrong runtime, wrong profile and blank headline metrics", () => { + expect(() => validate([row(), row()])).toThrow(/duplicate/); + expect(() => validate([row({ runtime: "ios_native" })])).toThrow(/runtime separation/); + expect(() => validate([row({ semantic_profile: "oprf_o2" })])).toThrow(/profile\/cell mismatch/); + expect(() => validate([row({ proving_payload_size_bytes: null })])).toThrow(/blank\/invalid/); + }); + + test("keeps unavailable metrics blank and requires a structured status", () => { + const gap = row({ sample_kind: "gap", sample_index: null, status: "unsupported", prove_time_ms: null, + proof_size_bytes: null, proving_payload_size_bytes: null, process_peak_memory_kib: null, + valid_proof_accepted: null, tampered_proof_rejected: null, failure_code: "unsupported_abi", + failure_detail: "No compatible binary exists." }); + expect(validate([gap])).toHaveLength(1); + expect(() => validate([{ ...gap, proof_size_bytes: 0 }])).toThrow(/must be blank/); + expect(() => validate([{ ...gap, failure_code: "" }])).toThrow(/structured failure/); + expect(() => validate([row(), gap])).toThrow(/duplicate cell evidence/); + }); + + test("ingests one native structured gap without fabricating metrics", async () => { + const dir = mkdtempSync(join(tmpdir(), "parity-gap-")); + const path = join(dir, "gap.json"); + await Bun.write(path, JSON.stringify({ + schema_version: 1, campaign_id: "semantic-parity-v1-20260731", semantic_profile: "oprf_o2", + target: "motorola_e15", stack: "noir_barretenberg", + device: { model: "Motorola E15", os_version: "Android", abi: "armeabi-v7a" }, + runtime: "android_native", frontend: "noir", prover_backend: "barretenberg", witness_backend: "noir", + source_commits: {}, package_versions: {}, artifact_hashes: {}, proving_payload_size_bytes: null, + process_peak_memory_kib: null, valid_proof_accepted: null, tampered_proof_rejected: null, + session_id: "adb-session", gap: { status: "unsupported", failure_code: "unsupported_abi", + failure_detail: "No armv7 backend exists.", prove_time_ms: null, proof_size_bytes: null }, + })); + try { + const rows = await exportCampaign([path]); + const gap = rows.find((candidate) => candidate.cell_id === "oprf_o2__motorola_e15__noir_barretenberg"); + expect(gap?.sample_kind).toBe("gap"); + expect(gap?.status).toBe("unsupported"); + expect(gap?.prove_time_ms).toBeNull(); + expect(gap?.proving_payload_size_bytes).toBeNull(); + } finally { + rmSync(dir, { recursive: true, force: true }); + } + }); + + test("counts explicit gap cells as covered in complete-matrix validation", () => { + const gaps: ParitySample[] = []; + for (const semantic_profile of PROFILES) for (const target of TARGETS) for (const stack of STACKS) { + gaps.push(row({ semantic_profile, target, stack, cell_id: cellId(semantic_profile, target, stack), + runtime: EXPECTED_RUNTIME[target], browser: target === "mac_chrome" ? "Chrome" : "", + sample_kind: "gap", sample_index: null, status: "zero_samples", prove_time_ms: null, + proof_size_bytes: null, proving_payload_size_bytes: null, process_peak_memory_kib: null, + valid_proof_accepted: null, tampered_proof_rejected: null, failure_code: "zero_samples", + failure_detail: "No qualified samples were retained." })); + } + expect(validate(gaps, true)).toHaveLength(27); + }); + + test("rejects incomplete successful series and incomplete full matrix", () => { + expect(() => validate([row()])).toThrow(/requires 1\+5/); + expect(() => validate([], true)).toThrow(/missing 27 cells/); + }); +}); diff --git a/benchmarks/v1/legacy/semantic-parity-data/export.ts b/benchmarks/v1/legacy/semantic-parity-data/export.ts new file mode 100644 index 000000000..7e52fe68d --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/export.ts @@ -0,0 +1,474 @@ +import { createHash } from "node:crypto"; +import { resolve } from "node:path"; +import { + CAMPAIGN_ID, CSV_COLUMNS, EXPECTED_RUNTIME, PROFILES, STACKS, TARGETS, + cellId, expectedCellIds, type ParitySample, type Profile, type Stack, type Target, +} from "./schema"; + +type Payload = { path?: string; name?: string; bytes: number; sha256: string | null }; +type ManifestCell = { + cell_id: string; profile: Profile; target: Target; stack: Stack; state: string; + evidence?: string; evidence_sha256?: string; payload?: Payload[]; +}; +type Manifest = { + campaign_id: string; + semantic_profiles: Record>; + cells: ManifestCell[]; +}; + +type NativeParityEvidenceBase = { + schema_version: 1; + campaign_id: string; + semantic_profile: Profile; + target: Exclude; + stack: Stack; + device: { model: string; os_version: string; abi: string }; + runtime: "ios_native" | "android_native"; + browser?: string; + frontend: "noir" | "circom"; + prover_backend: string; + witness_backend: string; + source_commits: Record; + package_versions: Record; + artifact_hashes: Record; + constraint_count?: number | null; + session_id: string; +}; + +export type NativeParityEvidence = NativeParityEvidenceBase & ({ + proving_payload_size_bytes: number; + process_peak_memory_kib: number; + valid_proof_accepted: true; + tampered_proof_rejected: true; + samples: Array<{ + warmup: boolean; + sample_index: number; + status: "ok"; + prove_time_ms: number | null; + proof_size_bytes: number; + }>; + gap?: never; +} | { + proving_payload_size_bytes: null; + process_peak_memory_kib: null; + valid_proof_accepted: null; + tampered_proof_rejected: null; + samples?: never; + gap: { + status: "unsupported" | "build_failed" | "crashed" | "timed_out" | "zero_samples"; + failure_code: string; + failure_detail: string; + prove_time_ms: null; + proof_size_bytes: null; + }; +}); + +const repoRoot = resolve(import.meta.dir, "../../.."); +const semanticDataRoot = resolve(import.meta.dir); +const manifestPath = resolve(import.meta.dir, "manifest.json"); +const historicalCsvPath = resolve(repoRoot, "benchmarks/v1/legacy/data/benchmark-samples.csv"); +const historicalCsvSha256 = "474cb49d528862da3a029967f63fdee1875339b7c3da5f7599f2aded40d57d60"; +const matchedProfileNote: Record, string> = { + passport_p1: "Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof.", + oprf_o2: "Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier.", +}; +const webauthnDifference = "Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings."; + +async function sha256(path: string) { + return createHash("sha256").update(Buffer.from(await Bun.file(path).arrayBuffer())).digest("hex"); +} + +function payloadBytes(cell: ManifestCell) { + return (cell.payload ?? []).reduce((sum, item) => sum + item.bytes, 0); +} + +function stackIdentity(stack: Stack) { + if (stack === "provekit_v1") return { frontend: "noir" as const, prover_backend: "provekit-v1-whir-wasm-single-thread", witness_backend: "@noir-lang/noir_js" }; + if (stack === "noir_barretenberg") return { frontend: "noir" as const, prover_backend: "barretenberg-ultrahonk-wasm-single-thread", witness_backend: "@noir-lang/noir_js" }; + return { frontend: "circom" as const, prover_backend: "snarkjs-groth16-browser-wasm", witness_backend: "circom-witness-wasm" }; +} + +function sourceCommits(profile: Profile, stack: Stack) { + if (profile === "webauthn_closest_analogue") return "{}"; + if (profile === "oprf_o2") return JSON.stringify({ + world_id_protocol: "85aeeef539961cae5a63de794997b507a5975717", + ...(stack === "circom_groth16" ? {} : { taceo_beta19_compat: "7831dca615db55147c60f49415af6e86730df090" }), + ...(stack === "provekit_v1" ? { provekit: "4b61b5d68e633a044eb41de4a6934d52ffdcbedc" } : {}), + }); + return JSON.stringify({ + self_fixture: "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e", + parity_circuit: "7de99e9e001d06797c9770684afea20f096d1ac3", + ...(stack === "provekit_v1" ? { provekit: "4b61b5d68e633a044eb41de4a6934d52ffdcbedc" } : {}), + }); +} + +function packages(stack: Stack) { + if (stack === "provekit_v1") return JSON.stringify({ "@worldcoin/provekit": "0.1.0", "@noir-lang/noir_js": "1.0.0-beta.20" }); + if (stack === "noir_barretenberg") return JSON.stringify({ "@aztec/bb.js": "4.2.0-aztecnr-rc.2", "@noir-lang/noir_js": "1.0.0-beta.19" }); + return JSON.stringify({ snarkjs: "0.7.6" }); +} + +function artifactHashes(cell: ManifestCell) { + return JSON.stringify(Object.fromEntries((cell.payload ?? []).filter((p) => p.sha256).map((p) => [p.path ?? p.name!, p.sha256]))); +} + +function baseMac(cell: ManifestCell, evidenceHash: string, peakKib: number): Omit { + return { + campaign_id: CAMPAIGN_ID, + semantic_profile: cell.profile, + cell_id: cell.cell_id, + target: "mac_chrome", + device_model: "MacBook Pro (Apple M4 Max)", + os_version: "macOS 26.5.2 (25F84)", + abi: "arm64", + runtime: "browser_wasm", + browser: "Google Chrome 151.0.7922.72 (headless)", + stack: cell.stack, + ...stackIdentity(cell.stack), + proving_payload_size_bytes: payloadBytes(cell), + process_peak_memory_kib: peakKib, + constraint_count: cell.profile === "passport_p1" && cell.stack === "circom_groth16" ? 978536 : null, + source_commits: sourceCommits(cell.profile, cell.stack), + package_versions: packages(cell.stack), + artifact_hashes: artifactHashes(cell), + evidence_path: cell.evidence!, + evidence_sha256: evidenceHash, + session_id: "", + failure_code: "", + failure_detail: "", + semantic_equivalence_note: cell.profile === "webauthn_closest_analogue" + ? webauthnDifference + : matchedProfileNote[cell.profile], + }; +} + +async function normalizeMac(cell: ManifestCell): Promise { + const evidence = cell.evidence!; + const path = evidence.startsWith("/") + ? evidence + : evidence.startsWith("target/") || evidence.startsWith("benchmarks/") + ? resolve(repoRoot, evidence) + : resolve(semanticDataRoot, evidence); + const evidenceHash = await sha256(path); + if (evidenceHash !== cell.evidence_sha256) throw new Error(`${cell.cell_id}: evidence hash drift`); + for (const item of cell.payload ?? []) { + if (!item.path || !item.sha256) continue; + const localPath = resolve(repoRoot, item.path); + if (Bun.file(localPath).size !== item.bytes || await sha256(localPath) !== item.sha256) throw new Error(`${cell.cell_id}: artifact drift at ${item.path}`); + } + const report = await Bun.file(path).json() as any; + const peakKib = report.process_memory?.peak_rss_kib; + if (!Number.isSafeInteger(peakKib) || peakKib <= 0) throw new Error(`${cell.cell_id}: missing process RSS`); + let samples: any[]; + let proofSize: number | undefined; + if (cell.stack === "provekit_v1") { + samples = report.samples.map((s: any) => ({ warmup: s.warmup, sample_index: s.iteration, prove_time_ms: s.prove_time_ms, proof_size_bytes: s.proof_size_bytes, tampered: s.tampered_proof_rejected })); + } else if (cell.stack === "noir_barretenberg") { + const body = report.report ?? report; + samples = body.samples.map((s: any) => ({ warmup: s.warmup, sample_index: s.sample_index, prove_time_ms: (s.prove_time_ns ?? s.duration_ns) / 1e6, proof_size_bytes: body.proof_size_bytes ?? report.metadata?.proof_size_bytes, tampered: body.tampered_proof_rejected ?? report.metadata?.tampered_proof_rejected })); + } else { + const result = report.results.find((r: any) => cell.profile === "oprf_o2" ? r.variant === "world_id_protocol_nullifier" : r.variant === "p1_matched_monolithic_rsa4096"); + samples = result.samples.map((s: any) => ({ warmup: s.warmup, sample_index: s.sample_index, prove_time_ms: s.prove_time_ns / 1e6, proof_size_bytes: s.proof_size_bytes, tampered: s.tampered_proof_rejected })); + } + const base = baseMac(cell, evidenceHash, peakKib); + return samples.map((sample, index) => ({ + ...base, + sample_kind: sample.warmup ? "warmup" : "measured", + sample_index: sample.warmup ? 0 : sample.sample_index + 1, + status: "ok", + prove_time_ms: sample.prove_time_ms, + proof_size_bytes: sample.proof_size_bytes ?? proofSize!, + valid_proof_accepted: true, + tampered_proof_rejected: sample.tampered === true, + })); +} + +async function normalizeNative(path: string, manifest: Manifest): Promise { + const input = await Bun.file(path).json() as NativeParityEvidence; + const id = cellId(input.semantic_profile, input.target, input.stack); + if (!manifest.cells.some((cell) => cell.cell_id === id)) throw new Error(`${path}: unknown cell ${id}`); + if (input.campaign_id !== CAMPAIGN_ID || input.runtime !== EXPECTED_RUNTIME[input.target]) throw new Error(`${path}: campaign/runtime mismatch`); + const evidenceHash = await sha256(path); + if ("gap" in input && input.gap) { + return [{ + campaign_id: CAMPAIGN_ID, semantic_profile: input.semantic_profile, cell_id: id, target: input.target, + device_model: input.device.model, os_version: input.device.os_version, abi: input.device.abi, + runtime: input.runtime, browser: input.browser ?? "", stack: input.stack, frontend: input.frontend, + prover_backend: input.prover_backend, witness_backend: input.witness_backend, + sample_kind: "gap", sample_index: null, status: input.gap.status, + prove_time_ms: null, proof_size_bytes: null, proving_payload_size_bytes: null, + process_peak_memory_kib: null, valid_proof_accepted: null, tampered_proof_rejected: null, + constraint_count: input.constraint_count ?? null, source_commits: JSON.stringify(input.source_commits), + package_versions: JSON.stringify(input.package_versions), artifact_hashes: JSON.stringify(input.artifact_hashes), + evidence_path: path, evidence_sha256: evidenceHash, session_id: input.session_id, + failure_code: input.gap.failure_code, failure_detail: input.gap.failure_detail, + semantic_equivalence_note: matchedProfileNote[input.semantic_profile as Exclude], + }]; + } + return input.samples.map((sample) => ({ + campaign_id: CAMPAIGN_ID, semantic_profile: input.semantic_profile, cell_id: id, target: input.target, + device_model: input.device.model, os_version: input.device.os_version, abi: input.device.abi, + runtime: input.runtime, browser: input.browser ?? "", stack: input.stack, frontend: input.frontend, + prover_backend: input.prover_backend, witness_backend: input.witness_backend, + sample_kind: sample.warmup ? "warmup" : "measured", sample_index: sample.warmup ? 0 : sample.sample_index + 1, + status: sample.status, prove_time_ms: sample.prove_time_ms, proof_size_bytes: sample.proof_size_bytes, + proving_payload_size_bytes: input.proving_payload_size_bytes, process_peak_memory_kib: input.process_peak_memory_kib, + valid_proof_accepted: input.valid_proof_accepted, tampered_proof_rejected: input.tampered_proof_rejected, + constraint_count: input.constraint_count ?? null, source_commits: JSON.stringify(input.source_commits), + package_versions: JSON.stringify(input.package_versions), artifact_hashes: JSON.stringify(input.artifact_hashes), + evidence_path: path, evidence_sha256: evidenceHash, session_id: input.session_id, + failure_code: "", failure_detail: "", + semantic_equivalence_note: matchedProfileNote[input.semantic_profile as Exclude], + })); +} + +function parseCsv(text: string): Array> { + const records: string[][] = []; + let record: string[] = []; + let field = ""; + let quoted = false; + for (let index = 0; index < text.length; index++) { + const char = text[index]; + if (quoted) { + if (char === '"' && text[index + 1] === '"') { field += '"'; index++; } + else if (char === '"') quoted = false; + else field += char; + } else if (char === '"') quoted = true; + else if (char === ",") { record.push(field); field = ""; } + else if (char === "\n") { record.push(field.replace(/\r$/, "")); records.push(record); record = []; field = ""; } + else field += char; + } + if (field || record.length) { record.push(field); records.push(record); } + const header = records.shift(); + if (!header) return []; + return records.filter((row) => row.some(Boolean)).map((row) => Object.fromEntries(header.map((column, index) => [column, row[index] ?? ""]))); +} + +function historicalTarget(hardware: string): Target { + if (hardware === "macbook_m4") return "mac_chrome"; + if (hardware === "iphone_se_2022") return "iphone_se_2022"; + if (hardware === "motorola_e15") return "motorola_e15"; + throw new Error(`unknown historical hardware: ${hardware}`); +} + +function numberOrNull(value: string): number | null { + if (value === "") return null; + const parsed = Number(value); + if (!Number.isFinite(parsed)) throw new Error(`invalid historical numeric value: ${value}`); + return parsed; +} + +async function normalizeHistoricalWebAuthn(manifest: Manifest): Promise { + if (await sha256(historicalCsvPath) !== historicalCsvSha256) throw new Error("historical WebAuthn CSV hash drift"); + const inputs = parseCsv(await Bun.file(historicalCsvPath).text()).filter((row) => row.circuit === "webauthn"); + if (inputs.length !== 54) throw new Error(`historical WebAuthn row count drift: ${inputs.length}`); + return inputs.flatMap((input) => { + const target = historicalTarget(input.hardware); + const stack = input.prover as Stack; + const id = cellId("webauthn_closest_analogue", target, stack); + const manifestCell = manifest.cells.find((cell) => cell.cell_id === id); + if (!manifestCell) throw new Error(`missing historical manifest cell: ${id}`); + // V1 WebAuthn rows now come from committed V1 evidence. Do not re-import + // the old WebAuthn row when the manifest promotes that cell to qualified. + if (manifestCell.state !== "historical_frozen") return []; + const historicalPayload = numberOrNull(input.circuit_size_bytes); + let provingPayload = historicalPayload; + let correction = ""; + if (stack === "provekit_v1" && target === "mac_chrome") { + provingPayload = 2_392_664; + correction = " Payload correction from frozen artifacts: 2,384,833-byte PKP + 7,831-byte input = 2,392,664 bytes."; + } else if (stack === "provekit_v1" && target === "iphone_se_2022") { + provingPayload = 2_376_468; + correction = " Payload correction from native structured evidence: 2,327,248-byte prover + 49,220-byte frozen input = 2,376,468 bytes."; + } else if (stack === "provekit_v1" && target === "motorola_e15") { + provingPayload = 2_426_672; + correction = " Payload correction from native structured evidence: 2,377,452-byte prover + 49,220-byte frozen input = 2,426,672 bytes."; + } else if (stack === "noir_barretenberg" && target === "mac_chrome") { + provingPayload = 74_003_114; + correction = " Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes."; + } else if (stack === "noir_barretenberg") { + provingPayload = 271_478_529; + correction = " Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes."; + } else if (stack === "circom_groth16" && target === "mac_chrome") { + provingPayload = 1_753_618_376; + correction = " Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes."; + } else if (stack === "circom_groth16" && target === "motorola_e15") { + provingPayload = 1_842_364_184; + correction = " Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes."; + } + const peakMemoryMib = numberOrNull(input.peak_memory_mib); + const historicalNote = input.non_equivalence_note; + const note = `${webauthnDifference} Historical note verbatim: ${historicalNote}${correction}`; + return [{ + campaign_id: CAMPAIGN_ID, + semantic_profile: "webauthn_closest_analogue", + cell_id: id, + target, + device_model: input.device_model, + os_version: input.os_version, + abi: input.abi, + runtime: input.runtime as ParitySample["runtime"], + browser: input.browser, + stack, + frontend: input.frontend as ParitySample["frontend"], + prover_backend: input.prover_backend, + witness_backend: input.witness_backend, + sample_kind: input.sample_kind as ParitySample["sample_kind"], + sample_index: numberOrNull(input.sample_index), + status: input.status as ParitySample["status"], + prove_time_ms: numberOrNull(input.prover_time_ms), + proof_size_bytes: numberOrNull(input.proof_size_bytes), + proving_payload_size_bytes: provingPayload, + process_peak_memory_kib: peakMemoryMib == null ? null : peakMemoryMib * 1024, + valid_proof_accepted: true, + tampered_proof_rejected: true, + constraint_count: numberOrNull(input.constraint_count), + source_commits: JSON.stringify({ circuit_commit: input.circuit_commit, source_commit: input.source_commit }), + package_versions: input.package_versions, + artifact_hashes: input.artifact_hashes, + evidence_path: input.evidence_path, + evidence_sha256: historicalCsvSha256, + session_id: input.session_id, + failure_code: input.failure_code, + failure_detail: input.failure_detail, + semantic_equivalence_note: note, + }]; + }); +} + +export function validate(samples: ParitySample[], requireComplete = false) { + const ids = new Set(); + const byCell = new Map(); + for (const row of samples) { + if (!PROFILES.includes(row.semantic_profile) || !TARGETS.includes(row.target) || !STACKS.includes(row.stack)) throw new Error(`invalid enum in ${row.cell_id}`); + if (row.cell_id !== cellId(row.semantic_profile, row.target, row.stack)) throw new Error(`semantic profile/cell mismatch: ${row.cell_id}`); + if (row.runtime !== EXPECTED_RUNTIME[row.target]) throw new Error(`runtime separation violation: ${row.cell_id}`); + if (!row.semantic_equivalence_note) throw new Error(`${row.cell_id}: missing semantic-equivalence note`); + const key = `${row.cell_id}|${row.sample_kind}|${row.sample_index}`; + if (ids.has(key)) throw new Error(`duplicate logical sample: ${key}`); + ids.add(key); + if (row.status === "ok" && row.sample_kind === "measured") { + for (const field of ["prove_time_ms", "proof_size_bytes", "proving_payload_size_bytes", "process_peak_memory_kib"] as const) if (row[field] == null || row[field]! <= 0) throw new Error(`${row.cell_id}: blank/invalid ${field}`); + if (!row.valid_proof_accepted || !row.tampered_proof_rejected) throw new Error(`${row.cell_id}: correctness gate failed`); + } + if (row.sample_kind === "gap") { + if (row.status === "ok") throw new Error(`${row.cell_id}: gap cannot be ok`); + for (const field of ["prove_time_ms", "proof_size_bytes", "proving_payload_size_bytes", "process_peak_memory_kib"] as const) if (row[field] != null) throw new Error(`${row.cell_id}: gap metric ${field} must be blank`); + if (!row.failure_code || !row.failure_detail) throw new Error(`${row.cell_id}: gap requires structured failure evidence`); + } else if (row.status !== "ok") { + throw new Error(`${row.cell_id}: sampled row must have ok status`); + } + byCell.set(row.cell_id, [...(byCell.get(row.cell_id) ?? []), row]); + } + for (const [id, rows] of byCell) { + const ok = rows.filter((r) => r.status === "ok"); + if (ok.length && rows.some((r) => r.sample_kind === "gap")) { + throw new Error(`${id}: duplicate cell evidence mixes successful samples with a gap`); + } + if (ok.length && (ok.filter((r) => r.sample_kind === "warmup").length !== 1 || ok.filter((r) => r.sample_kind === "measured").length !== 5)) throw new Error(`${id}: requires 1+5 samples`); + if (!ok.length && (rows.length !== 1 || rows[0].sample_kind !== "gap")) throw new Error(`${id}: unavailable cell requires exactly one gap row`); + } + if (requireComplete) { + const missing = expectedCellIds().filter((id) => !byCell.has(id)); + if (missing.length) throw new Error(`missing ${missing.length} cells: ${missing.join(", ")}`); + } + return samples; +} + +function csvValue(value: unknown) { + if (value == null) return ""; + const text = typeof value === "boolean" ? String(value) : String(value); + return /[",\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text; +} + +export function toCsv(samples: ParitySample[]) { + const hardware: Record = { + mac_chrome: "macbook_m4", + iphone_se_2022: "iphone_se_2022", + motorola_e15: "motorola_e15", + }; + const circuit: Record = { + passport_p1: "passport", + oprf_o2: "oprf", + webauthn_closest_analogue: "webauthn", + }; + const rows = samples.map((row) => { + let commits: Record = {}; + try { commits = JSON.parse(row.source_commits); } catch { /* Preserve malformed provenance below. */ } + const legacy: Record<(typeof CSV_COLUMNS)[number], unknown> = { + campaign_id: row.campaign_id, + attempt_id: `${row.cell_id}__${row.sample_kind}__${row.sample_index ?? "gap"}`, + recorded_at_utc: "", + hardware: hardware[row.target], + device_model: row.device_model, + os_version: row.os_version, + abi: row.abi, + runtime: row.runtime, + browser: row.browser, + circuit: circuit[row.semantic_profile], + circuit_variant: row.semantic_profile, + circuit_commit: commits.circuit_commit ?? commits.self ?? commits.world_id_protocol ?? "", + prover: row.stack, + frontend: row.frontend, + prover_backend: row.prover_backend, + witness_backend: row.witness_backend, + sample_kind: row.sample_kind, + sample_index: row.sample_index, + status: row.status, + initialization_time_ms: null, + witness_time_ms: null, + prover_time_ms: row.prove_time_ms, + verify_time_ms: null, + total_time_ms: null, + peak_memory_mib: row.process_peak_memory_kib == null ? null : row.process_peak_memory_kib / 1024, + proof_size_bytes: row.proof_size_bytes, + circuit_size_bytes: row.proving_payload_size_bytes, + artifact_size_bytes: null, + bundle_size_bytes: null, + constraint_count: row.constraint_count, + artifact_version: "", + source_commit: commits.source_commit ?? commits.campaign ?? commits.provekit ?? "", + package_versions: row.package_versions, + artifact_hashes: row.artifact_hashes, + session_id: row.session_id, + non_equivalence_note: row.semantic_equivalence_note, + failure_code: row.failure_code, + failure_detail: row.failure_detail, + evidence_path: row.evidence_path, + }; + return CSV_COLUMNS.map((column) => csvValue(legacy[column])).join(","); + }); + return [CSV_COLUMNS.join(","), ...rows].join("\n") + "\n"; +} + +export async function exportCampaign(nativePaths: string[] = [], requireComplete = false) { + const manifest = await Bun.file(manifestPath).json() as Manifest; + if (manifest.campaign_id !== CAMPAIGN_ID || manifest.cells.length !== 27) throw new Error("manifest campaign/cell count drift"); + const actual = manifest.cells.map((cell) => cell.cell_id).sort(); + const expected = expectedCellIds().sort(); + if (JSON.stringify(actual) !== JSON.stringify(expected)) throw new Error("manifest matrix drift"); + const mac = (await Promise.all(manifest.cells.filter((c) => c.state === "qualified" && c.target === "mac_chrome").map(normalizeMac))).flat(); + const native = (await Promise.all(nativePaths.map((path) => normalizeNative(resolve(path), manifest)))).flat(); + const historicalWebAuthn = await normalizeHistoricalWebAuthn(manifest); + return validate([...mac, ...native, ...historicalWebAuthn], requireComplete); +} + +if (import.meta.main) { + const args = Bun.argv.slice(2); + const requireComplete = args.includes("--require-complete"); + const outputArg = args.find((arg) => arg.startsWith("--output=")); + const nativePaths = args.filter((arg) => !arg.startsWith("--")); + const output = resolve(outputArg?.slice("--output=".length) ?? resolve(import.meta.dir, "../legacy/semantic-parity/semantic-parity-samples.csv")); + const rows = await exportCampaign(nativePaths, requireComplete); + await Bun.write(output, toCsv(rows)); + const successfulCells = new Set(rows.filter((row) => row.status === "ok").map((row) => row.cell_id)); + const gapCells = new Set(rows.filter((row) => row.sample_kind === "gap").map((row) => row.cell_id)); + console.log(JSON.stringify({ + output, + rows: rows.length, + cells: new Set(rows.map((r) => r.cell_id)).size, + successful_cells: successfulCells.size, + gap_cells: gapCells.size, + require_complete: requireComplete, + }, null, 2)); +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/manifest.json b/benchmarks/v1/legacy/semantic-parity-data/manifest.json new file mode 100644 index 000000000..f25139c2f --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/manifest.json @@ -0,0 +1,557 @@ +{ + "schema_version": 2, + "campaign_id": "semantic-parity-v1-20260731", + "contract": { + "profiles": [ + "passport_p1", + "oprf_o2", + "webauthn_closest_analogue" + ], + "targets": [ + "mac_chrome", + "iphone_se_2022", + "motorola_e15" + ], + "stacks": [ + "provekit_v1", + "noir_barretenberg", + "circom_groth16" + ], + "expected_cells": 27, + "sampling": { + "warmup": 1, + "measured": 5, + "sequential": true + }, + "correctness": { + "valid_proof_accepted": true, + "tampered_proof_rejected": true + }, + "headline_metrics": [ + "prove_time_ms", + "proof_size_bytes", + "proving_payload_size_bytes", + "process_peak_memory_kib" + ], + "payload_definition": "Deduplicated bytes required to create a proof: proving circuit plus frozen input, and backend proving parameters/CRS. Verifier-only artifacts, application packages, and transport duplication are excluded." + }, + "semantic_profiles": { + "passport_p1": { + "definition": "Matched monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity and asserted minimum-age proof.", + "circom_source_commit": "7de99e9e001d06797c9770684afea20f096d1ac3", + "self_fixture_commit": "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e" + }, + "oprf_o2": { + "definition": "Matched World ID Protocol nullifier statement and frozen witness, including the identical public nullifier.", + "world_id_protocol_commit": "85aeeef539961cae5a63de794997b507a5975717", + "noir_taceo_compat_commit": "7831dca615db55147c60f49415af6e86730df090", + "expected_nullifier_hex": "0x2f2fa0f2ad10720be5239755275c46b362fb90cfc5bccbdd8f889a8aadda0d8d" + }, + "webauthn_closest_analogue": { + "definition": "Historical closest available counterparts, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings.", + "source": "benchmarks/v1/legacy/data/benchmark-samples.csv", + "source_sha256": "474cb49d528862da3a029967f63fdee1875339b7c3da5f7599f2aded40d57d60" + } + }, + "cells": [ + { + "cell_id": "passport_p1__mac_chrome__provekit_v1", + "profile": "passport_p1", + "target": "mac_chrome", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/mac/passport.json", + "evidence_sha256": "46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd", + "payload": [ + { + "name": "passport_p1.pkp", + "bytes": 2283056, + "sha256": "7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7" + }, + { + "name": "passport_p1.inputs.json", + "bytes": 30683, + "sha256": "6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450" + } + ], + "provenance": { + "evidence_sha256": "46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd", + "session_id": "", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "passport_p1__mac_chrome__noir_barretenberg", + "profile": "passport_p1", + "target": "mac_chrome", + "stack": "noir_barretenberg", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json", + "evidence_sha256": "55146fe20fe3edc1887b6cc7a8fb5803c1f571b41568351380e1648b080a9fb7", + "payload": [ + { + "path": "benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json", + "bytes": 3260936, + "sha256": "357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34" + }, + { + "path": "benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json", + "bytes": 30675, + "sha256": "243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a" + }, + { + "name": "https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927", + "bytes": 67108928, + "sha256": "0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5" + }, + { + "name": "https://crs.aztec-cdn.foundation/g2.dat", + "bytes": 128, + "sha256": "01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f" + }, + { + "name": "https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367", + "bytes": 4194368, + "sha256": "8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870" + } + ] + }, + { + "cell_id": "passport_p1__mac_chrome__circom_groth16", + "profile": "passport_p1", + "target": "mac_chrome", + "stack": "circom_groth16", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json", + "evidence_sha256": "9b2a0b7e1e621531d6a8c3750d07f6e775ee30c02eb7971db39aff2e5a384264", + "payload": [ + { + "path": "target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm", + "bytes": 10089991, + "sha256": "322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f" + }, + { + "path": "target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey", + "bytes": 498212512, + "sha256": "75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c" + }, + { + "path": "target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json", + "bytes": 30424, + "sha256": "8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758" + } + ] + }, + { + "cell_id": "oprf_o2__mac_chrome__provekit_v1", + "profile": "oprf_o2", + "target": "mac_chrome", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/mac/oprf.json", + "evidence_sha256": "33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14", + "payload": [ + { + "name": "oprf_world_id_nullifier.pkp", + "bytes": 1638340, + "sha256": "e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af" + }, + { + "name": "oprf_world_id_nullifier.inputs.json", + "bytes": 6295, + "sha256": "4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad" + } + ], + "provenance": { + "evidence_sha256": "33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14", + "session_id": "", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "oprf_o2__mac_chrome__noir_barretenberg", + "profile": "oprf_o2", + "target": "mac_chrome", + "stack": "noir_barretenberg", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json", + "evidence_sha256": "32dd1a99e8c3d09d3ecbb7d8d25cc4bf317eafaf2eeba18187125e27188e0620", + "payload": [ + { + "path": "benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json", + "bytes": 2615487, + "sha256": "cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad" + }, + { + "path": "benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json", + "bytes": 6295, + "sha256": "4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad" + }, + { + "name": "https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927", + "bytes": 67108928, + "sha256": "0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5" + }, + { + "name": "https://crs.aztec-cdn.foundation/g2.dat", + "bytes": 128, + "sha256": "01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f" + }, + { + "name": "https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367", + "bytes": 4194368, + "sha256": "8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870" + } + ] + }, + { + "cell_id": "oprf_o2__mac_chrome__circom_groth16", + "profile": "oprf_o2", + "target": "mac_chrome", + "stack": "circom_groth16", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json", + "evidence_sha256": "d05057da686031712bee068b2d5b34c824e25b1b73b19e7b2a99c29063553b39", + "payload": [ + { + "path": "benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm", + "bytes": 918505, + "sha256": "f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909" + }, + { + "path": "benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey", + "bytes": 38279392, + "sha256": "5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc" + }, + { + "path": "benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json", + "bytes": 5610, + "sha256": "662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40" + } + ] + }, + { + "cell_id": "passport_p1__iphone_se_2022__provekit_v1", + "profile": "passport_p1", + "target": "iphone_se_2022", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/ios/summary.json", + "evidence_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "payload": [ + { + "name": "complete_age_check.pkp+frozen-input", + "bytes": 2307676, + "sha256": "01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526" + }, + { + "name": "complete_age_check.Prover.toml", + "bytes": 247039, + "sha256": "dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1" + } + ], + "provenance": { + "evidence_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "session_id": "5d9449e718692b36c4efa7c6609a6ba6d6a38eec", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "passport_p1__iphone_se_2022__noir_barretenberg", + "profile": "passport_p1", + "target": "iphone_se_2022", + "stack": "noir_barretenberg", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json", + "evidence_sha256": "c23af12b98fcf599742beeefb057dea3f0967a724f2e2797469106c387847899" + }, + { + "cell_id": "passport_p1__iphone_se_2022__circom_groth16", + "profile": "passport_p1", + "target": "iphone_se_2022", + "stack": "circom_groth16", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json", + "evidence_sha256": "88b26ae5181dad955f78dd724a40fd694507f80dbe2dad82f048e5c92d2d29f0" + }, + { + "cell_id": "passport_p1__motorola_e15__provekit_v1", + "profile": "passport_p1", + "target": "motorola_e15", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/e15/passport.json", + "evidence_sha256": "42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484", + "payload": [ + { + "name": "complete_age_check.pkp+frozen-input", + "bytes": 2299488, + "sha256": "01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526" + }, + { + "name": "complete_age_check.Prover.toml", + "bytes": 247039, + "sha256": "dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1" + } + ], + "provenance": { + "evidence_sha256": "42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484", + "session_id": "", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "passport_p1__motorola_e15__noir_barretenberg", + "profile": "passport_p1", + "target": "motorola_e15", + "stack": "noir_barretenberg", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json", + "evidence_sha256": "abaf4563625e6aa3c4aaf4d8479798fbbd6deda8a8a3a0a5d56aaf51bbe9e245" + }, + { + "cell_id": "passport_p1__motorola_e15__circom_groth16", + "profile": "passport_p1", + "target": "motorola_e15", + "stack": "circom_groth16", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json", + "evidence_sha256": "159e4a6007fc7c179a53d4e369aaa603733853ab0c3c8b47f82fa8d9b1b82231" + }, + { + "cell_id": "oprf_o2__iphone_se_2022__provekit_v1", + "profile": "oprf_o2", + "target": "iphone_se_2022", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/ios/summary.json", + "evidence_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "payload": [ + { + "name": "oprf.pkp+frozen-input", + "bytes": 1638340, + "sha256": "0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c" + }, + { + "name": "oprf.Prover.toml", + "bytes": 5853, + "sha256": "afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797" + } + ], + "provenance": { + "evidence_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "session_id": "6eca64c91564a0b36a0edc10d78e76dfde9780e0", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "oprf_o2__iphone_se_2022__noir_barretenberg", + "profile": "oprf_o2", + "target": "iphone_se_2022", + "stack": "noir_barretenberg", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json", + "evidence_sha256": "8580c5e6644ef865375b3db4686fec083da4fccd1f341333e17da67afcb70746" + }, + { + "cell_id": "oprf_o2__iphone_se_2022__circom_groth16", + "profile": "oprf_o2", + "target": "iphone_se_2022", + "stack": "circom_groth16", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json", + "evidence_sha256": "0e4e9e61067888ba86bfaf2969e6b88b02c9f0cd6ab67a8f35647a4ccea5f43a" + }, + { + "cell_id": "oprf_o2__motorola_e15__provekit_v1", + "profile": "oprf_o2", + "target": "motorola_e15", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/e15/oprf.json", + "evidence_sha256": "bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0", + "payload": [ + { + "name": "oprf.pkp+frozen-input", + "bytes": 1638340, + "sha256": "0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c" + }, + { + "name": "oprf.Prover.toml", + "bytes": 5853, + "sha256": "afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797" + } + ], + "provenance": { + "evidence_sha256": "bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0", + "session_id": "", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "oprf_o2__motorola_e15__noir_barretenberg", + "profile": "oprf_o2", + "target": "motorola_e15", + "stack": "noir_barretenberg", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json", + "evidence_sha256": "5e2cbcf4519bfd1e91ae22e142c9e554421157505c76688e8bfa4d038883227b" + }, + { + "cell_id": "oprf_o2__motorola_e15__circom_groth16", + "profile": "oprf_o2", + "target": "motorola_e15", + "stack": "circom_groth16", + "state": "qualified", + "evidence": "target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json", + "evidence_sha256": "4487c4ce7d5d50c1534ff373080bc205599f8bd8f2909e8852f9d6ba6eef1bd7" + }, + { + "cell_id": "webauthn_closest_analogue__mac_chrome__provekit_v1", + "profile": "webauthn_closest_analogue", + "target": "mac_chrome", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/mac/webauthn.json", + "evidence_sha256": "183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2", + "payload": [ + { + "name": "webauthn_assertion.pkp", + "bytes": 2278684, + "sha256": "0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f" + }, + { + "name": "webauthn_assertion.inputs.json", + "bytes": 7831, + "sha256": "aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc" + } + ], + "provenance": { + "evidence_sha256": "183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2", + "session_id": "", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "webauthn_closest_analogue__mac_chrome__noir_barretenberg", + "profile": "webauthn_closest_analogue", + "target": "mac_chrome", + "stack": "noir_barretenberg", + "state": "historical_frozen" + }, + { + "cell_id": "webauthn_closest_analogue__mac_chrome__circom_groth16", + "profile": "webauthn_closest_analogue", + "target": "mac_chrome", + "stack": "circom_groth16", + "state": "historical_frozen" + }, + { + "cell_id": "webauthn_closest_analogue__iphone_se_2022__provekit_v1", + "profile": "webauthn_closest_analogue", + "target": "iphone_se_2022", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/ios/summary.json", + "evidence_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "payload": [ + { + "name": "webauthn_assertion.pkp+frozen-input", + "bytes": 2361340, + "sha256": "f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1" + }, + { + "name": "webauthn_assertion.Prover.toml", + "bytes": 49220, + "sha256": "aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd" + } + ], + "provenance": { + "evidence_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "session_id": "9e03602c537f1b3e84d3672fc3a36bbeb8cbca41", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "webauthn_closest_analogue__iphone_se_2022__noir_barretenberg", + "profile": "webauthn_closest_analogue", + "target": "iphone_se_2022", + "stack": "noir_barretenberg", + "state": "historical_frozen" + }, + { + "cell_id": "webauthn_closest_analogue__iphone_se_2022__circom_groth16", + "profile": "webauthn_closest_analogue", + "target": "iphone_se_2022", + "stack": "circom_groth16", + "state": "historical_frozen" + }, + { + "cell_id": "webauthn_closest_analogue__motorola_e15__provekit_v1", + "profile": "webauthn_closest_analogue", + "target": "motorola_e15", + "stack": "provekit_v1", + "state": "qualified", + "evidence": "evidence/provekit-v1/e15/webauthn.json", + "evidence_sha256": "c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f", + "payload": [ + { + "name": "webauthn_assertion.pkp+frozen-input", + "bytes": 2327836, + "sha256": "f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1" + }, + { + "name": "webauthn_assertion.Prover.toml", + "bytes": 49220, + "sha256": "aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd" + } + ], + "provenance": { + "evidence_sha256": "c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f", + "session_id": "", + "payload_scope": "PKP/prover plus frozen proving input; no IPA/APK/transport bytes" + } + }, + { + "cell_id": "webauthn_closest_analogue__motorola_e15__noir_barretenberg", + "profile": "webauthn_closest_analogue", + "target": "motorola_e15", + "stack": "noir_barretenberg", + "state": "historical_frozen" + }, + { + "cell_id": "webauthn_closest_analogue__motorola_e15__circom_groth16", + "profile": "webauthn_closest_analogue", + "target": "motorola_e15", + "stack": "circom_groth16", + "state": "historical_frozen" + } + ], + "provekit_v1": { + "core_commit": "9b2a6f37c67691eab4b0cec6c35e35c520e93285", + "campaign_harness_commit": "7de99e9e001d06797c9770684afea20f096d1ac3", + "noir_version": "1.0.0-beta.11", + "browser_backend": "tooling/provekit-wasm single-thread build", + "browser_sdk_package": "not used for publication measurements", + "proof_serialization": { + "browser": "V1 WASM proof byte serialization", + "native": "postcard NoirProof (.np) byte serialization" + }, + "native_devices": { + "iphone": { + "device": "iPhone SE 2022-15", + "builds": { + "passport": "5d9449e718692b36c4efa7c6609a6ba6d6a38eec", + "webauthn": "9e03602c537f1b3e84d3672fc3a36bbeb8cbca41", + "oprf": "6eca64c91564a0b36a0edc10d78e76dfde9780e0" + } + }, + "e15": { + "serial": "ZY32M6782K", + "os": "Android 14", + "abi": "armeabi-v7a,armeabi", + "zygote": "zygote32" + } + } + } +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/native-evidence.schema.json b/benchmarks/v1/legacy/semantic-parity-data/native-evidence.schema.json new file mode 100644 index 000000000..ae604c448 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/native-evidence.schema.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Semantic parity native benchmark evidence", + "type": "object", + "required": ["schema_version", "campaign_id", "semantic_profile", "target", "stack", "device", "runtime", "frontend", "prover_backend", "witness_backend", "source_commits", "package_versions", "artifact_hashes", "proving_payload_size_bytes", "process_peak_memory_kib", "valid_proof_accepted", "tampered_proof_rejected", "session_id"], + "properties": { + "schema_version": {"const": 1}, + "campaign_id": {"const": "semantic-parity-v1-20260731"}, + "semantic_profile": {"enum": ["passport_p1", "oprf_o2", "webauthn_closest_analogue"]}, + "target": {"enum": ["iphone_se_2022", "motorola_e15"]}, + "stack": {"enum": ["provekit_v1", "noir_barretenberg", "circom_groth16"]}, + "device": {"type": "object", "required": ["model", "os_version", "abi"], "properties": {"model":{"type":"string","minLength":1},"os_version":{"type":"string","minLength":1},"abi":{"type":"string","minLength":1}}, "additionalProperties": false}, + "runtime": {"enum": ["ios_native", "android_native"]}, + "browser": {"type": "string"}, + "frontend": {"enum": ["noir", "circom"]}, + "prover_backend": {"type":"string","minLength":1}, + "witness_backend": {"type":"string"}, + "source_commits": {"type":"object","additionalProperties":{"type":"string","minLength":1}}, + "package_versions": {"type":"object","additionalProperties":{"type":"string","minLength":1}}, + "artifact_hashes": {"type":"object","additionalProperties":{"type":"string","pattern":"^[0-9a-f]{64}$"}}, + "proving_payload_size_bytes": {"type":["integer","null"],"minimum":1}, + "process_peak_memory_kib": {"type":["integer","null"],"minimum":1}, + "constraint_count": {"type":["integer","null"],"minimum":1}, + "valid_proof_accepted": {"type":["boolean","null"]}, + "tampered_proof_rejected": {"type":["boolean","null"]}, + "session_id": {"type":"string"}, + "samples": {"type":"array","minItems":6,"maxItems":6,"items":{"type":"object","required":["warmup","sample_index","status","prove_time_ms","proof_size_bytes"],"properties":{"warmup":{"type":"boolean"},"sample_index":{"type":"integer","minimum":0,"maximum":4},"status":{"const":"ok"},"prove_time_ms":{"type":["number","null"],"exclusiveMinimum":0},"proof_size_bytes":{"type":"integer","minimum":1}},"additionalProperties":false}}, + "gap": {"type":"object","required":["status","failure_code","failure_detail","prove_time_ms","proof_size_bytes"],"properties":{"status":{"enum":["unsupported","build_failed","crashed","timed_out","zero_samples"]},"failure_code":{"type":"string","minLength":1},"failure_detail":{"type":"string","minLength":1},"prove_time_ms":{"type":"null"},"proof_size_bytes":{"type":"null"}},"additionalProperties":false} + }, + "oneOf": [ + { + "required": ["samples"], + "not": {"required": ["gap"]}, + "properties": { + "proving_payload_size_bytes": {"type":"integer","minimum":1}, + "process_peak_memory_kib": {"type":"integer","minimum":1}, + "valid_proof_accepted": {"const":true}, + "tampered_proof_rejected": {"const":true} + } + }, + { + "required": ["gap"], + "not": {"required": ["samples"]}, + "properties": { + "proving_payload_size_bytes": {"type":"null"}, + "process_peak_memory_kib": {"type":"null"}, + "valid_proof_accepted": {"type":"null"}, + "tampered_proof_rejected": {"type":"null"} + } + } + ], + "additionalProperties": false +} diff --git a/benchmarks/v1/legacy/semantic-parity-data/schema.ts b/benchmarks/v1/legacy/semantic-parity-data/schema.ts new file mode 100644 index 000000000..dc9a811a3 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity-data/schema.ts @@ -0,0 +1,72 @@ +export const CAMPAIGN_ID = "semantic-parity-v1-20260731"; + +export const PROFILES = ["passport_p1", "oprf_o2", "webauthn_closest_analogue"] as const; +export const TARGETS = ["mac_chrome", "iphone_se_2022", "motorola_e15"] as const; +export const STACKS = ["provekit_v1", "noir_barretenberg", "circom_groth16"] as const; +export const RUNTIMES = ["browser_wasm", "ios_native", "android_native"] as const; +export const STATUSES = ["ok", "unsupported", "build_failed", "crashed", "runtime_failed", "timed_out", "zero_samples", "not_run"] as const; + +export type Profile = (typeof PROFILES)[number]; +export type Target = (typeof TARGETS)[number]; +export type Stack = (typeof STACKS)[number]; +export type Runtime = (typeof RUNTIMES)[number]; +export type Status = (typeof STATUSES)[number]; + +export const EXPECTED_RUNTIME: Record = { + mac_chrome: "browser_wasm", + iphone_se_2022: "ios_native", + motorola_e15: "android_native", +}; + +export const CSV_COLUMNS = [ + "campaign_id", "attempt_id", "recorded_at_utc", "hardware", "device_model", "os_version", "abi", + "runtime", "browser", "circuit", "circuit_variant", "circuit_commit", "prover", "frontend", + "prover_backend", "witness_backend", "sample_kind", "sample_index", "status", + "initialization_time_ms", "witness_time_ms", "prover_time_ms", "verify_time_ms", "total_time_ms", + "peak_memory_mib", "proof_size_bytes", "circuit_size_bytes", "artifact_size_bytes", + "bundle_size_bytes", "constraint_count", "artifact_version", "source_commit", "package_versions", + "artifact_hashes", "session_id", "non_equivalence_note", "failure_code", "failure_detail", "evidence_path", +] as const; + +export interface ParitySample { + campaign_id: string; + semantic_profile: Profile; + cell_id: string; + target: Target; + device_model: string; + os_version: string; + abi: string; + runtime: Runtime; + browser: string; + stack: Stack; + frontend: "noir" | "circom"; + prover_backend: string; + witness_backend: string; + sample_kind: "warmup" | "measured" | "gap"; + sample_index: number | null; + status: Status; + prove_time_ms: number | null; + proof_size_bytes: number | null; + proving_payload_size_bytes: number | null; + process_peak_memory_kib: number | null; + valid_proof_accepted: boolean | null; + tampered_proof_rejected: boolean | null; + constraint_count: number | null; + source_commits: string; + package_versions: string; + artifact_hashes: string; + evidence_path: string; + evidence_sha256: string; + session_id: string; + failure_code: string; + failure_detail: string; + semantic_equivalence_note: string; +} + +export function cellId(profile: Profile, target: Target, stack: Stack) { + return `${profile}__${target}__${stack}`; +} + +export function expectedCellIds() { + return PROFILES.flatMap((profile) => TARGETS.flatMap((target) => STACKS.map((stack) => cellId(profile, target, stack)))); +} diff --git a/benchmarks/v1/legacy/semantic-parity/semantic-parity-samples.csv b/benchmarks/v1/legacy/semantic-parity/semantic-parity-samples.csv new file mode 100644 index 000000000..b183bcd63 --- /dev/null +++ b/benchmarks/v1/legacy/semantic-parity/semantic-parity-samples.csv @@ -0,0 +1,163 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__circom_groth16__measured__1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,1,ok,,,576.381208,,576.381208,103.90625,1602,40639660,40639660,40639660,52849,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",9af7c1468ae9b8890d94cc27770e84ddb471082f,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__circom_groth16__measured__2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,2,ok,,,580.024625,,580.024625,103.90625,1601,40639660,40639660,40639660,52849,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",9af7c1468ae9b8890d94cc27770e84ddb471082f,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__circom_groth16__measured__3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,3,ok,,,586.212042,,586.212042,103.90625,1600,40639660,40639660,40639660,52849,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",9af7c1468ae9b8890d94cc27770e84ddb471082f,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__circom_groth16__measured__4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,4,ok,,,589.628292,,589.628292,103.90625,1603,40639660,40639660,40639660,52849,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",9af7c1468ae9b8890d94cc27770e84ddb471082f,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__circom_groth16__measured__5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,5,ok,,,612.6925,,612.6925,103.90625,1602,40639660,40639660,40639660,52849,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",9af7c1468ae9b8890d94cc27770e84ddb471082f,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__circom_groth16__warmup__0,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,warmup,0,ok,,,582.119125,,582.119125,103.90625,1603,40639660,40639660,40639660,52849,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",9af7c1468ae9b8890d94cc27770e84ddb471082f,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/circom.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,1,ok,,,2485.467042,,2485.467042,379.640625,16548,12983421,12983421,12983421,95921,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",d4963ddaa73de1771a741b752ec6bc6bc5fc26a2,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,2,ok,,,2510.258958,,2510.258958,379.640625,16548,12983421,12983421,12983421,95921,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",d4963ddaa73de1771a741b752ec6bc6bc5fc26a2,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,3,ok,,,2622.3125,,2622.3125,379.640625,16548,12983421,12983421,12983421,95921,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",d4963ddaa73de1771a741b752ec6bc6bc5fc26a2,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,4,ok,,,2616.610875,,2616.610875,379.640625,16548,12983421,12983421,12983421,95921,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",d4963ddaa73de1771a741b752ec6bc6bc5fc26a2,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,5,ok,,,2537.091875,,2537.091875,379.640625,16548,12983421,12983421,12983421,95921,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",d4963ddaa73de1771a741b752ec6bc6bc5fc26a2,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,warmup,0,ok,,,2577.418792,,2577.418792,379.640625,16548,12983421,12983421,12983421,95921,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",d4963ddaa73de1771a741b752ec6bc6bc5fc26a2,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/oprf-o2/iphone-native/barretenberg.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__provekit_v1__sample-1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,1,ok,,,1112.275291,,1112.6385,143.625,634068,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",6eca64c91564a0b36a0edc10d78e76dfde9780e0,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__provekit_v1__sample-2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,2,ok,,,1218.798,,1219.184833,143.84375,635444,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",6eca64c91564a0b36a0edc10d78e76dfde9780e0,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__provekit_v1__sample-3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,3,ok,,,1223.253625,,1223.628875,145.203125,632724,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",6eca64c91564a0b36a0edc10d78e76dfde9780e0,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__provekit_v1__sample-4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,4,ok,,,1212.871458,,1213.565875,144.609375,630453,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",6eca64c91564a0b36a0edc10d78e76dfde9780e0,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__provekit_v1__sample-5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,5,ok,,,1217.698208,,1218.0665,144.640625,635188,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",6eca64c91564a0b36a0edc10d78e76dfde9780e0,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,oprf_o2__iphone_se_2022__provekit_v1__warmup,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",6eca64c91564a0b36a0edc10d78e76dfde9780e0,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__circom_groth16__measured__1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,1,ok,,,7692.594417,,7692.594417,282.53125,926,529101612,529101612,529101612,978536,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""verification_key"":""f1252c845de81b5d55d11be8abb82a4b1e7d158d5bc61bfdc935c75559fa8e7f""}",9d83f7fd048bc0990a3f06fac1aeabf257644564,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__circom_groth16__measured__2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,2,ok,,,7849.023875,,7849.023875,282.53125,927,529101612,529101612,529101612,978536,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""verification_key"":""f1252c845de81b5d55d11be8abb82a4b1e7d158d5bc61bfdc935c75559fa8e7f""}",9d83f7fd048bc0990a3f06fac1aeabf257644564,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__circom_groth16__measured__3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,3,ok,,,8012.584459,,8012.584459,282.53125,930,529101612,529101612,529101612,978536,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""verification_key"":""f1252c845de81b5d55d11be8abb82a4b1e7d158d5bc61bfdc935c75559fa8e7f""}",9d83f7fd048bc0990a3f06fac1aeabf257644564,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__circom_groth16__measured__4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,4,ok,,,8094.65275,,8094.65275,282.53125,932,529101612,529101612,529101612,978536,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""verification_key"":""f1252c845de81b5d55d11be8abb82a4b1e7d158d5bc61bfdc935c75559fa8e7f""}",9d83f7fd048bc0990a3f06fac1aeabf257644564,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__circom_groth16__measured__5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,measured,5,ok,,,8174.924208,,8174.924208,282.53125,928,529101612,529101612,529101612,978536,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""verification_key"":""f1252c845de81b5d55d11be8abb82a4b1e7d158d5bc61bfdc935c75559fa8e7f""}",9d83f7fd048bc0990a3f06fac1aeabf257644564,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__circom_groth16__warmup__0,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,rapidsnark-0.1.4,frozen-wtns,warmup,0,ok,,,7649.340292,,7649.340292,282.53125,926,529101612,529101612,529101612,978536,legacy-unpinned,legacy-unpinned,"{""rust-rapidsnark"":""0.1.4"",""mobench"":""0.1.48""}","{""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""verification_key"":""f1252c845de81b5d55d11be8abb82a4b1e7d158d5bc61bfdc935c75559fa8e7f""}",9d83f7fd048bc0990a3f06fac1aeabf257644564,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/circom.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,1,ok,,,4054.534166,,4054.534166,506.671875,16324,20480588,20480588,20480588,253998,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",f2a9ea536b1689a63a44fb9a4eb95be4982324f8,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,2,ok,,,4204.478542,,4204.478542,506.671875,16324,20480588,20480588,20480588,253998,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",f2a9ea536b1689a63a44fb9a4eb95be4982324f8,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,3,ok,,,3851.353417,,3851.353417,506.671875,16324,20480588,20480588,20480588,253998,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",f2a9ea536b1689a63a44fb9a4eb95be4982324f8,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,4,ok,,,4109.933875,,4109.933875,506.671875,16324,20480588,20480588,20480588,253998,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",f2a9ea536b1689a63a44fb9a4eb95be4982324f8,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,measured,5,ok,,,4143.119833,,4143.119833,506.671875,16324,20480588,20480588,20480588,253998,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",f2a9ea536b1689a63a44fb9a4eb95be4982324f8,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,15,arm64,ios_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,frozen-noir-witness-stack,warmup,0,ok,,,3964.22225,,3964.22225,506.671875,16324,20480588,20480588,20480588,253998,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""mobench"":""0.1.48""}","{""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726"",""srs_artifact"":""3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5"",""native_library"":""74f871aa8e77957c480862bc13cb5d7c6b83b0bd7651e3bf9da18f3b446a05db""}",f2a9ea536b1689a63a44fb9a4eb95be4982324f8,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/passport-p1/iphone-native/barretenberg.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__provekit_v1__sample-1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,1,ok,,,2261.19725,,2262.063083,535.3125,715446,2554715,2554715,2554715,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",5d9449e718692b36c4efa7c6609a6ba6d6a38eec,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__provekit_v1__sample-2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,2,ok,,,3101.5075,,3102.353,542.390625,719255,2554715,2554715,2554715,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",5d9449e718692b36c4efa7c6609a6ba6d6a38eec,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__provekit_v1__sample-3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,3,ok,,,2474.173625,,2475.108292,548.796875,712832,2554715,2554715,2554715,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",5d9449e718692b36c4efa7c6609a6ba6d6a38eec,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__provekit_v1__sample-4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,4,ok,,,2279.506833,,2280.336958,550.03125,715102,2554715,2554715,2554715,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",5d9449e718692b36c4efa7c6609a6ba6d6a38eec,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__provekit_v1__sample-5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,5,ok,,,2384.363916,,2385.298625,559.34375,714697,2554715,2554715,2554715,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",5d9449e718692b36c4efa7c6609a6ba6d6a38eec,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,passport_p1__iphone_se_2022__provekit_v1__warmup,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,2554715,2554715,2554715,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",5d9449e718692b36c4efa7c6609a6ba6d6a38eec,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__circom_groth16__measured__1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,36998.1695,,36998.1695,845.3125,1002,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__circom_groth16__measured__2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,39245.250417,,39245.250417,845,1006,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__circom_groth16__measured__3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,38393.932667,,38393.932667,844.40625,1001,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__circom_groth16__measured__4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,38679.03925,,38679.03925,844.8125,1000,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__circom_groth16__measured__5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,38943.579333,,38943.579333,848.21875,1002,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warmup__0,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-single-thread,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""rapidsnark_threads"":1}",{},9fe5b442db9319cae7010b9e89c95610685e4a6e,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Circuit/proving payload size is an asset-size estimate: zkey plus frozen WTNS; IPA and app package sizes are excluded. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,1,ok,,,4044.97525,,4044.97525,667.375,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,2,ok,,,4019.74825,,4019.74825,667.34375,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,3,ok,,,4102.73925,,4102.73925,675.375,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,4,ok,,,4060.3015,,4060.3015,675.375,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,measured,5,ok,,,4099.76075,,4099.76075,675.375,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15.4,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native,,warmup,0,ok,,,,,,,,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2""}",{},66e15d58d1543b741abe8dac268908c80d49bc76,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/provekit-v1-cross-device-20260730/native-ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__provekit_v1__sample-1,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,1,ok,,,2973.014,,2973.894333,565.25,714467,2410560,2410560,2410560,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",9e03602c537f1b3e84d3672fc3a36bbeb8cbca41,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__provekit_v1__sample-2,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,2,ok,,,3031.699041,,3032.569667,571.359375,715888,2410560,2410560,2410560,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",9e03602c537f1b3e84d3672fc3a36bbeb8cbca41,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__provekit_v1__sample-3,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,3,ok,,,3182.688209,,3183.65125,577.515625,714756,2410560,2410560,2410560,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",9e03602c537f1b3e84d3672fc3a36bbeb8cbca41,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__provekit_v1__sample-4,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,4,ok,,,3183.604625,,3184.567375,583.953125,715336,2410560,2410560,2410560,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",9e03602c537f1b3e84d3672fc3a36bbeb8cbca41,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__provekit_v1__sample-5,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,5,ok,,,3228.687125,,3229.705459,583.0625,712911,2410560,2410560,2410560,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",9e03602c537f1b3e84d3672fc3a36bbeb8cbca41,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warmup,2026-07-31T00:00:00Z,iphone_se_2022,iPhone SE 2022,iOS 15,arm64,ios_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,2410560,2410560,2410560,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",9e03602c537f1b3e84d3672fc3a36bbeb8cbca41,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/ios/summary.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__circom_groth16__measured__1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,1,ok,,,1543.6,,1543.6,3096.328125,724,39203507,39203507,39203507,,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__circom_groth16__measured__2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,2,ok,,,1500.3,,1500.3,3096.328125,725,39203507,39203507,39203507,,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__circom_groth16__measured__3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,3,ok,,,1647.5,,1647.5,3096.328125,720,39203507,39203507,39203507,,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__circom_groth16__measured__4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,4,ok,,,1676.6,,1676.6,3096.328125,724,39203507,39203507,39203507,,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__circom_groth16__measured__5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,5,ok,,,1631.4,,1631.4,3096.328125,720,39203507,39203507,39203507,,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__circom_groth16__warmup__0,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,warmup,0,ok,,,1526.7,,1526.7,3096.328125,725,39203507,39203507,39203507,,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.wasm"":""f13e21ad5a14462a7ccd9d30c845d551e1eac3cc0346676aa674c792bb91e909"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.input.json"":""662a0242fd4a36ad71d565a51d5ecc4e70b764fd884d41902911e30a85764d40""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,1,ok,,,6199.425,,6199.425,909.375,16000,73925206,73925206,73925206,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,2,ok,,,6192.015,,6192.015,909.375,16000,73925206,73925206,73925206,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,3,ok,,,6444.655,,6444.655,909.375,16000,73925206,73925206,73925206,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,4,ok,,,6202.345,,6202.345,909.375,16000,73925206,73925206,73925206,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,5,ok,,,6180.015,,6180.015,909.375,16000,73925206,73925206,73925206,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,warmup,0,ok,,,6197.365,,6197.365,909.375,16000,73925206,73925206,73925206,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/circuit.json"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""benchmarks/v1/barretenberg/web/dist/assets/oprf_world_id_nullifier/inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/oprf-o2/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__provekit_v1__sample-1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,1,ok,,,2697.0049999952316,,3277.264999985695,702.65625,849742,1644635,1644635,1644635,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14"",""payload"":{""oprf_world_id_nullifier.pkp"":""e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af"",""oprf_world_id_nullifier.inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/oprf.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__provekit_v1__sample-2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,2,ok,,,2698.9199999570847,,3274.314999938011,702.65625,844238,1644635,1644635,1644635,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14"",""payload"":{""oprf_world_id_nullifier.pkp"":""e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af"",""oprf_world_id_nullifier.inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/oprf.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__provekit_v1__sample-3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,3,ok,,,2718.515000104904,,3214.899999976158,702.65625,842786,1644635,1644635,1644635,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14"",""payload"":{""oprf_world_id_nullifier.pkp"":""e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af"",""oprf_world_id_nullifier.inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/oprf.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__provekit_v1__sample-4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,4,ok,,,2734.7300000190735,,3325.064999938011,702.65625,846326,1644635,1644635,1644635,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14"",""payload"":{""oprf_world_id_nullifier.pkp"":""e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af"",""oprf_world_id_nullifier.inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/oprf.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__provekit_v1__sample-5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,5,ok,,,2693.179999947548,,3275.6299999952316,702.65625,847310,1644635,1644635,1644635,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14"",""payload"":{""oprf_world_id_nullifier.pkp"":""e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af"",""oprf_world_id_nullifier.inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/oprf.json +semantic-parity-v1-20260731,oprf_o2__mac_chrome__provekit_v1__warmup,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,1644635,1644635,1644635,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14"",""payload"":{""oprf_world_id_nullifier.pkp"":""e9baca10698248ae6a4c718b0fb615e95fd13f1f66d5c23c751fc7f8f94cd2af"",""oprf_world_id_nullifier.inputs.json"":""4b295901ff20681cf7719442f281e16774950673e2fb849e22fad5d50ff4e8ad""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/oprf.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__circom_groth16__measured__1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,1,ok,,,40866.3,,40866.3,6142.953125,723,508332927,508332927,508332927,978536,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm"":""322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json"":""8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__circom_groth16__measured__2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,2,ok,,,40806.4,,40806.4,6142.953125,722,508332927,508332927,508332927,978536,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm"":""322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json"":""8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__circom_groth16__measured__3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,3,ok,,,45043.7,,45043.7,6142.953125,722,508332927,508332927,508332927,978536,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm"":""322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json"":""8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__circom_groth16__measured__4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,4,ok,,,47447.5,,47447.5,6142.953125,723,508332927,508332927,508332927,978536,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm"":""322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json"":""8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__circom_groth16__measured__5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,measured,5,ok,,,46109.2,,46109.2,6142.953125,722,508332927,508332927,508332927,978536,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm"":""322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json"":""8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__circom_groth16__warmup__0,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,circom_groth16,circom,snarkjs-groth16-browser-wasm,circom-witness-wasm,warmup,0,ok,,,40845.7,,40845.7,6142.953125,723,508332927,508332927,508332927,978536,legacy-unpinned,legacy-unpinned,"{""snarkjs"":""0.7.6""}","{""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.wasm"":""322efbab8702ab37e3367e171326e0cb28dd336027898c08c1429c4b91e33f5f"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1_final.zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""target/v1-benchmarks/semantic-parity/passport-p1/browser/fixtures/passport_p1.input.json"":""8c90e1b2392e013df6a6bdd1f22c1bb2bae9bca457c8b937e43a0e10e3618758""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/circom-snarkjs.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,1,ok,,,13671.465,,13671.465,1148.296875,16000,74595035,74595035,74595035,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json"":""243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,2,ok,,,14249.18,,14249.18,1148.296875,16000,74595035,74595035,74595035,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json"":""243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,3,ok,,,14965.49,,14965.49,1148.296875,16000,74595035,74595035,74595035,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json"":""243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,4,ok,,,15248.12,,15248.12,1148.296875,16000,74595035,74595035,74595035,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json"":""243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,measured,5,ok,,,17122.75,,17122.75,1148.296875,16000,74595035,74595035,74595035,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json"":""243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro (Apple M4 Max),macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,legacy-unpinned,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js,warmup,0,ok,,,13682.905,,13682.905,1148.296875,16000,74595035,74595035,74595035,,legacy-unpinned,legacy-unpinned,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/circuit.json"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""benchmarks/v1/noir/passport_p1/web/dist/assets/passport_p1/inputs.json"":""243399e581fced3044b80b34ee45a7e07a64002f02fce811cc9a4d8d3196896a"",""https://crs.aztec-cdn.foundation/g1.dat bytes=0-67108927"":""0f238856e55722f15a4d64ef0de12b4260e218245590bd3a6c900aee188de8e5"",""https://crs.aztec-cdn.foundation/g2.dat"":""01797bfc4de5a96f0e516a9ea4537d18786dc30cb991aca4274c95822b69c32f"",""https://crs.aztec-cdn.foundation/grumpkin_g1.dat bytes=0-4194367"":""8df01ac0f564db0b52857d37b363b8f8042cd1d886f8d8fd2677375a6290e870""}",,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,target/v1-benchmarks/semantic-parity/passport-p1/mac-chrome/noir-barretenberg.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__provekit_v1__sample-1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,1,ok,,,10221.615000009537,,11270.340000033379,998.125,963449,2313739,2313739,2313739,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd"",""payload"":{""passport_p1.pkp"":""7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7"",""passport_p1.inputs.json"":""6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/passport.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__provekit_v1__sample-2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,2,ok,,,10208.43499994278,,11263.384999990463,998.125,964645,2313739,2313739,2313739,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd"",""payload"":{""passport_p1.pkp"":""7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7"",""passport_p1.inputs.json"":""6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/passport.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__provekit_v1__sample-3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,3,ok,,,10271.65499997139,,11340.044999957085,998.125,961573,2313739,2313739,2313739,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd"",""payload"":{""passport_p1.pkp"":""7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7"",""passport_p1.inputs.json"":""6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/passport.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__provekit_v1__sample-4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,4,ok,,,10216.27999997139,,11268.545000076294,998.125,964305,2313739,2313739,2313739,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd"",""payload"":{""passport_p1.pkp"":""7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7"",""passport_p1.inputs.json"":""6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/passport.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__provekit_v1__sample-5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,5,ok,,,10182.409999966621,,11233.944999933243,998.125,961829,2313739,2313739,2313739,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd"",""payload"":{""passport_p1.pkp"":""7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7"",""passport_p1.inputs.json"":""6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/passport.json +semantic-parity-v1-20260731,passport_p1__mac_chrome__provekit_v1__warmup,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,2313739,2313739,2313739,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd"",""payload"":{""passport_p1.pkp"":""7c99f9724f25229324ae3ec24d37a61e112cc32c411f8580c64ae1ed9a33eea7"",""passport_p1.inputs.json"":""6570f80c3e5464ab1840385b2b8ebc875128688bdb77e12057751be278f5a450""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/passport.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__circom_groth16__measured__1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,1,ok,,,194531.6,,194531.6,11064.78125,724,1753618376,1753618376,1753618376,2812892,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__circom_groth16__measured__2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,2,ok,,,219079.6,,219079.6,11064.78125,725,1753618376,1753618376,1753618376,2812892,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__circom_groth16__measured__3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,3,ok,,,201139.9,,201139.9,11064.78125,722,1753618376,1753618376,1753618376,2812892,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__circom_groth16__measured__4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,4,ok,,,270838,,270838,11064.78125,725,1753618376,1753618376,1753618376,2812892,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__circom_groth16__measured__5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,measured,5,ok,,,222479.7,,222479.7,11064.78125,720,1753618376,1753618376,1753618376,2812892,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__circom_groth16__warmup__0,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs_0.7.6_browser_wasm_single_thread,snarkjs-wtns-calculate-wasm,warmup,0,ok,,,221252.3,,221252.3,11064.78125,721,1753618376,1753618376,1753618376,2812892,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""wasm_sha256"":""b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088"",""zkey_sha256"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""input_sha256"":""b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 20,470,384-byte WASM + 1,733,145,772-byte zkey + 2,220-byte input = 1,753,618,376 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/circom-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,1,ok,,,14677.335,,14677.335,1060.0625,16000,74003114,74003114,74003114,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,2,ok,,,16153.085,,16153.085,1060.0625,16000,74003114,74003114,74003114,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,3,ok,,,14740.61,,14740.61,1060.0625,16000,74003114,74003114,74003114,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,4,ok,,,13333.53,,13333.53,1060.0625,16000,74003114,74003114,74003114,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,measured,5,ok,,,16982.47,,16982.47,1060.0625,16000,74003114,74003114,74003114,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 headless,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,,warmup,0,ok,,,13841.28,,13841.28,1060.0625,16000,74003114,74003114,74003114,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""@aztec/bb.js"":""4.2.0-aztecnr-rc.2"",""@noir-lang/noir_js"":""1.0.0-beta.19""}","{""circuit_sha256"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness_sha256"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""source_artifact_sha256"":""b6d8dc8a9f3527c478e336310035bec73d6da7f74e87d8e05d46312f43f597ab""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 2,691,859-byte circuit + 7,831-byte input + 71,303,424-byte consumed CRS = 74,003,114 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/mac-chrome-proof-metrics/raw/barretenberg-webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__provekit_v1__sample-1,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,1,ok,,,10961.985000014305,,12176.84500002861,994.953125,971344,2286515,2286515,2286515,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2"",""payload"":{""webauthn_assertion.pkp"":""0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f"",""webauthn_assertion.inputs.json"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__provekit_v1__sample-2,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,2,ok,,,11004.424999952316,,12212.65499997139,994.953125,969380,2286515,2286515,2286515,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2"",""payload"":{""webauthn_assertion.pkp"":""0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f"",""webauthn_assertion.inputs.json"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__provekit_v1__sample-3,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,3,ok,,,11021.429999947548,,12247.805000066757,994.953125,972536,2286515,2286515,2286515,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2"",""payload"":{""webauthn_assertion.pkp"":""0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f"",""webauthn_assertion.inputs.json"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__provekit_v1__sample-4,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,4,ok,,,10999.860000014305,,11981.304999947548,994.953125,972624,2286515,2286515,2286515,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2"",""payload"":{""webauthn_assertion.pkp"":""0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f"",""webauthn_assertion.inputs.json"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__provekit_v1__sample-5,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,measured,5,ok,,,11013.475000023842,,12236.465000033379,994.953125,972708,2286515,2286515,2286515,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2"",""payload"":{""webauthn_assertion.pkp"":""0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f"",""webauthn_assertion.inputs.json"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__mac_chrome__provekit_v1__warmup,2026-07-31T00:00:00Z,macbook_m4,MacBook Pro M4 Max,macOS 26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.72 (headless),webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-branch-9b2a6f3-wasm-single,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,2286515,2286515,2286515,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2"",""payload"":{""webauthn_assertion.pkp"":""0e43f923ae67fd12f4841bb4be28349ee371c029d6355c5cce467996da63ee7f"",""webauthn_assertion.inputs.json"":""aa8d7f8b27ae2f5deeb49c9eddf1fdd0789aa3bcc212d83619beabe1b8d362dc""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/mac/webauthn.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__circom_groth16__measured__1,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,1,ok,,,12069.135693,,12069.135693,139.171875,1779,40639660,40639660,40639660,,legacy-unpinned,legacy-unpinned,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""6e9927d9a83bc3433d1de4a20153a76637e6cb576d36864144c0279461204245"",""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",e15-oprf-o2-circom-arkworks-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__circom_groth16__measured__2,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,2,ok,,,11801.705924,,11801.705924,139.171875,1783,40639660,40639660,40639660,,legacy-unpinned,legacy-unpinned,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""6e9927d9a83bc3433d1de4a20153a76637e6cb576d36864144c0279461204245"",""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",e15-oprf-o2-circom-arkworks-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__circom_groth16__measured__3,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,3,ok,,,11807.866155,,11807.866155,139.171875,1780,40639660,40639660,40639660,,legacy-unpinned,legacy-unpinned,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""6e9927d9a83bc3433d1de4a20153a76637e6cb576d36864144c0279461204245"",""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",e15-oprf-o2-circom-arkworks-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__circom_groth16__measured__4,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,4,ok,,,11780.513231,,11780.513231,139.171875,1782,40639660,40639660,40639660,,legacy-unpinned,legacy-unpinned,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""6e9927d9a83bc3433d1de4a20153a76637e6cb576d36864144c0279461204245"",""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",e15-oprf-o2-circom-arkworks-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__circom_groth16__measured__5,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,5,ok,,,11801.808078,,11801.808078,139.171875,1787,40639660,40639660,40639660,,legacy-unpinned,legacy-unpinned,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""6e9927d9a83bc3433d1de4a20153a76637e6cb576d36864144c0279461204245"",""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",e15-oprf-o2-circom-arkworks-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__circom_groth16__warmup__0,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,warmup,0,ok,,,11687.240847,,11687.240847,139.171875,1787,40639660,40639660,40639660,,legacy-unpinned,legacy-unpinned,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""6e9927d9a83bc3433d1de4a20153a76637e6cb576d36864144c0279461204245"",""zkey"":""5c13f036144b3e9767edb51dc28034d3dc8d72d6ca4d66fad2c9655f5b4653dc"",""witness"":""b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568""}",e15-oprf-o2-circom-arkworks-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/circom-rapidsnark-1x5/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,1,ok,,,68194.674081,,68194.674081,341.79296875,16548,12983421,12983421,12983421,,legacy-unpinned,legacy-unpinned,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""dd2005c7ecf7afa8659baa43abc2492fb5cabd5e3131dfe96a84184678443be3"",""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a""}",e15-oprf-o2-noir-barretenberg-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,2,ok,,,68296.910466,,68296.910466,341.79296875,16548,12983421,12983421,12983421,,legacy-unpinned,legacy-unpinned,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""dd2005c7ecf7afa8659baa43abc2492fb5cabd5e3131dfe96a84184678443be3"",""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a""}",e15-oprf-o2-noir-barretenberg-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,3,ok,,,68166.184004,,68166.184004,341.79296875,16548,12983421,12983421,12983421,,legacy-unpinned,legacy-unpinned,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""dd2005c7ecf7afa8659baa43abc2492fb5cabd5e3131dfe96a84184678443be3"",""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a""}",e15-oprf-o2-noir-barretenberg-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,4,ok,,,68149.271388,,68149.271388,341.79296875,16548,12983421,12983421,12983421,,legacy-unpinned,legacy-unpinned,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""dd2005c7ecf7afa8659baa43abc2492fb5cabd5e3131dfe96a84184678443be3"",""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a""}",e15-oprf-o2-noir-barretenberg-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,5,ok,,,68230.10185,,68230.10185,341.79296875,16548,12983421,12983421,12983421,,legacy-unpinned,legacy-unpinned,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""dd2005c7ecf7afa8659baa43abc2492fb5cabd5e3131dfe96a84184678443be3"",""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a""}",e15-oprf-o2-noir-barretenberg-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,oprf,oprf_o2,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,warmup,0,ok,,,68217.393158,,68217.393158,341.79296875,16548,12983421,12983421,12983421,,legacy-unpinned,legacy-unpinned,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""dd2005c7ecf7afa8659baa43abc2492fb5cabd5e3131dfe96a84184678443be3"",""circuit"":""cc49b173395c6c0cea047285cbb69d5caf75903b9df65862c021d48c2a1683ad"",""witness"":""b676121b68b961ae41ea05abac0155ea8dc48587592c75bffa49a91a64c4523a""}",e15-oprf-o2-noir-barretenberg-20260731,"Matched semantic profile: World ID Protocol nullifier statement and frozen witness, including the identical public nullifier. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/oprf-o2/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__provekit_v1__sample-1,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,1,ok,,,12543.679693,,12557.585617,177.3359375,630215,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/oprf.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__provekit_v1__sample-2,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,2,ok,,,12597.403693,,12603.97777,178.11328125,633812,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/oprf.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__provekit_v1__sample-3,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,3,ok,,,12544.003385,,12555.643924,179.6328125,625574,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/oprf.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__provekit_v1__sample-4,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,4,ok,,,12564.926462,,12571.77477,177.9140625,634804,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/oprf.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__provekit_v1__sample-5,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,5,ok,,,12589.059693,,12596.926232,178.7890625,632628,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/oprf.json +semantic-parity-v1-20260731,oprf_o2__motorola_e15__provekit_v1__warmup,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,oprf,oprf_o2,fd37726215b59d3d4823ea7b1967b1da3525ed9d,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,1644193,1644193,1644193,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0"",""payload"":{""oprf.pkp+frozen-input"":""0a87a592e96b6e116b36f69e6fd8d2a0a5952e27f9c872c8d18d73642b4ec64c"",""oprf.Prover.toml"":""afd85db335ebdcd794dac895b1889cb40cae3d17ff52cb050b4204fb4c6d0797""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/oprf.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__circom_groth16__measured__1,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,1,ok,,,54364.144926,,54364.144926,649.9453125,1035,529101612,529101612,529101612,978536,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""609c94c6423d0a8854819084304a0b5f19f110beb9c4841b0800d8d9aa98a8ac"",""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd""}",e15-passport-p1-circom-rapidsnark-attempt-2-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__circom_groth16__measured__2,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,2,ok,,,53063.890772,,53063.890772,649.9453125,1042,529101612,529101612,529101612,978536,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""609c94c6423d0a8854819084304a0b5f19f110beb9c4841b0800d8d9aa98a8ac"",""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd""}",e15-passport-p1-circom-rapidsnark-attempt-2-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__circom_groth16__measured__3,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,3,ok,,,52415.240926,,52415.240926,649.9453125,1031,529101612,529101612,529101612,978536,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""609c94c6423d0a8854819084304a0b5f19f110beb9c4841b0800d8d9aa98a8ac"",""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd""}",e15-passport-p1-circom-rapidsnark-attempt-2-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__circom_groth16__measured__4,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,4,ok,,,52052.795388,,52052.795388,649.9453125,1045,529101612,529101612,529101612,978536,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""609c94c6423d0a8854819084304a0b5f19f110beb9c4841b0800d8d9aa98a8ac"",""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd""}",e15-passport-p1-circom-rapidsnark-attempt-2-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__circom_groth16__measured__5,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,measured,5,ok,,,53365.323388,,53365.323388,649.9453125,1035,529101612,529101612,529101612,978536,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""609c94c6423d0a8854819084304a0b5f19f110beb9c4841b0800d8d9aa98a8ac"",""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd""}",e15-passport-p1-circom-rapidsnark-attempt-2-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__circom_groth16__warmup__0,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,circom_groth16,circom,Mopro rust-rapidsnark Groth16 armv7 patch,frozen SnarkJS WTNS,warmup,0,ok,,,54632.631157,,54632.631157,649.9453125,1041,529101612,529101612,529101612,978536,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""rust_rapidsnark"":""0.1.4"",""mopro"":""0.3.7"",""mobench"":""0.1.48""}","{""apk"":""609c94c6423d0a8854819084304a0b5f19f110beb9c4841b0800d8d9aa98a8ac"",""zkey"":""75de3f63996cd69f63de091029aace20c90f4dbbcaf47603af015e74884f721c"",""witness"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd""}",e15-passport-p1-circom-rapidsnark-attempt-2-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/circom-rapidsnark-attempt-2/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,1,ok,,,115303.10616,,115303.10616,463.2265625,16324,20480588,20480588,20480588,,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""21ce0772f1e2f5a61b618eda6204c9a0099de959488a1f5c32a0d924a27f3577"",""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726""}",e15-passport-p1-noir-barretenberg-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,2,ok,,,115272.083776,,115272.083776,463.2265625,16324,20480588,20480588,20480588,,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""21ce0772f1e2f5a61b618eda6204c9a0099de959488a1f5c32a0d924a27f3577"",""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726""}",e15-passport-p1-noir-barretenberg-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,3,ok,,,115415.368622,,115415.368622,463.2265625,16324,20480588,20480588,20480588,,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""21ce0772f1e2f5a61b618eda6204c9a0099de959488a1f5c32a0d924a27f3577"",""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726""}",e15-passport-p1-noir-barretenberg-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,4,ok,,,115377.750161,,115377.750161,463.2265625,16324,20480588,20480588,20480588,,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""21ce0772f1e2f5a61b618eda6204c9a0099de959488a1f5c32a0d924a27f3577"",""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726""}",e15-passport-p1-noir-barretenberg-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,measured,5,ok,,,115282.65816,,115282.65816,463.2265625,16324,20480588,20480588,20480588,,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""21ce0772f1e2f5a61b618eda6204c9a0099de959488a1f5c32a0d924a27f3577"",""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726""}",e15-passport-p1-noir-barretenberg-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,motorola_e15,moto_e15,Android 14 (API 34),armeabi-v7a,android_native,,passport,passport_p1,15b167e3543a9dff1dbb16fcf71a45fe4625cf9e,noir_barretenberg,noir,barretenberg-rs 4.2.0-aztecnr-rc.2 with armv7 static library patch,frozen Noir beta.19 WitnessStack,warmup,0,ok,,,115028.658083,,115028.658083,463.2265625,16324,20480588,20480588,20480588,,legacy-unpinned,7de99e9e001d06797c9770684afea20f096d1ac3,"{""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""mobench"":""0.1.48""}","{""apk"":""21ce0772f1e2f5a61b618eda6204c9a0099de959488a1f5c32a0d924a27f3577"",""circuit"":""357150b3344a5ae6cbc8cd2304840f29142b9dbab21bbf842e083380aefe9a34"",""witness"":""bd5aaf605f382058693bbb6828d117f79da9c028f8438c0281d1eb944526c726""}",e15-passport-p1-noir-barretenberg-20260731,"Matched semantic profile: monolithic RSA-4096 passport integrity, Self registry authorization, DG1 validity, and asserted minimum-age proof. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/semantic-parity/e15/passport-p1/noir-barretenberg/normalized.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__provekit_v1__sample-1,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,1,ok,,,71595.260005,,74067.280543,474.59375,715014,2546527,2546527,2546527,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/passport.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__provekit_v1__sample-2,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,2,ok,,,71563.777927,,74024.937543,474.09765625,716879,2546527,2546527,2546527,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/passport.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__provekit_v1__sample-3,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,3,ok,,,71543.562389,,74012.293543,475.03515625,715470,2546527,2546527,2546527,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/passport.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__provekit_v1__sample-4,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,4,ok,,,71627.108927,,74086.977466,474.00390625,714255,2546527,2546527,2546527,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/passport.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__provekit_v1__sample-5,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,5,ok,,,71639.365235,,74090.311081,473.01953125,714761,2546527,2546527,2546527,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/passport.json +semantic-parity-v1-20260731,passport_p1__motorola_e15__provekit_v1__warmup,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,passport,passport_p1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,2546527,2546527,2546527,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484"",""payload"":{""complete_age_check.pkp+frozen-input"":""01c5ac40b916e3efe5b42f947d90f9076300f24c69af78844aff5867a8007526"",""complete_age_check.Prover.toml"":""dd1ff84f238d5d92b8c7de56b4dc6df9c2309e53f7394d4ac35055b3195f7aa1""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/passport.json +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__circom_groth16__measured__1,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,1,ok,,,850346.968128,,850346.968128,810.6796875,1130,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__circom_groth16__measured__2,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,2,ok,,,862780.278129,,862780.278129,787.08203125,1127,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__circom_groth16__measured__3,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,3,ok,,,855096.265358,,855096.265358,708.84765625,1127,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__circom_groth16__measured__4,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,4,ok,,,854925.975512,,854925.975512,767.01953125,1127,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__circom_groth16__measured__5,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,measured,5,ok,,,859999.803436,,859999.803436,802.69921875,1131,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__circom_groth16__warmup__0,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rapidsnark-groth16-native-armv7,frozen-wtns-witnesscalc-adapter-0.1.7,warmup,0,ok,,,,,,,,1842364184,1842364184,1842364184,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""rust_rapidsnark"":""0.1.4"",""witnesscalc_adapter"":""0.1.7"",""backend"":""rapidsnark""}","{""apk"":""a586d78fc42a77cc0d85602ea679967b188f81bc460a4c5db006cac23c6d49df"",""zkey"":""a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b"",""witness"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""verification_key"":""4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from raw evidence: 1,733,145,772-byte zkey + 109,218,412-byte frozen witness library = 1,842,364,184 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-circom-webauthn-rapidsnark-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__noir_barretenberg__measured__1,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,1,ok,,,107501.417621,,107501.417621,483.88671875,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__noir_barretenberg__measured__2,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,2,ok,,,107456.724698,,107456.724698,483.25,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__noir_barretenberg__measured__3,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,3,ok,,,107258.951083,,107258.951083,480.703125,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__noir_barretenberg__measured__4,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,4,ok,,,107847.259314,,107847.259314,483.6875,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__noir_barretenberg__measured__5,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,measured,5,ok,,,107241.40493,,107241.40493,485.36328125,21092,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warmup__0,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-native-armv7-file-srs-exact-domain,frozen-noir-witness-stack-beta.19,warmup,0,ok,,,,,,,,271478529,271478529,271478529,,legacy-unpinned,13044531f0f38e02ed19fcbd9b26202b8ba5a962,"{""mopro"":""0.3.7"",""noir"":""1.0.0-beta.19"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""srs_loading"":""direct-file-exact-verification-key-domain""}","{""apk"":""5c5fd9d9139a8c523f91b9f6b658fff0f10f271acc738b93cc578f0f7d9e653a"",""circuit"":""a03bfbef1b8b0ddb446d760307402d139bc0f8d8d499344297b2466dc0e6d6ec"",""witness"":""4b62089fd9867fc490a0c88be3983cf75e823c5527b501511e301e5caef03484"",""consumed_srs"":""8f5cd75519c2e995fa47aa7ecd7b213b9ae13824bc4b0f15025a63acd8c139eb""}",,"Closest analogue, not semantically equivalent: Noir binds challenge, client-data type, origin, RP-ID hash, UP/UV flags, and public key; privacy-ethereum/webauthn-circom omits several of those bindings. Historical note verbatim: Closest available counterpart only; proof statements and implementation details are not equivalent. Payload correction from native structured evidence: 2,691,859-byte circuit + 351,150-byte frozen witness + 268,435,520-byte SRS = 271,478,529 bytes. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV. Legacy row metadata normalized for the V1 replacement CSV.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/reproduction/e15-noir-webauthn-barretenberg-armv7-exact-domain-1x5 +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__provekit_v1__sample-1,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,1,ok,,,27859.356617,,27871.475309,498.57421875,716688,2377056,2377056,2377056,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__provekit_v1__sample-2,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,2,ok,,,27747.26654,,27760.853848,498.4375,716454,2377056,2377056,2377056,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__provekit_v1__sample-3,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,3,ok,,,27839.157617,,27852.851079,497.75,717130,2377056,2377056,2377056,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__provekit_v1__sample-4,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,4,ok,,,27794.375079,,27808.839079,499.16015625,715934,2377056,2377056,2377056,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__provekit_v1__sample-5,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,measured,5,ok,,,27931.619694,,27945.088233,492.015625,716186,2377056,2377056,2377056,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/webauthn.json +semantic-parity-v1-20260731,webauthn_closest_analogue__motorola_e15__provekit_v1__warmup,2026-07-31T00:00:00Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,webauthn_closest_analogue,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,noir-v1.0.0-beta.11,warmup,0,ok,,,,,,,,2377056,2377056,2377056,,provekit-v1-core-9b2a6f3-noir-beta.11,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit_core"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir"":""1.0.0-beta.11"",""mobench"":""0.1.48"",""campaign_harness"":""7de99e9e001d06797c9770684afea20f096d1ac3""}","{""evidence"":""c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f"",""payload"":{""webauthn_assertion.pkp+frozen-input"":""f2db98b9d9b5ff2ccd4d9cbe5bd50327bc037685299936aff6d55ba0fa1071f1"",""webauthn_assertion.Prover.toml"":""aa0fd0a7718f5db6a70f55585014e1afa598f9cd8b5af3ccf6e087dd8a7fccfd""}}",,"Closest available semantic counterpart; Noir and Circom statements remain non-equivalent where noted by the campaign. ProveKit V1 measurements use the pinned core WASM/C-ABI build, not @worldcoin/provekit npm artifacts. Browser proof_size_bytes is V1 WASM proof-byte serialization; native proof_size_bytes is serialized postcard NoirProof (.np) bytes.",,,evidence/provekit-v1/e15/webauthn.json diff --git a/benchmarks/v1/legacy/taceo-candidate/.gitignore b/benchmarks/v1/legacy/taceo-candidate/.gitignore new file mode 100644 index 000000000..48a58e61d --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/.gitignore @@ -0,0 +1 @@ +evidence/ diff --git a/benchmarks/v1/legacy/taceo-candidate/README.md b/benchmarks/v1/legacy/taceo-candidate/README.md new file mode 100644 index 000000000..78a3676da --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/README.md @@ -0,0 +1,79 @@ +# TACEO native Circom candidate CSV + +This directory produces a publication-review fork of the frozen +`../../input-to-proof-data/input-to-proof-samples.csv`. It never changes that +canonical file. + +Only these 16 logical series may be replaced: + +- four semantic profiles: Passport historical, Passport P1, OPRF O2, WebAuthn; +- iPhone SE 2022 and Motorola E15 native targets; +- cold-local and warm-reuse timing modes; +- Circom/Groth16 only. + +All ProveKit, Barretenberg, and Mac browser rows remain byte-for-byte equivalent +after CSV parsing. Export fails until all 16 evidence JSON files exist. A +successful series must contain exactly one real warmup followed by five measured +attempts. A genuine failure is represented by one explicit gap row with blank +metrics; it is never estimated and never filled from the Rapidsnark baseline. + +The only currently qualified workload is the production World ID OPRF +query-plus-nullifier pair. It uses optimized witness graphs and matching Ark +zkeys, so it is labeled `O2-updated-production-query-plus-nullifier`; it is not +a backend-only replacement for the frozen Rapidsnark OPRF material. Passport, +Passport P1, and WebAuthn remain explicit compatibility gaps because +`circom-witness-rs` cannot generate their data-dependent witness graphs as +shipped. + +## Evidence interface + +Create `evidence/.json` for every series printed by: + +```sh +bun -e 'import { replacementSeries } from "./benchmarks/v1/legacy/taceo-candidate/export.ts"; console.log(replacementSeries.join("\n"))' +``` + +The JSON shape is exercised in `export.test.ts`. Identity pins live in +`config.json`. Artifact hashes must be lowercase SHA-256 values and cover at +least two proving inputs. `proving_payload_size_bytes` means every frozen file +needed to create a proof, deduplicated; it is not an IPA/APK upload size. +Measured attempts require process peak RSS. Every series must pass valid-proof +acceptance and tampered-proof rejection. Separate witness/prover timings may be +blank only when the native runner instruments the coupled input-to-proof span; +the coupled timing must always be present. + +Run: + +```sh +bun test benchmarks/v1/legacy/taceo-candidate/export.test.ts +bun benchmarks/v1/legacy/taceo-candidate/export.ts +``` + +The output is `input-to-proof-samples.taceo-candidate.csv` in this directory. +Use environment variables `TACEO_BASELINE_CSV`, `TACEO_EVIDENCE_DIR`, and +`TACEO_CANDIDATE_CSV` to override paths in automation. + +## 2026-08-11 result + +Measured medians exclude the warmup row: + +| Target | Mode | Frozen Rapidsnark | TACEO updated production | Relative time | TACEO peak RSS | +|---|---:|---:|---:|---:|---:| +| iPhone SE 2022 | cold | 5,147 ms | 4,797 ms | 1.07x faster | 204.59 MiB | +| iPhone SE 2022 | warm | 5,168 ms | 492 ms | 10.50x faster | 184.66 MiB | +| Motorola E15 | cold | 75,244 ms | 11,921 ms | 6.31x faster | 245.68 MiB | +| Motorola E15 | warm | 75,200 ms | 7,280 ms | 10.33x faster | 234.95 MiB | + +These ratios are useful production-path evidence but are not backend-only +speedups. The TACEO rows use shorter optimized witness graphs and matching Ark +zkeys. The iPhone warm row additionally measures cached nullifier generation +after query setup, while its cold row measures query plus nullifier. Proof size +is 256 bytes for paired query-plus-nullifier rows and 128 bytes for the cached +nullifier row; the frozen Rapidsnark rows serialize Groth16 proof JSON at about +1,602 bytes and are not byte-format comparable. + +The candidate has 72 logical series and 372 rows: 60 complete 1+5 series and +12 explicit TACEO compatibility gaps. It should not replace the canonical CSV +for a general three-backend blog comparison. It can support a separately +labeled production OPRF section that discloses the material and warm-boundary +differences. diff --git a/benchmarks/v1/legacy/taceo-candidate/config.json b/benchmarks/v1/legacy/taceo-candidate/config.json new file mode 100644 index 000000000..8f11c9d06 --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/config.json @@ -0,0 +1,16 @@ +{ + "schema_version": "taceo-native-circom-v1", + "candidate_campaign_id": "input-to-proof-v1-20260807-taceo-candidate", + "circom_helpers_commit": "dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44", + "production_world_id_commit": "ccaac272c72012daa18608a62d00f8b10908b560", + "prover_backend": "taceo-groth16-0.1.3", + "witness_backend": "circom-witness-rs-0.2.3", + "package_versions": { + "circom": "2.2.2", + "circom_helpers": "dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44", + "circom_witness_rs": "0.2.3", + "taceo_groth16": "0.1.3", + "taceo_groth16_material": "0.3.0", + "world_id_protocol": "ccaac272c72012daa18608a62d00f8b10908b560" + } +} diff --git a/benchmarks/v1/legacy/taceo-candidate/export.test.ts b/benchmarks/v1/legacy/taceo-candidate/export.test.ts new file mode 100644 index 000000000..a9a9d1d41 --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/export.test.ts @@ -0,0 +1,98 @@ +import { afterEach, describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { join, resolve } from "node:path"; +import { tmpdir } from "node:os"; +import config from "./config.json"; +import { buildCandidate, replacementSeries } from "./export"; + +const baseline = resolve(import.meta.dir, "../../input-to-proof-data/input-to-proof-samples.csv"); +const scratch: string[] = []; +afterEach(() => scratch.splice(0).forEach((path) => rmSync(path, { recursive: true, force: true }))); + +const circuitByProfile = { + passport_complete_age_check: ["passport_complete_age_check", "historical-monolithic-age-integrity", "9b2a6f37c67691eab4b0cec6c35e35c520e93285"], + passport_p1: ["passport_age_integrity", "P1-matched-monolithic-RSA4096", "092621d721cfef9ff39b0787f5ba2c1f07eb6d95"], + oprf_o2: ["oprf_nullifier", "O2-world-id-nullifier", "85aeeef539961cae5a63de794997b507a5975717"], + webauthn_closest_analogue: ["webauthn", "closest-analogue", "0fb5b4aa1398281c2fd3dbe14db147e05b61f201"], +} as const; + +function fixture(id: string) { + const [profile, target, , timing_mode] = id.split("__") as [keyof typeof circuitByProfile, "iphone_se_2022" | "motorola_e15", string, "cold_local" | "warm_reuse"]; + const [name, variant, commit] = circuitByProfile[profile]; + return { + schema_version: config.schema_version, series_id: id, profile, target, timing_mode, + created_at_utc: "2026-08-11T12:00:00.000Z", + environment: { + hardware: target, device_model: target === "iphone_se_2022" ? "iPhone SE (2022)" : "moto e15", + os_version: target === "iphone_se_2022" ? "18" : "14", abi: target === "iphone_se_2022" ? "arm64" : "armeabi-v7a", + runtime: target === "iphone_se_2022" ? "ios_native" : "android_native", browser: "", session_id: `fixture-${id}`, + }, + circuit: { name, variant, commit, constraint_count: 123 }, + backend: { + frontend: "circom", prover_backend: config.prover_backend, witness_backend: config.witness_backend, + source_commit: config.circom_helpers_commit, package_versions: config.package_versions, + }, + artifacts: { + proving_payload_size_bytes: 1000, artifact_size_bytes: 900, bundle_size_bytes: 1000, + hashes: { zkey_sha256: "a".repeat(64), witness_graph_sha256: "b".repeat(64) }, + }, + public_outputs_sha256: "c".repeat(64), status: "ok", failure_code: "", failure_detail: "", + samples: Array.from({ length: 6 }, (_, index) => ({ + sample_index: index, warmup: index === 0, status: "ok", + initialization_time_ms: index === 0 ? 10 : 0, witness_time_ms: 20 + index, prover_time_ms: 30 + index, + verify_time_ms: 1, total_time_ms: 50 + index * 2, input_to_proof_time_ms: 50 + index * 2, + peak_memory_mib: index === 0 ? null : 100 + index, proof_size_bytes: 256, + valid_proof_accepted: true, tampered_proof_rejected: true, + })), + }; +} + +function evidenceDir() { + const dir = mkdtempSync(join(tmpdir(), "taceo-candidate-")); + scratch.push(dir); + for (const id of replacementSeries) writeFileSync(join(dir, `${id}.json`), JSON.stringify(fixture(id))); + return dir; +} + +describe("TACEO candidate exporter", () => { + test("requires all 16 native Circom evidence files", async () => { + const dir = evidenceDir(); + rmSync(join(dir, `${replacementSeries[0]}.json`)); + await expect(buildCandidate({ baselinePath: baseline, evidenceDir: dir, write: false })).rejects.toThrow(`missing TACEO evidence`); + }); + + test("replaces exactly 16 series and preserves the 72-series schema", async () => { + const result = await buildCandidate({ baselinePath: baseline, evidenceDir: evidenceDir(), write: false }); + expect(result.replacementSeries).toHaveLength(16); + expect(result.rows).toHaveLength(432); + const taceo = result.rows.filter((row) => row.prover_backend === config.prover_backend); + expect(taceo).toHaveLength(96); + expect(taceo.every((row) => row.campaign_id === config.candidate_campaign_id)).toBe(true); + }); + + test("rejects estimates and unpinned backend evidence", async () => { + const dir = evidenceDir(); + const id = replacementSeries[0]; + const bad = fixture(id) as any; + bad.backend.prover_backend = "rapidsnark"; + writeFileSync(join(dir, `${id}.json`), JSON.stringify(bad)); + await expect(buildCandidate({ baselinePath: baseline, evidenceDir: dir, write: false })).rejects.toThrow("prover backend is not pinned"); + }); + + test("accepts an explicit metric-free gap", async () => { + const dir = evidenceDir(); + const id = replacementSeries.at(-1)!; + const gap = fixture(id) as any; + gap.status = "runtime_failed"; + gap.failure_code = "out_of_memory"; + gap.failure_detail = "allocator failed"; + gap.public_outputs_sha256 = ""; + gap.samples = []; + writeFileSync(join(dir, `${id}.json`), JSON.stringify(gap)); + const result = await buildCandidate({ baselinePath: baseline, evidenceDir: dir, write: false }); + const row = result.rows.find((value) => value.attempt_id === `${id}-gap`)!; + expect(row.status).toBe("runtime_failed"); + expect(row.input_to_proof_time_ms).toBeNull(); + expect(result.rows).toHaveLength(427); + }); +}); diff --git a/benchmarks/v1/legacy/taceo-candidate/export.ts b/benchmarks/v1/legacy/taceo-candidate/export.ts new file mode 100644 index 000000000..a0f98fdca --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/export.ts @@ -0,0 +1,268 @@ +import { createHash } from "node:crypto"; +import { basename, resolve } from "node:path"; +import { CSV_COLUMNS, expectedSeries, seriesId, type Profile, type Target, type TimingMode } from "../../input-to-proof-data/schema"; +import config from "./config.json"; + +type Cell = string | number | boolean | null; +type Row = Record<(typeof CSV_COLUMNS)[number], Cell>; +type SuccessSample = { + sample_index: number; + warmup: boolean; + status: "ok"; + initialization_time_ms: number | null; + witness_time_ms: number | null; + prover_time_ms: number | null; + verify_time_ms: number | null; + total_time_ms: number; + input_to_proof_time_ms: number; + peak_memory_mib: number | null; + proof_size_bytes: number; + valid_proof_accepted: true; + tampered_proof_rejected: true; +}; +type Evidence = { + schema_version: typeof config.schema_version; + series_id: string; + profile: Profile; + target: Extract; + timing_mode: TimingMode; + created_at_utc: string; + environment: { + hardware: "iphone_se_2022" | "motorola_e15"; + device_model: string; + os_version: string; + abi: string; + runtime: "ios_native" | "android_native"; + browser: ""; + session_id: string; + }; + circuit: { name: string; variant: string; commit: string; constraint_count: number | null }; + backend: { + frontend: "circom"; + prover_backend: typeof config.prover_backend; + witness_backend: typeof config.witness_backend; + source_commit: typeof config.circom_helpers_commit; + package_versions: typeof config.package_versions; + }; + artifacts: { + proving_payload_size_bytes: number; + artifact_size_bytes: number; + bundle_size_bytes: number; + hashes: Record; + }; + public_outputs_sha256: string; + status: "ok" | "runtime_failed" | "build_failed" | "crashed" | "timed_out" | "unsupported"; + failure_code: string; + failure_detail: string; + samples: SuccessSample[]; +}; + +const here = import.meta.dir; +const baselineDefault = resolve(here, "../../input-to-proof-data/input-to-proof-samples.csv"); +const evidenceDefault = resolve(here, "evidence"); +const outputDefault = resolve(here, "input-to-proof-samples.taceo-candidate.csv"); +const nativeTargets = ["iphone_se_2022", "motorola_e15"] as const; +const profiles = ["passport_complete_age_check", "passport_p1", "oprf_o2", "webauthn_closest_analogue"] as const; +const modes = ["cold_local", "warm_reuse"] as const; +const replacementSeries = profiles.flatMap((profile) => nativeTargets.flatMap((target) => modes.map((mode) => seriesId(profile, target, "circom_groth16", mode)))); + +function assert(condition: unknown, message: string): asserts condition { + if (!condition) throw new Error(message); +} + +function parseCsv(text: string): string[][] { + const rows: string[][] = []; + let row: string[] = [], value = "", quoted = false; + for (let i = 0; i < text.length; i++) { + const char = text[i]; + if (quoted) { + if (char === '"' && text[i + 1] === '"') { value += '"'; i++; } + else if (char === '"') quoted = false; + else value += char; + } else if (char === '"') quoted = true; + else if (char === ",") { row.push(value); value = ""; } + else if (char === "\n") { row.push(value); rows.push(row); row = []; value = ""; } + else if (char !== "\r") value += char; + } + assert(!quoted, "baseline CSV has an unterminated quoted field"); + if (value.length || row.length) { row.push(value); rows.push(row); } + return rows; +} + +function readRows(text: string): Row[] { + const parsed = parseCsv(text); + const header = parsed.shift(); + assert(header?.join("\0") === CSV_COLUMNS.join("\0"), "baseline schema/order differs from input-to-proof-samples.csv"); + return parsed.filter((values) => values.length > 1).map((values, rowIndex) => { + assert(values.length === CSV_COLUMNS.length, `baseline row ${rowIndex + 2} has ${values.length} fields, expected ${CSV_COLUMNS.length}`); + return Object.fromEntries(CSV_COLUMNS.map((column, index) => [column, values[index]])) as Row; + }); +} + +function csvValue(value: Cell) { + if (value == null) return ""; + const text = String(value); + return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text; +} + +function writeRows(rows: Row[]) { + return [CSV_COLUMNS.join(","), ...rows.map((row) => CSV_COLUMNS.map((column) => csvValue(row[column])).join(","))].join("\n") + "\n"; +} + +function sha256(bytes: Uint8Array) { + return createHash("sha256").update(bytes).digest("hex"); +} + +function isHash(value: unknown): value is string { + return typeof value === "string" && /^[0-9a-f]{64}$/.test(value); +} + +function profileFor(row: Row): Profile { + if (row.circuit === "passport_complete_age_check") return "passport_complete_age_check"; + if (row.circuit === "passport_age_integrity") return "passport_p1"; + if (row.circuit === "oprf_nullifier") return "oprf_o2"; + if (row.circuit === "webauthn") return "webauthn_closest_analogue"; + throw new Error(`unknown circuit in CSV: ${row.circuit}`); +} + +function targetFor(row: Row): Target { + if (row.hardware === "macbook_m4") return "mac_chrome"; + if (row.hardware === "iphone_se_2022") return "iphone_se_2022"; + if (row.hardware === "motorola_e15") return "motorola_e15"; + throw new Error(`unknown hardware in CSV: ${row.hardware}`); +} + +function rowSeries(row: Row) { + return seriesId(profileFor(row), targetFor(row), row.prover as any, row.timing_mode as TimingMode); +} + +function validateEvidence(e: Evidence, expectedId: string, path: string) { + assert(e.schema_version === config.schema_version, `${path}: schema_version is not pinned ${config.schema_version}`); + assert(e.series_id === expectedId, `${path}: series_id mismatch`); + assert(e.series_id === seriesId(e.profile, e.target, "circom_groth16", e.timing_mode), `${path}: identity fields disagree with series_id`); + assert(e.environment.hardware === e.target, `${path}: environment hardware/target mismatch`); + assert((e.target === "iphone_se_2022" && e.environment.runtime === "ios_native") || (e.target === "motorola_e15" && e.environment.runtime === "android_native"), `${path}: invalid native runtime`); + assert(e.environment.browser === "", `${path}: native evidence cannot name a browser`); + assert(e.backend.frontend === "circom", `${path}: frontend must be circom`); + assert(e.backend.prover_backend === config.prover_backend, `${path}: prover backend is not pinned ${config.prover_backend}`); + assert(e.backend.witness_backend === config.witness_backend, `${path}: witness backend is not pinned ${config.witness_backend}`); + assert(e.backend.source_commit === config.circom_helpers_commit, `${path}: circom-helpers commit drift`); + assert(JSON.stringify(e.backend.package_versions) === JSON.stringify(config.package_versions), `${path}: package version drift`); + assert(Object.keys(e.artifacts.hashes).length >= 2, `${path}: at least two proving artifact hashes are required`); + for (const [name, hash] of Object.entries(e.artifacts.hashes)) assert(isHash(hash), `${path}: invalid ${name} SHA-256`); + if (e.status === "ok") { + assert(isHash(e.public_outputs_sha256), `${path}: successful evidence requires a lowercase public_outputs_sha256`); + assert(!e.failure_code && !e.failure_detail, `${path}: successful evidence cannot contain failure fields`); + assert(e.artifacts.proving_payload_size_bytes > 0 && e.artifacts.artifact_size_bytes > 0 && e.artifacts.bundle_size_bytes > 0, `${path}: artifact sizes must be positive exact values`); + assert(e.samples.length === 6, `${path}: successful series requires one warmup and five measured samples`); + e.samples.forEach((sample, index) => { + assert(sample.status === "ok" && sample.sample_index === index && sample.warmup === (index === 0), `${path}: samples must be ordered warmup 0 then measured 1..5`); + for (const key of ["total_time_ms", "input_to_proof_time_ms", "proof_size_bytes"] as const) assert(typeof sample[key] === "number" && sample[key]! > 0, `${path}: sample ${index} has invalid ${key}`); + assert((sample.witness_time_ms == null && sample.prover_time_ms == null) || + (typeof sample.witness_time_ms === "number" && sample.witness_time_ms > 0 && typeof sample.prover_time_ms === "number" && sample.prover_time_ms > 0), + `${path}: sample ${index} must provide both component timings or neither when only coupled input-to-proof was instrumented`); + assert(sample.valid_proof_accepted && sample.tampered_proof_rejected, `${path}: sample ${index} failed correctness gate`); + if (index > 0) assert(typeof sample.peak_memory_mib === "number" && sample.peak_memory_mib > 0, `${path}: measured sample ${index} lacks peak RSS`); + }); + } else { + assert(e.public_outputs_sha256 === "" || isHash(e.public_outputs_sha256), `${path}: failed evidence public_outputs_sha256 must be empty or lowercase SHA-256`); + assert(e.samples.length === 0, `${path}: failed series must not contain samples`); + assert(Boolean(e.failure_code && e.failure_detail), `${path}: failed series requires structured failure evidence`); + } +} + +function makeRows(e: Evidence, evidencePath: string, evidenceHash: string): Row[] { + const common: Partial = { + campaign_id: config.candidate_campaign_id, recorded_at_utc: e.created_at_utc, + hardware: e.environment.hardware, device_model: e.environment.device_model, os_version: e.environment.os_version, + abi: e.environment.abi, runtime: e.environment.runtime, browser: "", circuit: e.circuit.name, + circuit_variant: e.circuit.variant, circuit_commit: e.circuit.commit, prover: "circom_groth16", frontend: "circom", + prover_backend: e.backend.prover_backend, witness_backend: e.backend.witness_backend, + constraint_count: e.circuit.constraint_count, artifact_version: config.schema_version, + source_commit: e.backend.source_commit, package_versions: JSON.stringify(e.backend.package_versions), + artifact_hashes: JSON.stringify({ ...e.artifacts.hashes, raw_evidence_sha256: evidenceHash, public_outputs_sha256: e.public_outputs_sha256 }), + session_id: e.environment.session_id, + non_equivalence_note: e.profile === "oprf_o2" + ? "TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison." + : "TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.", + evidence_path: evidencePath, timing_mode: e.timing_mode, + }; + if (e.status !== "ok") return [{ + ...Object.fromEntries(CSV_COLUMNS.map((column) => [column, null])), ...common, + attempt_id: `${e.series_id}-gap`, sample_kind: "gap", status: e.status, + failure_code: e.failure_code, failure_detail: e.failure_detail, + } as Row]; + return e.samples.map((sample) => ({ + ...Object.fromEntries(CSV_COLUMNS.map((column) => [column, null])), ...common, + attempt_id: `${e.series_id}-${sample.sample_index}`, sample_kind: sample.warmup ? "warmup" : "measured", + sample_index: sample.warmup ? 0 : sample.sample_index, status: "ok", + initialization_time_ms: sample.initialization_time_ms, witness_time_ms: sample.witness_time_ms, + prover_time_ms: sample.prover_time_ms, verify_time_ms: sample.verify_time_ms, total_time_ms: sample.total_time_ms, + input_to_proof_time_ms: sample.input_to_proof_time_ms, peak_memory_mib: sample.peak_memory_mib, + proof_size_bytes: sample.proof_size_bytes, circuit_size_bytes: e.artifacts.proving_payload_size_bytes, + artifact_size_bytes: e.artifacts.artifact_size_bytes, bundle_size_bytes: e.artifacts.bundle_size_bytes, + failure_code: "", failure_detail: "", + } as Row)); +} + +export function validateCandidate(baseline: Row[], candidate: Row[]) { + const expected = new Set(expectedSeries()); + const grouped = new Map(); + for (const row of candidate) { + const id = rowSeries(row); + assert(expected.has(id), `candidate contains unexpected series ${id}`); + grouped.set(id, [...(grouped.get(id) ?? []), row]); + } + assert(grouped.size === 72, `candidate has ${grouped.size}/72 logical series`); + for (const id of expected) { + const rows = grouped.get(id)!; + if (rows.length === 1 && rows[0].sample_kind === "gap") { + for (const metric of ["witness_time_ms", "prover_time_ms", "input_to_proof_time_ms", "peak_memory_mib", "proof_size_bytes", "circuit_size_bytes"] as const) assert(rows[0][metric] == null, `${id}: gap metric ${metric} must be blank`); + continue; + } + assert(rows.length === 6, `${id}: requires 6 successful rows or one explicit gap, found ${rows.length}`); + assert(rows.every((row) => row.status === "ok"), `${id}: successful series contains non-ok row`); + } + const replace = new Set(replacementSeries); + const baselineKept = baseline.filter((row) => !replace.has(rowSeries(row))); + const candidateKept = candidate.filter((row) => !replace.has(rowSeries(row))); + assert(JSON.stringify(candidateKept) === JSON.stringify(baselineKept), "candidate changed rows outside native Circom replacement scope"); + for (const id of replacementSeries) { + const rows = grouped.get(id)!; + assert(rows.every((row) => row.prover_backend === config.prover_backend && row.witness_backend === config.witness_backend), `${id}: retained a non-TACEO native Circom row`); + } +} + +export async function buildCandidate(options: { baselinePath?: string; evidenceDir?: string; outputPath?: string; write?: boolean } = {}) { + const baselinePath = resolve(options.baselinePath ?? baselineDefault); + const evidenceDir = resolve(options.evidenceDir ?? evidenceDefault); + const outputPath = resolve(options.outputPath ?? outputDefault); + const baseline = readRows(await Bun.file(baselinePath).text()); + const replacements: Row[] = []; + for (const id of replacementSeries) { + const path = resolve(evidenceDir, `${id}.json`); + assert(await Bun.file(path).exists(), `missing TACEO evidence: ${path}`); + const bytes = new Uint8Array(await Bun.file(path).arrayBuffer()); + let evidence: Evidence; + try { evidence = JSON.parse(new TextDecoder().decode(bytes)); } + catch (error) { throw new Error(`${path}: invalid JSON: ${error}`); } + validateEvidence(evidence, id, path); + replacements.push(...makeRows(evidence, path, sha256(bytes))); + } + const replace = new Set(replacementSeries); + const candidate = [...baseline.filter((row) => !replace.has(rowSeries(row))), ...replacements]; + validateCandidate(baseline, candidate); + if (options.write !== false) await Bun.write(outputPath, writeRows(candidate)); + return { rows: candidate, outputPath, replacementSeries: [...replacementSeries] }; +} + +export { replacementSeries }; + +if (import.meta.main) { + const result = await buildCandidate({ + baselinePath: process.env.TACEO_BASELINE_CSV, + evidenceDir: process.env.TACEO_EVIDENCE_DIR, + outputPath: process.env.TACEO_CANDIDATE_CSV, + }); + console.log(`${result.outputPath}: ${result.rows.length} rows, 72 series, ${result.replacementSeries.length} native Circom series replaced`); +} diff --git a/benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.pre-taceo-oprf-20260814.csv b/benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.pre-taceo-oprf-20260814.csv new file mode 100644 index 000000000..6c09e95eb --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.pre-taceo-oprf-20260814.csv @@ -0,0 +1,418 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path,timing_mode,input_to_proof_time_ms +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,2842.120000001043,1049.1049999985844,3412.5250000003725,117.99000000022352,7303.75,1416.921875,993532,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7303.75 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,2843.0149999987334,1054.925000000745,3336.464999999851,115.00499999895692,7234.404999999329,1413.21875,992764,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7234.404999999329 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,2966.2099999990314,1293.480000000447,5916.785000000149,248.48499999940395,10176.474999999627,1420.65625,992976,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10176.474999999627 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,3724.609999999404,1383.6300000008196,4081.754999998957,158.14499999955297,9189.99499999918,1419.609375,994300,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,9189.99499999918 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,2845.2599999997765,1049.1100000012666,7035.0999999996275,183.36500000022352,10929.47000000067,1419.28125,993444,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10929.47000000067 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,2926.5499999988824,1043.7250000014901,4237.64999999851,176.7299999985844,8207.924999998882,1420.109375,992764,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,8207.924999998882 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1102.394999999553,1050.0649999994785,4727.995000001043,212.54000000096858,6880.4550000000745,1608.015625,999632,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6880.4550000000745 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1278,845.375,5043.015000000596,193.625,7166.390000000596,1608.015625,991652,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7166.390000000596 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1296.464999999851,837.320000000298,5037,188.37000000104308,7170.790000000969,1608.015625,994596,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7170.790000000969 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1419.265000000596,847.160000000149,4606.530000001192,203.87999999895692,6872.960000000894,1608.015625,993188,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6872.960000000894 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1471.960000000894,856.9949999991804,4651.714999999851,276.445000000298,6980.680000001565,1608.015625,995280,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6980.680000001565 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1389.769999999553,853.2999999988824,4474.6850000005215,171.2649999987334,6717.754999998957,1608.015625,994212,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6717.754999998957 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,4348.745,712.235,4976.885,1633.795,10037.865,1735.34375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10037.865 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2858.755,710.165,8026.005,1542.55,11594.925,1723,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,11594.925 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2587.665,760.585,5524.04,1231.715,8872.29,1796.5,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,8872.29 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,3637.7,709.45,6380.82,1819.1,10727.97,1726.03125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10727.97 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2077.69,711.37,3863.43,1273.755,6652.49,1792.515625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6652.49 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2128.095,706.23,6831.17,1896.58,9665.495,1734.90625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,9665.495 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,745.05,4944.695,0,5689.8,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5689.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,645.265,5698.31,0,6343.62,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6343.62 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,725.91,5898.43,0,6624.385,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6624.385 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,924.91,5710.09,0,6635.05,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6635.05 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,678.5,6780.515,0,7459.05,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,7459.05 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,733.24,5886.9,0,6620.185,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6620.185 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,11.4,4416.835,16579.795,19.46,21008.03,14760.9375,1441,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,21008.03 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,7.95,4300.735,13689.82,17.665,17998.505,15044.921875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,17998.505 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,6.095,4306.37,12557.965,16.465,16870.43,15168.8125,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,16870.43 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,9.255,4454.065,15041.63,18.3,19504.95,14813.609375,1441,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,19504.95 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,5.645,4261.645,11047.29,11.54,15314.58,15569.78125,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15314.58 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,7.26,4299.855,16407.645,15.345,20714.76,15893.671875,1450,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,20714.76 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4364.78,15077.205,21.55,19442.24,15174.21875,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,19442.24 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,5048.455,16275.19,12.84,21323.915,15174.21875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,21323.915 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4316.945,11655.63,11.43,15972.8,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,15972.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4267.2,14298.215,21.66,18565.625,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,18565.625 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4448.685,12469.445,18.435,16918.345,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,16918.345 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4656.93,14999.81,15.19,19660.13,15174.21875,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,19660.13 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1622.155000001192,821.625,1708.1150000002235,91.07000000029802,4151.895000001416,887.65625,961017,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4151.895000001416 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1876.5550000015646,863.4749999996275,2735.339999999851,157,5475.370000001043,885.640625,960377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5475.370000001043 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1978.160000000149,858.0500000007451,2795.269999999553,137.18500000052154,5631.480000000447,884.828125,962809,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5631.480000000447 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,2322.0200000014156,924.875,2671.699999999255,130.57499999925494,5918.595000000671,885.421875,960721,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5918.595000000671 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1575.8499999996275,789.035000000149,2135.5200000014156,103.67999999970198,4500.405000001192,886.015625,960549,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4500.405000001192 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1558.5550000015646,790.3249999992549,2642.1199999991804,177.17999999970198,4991,881.140625,963833,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4991 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,554.570000000298,791.8149999994785,2604.7599999997765,100.02500000037253,3951.1500000003725,1033.078125,962085,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3951.1500000003725 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,627.5750000011176,641.9700000006706,1930.6199999991804,89.50499999895692,3200.1699999999255,1033.078125,967377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3200.1699999999255 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,622.910000000149,638.0800000000745,1897.769999999553,122.30000000074506,3158.765000000596,1033.078125,965157,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3158.765000000596 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,709.3000000007451,696.6549999993294,2027.339999999851,88.50500000081956,3433.2949999999255,1033.078125,967121,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3433.2949999999255 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,629.6500000003725,626.6699999999255,1691.1150000002235,87.52999999932945,2947.4350000005215,1033.078125,960081,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2947.4350000005215 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,621.5750000011176,626.6300000008196,1825.390000000596,82.08499999903142,3073.605000000447,1033.078125,960165,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3073.605000000447 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2916.98,552.065,2213.25,702.77,5682.295,1430.578125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5682.295 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2141.505,536.83,2088.175,668.555,4766.51,1403.203125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4766.51 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2354.715,535.86,2067.005,660.255,4957.58,1403.03125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4957.58 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2234.14,544.745,2088.39,659.525,4867.275,1400.828125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4867.275 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2889.57,544.465,2114.875,660.43,5548.91,1402.609375,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5548.91 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2350.105,540.185,2061.27,666.545,4951.56,1428.515625,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4951.56 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,423.71,1908.505,0,2332.245,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2332.245 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,420.66,1922.74,0,2343.43,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2343.43 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,421.22,1889.3,0,2310.545,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2310.545 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,422.685,1893.075,0,2315.79,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2315.79 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,422.365,1914.91,0,2337.32,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2337.32 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,421.46,1896.29,0,2317.765,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2317.765 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,4.1,3941.765,8451.815,6.63,12397.68,14436.53125,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12397.68 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.2,3979.935,8573.535,6.4,12555.67,14977.96875,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12555.67 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.29,3990.985,8595,6.45,12588.275,14629.671875,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12588.275 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,2.6,4003.765,8502.03,7.605,12508.395,14588.578125,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12508.395 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,2.835,4043.31,8677.805,6.39,12723.95,14386.03125,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12723.95 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,3.035,4000.415,8485.75,6.555,12489.2,15473.25,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12489.2 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4012.1,8717.49,6.325,12729.71,15019.90625,720,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12729.71 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,3988.105,8483.55,6.95,12471.8,15019.90625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12471.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4044.51,8580.92,5.825,12625.545,15019.90625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12625.545 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4018.445,8761.28,5.825,12779.825,15019.90625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12779.825 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4029.195,8587.455,13.035,12616.765,15019.90625,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12616.765 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4001.05,8682.295,5.76,12683.45,15019.90625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12683.45 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1102.2249999977648,1399.0800000000745,506.47000000067055,49.955000000074506,3007.77499999851,601.46875,845390,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3007.77499999851 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1112.339999999851,1406.695000000298,499.23000000044703,50.93999999947846,3018.265000000596,601.828125,849014,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3018.265000000596 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1122.7799999993294,1401.7249999996275,538.410000000149,48.63499999977648,3062.914999999106,599.890625,848206,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3062.914999999106 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1119.824999999255,1411.894999999553,491.42500000074506,49.11500000022352,3023.144999999553,600.46875,845302,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3023.144999999553 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1125.464999999851,1418.699999999255,498.2450000010431,50.519999999552965,3042.410000000149,601,849826,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3042.410000000149 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1116.035000000149,1412.355000000447,491.714999999851,49.665000000968575,3020.105000000447,600.71875,846454,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3020.105000000447 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,364.76999999955297,1398.605000000447,490.695000000298,49.25,2254.0800000000745,744.796875,844918,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2254.0800000000745 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,364.5300000011921,1343.714999999851,435.964999999851,44.21499999985099,2144.2200000006706,744.796875,848334,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2144.2200000006706 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,373.6150000002235,1333.690000001341,433.195000000298,42.475000001490116,2140.5050000008196,744.796875,848802,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2140.5050000008196 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,365.8700000010431,1325.429999999702,427.99499999918044,43.05000000074506,2119.2949999999255,744.796875,848462,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2119.2949999999255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,364.25,1319.949999999255,424.179999999702,41.665000000968575,2108.394999999553,744.796875,847266,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2108.394999999553 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,364.7600000016391,1326.844999998808,454.5049999989569,52.91000000014901,2146.1150000002235,744.796875,846414,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2146.1150000002235 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2874.525,609.985,1589.755,512.375,5074.265,1283.734375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5074.265 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2113.02,592.025,1290.605,411.71,3995.65,1277.78125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,3995.65 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2187.07,586.075,1299.35,402.915,4072.495,1279.1875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4072.495 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2291.4,590.185,1309.965,409.05,4191.55,1280.671875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4191.55 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2265.82,590.995,1272.485,407.635,4129.3,1285.4375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4129.3 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2254.585,590.63,1280.035,433.58,4125.25,1279.1875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4125.25 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,527.085,1345.135,0,1872.255,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1872.255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,529.895,1297.735,0,1827.67,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1827.67 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,525.56,1253.17,0,1778.755,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1778.755 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,530.225,1258.44,0,1788.705,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1788.705 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,523.49,1362.685,0,1886.21,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1886.21 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,525.145,1343.915,0,1869.085,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1869.085 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,3.825,128.76,1409.79,6.28,1542.375,3642.625,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1542.375 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.54,125.145,1407.61,6.205,1535.295,3526.3125,722,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1535.295 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.43,125.14,1357.23,6.185,1484.8,3703.40625,726,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1484.8 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,2.57,124.77,1383.9,6.375,1511.24,3444.484375,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1511.24 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,2.605,130.03,1409.48,6.205,1542.115,3625.328125,722,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1542.115 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,2.26,127.155,1428.825,6.09,1558.24,3367.109375,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1558.24 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,125.645,1402.39,5.865,1528.385,3240.375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1528.385 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,126.58,1359.86,5.83,1486.95,3240.375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1486.95 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,125.71,1353,5.775,1479.255,3240.375,726,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1479.255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,126.835,1361.78,5.76,1489.14,3240.375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1489.14 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,124.985,1369.025,6.115,1494.575,3240.375,725,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1494.575 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,128,1336.785,5.745,1465.28,3240.375,719,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1465.28 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1616.809999998659,1637.0100000016391,1810.684999998659,88.18999999947846,5064.504999998957,972.234375,975568,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5064.504999998957 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1625.339999999851,1645.684999998659,1764.335000000894,83.01500000059605,5035.359999999404,966.484375,969336,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5035.359999999404 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1624.2799999993294,1640.5400000009686,1824.894999999553,85.48000000044703,5089.714999999851,969.21875,973092,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5089.714999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1610.9700000006706,1636.7649999987334,1841.6000000014901,88.2350000012666,5089.335000000894,970.484375,973604,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5089.335000000894 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1614.519999999553,1652.5,1762.0499999988824,83.30499999970198,5029.069999998435,970.859375,972708,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5029.069999998435 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1607.535000000149,1635.164999999106,1840.355000000447,84.55499999970198,5083.054999999702,965.53125,972664,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5083.054999999702 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,597.4350000005215,1611.844999998808,1764.6850000005215,80.91000000014901,3973.964999999851,1057.625,976720,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3973.964999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,594.089999999851,1218.7050000000745,1669.4199999999255,81.71499999985099,3482.214999999851,1057.625,971256,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3482.214999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,592.8300000000745,1223.0499999988824,1678.910000000149,73.68500000052154,3494.7949999999255,1057.625,972112,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3494.7949999999255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,592.875,1224.1650000009686,1695.5099999997765,73.42999999970198,3512.554999999702,1057.625,972024,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3512.554999999702 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,602.2899999991059,1220.445000000298,1658.9000000003725,73.1699999999255,3481.6349999997765,1057.625,972240,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3481.6349999997765 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,606.5800000000745,1229.515000000596,1702.125,73.20999999903142,3538.2249999996275,1057.625,975096,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3538.2249999996275 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2310.06,1291.51,2047.705,635.2,5649.275,1415.90625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5649.275 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2363.25,1290.04,2062.965,635.955,5716.255,1416.578125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5716.255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2282.265,1283.095,2083.845,637.12,5649.205,1416.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5649.205 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2092.845,1278.405,2095.845,679.85,5467.095,1441.609375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5467.095 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2149.255,1277.985,2071.745,639.71,5498.985,1414.421875,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5498.985 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2101.3,1273.695,2074.26,633.575,5449.255,1415.890625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5449.255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,1034.07,1801.57,0,2835.67,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2835.67 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,1026.735,1780.15,0,2806.915,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2806.915 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,1031.615,1799.2,0,2830.845,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2830.845 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,1040.36,2184.33,0,3224.73,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,3224.73 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,1061.88,1884.545,0,2946.455,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2946.455 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,1044.965,1866.935,0,2911.925,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2911.925 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-gap,2026-08-12T12:43:50.009Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,gap,,runtime_failed,,,,,,,,,,,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16","{""raw_evidence_sha256"":""b6a994516dc5a9e7f59d2fb67434402197b569ff71a9924d7789bd1b0f54f7ef""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.",out_of_memory,"The 16-worker SnarkJS WebAuthn attempt did not produce a proof. The dedicated Chrome renderer reached 14,559,360 KiB RSS (10.4 GiB current physical footprint; 21.7 GiB peak), then remained CPU-idle with all worker threads sleeping for 18 minutes 59 seconds. The attempt was terminated after preserving process evidence; no timing was recorded.",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-gap,2026-08-12T12:43:50.009Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,gap,,not_run,,,,,,,,,,,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16","{""raw_evidence_sha256"":""5fbc6616d8d3e872d396948d811baf33977b263da165b0b2e13c840526670f83""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.",blocked_by_cold_failure,Warm-reuse measurements were not started because the required fixed-16 cold WebAuthn attempt stalled in the renderer before producing a valid proof.,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,5561.899083,,5561.899083,1012.59375,738899,4246785,3974928,4246785,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,5561.899083 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,6721.897208,,6721.897208,1032.640625,739119,4242061,3970204,4242061,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6721.897208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,6744.484625,,6744.484625,1021.984375,738515,4297357,4025500,4297357,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6744.484625 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,6786.961709,,6786.961709,1018.59375,740692,4280029,4008172,4280029,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6786.961709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,7751.007208,,7751.007208,1028.75,739227,4199409,3927552,4199409,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,7751.007208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,7404.360792,,7404.360792,1022.75,739919,4237853,3965996,4237853,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,7404.360792 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,4706.155042,,4706.155042,,737829,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,4706.155042 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,6449.621417,,6449.621417,1036.625,741414,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6449.621417 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,6485.354208,,6485.354208,1058.1875,739392,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6485.354208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,6428.335125,,6428.335125,1074,740525,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6428.335125 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,6479.023709,,6479.023709,1090.65625,738544,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6479.023709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,6415.690167,,6415.690167,1096.0625,742373,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6415.690167 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,452.420083,6643.58075,,7096.001,862.4375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7096.001 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,503.480542,7514.892833,,8018.373459,859.15625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8018.373459 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,503.247291,7648.712417,,8151.95975,872.140625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8151.95975 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,503.200875,7473.9845,,7977.1855,857.0625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7977.1855 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,521.086042,7572.189625,,8093.275709,853.5,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8093.275709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,503.777375,7113.808542,,7617.586041,855.5,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7617.586041 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,457.751292,7447.586333,,7905.337833,,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7905.337833 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,482.815042,7496.62,,7979.435125,884.5625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7979.435125 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,515.780959,7643.547334,,8159.328416,891.953125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8159.328416 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,504.39725,7713.985542,,8218.382875,891.890625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8218.382875 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,511.586792,7285.887125,,7797.474042,891.96875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7797.474042 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,509.84,7720.695958,,8230.536,891.921875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8230.536 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-0,2026-08-10T06:45:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,6204.0834589999995,12047.987208,,18252.071,292.15625,2503,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f15435d7eea73d90fd4ba48d1973332befab2942e678a2d1c9ba97025ee8e47a"",""session_sha256"":""a6cb544430ac889396c197e5911935405973c3b58dc72f4927b38e04a7371a5c"",""build_sha256"":""57646c86fcfa271858e72600fbe83068a7e267f1b19ceb22fc804a9431f58bbc""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd/3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-0/circom-register-verified/appium-3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd/session-3e98af9d0a87e21ddcbe8d4b8a21f5e7a9e323dd/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18252.071 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-1,2026-08-10T06:47:17.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6195.8720410000005,11553.437291000002,,17749.309458,292.109375,2500,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""b8d3f501b6ada217a8ed3fa88253b6fb470fddec16049e946f20592c74737d2d"",""session_sha256"":""484488bae00495d20f19b231d3236ad024e8082be83943d8a04a74d63a71135c"",""build_sha256"":""239f31d606340cc6dcb7f4003b087b2e8997d4c4338cbc6d84764b3069a073ce""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-d0cc69cff747b3205e2988f8429ad3a074625c9d/d0cc69cff747b3205e2988f8429ad3a074625c9d;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-1/circom-register-verified/appium-d0cc69cff747b3205e2988f8429ad3a074625c9d/session-d0cc69cff747b3205e2988f8429ad3a074625c9d/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,17749.309458 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-2,2026-08-10T06:48:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6185.364084,11846.453625,,18031.817875,292.171875,2499,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""aeaf9b2f942364bec89faf8ecedb9c8f93f4afabad49d1de325c7ef3c4614443"",""session_sha256"":""f13eaf78f614e66fdc1cf46584214ebc633026846b05570da4036762e6b16b56"",""build_sha256"":""be1a34897581ba40522b77c4519e7f2c475e425ab186cb02f14287a8efea8a84""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-f30a96f15aa4f591963a4feae1e7f3966d357a33/f30a96f15aa4f591963a4feae1e7f3966d357a33;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-2/circom-register-verified/appium-f30a96f15aa4f591963a4feae1e7f3966d357a33/session-f30a96f15aa4f591963a4feae1e7f3966d357a33/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18031.817875 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-3,2026-08-10T06:49:46.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6216.887,11949.56025,,18166.447374,292.296875,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bad22c058133b58cb7addea28485fe705279d136be1cfd816cc541a6e254570e"",""session_sha256"":""011e8c4336cad753523c687f98f32fe1ca633722a6f59a8f06e58d8b925960e4"",""build_sha256"":""1524ad1b29605dbce9e37268ab3a8f85f499cc005969e592d651056f5c6e6edb""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-7009179e108287e74bf3a9df29ec22d930291a89/7009179e108287e74bf3a9df29ec22d930291a89;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-3/circom-register-verified/appium-7009179e108287e74bf3a9df29ec22d930291a89/session-7009179e108287e74bf3a9df29ec22d930291a89/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18166.447374 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-4,2026-08-10T06:50:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6207.269458,11582.274332,,17789.544,292.28125,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""aac371ceb2b71c3b1b026f3454bab51fe48a9a29b38068459d6af62f04abbd0c"",""session_sha256"":""dc1d5e6917f5bd4b97a03bec97f6c308078ad6c87322359e55e463e0c91d1a33"",""build_sha256"":""8c48e0207a4a33ca620a0cae925fc3775c862cc521f98e93a9bdeb42a03b010e""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-e8421f4be5aa264d4cc7856838b3aa3c3d8acda7/e8421f4be5aa264d4cc7856838b3aa3c3d8acda7;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-4/circom-register-verified/appium-e8421f4be5aa264d4cc7856838b3aa3c3d8acda7/session-e8421f4be5aa264d4cc7856838b3aa3c3d8acda7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,17789.544 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-5,2026-08-10T06:51:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6208.870208,11830.389833000001,,18039.26025,292.21875,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""8055b1bf76302f0375633f84231c619ef95129e9bae4dc9218c5a4021ab25d29"",""session_sha256"":""ddf1b655ac6f35f43ba018ede47f22ef9cba21111cddbae201c60423c5dcbe87"",""build_sha256"":""016fce7a56fab3dc0f5a40371ef960db9ea92032a4897752d1de6ca33c876d81""},{""report_sha256"":""6eb68f4417771dbcfc1adaacf302737ca34abea84bfe6c375a22a69a38d4f796"",""session_sha256"":""68ffa79ea3669cb1a9ed54bd96247419d5aace532fbf22100bf475cb82cf61a1"",""build_sha256"":""daa3f348d35de6f071b436aebad2a4bf0b7204231cf38380d16ba1a34154c62b""}]}",appium-d03af49f0f1418a0b40a8743f05857ef189383f7/d03af49f0f1418a0b40a8743f05857ef189383f7;0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/16850982dd3bf0fbdeaced7c317995c643f14920,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/run-5/circom-register-verified/appium-d03af49f0f1418a0b40a8743f05857ef189383f7/session-d03af49f0f1418a0b40a8743f05857ef189383f7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/0cfedf3f137d5f7a4ba35cb5d0c1a5703a1aeb45/session-16850982dd3bf0fbdeaced7c317995c643f14920/bench-report.json,cold_local,18039.26025 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,6132.7222919999995,11035.131125,,17167.853751,,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17167.853751 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6154.406542,11329.655666999999,,17484.062375,289.75,2500,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17484.062375 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6159.8206660000005,11483.373458000002,,17643.194292,289.796875,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17643.194292 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6162.827834,11630.165292000002,,17792.993334,289.875,2504,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17792.993334 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6188.240625,11671.697417,,17859.938209,289.875,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17859.938209 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-09T09:53:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6198.617625,11754.712708000001,,17953.330709,289.875,2502,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""31ecf6a655d66fa13e0356c4975b9f4220ebef96e7cd7c3d1ffcee5c30bf4864"",""session_sha256"":""a848e9fa3b30c123cbef834199a4f8799c3fc6e44ee5c18c01a53da1239ac520"",""build_sha256"":""9f2b7c1614434a45b3912430c8e7116efc0c51d4250de3ef4bf98dc0598ad22c""},{""report_sha256"":""7a3d56ba6ac8f25b3614eacf62872d82301e6fbd093a5e8079f2d4e57f9e3004"",""session_sha256"":""62e48458321e5e9b974089f1308ccbb6bc2c550b2371db2ca0d7b418a0bab2e4"",""build_sha256"":""3764cc0a8a9a5c956f7820ee53f41ea47b733c212114219ffdd75026a55100cc""}]}",69bdcd9e678722b46af512daa6526f1e736fbb4a/20e2dc5b59381b668a6448a99351ab9454069ce7;ed93cc01e6c2bd8037b41e75111e0d42e2642541/d321c03c0eb324fe88d2e84b2e24bf9cebf60190,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-register/69bdcd9e678722b46af512daa6526f1e736fbb4a/session-20e2dc5b59381b668a6448a99351ab9454069ce7/bench-report.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/ed93cc01e6c2bd8037b41e75111e0d42e2642541/session-d321c03c0eb324fe88d2e84b2e24bf9cebf60190/bench-report.json,warm_reuse,17953.330709 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2172.8525,,2172.8525,530.65625,716750,2578799,2331760,2578799,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2172.8525 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2242.035291,,2242.035291,527.359375,716187,2514819,2267780,2514819,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2242.035291 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2898.778958,,2898.778958,526.703125,715938,2573939,2326900,2573939,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2898.778958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,2410.340917,,2410.340917,530.140625,714941,2565007,2317968,2565007,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2410.340917 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,2929.068875,,2929.068875,530.640625,715885,2547371,2300332,2547371,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2929.068875 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,2426.808625,,2426.808625,536.59375,715147,2519239,2272200,2519239,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2426.808625 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2137.248125,,2137.248125,,717410,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2137.248125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2242.047,,2242.047,538.09375,714730,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2242.047 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2244.620417,,2244.620417,556.046875,718955,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2244.620417 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,2315.447916,,2315.447916,568.015625,713994,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2315.447916 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,2304.393875,,2304.393875,573.609375,717286,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2304.393875 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,2322.712625,,2322.712625,575.828125,717635,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2322.712625 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,283.588792,4691.273167,,4974.862125,491.59375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4974.862125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,288.769333,4321.633625,,4610.403042,496.984375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4610.403042 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,307.65025,4593.549125,,4901.1995,481.046875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4901.1995 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,300.4865,4444.501334,,4744.987958,493.78125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4744.987958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,317.124917,4704.524709,,5021.64975,488.078125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,5021.64975 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,305.928125,4811.90775,,5117.835958,487.609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,5117.835958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,278.133166,4241.928583,,4520.062375,,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4520.062375 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,308.967083,4330.398917,,4639.366125,490.84375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4639.366125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,315.864333,4321.75475,,4637.619209,491.15625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4637.619209 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,318.497667,4321.779917,,4640.277709,491.171875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4640.277709 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,333.711875,4346.148625,,4679.860584,491.234375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4679.860584 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,314.228041,4364.101459,,4678.3295,491.265625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4678.3295 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-0,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,6008.152458,7739.520708,,13747.673208,293.5625,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,13747.673208 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-1,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6010.293625,8005.910458,,14016.204209,290.375,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14016.204209 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-2,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6014.683375,8144.886375,,14159.569834,290.34375,931,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14159.569834 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-3,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6032.077167,8303.620458,,14335.697667,290.453125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14335.697667 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-4,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6050.001375,8364.070791,,14414.072208,290.578125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14414.072208 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__cold_local-5,2026-08-09T16:24:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6044.670125,8409.414125,,14454.084375,290.375,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""740bd97276ad0f36434021b6d6261536faa01b14033462453f0663a7d7536abf"",""session_sha256"":""664ddb5306ad82059a49aeb002d7127c73f4d200f347f03a06f274fa20702fb8"",""build_sha256"":""baf5275da943b8f9a2b49a48a3fd72565d79e0edbabf7056a1c82be1a8411880""}]}",77d45d1a6593f396e64f2d3d11e8ab9572756b10/61b59a55f95ce051c3eb8d9b930f34ce526693ef,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/77d45d1a6593f396e64f2d3d11e8ab9572756b10/session-61b59a55f95ce051c3eb8d9b930f34ce526693ef/bench-report.json,cold_local,14454.084375 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,5996.592333,7797.286875,,13793.879541,,932,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,13793.879541 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,6012.239375,8049.649292,,14061.888791,293.9375,925,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14061.888791 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,6032.486083,8203.367833,,14235.854042,293.9375,926,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14235.854042 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,6050.944667,8270.582666,,14321.527417,293.9375,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14321.527417 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,6056.481625,8337.024417,,14393.506166,293.953125,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14393.506166 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-08T11:42:39.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,6061.639,8389.270083,,14450.909209,293.953125,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""bea0927c8a1e2e55d12d2cfe6894cdb1d23a00e822e633cac744a7a08063db7f"",""session_sha256"":""a4cdea97c713e83dc843265ba2fdbed79aa79b54bd22a224f343eabf94462a01"",""build_sha256"":""0ded71df4edf01ae0137eb03393cbcaa2474a850127e716dc9d35ca1daf5326b""}]}",a94c7f6f3ec47793695d9b9ddee2b9510623a79c/4ae32f672043546cc90dacde0ace3d0a61dcfb9d,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-core/a94c7f6f3ec47793695d9b9ddee2b9510623a79c/session-4ae32f672043546cc90dacde0ace3d0a61dcfb9d/bench-report.json,warm_reuse,14450.909209 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,1140.392959,,1140.392959,143.328125,632660,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1140.392959 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,919.743542,,919.743542,142.671875,634964,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,919.743542 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,1254.2595,,1254.2595,141.125,635604,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1254.2595 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,1199.335791,,1199.335791,141.90625,635764,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1199.335791 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,1337.309875,,1337.309875,141.453125,629195,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1337.309875 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,903.116333,,903.116333,144.53125,629740,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,903.116333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,909.477083,,909.477083,,632244,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,909.477083 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,1237.383833,,1237.383833,144.125,634644,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1237.383833 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,1172.487958,,1172.487958,141.921875,630516,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1172.487958 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,1084.921333,,1084.921333,142.34375,636724,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1084.921333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,1242.178792,,1242.178792,145.109375,634580,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1242.178792 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,1423.84775,,1423.84775,145.84375,633588,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1423.84775 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,323.8575,2519.133458,,2842.991,367.453125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2842.991 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,320.633958,2596.478208,,2917.112292,366.46875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2917.112292 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,327.897709,2559.122667,,2887.0205,375.875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2887.0205 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,316.197375,2559.387917,,2875.585416,371.515625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2875.585416 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,329.706041,2680.23325,,3009.939333,373.484375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,3009.939333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,338.01325,2719.800375,,3057.813708,378.375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,3057.813708 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,303.190333,2643.975458,,2947.166042,,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2947.166042 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,307.867584,2645.076833,,2952.944459,384.0625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2952.944459 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,304.529667,2464.748583,,2769.278333,384.171875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2769.278333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,317.14025,2606.420959,,2923.561291,384.953125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2923.561291 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,321.849959,2755.037334,,3076.887375,388.328125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,3076.887375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,318.147167,2719.777166,,3037.924417,387.5625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,3037.924417 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__cold_local-0,2026-08-09T10:16:02.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,warmup,0,ok,,3137.147,1766.501917,,4903.648958,70.40625,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""6960e0bf0baee5c5833721f0b79b9f6a6417471c21ae88497729765e5dde08a3"",""session_sha256"":""620cbe000d8dd6ed7866d2734499806c5a391d8dfb076ca2b1341b89a53ed0d3"",""build_sha256"":""5507aedf0682f39f69e63910b83217407bf719ad3bca0bc297f4affd2745ad45""}]}",649e6285ce47441ce5d8fd200dbd2716af0ce66a/471329edf9291981c6a28e843d4d1d79b8096c6e,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/oprf/649e6285ce47441ce5d8fd200dbd2716af0ce66a/session-471329edf9291981c6a28e843d4d1d79b8096c6e/bench-report.json,cold_local,4903.648958 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__cold_local-1,2026-08-09T10:16:02.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,1,ok,,3240.907541,1783.576708,,5024.484375,69.6875,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""6960e0bf0baee5c5833721f0b79b9f6a6417471c21ae88497729765e5dde08a3"",""session_sha256"":""620cbe000d8dd6ed7866d2734499806c5a391d8dfb076ca2b1341b89a53ed0d3"",""build_sha256"":""5507aedf0682f39f69e63910b83217407bf719ad3bca0bc297f4affd2745ad45""}]}",649e6285ce47441ce5d8fd200dbd2716af0ce66a/471329edf9291981c6a28e843d4d1d79b8096c6e,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/oprf/649e6285ce47441ce5d8fd200dbd2716af0ce66a/session-471329edf9291981c6a28e843d4d1d79b8096c6e/bench-report.json,cold_local,5024.484375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__cold_local-2,2026-08-09T10:16:02.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,2,ok,,3313.103167,1797.285167,,5110.388375,69.71875,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""6960e0bf0baee5c5833721f0b79b9f6a6417471c21ae88497729765e5dde08a3"",""session_sha256"":""620cbe000d8dd6ed7866d2734499806c5a391d8dfb076ca2b1341b89a53ed0d3"",""build_sha256"":""5507aedf0682f39f69e63910b83217407bf719ad3bca0bc297f4affd2745ad45""}]}",649e6285ce47441ce5d8fd200dbd2716af0ce66a/471329edf9291981c6a28e843d4d1d79b8096c6e,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/oprf/649e6285ce47441ce5d8fd200dbd2716af0ce66a/session-471329edf9291981c6a28e843d4d1d79b8096c6e/bench-report.json,cold_local,5110.388375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__cold_local-3,2026-08-09T10:16:02.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,3,ok,,3333.717917,1813.684417,,5147.402375,70.09375,1601,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""6960e0bf0baee5c5833721f0b79b9f6a6417471c21ae88497729765e5dde08a3"",""session_sha256"":""620cbe000d8dd6ed7866d2734499806c5a391d8dfb076ca2b1341b89a53ed0d3"",""build_sha256"":""5507aedf0682f39f69e63910b83217407bf719ad3bca0bc297f4affd2745ad45""}]}",649e6285ce47441ce5d8fd200dbd2716af0ce66a/471329edf9291981c6a28e843d4d1d79b8096c6e,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/oprf/649e6285ce47441ce5d8fd200dbd2716af0ce66a/session-471329edf9291981c6a28e843d4d1d79b8096c6e/bench-report.json,cold_local,5147.402375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__cold_local-4,2026-08-09T10:16:02.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,4,ok,,3359.839416,1837.023375,,5196.862917,70.296875,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""6960e0bf0baee5c5833721f0b79b9f6a6417471c21ae88497729765e5dde08a3"",""session_sha256"":""620cbe000d8dd6ed7866d2734499806c5a391d8dfb076ca2b1341b89a53ed0d3"",""build_sha256"":""5507aedf0682f39f69e63910b83217407bf719ad3bca0bc297f4affd2745ad45""}]}",649e6285ce47441ce5d8fd200dbd2716af0ce66a/471329edf9291981c6a28e843d4d1d79b8096c6e,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/oprf/649e6285ce47441ce5d8fd200dbd2716af0ce66a/session-471329edf9291981c6a28e843d4d1d79b8096c6e/bench-report.json,cold_local,5196.862917 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__cold_local-5,2026-08-09T10:16:02.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,5,ok,,3368.4635,1843.57575,,5212.039375,69.71875,1606,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""6960e0bf0baee5c5833721f0b79b9f6a6417471c21ae88497729765e5dde08a3"",""session_sha256"":""620cbe000d8dd6ed7866d2734499806c5a391d8dfb076ca2b1341b89a53ed0d3"",""build_sha256"":""5507aedf0682f39f69e63910b83217407bf719ad3bca0bc297f4affd2745ad45""}]}",649e6285ce47441ce5d8fd200dbd2716af0ce66a/471329edf9291981c6a28e843d4d1d79b8096c6e,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/oprf/649e6285ce47441ce5d8fd200dbd2716af0ce66a/session-471329edf9291981c6a28e843d4d1d79b8096c6e/bench-report.json,cold_local,5212.039375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-07T23:00:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,warmup,0,ok,,3114.565208,1765.670708,,4880.236042,,1602,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f141b7a289fd42022d25c599b81eb18c2bf1e9d0aeaa9cd5afd049185774bd0f"",""session_sha256"":""0c0df0385733fc02e89f84d30102cfd813981e5ab7939535a1d629b5e9c928ca"",""build_sha256"":""67a3898663e3a3c7e05980f30cbb71d10d175bfbe89e0bae0301a05dc83cd976""}]}",0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/3de6c106ecb73240df42f3557e49a17c47a8be8b,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-oprf/0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/session-3de6c106ecb73240df42f3557e49a17c47a8be8b/bench-report.json,warm_reuse,4880.236042 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-07T23:00:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,1,ok,,3214.494,1773.606625,,4988.100708,69.6875,1601,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f141b7a289fd42022d25c599b81eb18c2bf1e9d0aeaa9cd5afd049185774bd0f"",""session_sha256"":""0c0df0385733fc02e89f84d30102cfd813981e5ab7939535a1d629b5e9c928ca"",""build_sha256"":""67a3898663e3a3c7e05980f30cbb71d10d175bfbe89e0bae0301a05dc83cd976""}]}",0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/3de6c106ecb73240df42f3557e49a17c47a8be8b,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-oprf/0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/session-3de6c106ecb73240df42f3557e49a17c47a8be8b/bench-report.json,warm_reuse,4988.100708 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-07T23:00:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,2,ok,,3284.978,1791.698292,,5076.676375,70.359375,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f141b7a289fd42022d25c599b81eb18c2bf1e9d0aeaa9cd5afd049185774bd0f"",""session_sha256"":""0c0df0385733fc02e89f84d30102cfd813981e5ab7939535a1d629b5e9c928ca"",""build_sha256"":""67a3898663e3a3c7e05980f30cbb71d10d175bfbe89e0bae0301a05dc83cd976""}]}",0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/3de6c106ecb73240df42f3557e49a17c47a8be8b,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-oprf/0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/session-3de6c106ecb73240df42f3557e49a17c47a8be8b/bench-report.json,warm_reuse,5076.676375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-07T23:00:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,3,ok,,3341.195458,1826.60575,,5167.801292,70.359375,1605,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f141b7a289fd42022d25c599b81eb18c2bf1e9d0aeaa9cd5afd049185774bd0f"",""session_sha256"":""0c0df0385733fc02e89f84d30102cfd813981e5ab7939535a1d629b5e9c928ca"",""build_sha256"":""67a3898663e3a3c7e05980f30cbb71d10d175bfbe89e0bae0301a05dc83cd976""}]}",0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/3de6c106ecb73240df42f3557e49a17c47a8be8b,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-oprf/0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/session-3de6c106ecb73240df42f3557e49a17c47a8be8b/bench-report.json,warm_reuse,5167.801292 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-07T23:00:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,4,ok,,3385.552125,1840.173458,,5225.725625,70.359375,1602,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f141b7a289fd42022d25c599b81eb18c2bf1e9d0aeaa9cd5afd049185774bd0f"",""session_sha256"":""0c0df0385733fc02e89f84d30102cfd813981e5ab7939535a1d629b5e9c928ca"",""build_sha256"":""67a3898663e3a3c7e05980f30cbb71d10d175bfbe89e0bae0301a05dc83cd976""}]}",0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/3de6c106ecb73240df42f3557e49a17c47a8be8b,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-oprf/0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/session-3de6c106ecb73240df42f3557e49a17c47a8be8b/bench-report.json,warm_reuse,5225.725625 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-07T23:00:57.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,5,ok,,3431.749042,1856.150583,,5287.899667,70.359375,1601,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""f141b7a289fd42022d25c599b81eb18c2bf1e9d0aeaa9cd5afd049185774bd0f"",""session_sha256"":""0c0df0385733fc02e89f84d30102cfd813981e5ab7939535a1d629b5e9c928ca"",""build_sha256"":""67a3898663e3a3c7e05980f30cbb71d10d175bfbe89e0bae0301a05dc83cd976""}]}",0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/3de6c106ecb73240df42f3557e49a17c47a8be8b,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-oprf/0215e61ef3d6180097fb4b6cc4bbe9b5e57d1115/session-3de6c106ecb73240df42f3557e49a17c47a8be8b/bench-report.json,warm_reuse,5287.899667 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2772.417125,,2772.417125,554.265625,714522,2324912,2275692,2324912,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2772.417125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2879.950208,,2879.950208,554.140625,716218,2373452,2324232,2373452,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2879.950208 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2946.604,,2946.604,547.921875,714370,2388132,2338912,2388132,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2946.604 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,3315.102917,,3315.102917,556.03125,716216,2387368,2338148,2387368,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3315.102917 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,3142.408333,,3142.408333,551.21875,717544,2369352,2320132,2369352,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3142.408333 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,3031.44075,,3031.44075,556.375,717723,2386684,2337464,2386684,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3031.44075 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2987.521167,,2987.521167,,712759,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,2987.521167 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,3374.250958,,3374.250958,561.265625,715532,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3374.250958 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,3054.951167,,3054.951167,577.171875,716745,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3054.951167 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,3222.688875,,3222.688875,589.75,715440,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3222.688875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,3016.537291,,3016.537291,591.796875,719840,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3016.537291 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,3171.360292,,3171.360292,592.59375,712265,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3171.360292 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1033.621084,4173.030667,,5206.651875,540.0625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5206.651875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1043.084958,3994.710292,,5037.795458,528.109375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5037.795458 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1072.522292,4008.883292,,5081.405667,554.0625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5081.405667 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1055.143,4061.1945,,5116.337541,532.234375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5116.337541 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1069.207583,4225.806417,,5295.014083,536.609375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5295.014083 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1135.534583,4131.623625,,5267.158292,537.203125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5267.158292 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1022.695417,4024.849833,,5047.545875,,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5047.545875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1091.779125,4019.158917,,5110.938125,566.609375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5110.938125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1130.776875,4098.645125,,5229.422041,570.34375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5229.422041 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1155.52975,3930.39975,,5085.929583,566.734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5085.929583 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1161.810417,4184.801375,,5346.612,581.46875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5346.612 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1180.926959,4172.13675,,5353.063792,585.859375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5353.063792 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-0,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,102420.876125,39876.665209,,142297.541375,872.21875,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,142297.541375 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-1,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,106936.38175,40870.077917,,147806.459792,862,1001,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,147806.459792 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-2,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,111014.192708,41400.739833,,152414.932583,867.203125,1003,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,152414.932583 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-3,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,109002.410042,40991.395834,,149993.805958,866.984375,1000,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,149993.805958 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-4,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,110082.735042,41763.033666,,151845.768833,866.984375,1004,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,151845.768833 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-5,2026-08-09T16:30:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,110299.300084,41123.632709,,151422.932916,866.984375,1004,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""e953fe0a8d3de37d9e90d74c04559d5c867a927de9f126f4efb7520753bac163"",""session_sha256"":""213ee70fc0eb5b10260923b52afe850b275bcbedf644c01fd921e4764ab492eb"",""build_sha256"":""869bf1ba2521efdb5f20700a259335bab0fbb3c1f1fa607264a2b3339b3497cf""}]}",4444b2c60a355abbbdd551a13e259ad5af91721c/f2ff053279bafbd2e85fd4831286e3a647c26f61,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/circom/4444b2c60a355abbbdd551a13e259ad5af91721c/session-f2ff053279bafbd2e85fd4831286e3a647c26f61/bench-report.json,cold_local,151422.932916 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,100787.023042,39877.106875,,140664.130291,,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,140664.130291 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,102831.955084,39591.856292,,142423.8115,869.40625,1001,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,142423.8115 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,103634.922416,39590.931875,,143225.854375,860.1875,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,143225.854375 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,103800.913625,39740.896375,,143541.810125,865.625,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,143541.810125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,104146.095833,40541.362334,,144687.458208,864.765625,1000,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,144687.458208 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-09T09:57:16.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,106845.61075,40982.819958,,147828.431083,865.40625,1003,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""raw_evidence_sha256"":[{""report_sha256"":""a76ff762fef690bdb1c106f00e0e74e8174bb83a26217993fa592570d906d585"",""session_sha256"":""9cf83eea9f2d78a46dfe7ee3ced9ff52c2f3f890dcf20e9ef02ed99473889619"",""build_sha256"":""20b6f304f016be89cbbf49cbdacbe3916dd16901d85785965f8020fc621505ae""}]}",647d562d13e151b65ba2e1668bb78ae525fcc3bf/5d33e9dd67d29491f513c77e94fb309afea72abe,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/circom-webauthn/647d562d13e151b65ba2e1668bb78ae525fcc3bf/session-5d33e9dd67d29491f513c77e94fb309afea72abe/bench-report.json,warm_reuse,147828.431083 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-0,2026-08-09T20:01:36.397Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,150764.229547,,150764.229547,777.4140625,735992,4240241,3968384,4240241,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""8c4eec0aac6ee6700f1f2e366aba6618579c86b3292ebf9b214018903dad9837""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-0/results.json,cold_local,150764.229547 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-1,2026-08-09T20:14:08.206Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,151292.213163,,151292.213163,707.79296875,740608,4188373,3916516,4188373,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""8ebb89be567c08eec7930837e20f75a6a3d410c2a11edfb242f29ebd8c74d914""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-1/results.json,cold_local,151292.213163 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-2,2026-08-09T20:26:39.589Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,152077.526855,,152077.526855,791.62890625,742458,4238025,3966168,4238025,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4f44326cfcfd9aa917784c8c3310f443054d0f13846908e4ddb0dca91bd1fab2""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-2/results.json,cold_local,152077.526855 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-3,2026-08-09T21:34:42.018Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,152313.415163,,152313.415163,771.859375,739838,4211625,3939768,4211625,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""0712859473d19ba69564c6b524c3e7e7b168adb645c8a418576a74cebf98e3a3""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry4-20260809/passport/run-3/results.json,cold_local,152313.415163 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-4,2026-08-09T20:41:20.676Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,150512.474239,,150512.474239,830.234375,737221,4218333,3946476,4218333,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""961dd84deedfd89da331a200760454ff843d2b03bacfeb48c761acaae6945906""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-4/results.json,cold_local,150512.474239 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-5,2026-08-09T20:53:52.047Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,152458.801547,,152458.801547,815.375,739700,4244457,3972600,4244457,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""22ab696bcf14bd0762fca85e6cbba02f0c70f332ce772ed3df8498f87bc5f66d""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-5/results.json,cold_local,152458.801547 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,151892.272316,,151892.272316,,739136,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151892.272316 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,151278.737471,,151278.737471,842.05078125,739427,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151278.737471 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,151264.522855,,151264.522855,879.7734375,738045,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151264.522855 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,152133.721778,,152133.721778,623.71875,741328,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,152133.721778 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,151222.247778,,151222.247778,863.24609375,740506,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151222.247778 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,151117.975086,,151117.975086,895,737789,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151117.975086 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T11:36:22.696Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,2865.287154,203079.489551,,205944.77755,706.30859375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""25b249e2c2da4e08e3bb89806c009a2afa43de3481cbdee454ea4f094a7ab639""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-0/results.json,cold_local,205944.77755 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T11:47:36.110Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,2872.622538,205042.635782,,207915.259704,773.95703125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c0194e04bdc10c8acf271f853cdced7aaa3321ac3c9cf365602b202003b0f4f6""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-1/results.json,cold_local,207915.259704 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T11:58:48.823Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,2895.865616,202800.136936,,205696.003397,744.1015625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""93e05d44ad0729418162f1db79ac4fe9872921d932fb06d2b717e6434e9165cd""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-2/results.json,cold_local,205696.003397 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T12:10:02.560Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,2851.148923,204448.643628,,207299.793551,705.546875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""0c1abf53be299a461d558926f17b8cbb277bcefb52b0beba681ec5e03f1189f7""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-3/results.json,cold_local,207299.793551 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T12:21:11.991Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,2872.618462,203511.816704,,206384.436013,717.3828125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""80baf1a897b600cb94440cc26e21177685766586c0c69c9fe69aed696f8d1ec6""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-4/results.json,cold_local,206384.436013 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T12:32:28.475Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,2858.514462,207933.075474,,210791.590859,711.4765625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d0f3b90a45f3af7afb5f5091d5022f00fcf3fe8da60b32ec9d6a96d813f5abc9""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-5/results.json,cold_local,210791.590859 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,2850.672923,203002.677551,,205853.352243,,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205853.352243 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,2867.334385,202867.789782,,205735.125012,759.42578125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205735.125012 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,2871.198461,202466.879089,,205338.078705,765.3828125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205338.078705 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,2878.200308,203673.143396,,206551.344628,705.96484375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,206551.344628 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,2881.895308,201911.566705,,204793.463089,783.296875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,204793.463089 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,2863.949461,202657.051089,,205521.00132,733.0390625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205521.00132 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-0,2026-08-10T20:05:07.858Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,22770.162616999998,316986.161249,,339756.325328,287.4921875,2502,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""367f6d30d2856c1290fa956ed98038805fed9d77febe599b7bf8f9523e339e43""},{""raw_evidence_sha256"":""2c629da556dd571d88127c2abbda0751fe1835299854e317b68ed5982c7e7336""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-0/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-0/results.json,cold_local,339756.325328 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-1,2026-08-10T20:15:22.523Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,22814.156001000003,316563.82448,,339377.981328,267.12109375,2504,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""66dbbf9de33484be01bbadca381df4d72e0a8e232594d87af924ae11cd3f103a""},{""raw_evidence_sha256"":""c3290e596f6ab0dc50f77eb8ce5446ac4c248eb92593b4c0a44fed6186b15723""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-1/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-1/results.json,cold_local,339377.981328 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-2,2026-08-10T20:25:37.923Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,22781.725541,317217.515096,,339999.24225199997,292.41015625,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""91960ad86c25fbd03b2d498638cf3fe12a43f8f9a50dc36fac4f89854880b449""},{""raw_evidence_sha256"":""add4e077b6069e46031b36a8d4b962e61c693a3dabf6d66c5abdb55510cd2ed9""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-2/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-2/results.json,cold_local,339999.24225199997 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-3,2026-08-10T20:35:56.948Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,22781.040079,317586.012404,,340367.05409600004,296.34375,2497,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""4ef071cda4677b8ad33b66b4a1c29534ae75a73d33b7ebf78311c289fe9bbb1c""},{""raw_evidence_sha256"":""b08e0a71418c1691322d688a6e28209e0c23636f17cfa1245e34d6fec312342b""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-3/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-3/results.json,cold_local,340367.05409600004 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-4,2026-08-10T20:46:13.929Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,22766.413694000003,316793.28925000003,,339559.704328,298.40625,2501,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""cf84107d76860ed7cf1955db87589b50894e0947f49c98cc0e3ee54fdfb75a1f""},{""raw_evidence_sha256"":""a44ebae9eecba28f98c62bfbb4ab5e51f55e92c955097555369bda464cb815f2""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-4/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-4/results.json,cold_local,339559.704328 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-5,2026-08-10T20:56:29.449Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,22762.995386,317206.783481,,339969.780481,291.21484375,2501,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""e98aa230521d813f8c507d0244fbf70244f3a1c3d5e4f9f2332e8d0f1284d346""},{""raw_evidence_sha256"":""1516fd5c363ea5beda32307c12705ef252b9192ecdb0a2f5c98286b9e7e3b936""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-register/run-5/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-disclose/run-5/results.json,cold_local,339969.780481 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,22851.894154999998,316427.88494200003,,339279.781559,,2499,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,339279.781559 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,22846.480925,315078.723019,,337925.205097,292.33203125,2504,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,337925.205097 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,22848.462771000002,315869.995942,,338718.46063600003,273.3984375,2502,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,338718.46063600003 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,22873.333771,316506.086019,,339379.421251,290.46484375,2497,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,339379.421251 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,22868.431617000002,315780.222787,,338648.656021,289.47265625,2498,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,338648.656021 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T13:59:19.860Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,22842.737156,314969.260326,,337811.999021,287.52734375,2505,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5a9c8a023530455b778f44ec5a72a7b0b33bb2cb0a78570b9f8f6799e1257ee3""},{""raw_evidence_sha256"":""da0c30db840c99a3e31ffdc02a878e333a196b1b1cafda35c398acfb3d0ff031""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-register/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-disclose/results.json,warm_reuse,337811.999021 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-0,2026-08-09T19:29:52.352Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,21931.14554,,21931.14554,473.82421875,714537,2544947,2297908,2544947,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""1adc9289e38ec836cebb9e7d02642b2280df2f552341e2d5c48f5e904edd70ee""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-0/results.json,cold_local,21931.14554 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-1,2026-08-09T21:19:58.552Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,37041.281771,,37041.281771,804.08984375,716512,2546303,2299264,2546303,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""499de31c42b13d58caba4c553b037393bd17558d272aba58810a21f88f069836""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry2-20260809/passport-p1/run-1/results.json,cold_local,37041.281771 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-2,2026-08-09T19:36:13.158Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,22010.566386,,22010.566386,475.72265625,714242,2561167,2314128,2561167,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4219d81524f94194e24a572de6701df98acfc2585ab68f1592bd23d6dc7b6a19""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-2/results.json,cold_local,22010.566386 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-3,2026-08-09T19:40:23.451Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,22004.165925,,22004.165925,470.55078125,717141,2534723,2287684,2534723,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""abb6d31172c9eb62445880fa1681bdee7a44e701428f15a5ff6d2e94e92534e7""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-3/results.json,cold_local,22004.165925 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-4,2026-08-09T19:44:30.877Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,21936.455616,,21936.455616,473.8046875,716285,2561447,2314408,2561447,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""bcb3a37e29e031da1db24ed43a49228fa57b70520f9390f51c5a94dda1a4aca3""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-4/results.json,cold_local,21936.455616 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-5,2026-08-09T19:49:02.544Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,21932.071156,,21932.071156,474.06640625,716138,2549071,2302032,2549071,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""73f1e2b814e1e7170fe46286b2096bf6e5b5082db2c3b5519374e508b7566710""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-5/results.json,cold_local,21932.071156 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,22012.132616,,22012.132616,,715538,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22012.132616 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,22013.30554,,22013.30554,468.4765625,716398,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22013.30554 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,21946.08954,,21946.08954,472.41796875,715701,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21946.08954 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,21960.394386,,21960.394386,473.38671875,713658,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21960.394386 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,22017.082848,,22017.082848,471.8828125,713578,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22017.082848 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,21965.429847,,21965.429847,471.87890625,717491,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21965.429847 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T10:47:29.617Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1930.646462,115098.799392,,117029.447007,465.24609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c8305a812976dc175ab872236aa6b088ddbd36c47b4c5e0bc26e82ce6c0bfa8e""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-0/results.json,cold_local,117029.447007 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T10:55:00.924Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1938.775616,115207.859392,,117146.636084,459.99609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""2d369cdc201378381b9492f05f0953ea39eb03b7f52b2c110e223b7f40eb7064""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-1/results.json,cold_local,117146.636084 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T11:02:33.065Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1934.800077,115154.204314,,117089.005468,466.125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""3776758f3143e02c849aad1358a73a39ebbfbcfc2724c5d71aa78a8752d56674""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-2/results.json,cold_local,117089.005468 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T11:10:03.637Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1938.140693,115850.475623,,117788.617315,465.1484375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""1ab20865d70ba9b594487a57d197a70b75148721eadd75a25d8e616a3211c92d""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-3/results.json,cold_local,117788.617315 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T11:17:36.073Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1938.114154,115212.368545,,117150.483622,465.85546875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""16ecdfdc963615f034092563ea6298879949b75d88a594141840bc7edb3e1aa0""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-4/results.json,cold_local,117150.483622 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T11:25:09.090Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1940.772231,115395.711161,,117336.484622,461.2109375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""4e89cbbb427961004c4949ca99e6fbad762e23a088fc23c79d5b30868cc5f119""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-5/results.json,cold_local,117336.484622 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1940.787077,115001.471699,,116942.260392,,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,116942.260392 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1937.975769,115208.417853,,117146.394699,468.6953125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117146.394699 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1936.869308,115176.956007,,117113.826392,468.7734375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117113.826392 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1934.062231,115440.940623,,117375.00393,470.2265625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117375.00393 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1941.104846,115179.304237,,117120.410084,475.015625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117120.410084 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1938.620923,115332.492545,,117271.114776,471.125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117271.114776 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-0,2026-08-10T21:06:43.851Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,21865.903309,219933.206475,,241799.110476,286.54296875,925,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""afc55c72c7a26a75ac3efd85759bffaaaac3f8e934d6d7825fe9b09a5ac907e1""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-0/results.json,cold_local,241799.110476 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-1,2026-08-10T21:16:57.847Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,21841.26554,219946.51209,,241787.778476,293.37109375,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""41b688b9fd447a2bfd12f7a33c2f7033e740e879a2ba93f1b9dc557196fe68c2""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-1/results.json,cold_local,241787.778476 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-2,2026-08-10T21:27:11.559Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,21889.267694,219716.131705,,241605.40063,293.5546875,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""10bc42d7e8cd6ff32e41fd32aa15bb8a4b5fe4572f6e6f379339fa18eb7ef40e""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-2/results.json,cold_local,241605.40063 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-3,2026-08-10T21:37:28.321Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,21855.38454,219855.616629,,241711.001861,292.140625,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""984facc03fc0a515947cc7e7f08656c4e60c47c6396ec8a647d35cbbff071b15""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-3/results.json,cold_local,241711.001861 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-4,2026-08-10T21:47:42.211Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,21859.755309,219596.209936,,241455.965784,297.5703125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""62d3a7935d4c9bec9adabb3693f142ca1113deee2d445a9eb6576ccb9ca41f56""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-4/results.json,cold_local,241455.965784 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__cold_local-5,2026-08-10T21:57:55.559Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,21850.164078,219582.274705,,241432.439707,292.16796875,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""5b4a3f2cdb94cc3bcfe2b37b101c4ce699fb36be1da5ecd36d01e35cd74290fd""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-passport-p1/run-5/results.json,cold_local,241432.439707 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,21838.82854,219571.219013,,241410.048707,,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,241410.048707 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,21935.204925,217164.146474,,239099.352015,289.1328125,928,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239099.352015 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,21834.133463,217989.376859,,239823.511091,290.3828125,927,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239823.511091 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,21835.60154,218252.675321,,240088.277784,283.71875,926,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,240088.277784 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,21840.064848,217806.936706,,239647.002476,276.57421875,929,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239647.002476 +input-to-proof-v1-20260807,passport_p1__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T14:29:33.176Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,21838.055771,217892.081475,,239730.13763,286.06640625,930,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""924d59b20316e0603c7db72815f4e9c5793bd3ff29b25c4445521c1d4fd229a6""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-passport-p1/results.json,warm_reuse,239730.13763 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-0,2026-08-09T17:49:39.722Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,12584.178155,,12584.178155,145.85546875,632532,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""09ac8e4947b96f9397ef34b4b05de4f398f08bc9cdd677697d132111e6ecaefc""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-0/results.json,cold_local,12584.178155 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-1,2026-08-09T17:52:09.957Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,12680.550155,,12680.550155,144.88671875,636500,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""3b2677e383c3f9eacd1788ee85a3ccdd978efbf5cd4a46b5ddb108cc108e9a29""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-1/results.json,cold_local,12680.550155 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-2,2026-08-09T17:54:13.505Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,12466.876924,,12466.876924,145.1015625,634516,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9f9c74a226bcbf2c9b7afd64c23e4266b4a5c596861b4b99265d7d916833c1ee""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-2/results.json,cold_local,12466.876924 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-3,2026-08-09T21:04:59.575Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,12799.092386,,12799.092386,170.140625,634548,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""54ec9c0e17a3bebdc546c5c73fa6f139df54cb14cfd9d988ebf56b3b2fc87002""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry-20260809/oprf/run-3/results.json,cold_local,12799.092386 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-4,2026-08-09T17:58:28.620Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,12725.462078,,12725.462078,140.03515625,633096,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""2bb6eb16cf831f0e35cf8dfb8c095815ccc7c57758faadc9371e821018cf7be5""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-4/results.json,cold_local,12725.462078 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-5,2026-08-09T18:00:33.037Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,12444.639693,,12444.639693,145.078125,634868,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4c79106dd34e329ccedb44c559c6b4b3e7cd3b2cf9d9e42cd9f9d6af1bfd3fd8""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-5/results.json,cold_local,12444.639693 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,12162.576385,,12162.576385,,634836,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12162.576385 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,10413.302462,,10413.302462,145.93359375,631668,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10413.302462 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,10142.202539,,10142.202539,147.703125,632948,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10142.202539 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,10756.831616,,10756.831616,160.46484375,623775,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10756.831616 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,12584.569463,,12584.569463,158.10546875,632852,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12584.569463 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,12419.088693,,12419.088693,158.046875,626597,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12419.088693 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T07:57:50.331Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1883.057847,68266.155004,,70149.213543,318.24609375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""52c5dec4dd733ada22482652940c33f0620cca205fbc5c7127cee1133c93684e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-0/results.json,cold_local,70149.213543 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T09:35:27.717Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1888.725538,68274.720235,,70163.445927,306.59765625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""998f6f8068611896ea01432316048f8ae03ccf7600448157a91a2d5bef52832a""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-1/results.json,cold_local,70163.445927 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T09:40:50.624Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1882.602462,68229.872619,,70112.475697,306.09375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""de0477de370a6baf2aea70c0f55edf312a8a3b51e6b2e18105436d8a0ad19b89""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-2/results.json,cold_local,70112.475697 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T09:46:12.899Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1892.495308,68252.736004,,70145.231774,305.1796875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""03340fc290cbddd7555ae20c9de7f272552952b9aa40553af91747eca7265192""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-3/results.json,cold_local,70145.231774 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T09:51:32.631Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1892.782461,68287.56185,,70180.345466,307.2578125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""57fe05ea8648843c9ecc5c83c9ac60ed8a2ec12827670903f2479366d9060b75""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-4/results.json,cold_local,70180.345466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T09:56:55.485Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1887.943385,68227.946234,,70115.891158,303.5078125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""7d1d1f7c2db24881e8cbb594f3da736032c22fb59a1934934ab68e3f66699756""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-5/results.json,cold_local,70115.891158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1888.348615,68189.509312,,70077.859465,,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70077.859465 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1889.628538,67988.621235,,69878.250696,301.96875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,69878.250696 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1875.327384,68222.355158,,70097.683388,302.1484375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70097.683388 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1876.999154,68142.220927,,70019.221466,300.45703125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70019.221466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1875.057154,68249.552312,,70124.610158,301.87890625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70124.610158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1893.020615,69120.355389,,71013.376312,300.59375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,71013.376312 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__cold_local-0,2026-08-10T18:47:58.529Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,warmup,0,ok,,23153.917617,51757.72708,,74911.645313,103.421875,1604,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""daf41eed658f628f98fa96fcc022def4f8c3d48806dcf282c948c59f4990d342""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-oprf/run-0/results.json,cold_local,74911.645313 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__cold_local-1,2026-08-10T18:52:26.475Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,1,ok,,23139.660924,52092.771003,,75232.43262,106.45703125,1602,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""1ab8f9c2451316780de8c39195c437f260b47f4ce62e30a86f76efb95775155a""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-oprf/run-1/results.json,cold_local,75232.43262 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__cold_local-2,2026-08-10T18:56:54.658Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,2,ok,,23157.066155,52087.380003,,75244.446774,103.47265625,1602,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f8d8638f5f84ad2e9b493a27b689f68ccd10718eb1cd01f0c57daa41044c909b""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-oprf/run-2/results.json,cold_local,75244.446774 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__cold_local-3,2026-08-10T19:01:23.725Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,3,ok,,23309.111463,52090.43508,,75399.54762,102.75,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""13607b39d83990bd93655934450f046875bf47095ad9410113841188fd8807a1""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-oprf/run-3/results.json,cold_local,75399.54762 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__cold_local-4,2026-08-10T19:14:23.472Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,4,ok,,23234.647463,52015.946387,,75250.594466,106.6171875,1605,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""b253143412eef95fd8ee8c516c52b6df4a460075eca5256ef730f1c676c766dd""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-oprf/run-4/results.json,cold_local,75250.594466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__cold_local-5,2026-08-10T19:18:56.849Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,5,ok,,23107.180001,52050.773464,,75157.954158,106.41015625,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""6297371010729ec0f807f04360e3e5046a67319c23c91e5033212fe35c280a94""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/circom-oprf/run-5/results.json,cold_local,75157.954158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T13:15:38.622Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,warmup,0,ok,,23134.037001,51981.317849,,75115.356081,,1601,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""ac328b89798be4a3cd4ad2cca99876bb4c1ca2abae0bcbf4ec4a8f4aefd7f613""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-oprf/results.json,warm_reuse,75115.356081 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T13:15:38.622Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,1,ok,,23148.106463,52041.51808,,75189.625004,109.6484375,1602,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""ac328b89798be4a3cd4ad2cca99876bb4c1ca2abae0bcbf4ec4a8f4aefd7f613""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-oprf/results.json,warm_reuse,75189.625004 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T13:15:38.622Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,2,ok,,23136.695309,52295.445234,,75432.141235,115.0078125,1604,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""ac328b89798be4a3cd4ad2cca99876bb4c1ca2abae0bcbf4ec4a8f4aefd7f613""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-oprf/results.json,warm_reuse,75432.141235 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T13:15:38.622Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,3,ok,,23161.343078,52085.413849,,75246.757851,96.81640625,1606,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""ac328b89798be4a3cd4ad2cca99876bb4c1ca2abae0bcbf4ec4a8f4aefd7f613""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-oprf/results.json,warm_reuse,75246.757851 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T13:15:38.622Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,4,ok,,23148.537848,52027.545541,,75176.084082,96.859375,1602,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""ac328b89798be4a3cd4ad2cca99876bb4c1ca2abae0bcbf4ec4a8f4aefd7f613""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-oprf/results.json,warm_reuse,75176.084082 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T13:15:38.622Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,rust-rapidsnark-0.1.4,wasmi-0.46.0-circom-wasm,measured,5,ok,,23129.999079,52069.741234,,75199.740697,97.125,1603,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""rust_rapidsnark"":""0.1.4"",""wasmi"":""0.46.0"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""ac328b89798be4a3cd4ad2cca99876bb4c1ca2abae0bcbf4ec4a8f4aefd7f613""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-oprf/results.json,warm_reuse,75199.740697 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-0,2026-08-09T18:06:53.295Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,27751.064925,,27751.064925,496.4609375,718163,2390932,2341712,2390932,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""f2e0ff7e7588dbed87ff8946aef1a8017d03860987d252ecddea0a04fc7ee65e""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-0/results.json,cold_local,27751.064925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-1,2026-08-09T18:11:05.720Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,27910.810463,,27910.810463,493.00390625,716743,2363144,2313924,2363144,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d60fc911089738a04c32e1dc20f8472b4a00ec86ee9f3cc098c00f96d0ff0442""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-1/results.json,cold_local,27910.810463 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-2,2026-08-09T19:15:04.224Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,27714.982386,,27714.982386,500.12109375,716211,2384412,2335192,2384412,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""0a71e2ffe395f25cb86883ce326e43ea5d5ec9f415d1ff0765f4152c92d37f70""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-2/results.json,cold_local,27714.982386 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-3,2026-08-09T19:19:15.319Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,27812.34954,,27812.34954,494.33203125,714300,2322424,2273204,2322424,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""593b56a00bebece2303ebbb221ab168493bed04dc656cac067f91f82c702d7c7""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-3/results.json,cold_local,27812.34954 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-4,2026-08-09T19:23:34.521Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,28003.115386,,28003.115386,491.296875,718670,2406852,2357632,2406852,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""bf346e612a20bc5b83e06797cb94c32a9b95e697ef3ea6d830d2253a32a8d891""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-4/results.json,cold_local,28003.115386 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-5,2026-08-09T21:09:23.421Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,27901.663771,,27901.663771,494.79296875,716291,2336580,2287360,2336580,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""6208691e252755688904025e0c40a7c4516edf2a62877a522d4ad144bca8bb62""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry-20260809/webauthn/run-5/results.json,cold_local,27901.663771 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,27986.81054,,27986.81054,,715639,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27986.81054 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,27898.193771,,27898.193771,493.74609375,715277,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27898.193771 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,27803.135617,,27803.135617,491.97265625,715049,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27803.135617 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,27862.763617,,27862.763617,501.51171875,716193,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27862.763617 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,27743.926233,,27743.926233,500.5625,712986,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27743.926233 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,27767.005925,,27767.005925,502.0390625,710361,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27767.005925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T10:04:06.562Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,7453.589847,107470.601853,,114924.192853,486.23828125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""3d3e0937e8ecb2a964b3ae04e58eba0ba1ad220f3dd426ad73580efdd2794a37""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-0/results.json,cold_local,114924.192853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T10:11:16.913Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,7464.466385,106320.877467,,113785.344853,490.734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""1959c4bb4de693d8e213388939aa3fff408ce6a4bfd39bb7430079b7d7399cae""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-1/results.json,cold_local,113785.344853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T10:18:26.772Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,7463.362462,107215.131775,,114678.495315,493.37890625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c7eebf005b62db532f56b4ba72caaa77ddf7fa4da0229c941fcf5b3dde183ede""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-2/results.json,cold_local,114678.495315 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T10:25:39.076Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,7442.536539,107617.012622,,115059.550238,492.9296875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d727ff17466c2d0280bf99f6391ed4e4c78714a199bf8d4fd58c4624b14ec071""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-3/results.json,cold_local,115059.550238 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T10:32:50.164Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,7455.639385,107196.120929,,114651.761238,494.9140625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""76261f17a59e8f803f69b08b1569e91056b5bacc951373fa414e09ec45285e4b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-4/results.json,cold_local,114651.761238 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T10:39:59.829Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,7464.392616,106954.437853,,114418.831468,494.05078125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d050f00a18626bf659e7f8efbb3c68361c40c320237f99acb68ab0d9a69e6422""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-5/results.json,cold_local,114418.831468 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,7427.613232,107333.576545,,114761.191161,,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114761.191161 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,7449.868847,107294.658468,,114744.528315,494.7265625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114744.528315 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,7461.823385,107155.801468,,114617.625853,502.796875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114617.625853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,7443.431078,107235.876545,,114679.308623,504.30859375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114679.308623 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,7451.634231,107122.822776,,114574.458468,506.52734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114574.458468 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,7443.167308,107202.061775,,114645.229776,506.37890625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114645.229776 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local-gap,2026-08-11T10:47:03.183Z,motorola_e15,moto e15,Android 14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6 (split helper canary),gap,,runtime_failed,,,,,,,,,,,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","{""report_sha256"":""41d6c31a71f5d19c512b9d240517ff372dd75ed6c026fa4c1be3ef5ce3e516ee"",""logcat_sha256"":""cfccf2a1be99f36e3968e157868513a43fc6b08f9e9e475a2574b87019499255""}",,"This is an explicit E15 input-to-proof gap. It is not a zero measurement, and no iPhone, Mac, or browser value is substituted.",out_of_memory,"Rapidsnark failed in the native E15 worker with `mmap failed: Out of memory`. The pinned WebAuthn zkey is 1,733,145,772 bytes and the frozen WTNS is 109,218,412 bytes; the 32-bit E15 could not create the proving mappings. Repeated helper-split and unmap canaries did not produce a stable valid run.",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/circom-webauthn-helper-unmap-canary-20260811/results.json;/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/circom-webauthn-helper-unmap-canary-20260811/circom_webauthn_input_to_proof.logcat.txt,cold_local, +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-0,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,warmup,0,ok,,459162.841874,856718.871744,,1315881.714925,,1005,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1315881.714925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-1,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,1,ok,,459192.934565,864361.80159,,1323554.737002,776.859375,1001,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1323554.737002 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-2,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,2,ok,,460037.603105,862393.702743,,1322431.306233,663.66796875,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1322431.306233 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-3,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,3,ok,,459024.957566,860136.160974,,1319161.119694,705.38671875,1005,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1319161.119694 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-4,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,4,ok,,459224.595335,853365.856667,,1312590.452616,717.85546875,1003,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1312590.452616 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-5,2026-08-10T17:06:48.724Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,rust-rapidsnark-0.1.4,rust-witness-0.1.6,measured,5,ok,,459426.71272,853232.236667,,1312658.950001,810.06640625,1002,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""rust_rapidsnark"":""0.1.4"",""rust_witness"":""0.1.6"",""circom"":""2.2.2""}","[{""raw_evidence_sha256"":""f4dc3c682d771ec953be5a18b92b21ac51a35f834df6f386c3e037b2ec7753cc""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/circom-webauthn/results.json,warm_reuse,1312658.950001 diff --git a/benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.taceo-candidate.csv b/benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.taceo-candidate.csv new file mode 100644 index 000000000..6970599de --- /dev/null +++ b/benchmarks/v1/legacy/taceo-candidate/input-to-proof-samples.taceo-candidate.csv @@ -0,0 +1,373 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path,timing_mode,input_to_proof_time_ms +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-0,2026-08-07T16:13:28.693Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,2723.875,1021.1799999475479,19760.03499996662,621.7900000810623,23505.08999991417,1372.28125,990332,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""998f7de8f4c3a811add5e2e3d413afaa4bd28f014e690050be25ed424e317668""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,23505.08999991417 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-1,2026-08-07T16:13:28.693Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,2780.5449999570847,1017.835000038147,19667.875,629.5149999856949,23466.25499999523,1372.453125,994468,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""998f7de8f4c3a811add5e2e3d413afaa4bd28f014e690050be25ed424e317668""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,23466.25499999523 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-2,2026-08-07T16:13:28.693Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,2726.0499999523163,1022.4049999713898,19703.820000052452,627.4950000047684,23452.274999976158,1371.296875,993828,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""998f7de8f4c3a811add5e2e3d413afaa4bd28f014e690050be25ed424e317668""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,23452.274999976158 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-3,2026-08-07T16:13:28.693Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,2718.3849999904633,1023.914999961853,19682.149999976158,623.289999961853,23424.449999928474,1372.171875,989648,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""998f7de8f4c3a811add5e2e3d413afaa4bd28f014e690050be25ed424e317668""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,23424.449999928474 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-4,2026-08-07T16:13:28.693Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,2747.960000038147,1029.0099999904633,19759.804999947548,630.7749999761581,23536.774999976158,1375.34375,990844,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""998f7de8f4c3a811add5e2e3d413afaa4bd28f014e690050be25ed424e317668""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,23536.774999976158 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-5,2026-08-07T16:13:28.693Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,2724.9199999570847,1020.1850000619888,19708.37000000477,624.0599999427795,23453.475000023842,1372.75,995836,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""998f7de8f4c3a811add5e2e3d413afaa4bd28f014e690050be25ed424e317668""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,23453.475000023842 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-0,2026-08-07T16:15:46.472Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1080.5499999523163,1021.2150000333786,19667.600000023842,625.5950000286102,21769.365000009537,1522.5,995580,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""f0b56ce8d576ef9af847e24b1fd4737c78e7bd0f2ace59d656d66b34f4b19912""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,21769.365000009537 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-1,2026-08-07T16:15:46.472Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1070.5750000476837,828.4299999475479,19509.705000042915,620.5650000572205,21408.710000038147,1522.5,994300,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""f0b56ce8d576ef9af847e24b1fd4737c78e7bd0f2ace59d656d66b34f4b19912""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,21408.710000038147 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-2,2026-08-07T16:15:46.472Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1083.3199999332428,820.375,19514.514999985695,616.1399999856949,21418.209999918938,1522.5,993616,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""f0b56ce8d576ef9af847e24b1fd4737c78e7bd0f2ace59d656d66b34f4b19912""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,21418.209999918938 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-3,2026-08-07T16:15:46.472Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1070.3899999856949,823.9950000047684,19503.06500005722,620.6699999570847,21397.450000047684,1522.5,995536,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""f0b56ce8d576ef9af847e24b1fd4737c78e7bd0f2ace59d656d66b34f4b19912""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,21397.450000047684 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-4,2026-08-07T16:15:46.472Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1077.6749999523163,823.8150000572205,19507.355000019073,615.2149999141693,21408.84500002861,1522.5,992420,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""f0b56ce8d576ef9af847e24b1fd4737c78e7bd0f2ace59d656d66b34f4b19912""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,21408.84500002861 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-5,2026-08-07T16:15:46.472Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1062.1200000047684,818.6950000524521,19529.269999980927,612.2200000286102,21410.09000003338,1522.5,993444,4044410,4002796,22008360,711664,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""f0b56ce8d576ef9af847e24b1fd4737c78e7bd0f2ace59d656d66b34f4b19912""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,21410.09000003338 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-0,2026-08-07T16:20:20.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,15379.11,700.27,18252.43,4282.355,34331.81,1480.765625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""848753290c4f93666c61e16a3e3cfe3515dd1d4159994617458ffce48c2bccaf""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,34331.81 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-1,2026-08-07T16:20:20.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,15346.235,689.705,18243.385,4246.385,34279.325,1475.359375,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""848753290c4f93666c61e16a3e3cfe3515dd1d4159994617458ffce48c2bccaf""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,34279.325 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-2,2026-08-07T16:20:20.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,15481.24,690.6,18268.155,4235.185,34439.995,1481.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""848753290c4f93666c61e16a3e3cfe3515dd1d4159994617458ffce48c2bccaf""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,34439.995 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-3,2026-08-07T16:20:20.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,15350.765,697.095,18291.345,4255.595,34339.205,1476.09375,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""848753290c4f93666c61e16a3e3cfe3515dd1d4159994617458ffce48c2bccaf""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,34339.205 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-4,2026-08-07T16:20:20.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,15300.62,694.115,18287.205,4241.65,34281.94,1480.53125,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""848753290c4f93666c61e16a3e3cfe3515dd1d4159994617458ffce48c2bccaf""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,34281.94 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-5,2026-08-07T16:20:20.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,15271.005,694.57,18292.98,4220.565,34258.555,1473.28125,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""848753290c4f93666c61e16a3e3cfe3515dd1d4159994617458ffce48c2bccaf""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,34258.555 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-07T16:22:54.730Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,569.59,17951.74,0,18521.345,1676.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""54433d48de89c1c5827118804fb6252e7452dae07a5731567ce74df8a519ed82""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,18521.345 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-07T16:22:54.730Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,557.095,17882.9,0,18440.035,1676.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""54433d48de89c1c5827118804fb6252e7452dae07a5731567ce74df8a519ed82""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,18440.035 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-07T16:22:54.730Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,579.705,17939.99,0,18519.715,1676.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""54433d48de89c1c5827118804fb6252e7452dae07a5731567ce74df8a519ed82""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,18519.715 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-07T16:22:54.730Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,569.235,17943.8,0,18513.21,1676.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""54433d48de89c1c5827118804fb6252e7452dae07a5731567ce74df8a519ed82""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,18513.21 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-07T16:22:54.730Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,580.34,17866.225,0,18446.71,1676.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""54433d48de89c1c5827118804fb6252e7452dae07a5731567ce74df8a519ed82""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,18446.71 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-07T16:22:54.730Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,584.12,17840.73,0,18425.005,1676.65625,16000,73375498,73333886,73375498,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""54433d48de89c1c5827118804fb6252e7452dae07a5731567ce74df8a519ed82""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,18425.005 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-0,2026-08-07T16:28:58.792Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,7.6,4171.7,55421.5,59.7,59600.8,6027.234375,1447,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""0f5da4f5c857290f9b842874a431e7f5b98670f927eafa7aad38a64f38031e0b""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,59600.8 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-1,2026-08-07T16:28:58.792Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,5.9,4183.3,55487.9,60.2,59677.1,6029.28125,1448,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""0f5da4f5c857290f9b842874a431e7f5b98670f927eafa7aad38a64f38031e0b""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,59677.1 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-2,2026-08-07T16:28:58.792Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,5.4,4180.5,55360.7,58.5,59546.6,6029.140625,1445,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""0f5da4f5c857290f9b842874a431e7f5b98670f927eafa7aad38a64f38031e0b""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,59546.6 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-3,2026-08-07T16:28:58.792Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,5.6,4186.2,55453.4,62.2,59645.2,6029.703125,1443,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""0f5da4f5c857290f9b842874a431e7f5b98670f927eafa7aad38a64f38031e0b""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,59645.2 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-4,2026-08-07T16:28:58.792Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,5.8,4166,55376.9,59.4,59548.7,6031.453125,1446,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""0f5da4f5c857290f9b842874a431e7f5b98670f927eafa7aad38a64f38031e0b""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,59548.7 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-5,2026-08-07T16:28:58.792Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,8.1,4166.3,55328.4,57.7,59502.8,6031.34375,1448,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""0f5da4f5c857290f9b842874a431e7f5b98670f927eafa7aad38a64f38031e0b""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,59502.8 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-0,2026-08-07T16:34:57.284Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,0,4170.3,55332.3,59.6,59503,6269.046875,1443,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a542698687cbee69bb21ee1e6ed568e6d440e12c7a27c000b5e68da98126d991""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,59503 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-1,2026-08-07T16:34:57.284Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,0,4133.6,55414.7,11.5,59548.5,6269.046875,1444,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a542698687cbee69bb21ee1e6ed568e6d440e12c7a27c000b5e68da98126d991""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,59548.5 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-2,2026-08-07T16:34:57.284Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,0,4156,55405.1,11.4,59561.3,6269.046875,1450,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a542698687cbee69bb21ee1e6ed568e6d440e12c7a27c000b5e68da98126d991""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,59561.3 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-3,2026-08-07T16:34:57.284Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,0,4174.2,55417.1,10.9,59591.5,6269.046875,1446,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a542698687cbee69bb21ee1e6ed568e6d440e12c7a27c000b5e68da98126d991""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,59591.5 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-4,2026-08-07T16:34:57.284Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,0,4158.3,55596.2,11,59759.2,6269.046875,1443,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a542698687cbee69bb21ee1e6ed568e6d440e12c7a27c000b5e68da98126d991""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,59759.2 +input-to-proof-v1-20260807,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-5,2026-08-07T16:34:57.284Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,0,4127.6,55130.5,11,59259.1,6269.046875,1446,588352242,568828944,588352242,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a542698687cbee69bb21ee1e6ed568e6d440e12c7a27c000b5e68da98126d991""}",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,59259.1 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__cold_local-0,2026-08-07T16:36:15.896Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1500.6849999427795,794.5,9408.820000052452,309.789999961853,11704.004999995232,844.640625,961913,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8ed8d3606516bd417816fcaa9a3c685294f49511560a4c9d7b797df9f8738382""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,11704.004999995232 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__cold_local-1,2026-08-07T16:36:15.896Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1526.204999923706,779.5,9355.389999985695,313.3700000047684,11661.094999909401,842.578125,960209,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8ed8d3606516bd417816fcaa9a3c685294f49511560a4c9d7b797df9f8738382""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,11661.094999909401 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__cold_local-2,2026-08-07T16:36:15.896Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1492.3199999332428,784.8450000286102,9389.264999985695,305.94000005722046,11666.429999947548,842.265625,964601,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8ed8d3606516bd417816fcaa9a3c685294f49511560a4c9d7b797df9f8738382""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,11666.429999947548 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__cold_local-3,2026-08-07T16:36:15.896Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1506.0900000333786,784.9049999713898,9398.320000052452,309.25999999046326,11689.31500005722,842.75,963025,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8ed8d3606516bd417816fcaa9a3c685294f49511560a4c9d7b797df9f8738382""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,11689.31500005722 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__cold_local-4,2026-08-07T16:36:15.896Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1499.3499999046326,788.0250000953674,9403.854999899864,305.6100000143051,11691.229999899864,838.296875,966309,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8ed8d3606516bd417816fcaa9a3c685294f49511560a4c9d7b797df9f8738382""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,11691.229999899864 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__cold_local-5,2026-08-07T16:36:15.896Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1524.0750000476837,789.4349999427795,9377.504999995232,306.70500004291534,11691.014999985695,841.671875,964217,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8ed8d3606516bd417816fcaa9a3c685294f49511560a4c9d7b797df9f8738382""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,11691.014999985695 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__warm_reuse-0,2026-08-07T16:37:23.428Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,555.8699998855591,774.4400000572205,9409.610000014305,305.25,10739.919999957085,997.859375,963065,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8facca6a304d91bbf2c392b05ee408c3a82bb2a519a62725acf487707a2047c3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,10739.919999957085 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__warm_reuse-1,2026-08-07T16:37:23.428Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,539.4950000047684,615.1450001001358,9273.989999890327,303.40000009536743,10428.634999990463,997.859375,965497,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8facca6a304d91bbf2c392b05ee408c3a82bb2a519a62725acf487707a2047c3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,10428.634999990463 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__warm_reuse-2,2026-08-07T16:37:23.428Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,545.4800000190735,617.6900000572205,9355.27999997139,301.5199999809265,10518.455000042915,997.859375,965285,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8facca6a304d91bbf2c392b05ee408c3a82bb2a519a62725acf487707a2047c3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,10518.455000042915 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__warm_reuse-3,2026-08-07T16:37:23.428Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,544.8700000047684,611.3400000333786,9294.245000004768,308.88499999046326,10450.455000042915,997.859375,963321,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8facca6a304d91bbf2c392b05ee408c3a82bb2a519a62725acf487707a2047c3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,10450.455000042915 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__warm_reuse-4,2026-08-07T16:37:23.428Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,546.8349999189377,605.125,9289.44000005722,303.04499995708466,10441.40499997139,997.859375,961957,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8facca6a304d91bbf2c392b05ee408c3a82bb2a519a62725acf487707a2047c3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,10441.40499997139 +input-to-proof-v1-20260807,passport_p1__mac_chrome__provekit_v1__warm_reuse-5,2026-08-07T16:37:23.428Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,539.9700000286102,606.6100000143051,9303.079999923706,297.4300000667572,10449.659999966621,997.859375,960549,2310275,2279592,15006054,294402,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""8facca6a304d91bbf2c392b05ee408c3a82bb2a519a62725acf487707a2047c3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,10449.659999966621 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__cold_local-0,2026-08-07T16:43:43.806Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,130146.235,531.335,10662.43,2734.97,141340,1142.296875,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23f1202ffe65bbe2e0d486f53f8f4a491a01d64edbe796f8816312b2dd977f79""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,141340 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__cold_local-1,2026-08-07T16:43:43.806Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,15356.73,541.655,10643.84,2699.295,26542.225,1144.171875,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23f1202ffe65bbe2e0d486f53f8f4a491a01d64edbe796f8816312b2dd977f79""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26542.225 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__cold_local-2,2026-08-07T16:43:43.806Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,15369.985,530.425,10631.695,2697.45,26532.105,1143.75,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23f1202ffe65bbe2e0d486f53f8f4a491a01d64edbe796f8816312b2dd977f79""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26532.105 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__cold_local-3,2026-08-07T16:43:43.806Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,15291.88,533.825,10712.03,2729.52,26537.735,1143.703125,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23f1202ffe65bbe2e0d486f53f8f4a491a01d64edbe796f8816312b2dd977f79""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26537.735 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__cold_local-4,2026-08-07T16:43:43.806Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,15282.485,534.16,10637.615,2715.605,26454.26,1143.625,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23f1202ffe65bbe2e0d486f53f8f4a491a01d64edbe796f8816312b2dd977f79""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26454.26 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__cold_local-5,2026-08-07T16:43:43.806Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,15423.19,524.665,10641.91,2712.075,26589.765,1146.0625,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23f1202ffe65bbe2e0d486f53f8f4a491a01d64edbe796f8816312b2dd977f79""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26589.765 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-07T16:45:22.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,430.995,10472.015,0,10903.03,1232.375,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""cb52cc691f1efdbf276ca4f1f1c7fac1ea100f37ec3633d84b23e6597523ad3b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10903.03 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-07T16:45:22.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,428.515,10444.685,0,10873.22,1232.375,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""cb52cc691f1efdbf276ca4f1f1c7fac1ea100f37ec3633d84b23e6597523ad3b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10873.22 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-07T16:45:22.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,429.665,10436.49,0,10866.175,1232.375,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""cb52cc691f1efdbf276ca4f1f1c7fac1ea100f37ec3633d84b23e6597523ad3b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10866.175 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-07T16:45:22.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,430.2,10420.61,0,10850.975,1232.375,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""cb52cc691f1efdbf276ca4f1f1c7fac1ea100f37ec3633d84b23e6597523ad3b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10850.975 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-07T16:45:22.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,442.2,10480.235,0,10922.6,1232.375,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""cb52cc691f1efdbf276ca4f1f1c7fac1ea100f37ec3633d84b23e6597523ad3b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10922.6 +input-to-proof-v1-20260807,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-07T16:45:22.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,432.755,10424.655,0,10857.595,1232.375,16000,74595035,74564360,74595035,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""cb52cc691f1efdbf276ca4f1f1c7fac1ea100f37ec3633d84b23e6597523ad3b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10857.595 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__cold_local-0,2026-08-07T16:49:43.182Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,2.4,3933.5,38435.9,56.6,42371.8,6017.609375,725,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d1f5c41bc9612e31b4c0158a96542901e6fbe6c2fdf08f00d0900ad5897b8a99""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,42371.8 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__cold_local-1,2026-08-07T16:49:43.182Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,3.4,3944.3,38526,58.9,42473.7,6020.484375,726,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d1f5c41bc9612e31b4c0158a96542901e6fbe6c2fdf08f00d0900ad5897b8a99""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,42473.7 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__cold_local-2,2026-08-07T16:49:43.182Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,2.2,3913.5,38411.6,56.5,42327.3,6018.375,725,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d1f5c41bc9612e31b4c0158a96542901e6fbe6c2fdf08f00d0900ad5897b8a99""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,42327.3 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__cold_local-3,2026-08-07T16:49:43.182Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,2.4,3906.7,38487.8,55.9,42396.9,6019.09375,722,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d1f5c41bc9612e31b4c0158a96542901e6fbe6c2fdf08f00d0900ad5897b8a99""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,42396.9 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__cold_local-4,2026-08-07T16:49:43.182Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,2.8,3937.7,38445.8,55.9,42386.3,6017.84375,723,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d1f5c41bc9612e31b4c0158a96542901e6fbe6c2fdf08f00d0900ad5897b8a99""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,42386.3 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__cold_local-5,2026-08-07T16:49:43.182Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,2.7,3928.9,38528.6,55.6,42460.2,6019.8125,722,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d1f5c41bc9612e31b4c0158a96542901e6fbe6c2fdf08f00d0900ad5897b8a99""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,42460.2 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__warm_reuse-0,2026-08-07T16:56:29.340Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,0,3916.7,38416.5,53.7,42333.2,6224.875,724,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a98e306ffa800420536289012fd0695e7bafc168a186c2dc7ae162b7da4aa508""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,42333.2 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__warm_reuse-1,2026-08-07T16:56:29.340Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,0,3925,38545.5,6.1,42470.7,6224.875,720,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a98e306ffa800420536289012fd0695e7bafc168a186c2dc7ae162b7da4aa508""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,42470.7 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__warm_reuse-2,2026-08-07T16:56:29.340Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,0,3922.4,38603.5,6.1,42526.1,6224.875,724,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a98e306ffa800420536289012fd0695e7bafc168a186c2dc7ae162b7da4aa508""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,42526.1 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__warm_reuse-3,2026-08-07T16:56:29.340Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,0,3913.1,38405.1,5.9,42318.4,6224.875,724,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a98e306ffa800420536289012fd0695e7bafc168a186c2dc7ae162b7da4aa508""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,42318.4 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__warm_reuse-4,2026-08-07T16:56:29.340Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,0,3925.8,38443.5,5.8,42369.4,6224.875,723,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a98e306ffa800420536289012fd0695e7bafc168a186c2dc7ae162b7da4aa508""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,42369.4 +input-to-proof-v1-20260807,passport_p1__mac_chrome__circom_groth16__warm_reuse-5,2026-08-07T16:56:29.340Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,0,3948,38359.2,6.4,42307.2,6224.875,724,508332927,498212512,508332927,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""a98e306ffa800420536289012fd0695e7bafc168a186c2dc7ae162b7da4aa508""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,42307.2 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__cold_local-0,2026-08-07T16:56:58.737Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1081.2050000429153,1377.9449999332428,1383.7549999952316,136.7300000190735,3842.9049999713898,557.578125,846754,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""1185f3511060b1318589d0309060fcf255cfb93f291e1df41be93c5b05b10f0b""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3842.9049999713898 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__cold_local-1,2026-08-07T16:56:58.737Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1071.0149999856949,1374.7299998998642,1408.9000000953674,137.2699999809265,3854.6449999809265,559.078125,846926,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""1185f3511060b1318589d0309060fcf255cfb93f291e1df41be93c5b05b10f0b""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3854.6449999809265 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__cold_local-2,2026-08-07T16:56:58.737Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1091.1100000143051,1396.8249999284744,1396.9750000238419,136.1950000524521,3884.9099999666214,558.40625,846454,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""1185f3511060b1318589d0309060fcf255cfb93f291e1df41be93c5b05b10f0b""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3884.9099999666214 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__cold_local-3,2026-08-07T16:56:58.737Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1064.5049999952316,1381.5299999713898,1397.1900000572205,142.07499992847443,3843.225000023842,560.703125,845858,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""1185f3511060b1318589d0309060fcf255cfb93f291e1df41be93c5b05b10f0b""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3843.225000023842 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__cold_local-4,2026-08-07T16:56:58.737Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1116.7000000476837,1380.829999923706,1398.8300000429153,136.16999995708466,3896.360000014305,559.84375,842958,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""1185f3511060b1318589d0309060fcf255cfb93f291e1df41be93c5b05b10f0b""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3896.360000014305 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__cold_local-5,2026-08-07T16:56:58.737Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1069.6999999284744,1373.125,1398.9000000953674,137.67499995231628,3841.725000023842,556.28125,845218,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""1185f3511060b1318589d0309060fcf255cfb93f291e1df41be93c5b05b10f0b""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3841.725000023842 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__warm_reuse-0,2026-08-07T16:57:44.166Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,363.8950001001358,1399.6699999570847,1410.2300000190735,137.76499998569489,3173.795000076294,702.234375,843982,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""05cf0fc2c50392f7a1e5bfea93a6652ea04a81fd2889089648e73a29df21836c""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3173.795000076294 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__warm_reuse-1,2026-08-07T16:57:44.166Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,357.5200001001358,1283.8499999046326,1345.8949999809265,129.88499999046326,2987.264999985695,702.234375,845262,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""05cf0fc2c50392f7a1e5bfea93a6652ea04a81fd2889089648e73a29df21836c""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2987.264999985695 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__warm_reuse-2,2026-08-07T16:57:44.166Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,353.289999961853,1291.0249999761581,1360.6549999713898,131.15499997138977,3004.969999909401,702.234375,848886,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""05cf0fc2c50392f7a1e5bfea93a6652ea04a81fd2889089648e73a29df21836c""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3004.969999909401 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__warm_reuse-3,2026-08-07T16:57:44.166Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,359.0749999284744,1291.375,1355.2849999666214,133.85999989509583,3005.734999895096,702.234375,846882,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""05cf0fc2c50392f7a1e5bfea93a6652ea04a81fd2889089648e73a29df21836c""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3005.734999895096 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__warm_reuse-4,2026-08-07T16:57:44.166Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,362.29499995708466,1297.625,1338.3550000190735,129.91499996185303,2998.274999976158,702.234375,846754,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""05cf0fc2c50392f7a1e5bfea93a6652ea04a81fd2889089648e73a29df21836c""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2998.274999976158 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__provekit_v1__warm_reuse-5,2026-08-07T16:57:44.166Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,353.06500005722046,1296.1200000047684,1365.1899999380112,129.90000009536743,3014.375,702.234375,844406,1644635,1638340,11872918,95921,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""05cf0fc2c50392f7a1e5bfea93a6652ea04a81fd2889089648e73a29df21836c""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3014.375 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__cold_local-0,2026-08-07T17:02:20.615Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,15657.87,591.47,6138,1513.085,22387.34,1080.3125,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""0c5b771614472a6d784d650bcb66b0734cd9ca9bfe7811e5f05e04a1ce057637""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,22387.34 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__cold_local-1,2026-08-07T17:02:20.615Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,15280.475,586.54,6075.125,1503.7,21942.14,1090.171875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""0c5b771614472a6d784d650bcb66b0734cd9ca9bfe7811e5f05e04a1ce057637""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,21942.14 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__cold_local-2,2026-08-07T17:02:20.615Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,15329.44,579.745,6125.34,1517.63,22034.525,1081.171875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""0c5b771614472a6d784d650bcb66b0734cd9ca9bfe7811e5f05e04a1ce057637""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,22034.525 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__cold_local-3,2026-08-07T17:02:20.615Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,15539.245,576.615,6175.665,1503.07,22291.525,1082.421875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""0c5b771614472a6d784d650bcb66b0734cd9ca9bfe7811e5f05e04a1ce057637""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,22291.525 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__cold_local-4,2026-08-07T17:02:20.615Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,15426.975,587.415,6092.2,1513.685,22106.59,1082.5625,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""0c5b771614472a6d784d650bcb66b0734cd9ca9bfe7811e5f05e04a1ce057637""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,22106.59 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__cold_local-5,2026-08-07T17:02:20.615Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,15323.075,583.15,6113.445,1528.045,22019.67,1083.6875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""0c5b771614472a6d784d650bcb66b0734cd9ca9bfe7811e5f05e04a1ce057637""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,22019.67 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-07T17:03:26.165Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,501.22,6032.5,0,6533.78,1119.046875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""5f17546a8f06152e00669b23c419ae8e1022fe9b950133ea90d01550d11d8dfa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6533.78 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-07T17:03:26.165Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,519.23,5964.815,0,6484.07,1119.046875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""5f17546a8f06152e00669b23c419ae8e1022fe9b950133ea90d01550d11d8dfa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6484.07 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-07T17:03:26.165Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,516.92,6004.94,0,6522.02,1119.046875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""5f17546a8f06152e00669b23c419ae8e1022fe9b950133ea90d01550d11d8dfa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6522.02 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-07T17:03:26.165Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,509.695,6016.15,0,6525.995,1119.046875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""5f17546a8f06152e00669b23c419ae8e1022fe9b950133ea90d01550d11d8dfa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6525.995 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-07T17:03:26.165Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,515.08,5973.155,0,6488.455,1119.046875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""5f17546a8f06152e00669b23c419ae8e1022fe9b950133ea90d01550d11d8dfa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6488.455 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-07T17:03:26.165Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,506.74,5985.01,0,6491.9,1119.046875,16000,73925206,73918911,73925206,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""5f17546a8f06152e00669b23c419ae8e1022fe9b950133ea90d01550d11d8dfa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6491.9 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__cold_local-0,2026-08-07T17:04:54.535Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,3.1,123.4,9134.5,6.6,9261,902.765625,721,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d21088a3fb869681fa99b5b9a77e9b64491d77c80e1e1985ccbd0d3618a6f1af""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,9261 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__cold_local-1,2026-08-07T17:04:54.535Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,3.4,121.2,9012.5,6.1,9137.1,969.921875,724,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d21088a3fb869681fa99b5b9a77e9b64491d77c80e1e1985ccbd0d3618a6f1af""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,9137.1 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__cold_local-2,2026-08-07T17:04:54.535Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,2.6,123.8,9034.7,6,9161.1,914.953125,721,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d21088a3fb869681fa99b5b9a77e9b64491d77c80e1e1985ccbd0d3618a6f1af""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,9161.1 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__cold_local-3,2026-08-07T17:04:54.535Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,2.7,126.1,9026.9,6,9155.7,970.84375,724,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d21088a3fb869681fa99b5b9a77e9b64491d77c80e1e1985ccbd0d3618a6f1af""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,9155.7 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__cold_local-4,2026-08-07T17:04:54.535Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,2.5,123,9019.9,6,9145.4,914.828125,719,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d21088a3fb869681fa99b5b9a77e9b64491d77c80e1e1985ccbd0d3618a6f1af""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,9145.4 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__cold_local-5,2026-08-07T17:04:54.535Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,2.6,121.7,9032.8,6,9157.1,914.65625,724,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""d21088a3fb869681fa99b5b9a77e9b64491d77c80e1e1985ccbd0d3618a6f1af""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,9157.1 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__warm_reuse-0,2026-08-07T17:06:22.622Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,0,125.5,9000.9,5.9,9126.9,1044.609375,723,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""b753e17b7a98eaffc65aea9ada93f4ed0f5d481a074df79cee9e28fe8cbdd094""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,9126.9 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__warm_reuse-1,2026-08-07T17:06:22.622Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,0,122,9016.7,6.5,9139.2,1044.609375,722,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""b753e17b7a98eaffc65aea9ada93f4ed0f5d481a074df79cee9e28fe8cbdd094""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,9139.2 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__warm_reuse-2,2026-08-07T17:06:22.622Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,0,124.4,9000.3,6.4,9125.3,1044.609375,723,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""b753e17b7a98eaffc65aea9ada93f4ed0f5d481a074df79cee9e28fe8cbdd094""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,9125.3 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__warm_reuse-3,2026-08-07T17:06:22.622Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,0,124,8996.1,8.9,9120.7,1044.609375,722,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""b753e17b7a98eaffc65aea9ada93f4ed0f5d481a074df79cee9e28fe8cbdd094""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,9120.7 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__warm_reuse-4,2026-08-07T17:06:22.622Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,0,126.1,9009.6,5.9,9135.8,1044.609375,722,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""b753e17b7a98eaffc65aea9ada93f4ed0f5d481a074df79cee9e28fe8cbdd094""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,9135.8 +input-to-proof-v1-20260807,oprf_o2__mac_chrome__circom_groth16__warm_reuse-5,2026-08-07T17:06:22.622Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,0,123.4,9011,5.9,9135,1044.609375,725,39203507,38279392,39203507,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""b753e17b7a98eaffc65aea9ada93f4ed0f5d481a074df79cee9e28fe8cbdd094""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,9135 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-0,2026-08-07T17:07:48.584Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1560.7200000286102,1589.2699999809265,9640.730000019073,368.9950000047684,12790.72000002861,929.140625,974672,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""ae99683701a2bf52ad9d6bde513f3702768dab7e2f6900afde7a647a69a318da""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,12790.72000002861 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-1,2026-08-07T17:07:48.584Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1544.5649999380112,1604.0349999666214,9633.780000090599,384.9299999475479,12782.379999995232,927.765625,970192,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""ae99683701a2bf52ad9d6bde513f3702768dab7e2f6900afde7a647a69a318da""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,12782.379999995232 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-2,2026-08-07T17:07:48.584Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1545.9100000858307,1596.3999999761581,9693.375,373.289999961853,12835.685000061989,924.453125,974928,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""ae99683701a2bf52ad9d6bde513f3702768dab7e2f6900afde7a647a69a318da""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,12835.685000061989 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-3,2026-08-07T17:07:48.584Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1533.1599999666214,1601.5550000667572,9643.679999947548,373.04499995708466,12778.394999980927,925.578125,975224,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""ae99683701a2bf52ad9d6bde513f3702768dab7e2f6900afde7a647a69a318da""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,12778.394999980927 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-4,2026-08-07T17:07:48.584Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1540.9199999570847,1581.4500000476837,9604.769999980927,362.6750000715256,12727.139999985695,929.90625,976548,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""ae99683701a2bf52ad9d6bde513f3702768dab7e2f6900afde7a647a69a318da""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,12727.139999985695 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-5,2026-08-07T17:07:48.584Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1552.0400000810623,1600.5149999856949,9630.5,368.0199999809265,12783.055000066757,929.46875,971600,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""ae99683701a2bf52ad9d6bde513f3702768dab7e2f6900afde7a647a69a318da""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,12783.055000066757 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-0,2026-08-07T17:09:01.941Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,576.5900000333786,1596.125,9637.524999976158,367.44000005722046,11810.240000009537,1027.15625,973860,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""056f32c8ce5f5185a7e3a23a0b9b61ec8c51cc105db5c033c3dc719ed8254867""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,11810.240000009537 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-1,2026-08-07T17:09:01.941Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,583.5899999141693,1188.8450000286102,9549.27999997139,355.8799999952316,11321.71499991417,1027.15625,973520,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""056f32c8ce5f5185a7e3a23a0b9b61ec8c51cc105db5c033c3dc719ed8254867""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,11321.71499991417 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-2,2026-08-07T17:09:01.941Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,584.7800000905991,1182.679999947548,9524.820000052452,356.5849999189377,11292.280000090599,1027.15625,972368,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""056f32c8ce5f5185a7e3a23a0b9b61ec8c51cc105db5c033c3dc719ed8254867""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,11292.280000090599 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-3,2026-08-07T17:09:01.941Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,576.6549999713898,1192.1749999523163,9520.915000081062,359.7549999952316,11289.745000004768,1027.15625,970576,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""056f32c8ce5f5185a7e3a23a0b9b61ec8c51cc105db5c033c3dc719ed8254867""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,11289.745000004768 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-4,2026-08-07T17:09:01.941Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,579.8249999284744,1210.7549999952316,9551.820000052452,357.8250000476837,11342.40499997139,1027.15625,974500,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""056f32c8ce5f5185a7e3a23a0b9b61ec8c51cc105db5c033c3dc719ed8254867""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,11342.40499997139 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-5,2026-08-07T17:09:01.941Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,580.5600000619888,1195.5749999284744,9510.040000081062,364.4800000190735,11286.175000071526,1027.15625,974160,2283707,2275876,15913725,389181,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":""056f32c8ce5f5185a7e3a23a0b9b61ec8c51cc105db5c033c3dc719ed8254867""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,11286.175000071526 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-0,2026-08-07T17:13:44.104Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,15434.12,1250.56,9614.075,2209.79,26298.755,1217.046875,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23359d4ff7ba5e9320f9ce02e5ca5c7b5f3e20c3f12004cb5283e1a0a7ba4743""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26298.755 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-1,2026-08-07T17:13:44.104Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,15267.53,1235.16,9607.57,2213.555,26110.26,1218.328125,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23359d4ff7ba5e9320f9ce02e5ca5c7b5f3e20c3f12004cb5283e1a0a7ba4743""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26110.26 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-2,2026-08-07T17:13:44.104Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,15584.6,1230.495,9566.49,2183.805,26381.585,1222.96875,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23359d4ff7ba5e9320f9ce02e5ca5c7b5f3e20c3f12004cb5283e1a0a7ba4743""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26381.585 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-3,2026-08-07T17:13:44.104Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,15239.62,1231.67,9611.06,2217.63,26082.35,1223.015625,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23359d4ff7ba5e9320f9ce02e5ca5c7b5f3e20c3f12004cb5283e1a0a7ba4743""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26082.35 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-4,2026-08-07T17:13:44.104Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,15396.51,1233.48,9566.9,2182.6,26196.89,1219.296875,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23359d4ff7ba5e9320f9ce02e5ca5c7b5f3e20c3f12004cb5283e1a0a7ba4743""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26196.89 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-5,2026-08-07T17:13:44.104Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,15536.365,1224.615,9573.805,2181.74,26334.785,1223.90625,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""23359d4ff7ba5e9320f9ce02e5ca5c7b5f3e20c3f12004cb5283e1a0a7ba4743""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,26334.785 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-07T17:15:17.999Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,1001.84,9374.79,0,10376.67,1388.984375,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""f99d3e5d12736e72ae28f79687f456b24df0dd135f71a7ee8cdb60ab01b53544""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10376.67 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-07T17:15:17.999Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,1004.135,9414.56,0,10418.72,1388.984375,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""f99d3e5d12736e72ae28f79687f456b24df0dd135f71a7ee8cdb60ab01b53544""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10418.72 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-07T17:15:17.999Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,1000.75,9393.03,0,10393.81,1388.984375,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""f99d3e5d12736e72ae28f79687f456b24df0dd135f71a7ee8cdb60ab01b53544""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10393.81 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-07T17:15:17.999Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,992.96,9367.595,0,10360.74,1388.984375,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""f99d3e5d12736e72ae28f79687f456b24df0dd135f71a7ee8cdb60ab01b53544""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10360.74 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-07T17:15:17.999Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,984.25,9401.005,0,10385.285,1388.984375,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""f99d3e5d12736e72ae28f79687f456b24df0dd135f71a7ee8cdb60ab01b53544""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10385.285 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-07T17:15:17.999Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-single-thread,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,1018.24,9382.185,0,10400.44,1388.984375,16000,74003114,73995283,74003114,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":""f99d3e5d12736e72ae28f79687f456b24df0dd135f71a7ee8cdb60ab01b53544""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,10400.44 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-0,2026-08-07T17:40:07.664Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,2.9,60789.1,153769.8,42.5,214561.8,10632.9375,724,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""230e8560ba13b43008d797675bcd487a253a56d7eec3f837957f626a16e964f2""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,214561.8 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-1,2026-08-07T17:40:07.664Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,4.3,60845.5,153344.2,42.1,214194,10811.59375,723,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""230e8560ba13b43008d797675bcd487a253a56d7eec3f837957f626a16e964f2""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,214194 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-2,2026-08-07T17:40:07.664Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,3.3,60769.9,153086.7,41.2,213859.9,10640.71875,722,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""230e8560ba13b43008d797675bcd487a253a56d7eec3f837957f626a16e964f2""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,213859.9 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-3,2026-08-07T17:40:07.664Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,3.5,60862.8,152847.2,41.5,213713.5,10800.390625,725,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""230e8560ba13b43008d797675bcd487a253a56d7eec3f837957f626a16e964f2""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,213713.5 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-4,2026-08-07T17:40:07.664Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,4.9,60718.4,153483.5,41.5,214206.8,10643.8125,724,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""230e8560ba13b43008d797675bcd487a253a56d7eec3f837957f626a16e964f2""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,214206.8 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-5,2026-08-07T17:40:07.664Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,12.3,60921.4,153416.8,41.7,214350.5,10669.96875,725,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""230e8560ba13b43008d797675bcd487a253a56d7eec3f837957f626a16e964f2""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,214350.5 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-0,2026-08-07T18:01:29.909Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,warmup,0,ok,0,60861.4,152867.5,40.8,213729.6,10953.46875,723,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""169b2396679dfdc87ab586e07adcb48dfea7d1e5965c3d07f8cb83dad3057660""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,213729.6 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-1,2026-08-07T18:01:29.909Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,1,ok,0,60699.7,152742,8.4,213441.8,10953.46875,724,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""169b2396679dfdc87ab586e07adcb48dfea7d1e5965c3d07f8cb83dad3057660""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,213441.8 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-2,2026-08-07T18:01:29.909Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,2,ok,0,60519.6,152559,6.3,213078.8,10953.46875,722,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""169b2396679dfdc87ab586e07adcb48dfea7d1e5965c3d07f8cb83dad3057660""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,213078.8 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-3,2026-08-07T18:01:29.909Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,3,ok,0,60605.6,152661.4,6,213267.1,10953.46875,720,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""169b2396679dfdc87ab586e07adcb48dfea7d1e5965c3d07f8cb83dad3057660""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,213267.1 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-4,2026-08-07T18:01:29.909Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,4,ok,0,60607.8,153069.3,8.4,213677.1,10953.46875,724,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""169b2396679dfdc87ab586e07adcb48dfea7d1e5965c3d07f8cb83dad3057660""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,213677.1 +input-to-proof-v1-20260807,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-5,2026-08-07T18:01:29.909Z,macbook_m4,MacBook Pro (Apple M4 Max),26.5.2 (25F84),arm64,browser_wasm,Google Chrome 151.0.7922.76,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-single-thread,circom-witness-wasm,measured,5,ok,0,60644.4,153119,6.1,213763.5,10953.46875,723,1753618376,1733145772,1753618376,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6""}","{""raw_evidence_sha256"":""169b2396679dfdc87ab586e07adcb48dfea7d1e5965c3d07f8cb83dad3057660""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,213763.5 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,5561.899083,,5561.899083,1012.59375,738899,4246785,3974928,4246785,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,5561.899083 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,6721.897208,,6721.897208,1032.640625,739119,4242061,3970204,4242061,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6721.897208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,6744.484625,,6744.484625,1021.984375,738515,4297357,4025500,4297357,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6744.484625 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,6786.961709,,6786.961709,1018.59375,740692,4280029,4008172,4280029,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,6786.961709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,7751.007208,,7751.007208,1028.75,739227,4199409,3927552,4199409,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,7751.007208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:19:40.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,7404.360792,,7404.360792,1022.75,739919,4237853,3965996,4237853,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""4ea6255262d3053ce332b889d06c5381b4170ef3b39e027f5b6bbe841a27d8eb"",""session_sha256"":""56f2537e2dc9a209678717ce282d613f12881ec6a816694298c0016df140bf3b"",""build_sha256"":""88091bfe4097f9144e3567321552ef37718ad0ee8fae960e5aff9c07161bf9bb""}]}",59ede0a8fdfa8407cb733d42789bee61a31d6891/de6ca216158ba317cfa49a9b2d67fdea5a3afdee,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/59ede0a8fdfa8407cb733d42789bee61a31d6891/session-de6ca216158ba317cfa49a9b2d67fdea5a3afdee/bench-report.json,cold_local,7404.360792 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,4706.155042,,4706.155042,,737829,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,4706.155042 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,6449.621417,,6449.621417,1036.625,741414,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6449.621417 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,6485.354208,,6485.354208,1058.1875,739392,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6485.354208 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,6428.335125,,6428.335125,1074,740525,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6428.335125 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,6479.023709,,6479.023709,1090.65625,738544,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6479.023709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:03:35.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,6415.690167,,6415.690167,1096.0625,742373,4221081,3949224,4221081,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""0d3d105010ead7fb5ef86da72e94a1489166ac35dc169c9dccab4fa79a515b8e"",""session_sha256"":""0334b48f738cc964eafa3eaab9e26c79a5088f57b719f4c6be97d0611a5c748a"",""build_sha256"":""dc73d7976573897e7a4291583df02bad092a6911790a4870801bf1b5cd74a938""}]}",b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/39065e1bd4344ac23a8cb16d6c09574f81591946,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/b1e5ccd3fa7556b2b15a9ff1cde3484e154c5bd9/session-39065e1bd4344ac23a8cb16d6c09574f81591946/bench-report.json,warm_reuse,6415.690167 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,452.420083,6643.58075,,7096.001,862.4375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7096.001 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,503.480542,7514.892833,,8018.373459,859.15625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8018.373459 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,503.247291,7648.712417,,8151.95975,872.140625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8151.95975 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,503.200875,7473.9845,,7977.1855,857.0625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7977.1855 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,521.086042,7572.189625,,8093.275709,853.5,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,8093.275709 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T10:54:13.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,503.777375,7113.808542,,7617.586041,855.5,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a8396e36494447199bc887a4b9b384ef9d287a50955df684ea719045b0e19547"",""session_sha256"":""269d645c36f3044ca24661bce576315479866988232930de7ed4bf0a7dcff8b8"",""build_sha256"":""2cba1dbb861a5af2a723f9a929598c8a9a94e640a63535bac2a9ae29c4dab644""}]}",3ecb537628abb1a3d2adeca3b8a96323d1543548/848c866210b16592d24339c5fa3beb73b4d4a254,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/3ecb537628abb1a3d2adeca3b8a96323d1543548/session-848c866210b16592d24339c5fa3beb73b4d4a254/bench-report.json,cold_local,7617.586041 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,457.751292,7447.586333,,7905.337833,,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7905.337833 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,482.815042,7496.62,,7979.435125,884.5625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7979.435125 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,515.780959,7643.547334,,8159.328416,891.953125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8159.328416 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,504.39725,7713.985542,,8218.382875,891.890625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8218.382875 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,511.586792,7285.887125,,7797.474042,891.96875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,7797.474042 +input-to-proof-v1-20260807,passport_complete_age_check__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:14:12.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,509.84,7720.695958,,8230.536,891.921875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fb4ddd25d9e988d65d1ec2bfc7cd3ca04014528c52369e97cf9979eed061ee20"",""session_sha256"":""f3021c1620053b2d3a47c69d02f79c9524a853f4a8a9615fca65391cb0e9a543"",""build_sha256"":""b8dd725870051fa3522e746d1111b82a2cfa1c0bfd140471cc1d78f3e782cd5f""}]}",4859c9ff6d9c01236cdd5246bb4062d982187dbd/9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/4859c9ff6d9c01236cdd5246bb4062d982187dbd/session-9e106c9f7e6a90f732d65d2d0d1554ad71a9cef2/bench-report.json,warm_reuse,8230.536 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2172.8525,,2172.8525,530.65625,716750,2578799,2331760,2578799,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2172.8525 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2242.035291,,2242.035291,527.359375,716187,2514819,2267780,2514819,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2242.035291 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2898.778958,,2898.778958,526.703125,715938,2573939,2326900,2573939,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2898.778958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,2410.340917,,2410.340917,530.140625,714941,2565007,2317968,2565007,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2410.340917 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,2929.068875,,2929.068875,530.640625,715885,2547371,2300332,2547371,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2929.068875 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:35:07.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,2426.808625,,2426.808625,536.59375,715147,2519239,2272200,2519239,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""2fac9f84021ad6846ac29b54588b6557d21c89040a3ce82fea6eb7184bd83690"",""session_sha256"":""0bf31c2e1f726894208bd223d38b8eb6ea9a76de2a81f4984c0172754a3c6a3b"",""build_sha256"":""a4cfd230d1d3741ac48781c9d5eba0b81a2efeaca16ece68b9c1788a129be672""}]}",ee67db274e3809e95af215a5c744b25be006b6d1/1933dc94f98688456525e69437a433797fb3c918,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/ee67db274e3809e95af215a5c744b25be006b6d1/session-1933dc94f98688456525e69437a433797fb3c918/bench-report.json,cold_local,2426.808625 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2137.248125,,2137.248125,,717410,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2137.248125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2242.047,,2242.047,538.09375,714730,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2242.047 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2244.620417,,2244.620417,556.046875,718955,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2244.620417 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,2315.447916,,2315.447916,568.015625,713994,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2315.447916 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,2304.393875,,2304.393875,573.609375,717286,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2304.393875 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:16:56.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,2322.712625,,2322.712625,575.828125,717635,2539811,2292772,2539811,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""143088b17165db8578e4983ab96aabca71ecac22098ea8438746f091ce8d114c"",""session_sha256"":""c0283d9d01d6ae93beebc5eb0b968612694c1a975395948189107efb39f5b8a4"",""build_sha256"":""e9d4dd36b5182dd375894b63b62e07f96fd5d63b851d9736af2e91e6782e1dc3""}]}",c7577b09dea478eb7abb1a8378feac929929af69/6786df4010f93ec42074908be3cd9c40bc9a8fe8,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/c7577b09dea478eb7abb1a8378feac929929af69/session-6786df4010f93ec42074908be3cd9c40bc9a8fe8/bench-report.json,warm_reuse,2322.712625 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,283.588792,4691.273167,,4974.862125,491.59375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4974.862125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,288.769333,4321.633625,,4610.403042,496.984375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4610.403042 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,307.65025,4593.549125,,4901.1995,481.046875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4901.1995 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,300.4865,4444.501334,,4744.987958,493.78125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,4744.987958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,317.124917,4704.524709,,5021.64975,488.078125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,5021.64975 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T11:00:03.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,305.928125,4811.90775,,5117.835958,487.609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""11f54d3ec3ab6c7f17e17ab0dea7fb12ba8ba3f28bb7c762e569519a8013e1ee"",""session_sha256"":""47e72f01bb0434cfa8297df1847b7ff971f129d34efabb960f6df2bf7060cd79"",""build_sha256"":""daf30450c3cc12ecb3870fcc87defad5175b061de4dbd6a15ee9c6833ba66115""}]}",7ac7924fdfaae9cac6242ca49a98dd640f6c7750/b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/7ac7924fdfaae9cac6242ca49a98dd640f6c7750/session-b7e1e0c86b3a1c2ae43f7f3f7751e87b102d2e79/bench-report.json,cold_local,5117.835958 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,278.133166,4241.928583,,4520.062375,,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4520.062375 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,308.967083,4330.398917,,4639.366125,490.84375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4639.366125 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,315.864333,4321.75475,,4637.619209,491.15625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4637.619209 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,318.497667,4321.779917,,4640.277709,491.171875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4640.277709 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,333.711875,4346.148625,,4679.860584,491.234375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4679.860584 +input-to-proof-v1-20260807,passport_p1__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:28:47.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,314.228041,4364.101459,,4678.3295,491.265625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""633cb29f209a4e615a01ec15bcfd197ab8e8e894fc9c6180d2cc3ceb453f5745"",""session_sha256"":""a53e52d1f5ad540cd83d2b1f5dfc062bb689536658ec65331659b3343e62e3e3"",""build_sha256"":""ff444bdb5858250a18c8ca117fe4c92782aee817fe23e5582f9a1d4ccf2f1513""}]}",add170877eda73b95b8334e434ebcf68a831baf3/70bfc877199f31cd467422b4c17a75684ebbbe74,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/add170877eda73b95b8334e434ebcf68a831baf3/session-70bfc877199f31cd467422b4c17a75684ebbbe74/bench-report.json,warm_reuse,4678.3295 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,1140.392959,,1140.392959,143.328125,632660,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1140.392959 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,919.743542,,919.743542,142.671875,634964,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,919.743542 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,1254.2595,,1254.2595,141.125,635604,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1254.2595 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,1199.335791,,1199.335791,141.90625,635764,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1199.335791 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,1337.309875,,1337.309875,141.453125,629195,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,1337.309875 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:45:09.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,903.116333,,903.116333,144.53125,629740,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""e628a63f508565673cdce331185dea4abb70f66afb666debf939f42b9ee4cad7"",""session_sha256"":""95927199f0a90598080ba361f72cac69e2ac4254285a97ddbf0683e89bded230"",""build_sha256"":""b57b080a236425ad84fc1bf75b726b1651245b20971f52b5013a0710027b1ae4""}]}",6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/7b5fd61c76a93135772d30e55ef971df9f78f166,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/6ec3478e3deafbfe2c9d1b7cf3ad263db8e4752b/session-7b5fd61c76a93135772d30e55ef971df9f78f166/bench-report.json,cold_local,903.116333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,909.477083,,909.477083,,632244,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,909.477083 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,1237.383833,,1237.383833,144.125,634644,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1237.383833 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,1172.487958,,1172.487958,141.921875,630516,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1172.487958 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,1084.921333,,1084.921333,142.34375,636724,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1084.921333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,1242.178792,,1242.178792,145.109375,634580,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1242.178792 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T19:15:14.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,1423.84775,,1423.84775,145.84375,633588,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""8473606319e2fd8c91d47d8b575e0c99e54f2a2644b562d5bccf39c6d94ef1bf"",""session_sha256"":""4f9b76e7347f28fe880d35fb1be165cd7221b0bdc2252f5ec1ebd1b754bd2f34"",""build_sha256"":""a8353450fc064ddf20d14fd60f78ff7002b61ebd8ccbbb2ecbd8186321990b81""}]}",a547a225089d90695ee928448239a289a6f17486/4c17c3b0d49a7054b63af876b3e2b6874576694a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/a547a225089d90695ee928448239a289a6f17486/session-4c17c3b0d49a7054b63af876b3e2b6874576694a/bench-report.json,warm_reuse,1423.84775 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,323.8575,2519.133458,,2842.991,367.453125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2842.991 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,320.633958,2596.478208,,2917.112292,366.46875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2917.112292 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,327.897709,2559.122667,,2887.0205,375.875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2887.0205 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,316.197375,2559.387917,,2875.585416,371.515625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,2875.585416 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,329.706041,2680.23325,,3009.939333,373.484375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,3009.939333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T11:05:00.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,338.01325,2719.800375,,3057.813708,378.375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""2f019fe49eb4167d81ad37c9f9f7b0c50ae6b37d2cf168e7cfaaa74e35bf8732"",""session_sha256"":""46ee5483640870aa30eed2d173aa2bdc618e14c38e0ce0e63df8b9874d853658"",""build_sha256"":""b82bf847306d3972e0e33dbe7b83affaed5968cd02738702494e30f65115ec7a""}]}",d82d32c4209ae0fe1b5873911ce984481dd8d4b3/bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/d82d32c4209ae0fe1b5873911ce984481dd8d4b3/session-bab0e5c82f0c35d2b0829bd6c1fa15fe521485e1/bench-report.json,cold_local,3057.813708 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,303.190333,2643.975458,,2947.166042,,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2947.166042 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,307.867584,2645.076833,,2952.944459,384.0625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2952.944459 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,304.529667,2464.748583,,2769.278333,384.171875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2769.278333 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,317.14025,2606.420959,,2923.561291,384.953125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,2923.561291 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,321.849959,2755.037334,,3076.887375,388.328125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,3076.887375 +input-to-proof-v1-20260807,oprf_o2__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T21:43:49.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,318.147167,2719.777166,,3037.924417,387.5625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""fe4c8f2c3f65934e782ca87dd5bed82066f0fe316cdabbcd5265918e8f694428"",""session_sha256"":""f8a7333af2dffd4e17c43cf5d0897e8066dfd3419b7d546ad709b816a75fc187"",""build_sha256"":""95ce3f1bd3cb27b129ce2ae533d6fcd26b2b21434d200292e6ababa6bc299f9b""}]}",ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/58176d171c5fc0b0ddf5acb3855303477207887a,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/ece465c45ad91aa2d9a6f85d9a7260bdfb26de2e/session-58176d171c5fc0b0ddf5acb3855303477207887a/bench-report.json,warm_reuse,3037.924417 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-0,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2772.417125,,2772.417125,554.265625,714522,2324912,2275692,2324912,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2772.417125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-1,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,2879.950208,,2879.950208,554.140625,716218,2373452,2324232,2373452,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2879.950208 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-2,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,2946.604,,2946.604,547.921875,714370,2388132,2338912,2388132,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,2946.604 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-3,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,3315.102917,,3315.102917,556.03125,716216,2387368,2338148,2387368,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3315.102917 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-4,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,3142.408333,,3142.408333,551.21875,717544,2369352,2320132,2369352,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3142.408333 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__cold_local-5,2026-08-09T10:39:37.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,3031.44075,,3031.44075,556.375,717723,2386684,2337464,2386684,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""5f736b7fc0777d6d373fcb09404581a0a104bb8fd3b4ec0ea3c6f42d16171efb"",""session_sha256"":""7b95b94dd1c07f403b9977892b05c27960c03ed349f4af8f01865793397d783a"",""build_sha256"":""25b6894967e505c2e4f53e67ddce3cc8d43d7f7b6701a3d3f145eac85d780207""}]}",67a149cdf6424ae1c8ca97ed12326112bb6e1871/343ce2e7c4d0cab63fa786bce1be8874e18062c4,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/67a149cdf6424ae1c8ca97ed12326112bb6e1871/session-343ce2e7c4d0cab63fa786bce1be8874e18062c4/bench-report.json,cold_local,3031.44075 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-0,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,2987.521167,,2987.521167,,712759,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,2987.521167 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-1,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,3374.250958,,3374.250958,561.265625,715532,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3374.250958 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-2,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,3054.951167,,3054.951167,577.171875,716745,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3054.951167 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-3,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,3222.688875,,3222.688875,589.75,715440,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3222.688875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-4,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,3016.537291,,3016.537291,591.796875,719840,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3016.537291 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__provekit_v1__warm_reuse-5,2026-08-07T21:24:27.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,3171.360292,,3171.360292,592.59375,712265,2425244,2376024,2425244,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","{""raw_evidence_sha256"":[{""report_sha256"":""99c012d37ffc293a8f51bf146661cac61bd635ef92bcf14fcef843c6add07c98"",""session_sha256"":""e6bb0dc564c46dee3ccfa19fbcecc7e33270a29de262407d805dcf424464327a"",""build_sha256"":""d24987476d6b24c07967710ee4febd5d9d72369fb474002feb9d73b07d1dbb87""}]}",1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/ba570bbe2981c642d91ca44182c0d8bbd7502fd6,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/provekit/browserstack/1efe4e5c1c8a8aa1ff96b3ead080ac5ecac5c1c4/session-ba570bbe2981c642d91ca44182c0d8bbd7502fd6/bench-report.json,warm_reuse,3171.360292 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-0,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1033.621084,4173.030667,,5206.651875,540.0625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5206.651875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-1,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1043.084958,3994.710292,,5037.795458,528.109375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5037.795458 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-2,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1072.522292,4008.883292,,5081.405667,554.0625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5081.405667 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-3,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1055.143,4061.1945,,5116.337541,532.234375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5116.337541 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-4,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1069.207583,4225.806417,,5295.014083,536.609375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5295.014083 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__cold_local-5,2026-08-09T10:49:25.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1135.534583,4131.623625,,5267.158292,537.203125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""a2b128e6872945c436400cc5fb046c9b1cd41ae7e61ff4c82ec992c9cb597d72"",""session_sha256"":""ed52606113b51d18d43e17ddadffb4be7a3657d8fb1d71d77d4a2e159be20229"",""build_sha256"":""c74d9853403223c29e6fd3a9d5f1154d3c946a13128b10e48933eadcf0b10e4b""}]}",8bbe2ac26b9ae7df3feed3e938a2e408709d7167/95c8e60b26c9d9274a1eca0e19c523f6c78043ee,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/cold/batch/remaining/8bbe2ac26b9ae7df3feed3e938a2e408709d7167/session-95c8e60b26c9d9274a1eca0e19c523f6c78043ee/bench-report.json,cold_local,5267.158292 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-0,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1022.695417,4024.849833,,5047.545875,,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5047.545875 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-1,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1091.779125,4019.158917,,5110.938125,566.609375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5110.938125 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-2,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1130.776875,4098.645125,,5229.422041,570.34375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5229.422041 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-3,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1155.52975,3930.39975,,5085.929583,566.734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5085.929583 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-4,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1161.810417,4184.801375,,5346.612,581.46875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5346.612 +input-to-proof-v1-20260807,webauthn_closest_analogue__iphone_se_2022__noir_barretenberg__warm_reuse-5,2026-08-07T19:22:38.000Z,iphone_se_2022,iPhone SE 2022,15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1180.926959,4172.13675,,5353.063792,585.859375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","{""raw_evidence_sha256"":[{""report_sha256"":""d5677fd347cd599e1d34faf99cb71c7c628f7ff8dab42b4cbacb374895928479"",""session_sha256"":""c923c6561e5bdd640d11a7b7a4efd7a5daff8748ee8de9e54057ab88e248e3b0"",""build_sha256"":""24872c6ca86e462821d2f00960abd56e6c3c20b3de837e5109de4685cd6e36d6""}]}",5fc92aa790d0ef36ecab56993b32f502bc379f00/27cc9f9655c0069cdc44133c1fb864fc202abf3c,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/iphone/publication/warm/noir/browserstack/5fc92aa790d0ef36ecab56993b32f502bc379f00/session-27cc9f9655c0069cdc44133c1fb864fc202abf3c/bench-report.json,warm_reuse,5353.063792 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-0,2026-08-09T20:01:36.397Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,150764.229547,,150764.229547,777.4140625,735992,4240241,3968384,4240241,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""8c4eec0aac6ee6700f1f2e366aba6618579c86b3292ebf9b214018903dad9837""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-0/results.json,cold_local,150764.229547 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-1,2026-08-09T20:14:08.206Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,151292.213163,,151292.213163,707.79296875,740608,4188373,3916516,4188373,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""8ebb89be567c08eec7930837e20f75a6a3d410c2a11edfb242f29ebd8c74d914""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-1/results.json,cold_local,151292.213163 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-2,2026-08-09T20:26:39.589Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,152077.526855,,152077.526855,791.62890625,742458,4238025,3966168,4238025,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4f44326cfcfd9aa917784c8c3310f443054d0f13846908e4ddb0dca91bd1fab2""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-2/results.json,cold_local,152077.526855 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-3,2026-08-09T21:34:42.018Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,152313.415163,,152313.415163,771.859375,739838,4211625,3939768,4211625,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""0712859473d19ba69564c6b524c3e7e7b168adb645c8a418576a74cebf98e3a3""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry4-20260809/passport/run-3/results.json,cold_local,152313.415163 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-4,2026-08-09T20:41:20.676Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,150512.474239,,150512.474239,830.234375,737221,4218333,3946476,4218333,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""961dd84deedfd89da331a200760454ff843d2b03bacfeb48c761acaae6945906""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-4/results.json,cold_local,150512.474239 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__cold_local-5,2026-08-09T20:53:52.047Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,152458.801547,,152458.801547,815.375,739700,4244457,3972600,4244457,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""22ab696bcf14bd0762fca85e6cbba02f0c70f332ce772ed3df8498f87bc5f66d""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport/run-5/results.json,cold_local,152458.801547 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,151892.272316,,151892.272316,,739136,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151892.272316 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,151278.737471,,151278.737471,842.05078125,739427,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151278.737471 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,151264.522855,,151264.522855,879.7734375,738045,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151264.522855 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,152133.721778,,152133.721778,623.71875,741328,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,152133.721778 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,151222.247778,,151222.247778,863.24609375,740506,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151222.247778 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T17:42:14.898Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,151117.975086,,151117.975086,895,737789,4222317,3950460,4222317,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d01563a77c5f18dbe84a0bb4652446ed154adff212d51c343f97d66adf920c2e""}]",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-single-thread-v3-postreboot-20260809/results.json,warm_reuse,151117.975086 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T11:36:22.696Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,2865.287154,203079.489551,,205944.77755,706.30859375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""25b249e2c2da4e08e3bb89806c009a2afa43de3481cbdee454ea4f094a7ab639""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-0/results.json,cold_local,205944.77755 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T11:47:36.110Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,2872.622538,205042.635782,,207915.259704,773.95703125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c0194e04bdc10c8acf271f853cdced7aaa3321ac3c9cf365602b202003b0f4f6""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-1/results.json,cold_local,207915.259704 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T11:58:48.823Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,2895.865616,202800.136936,,205696.003397,744.1015625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""93e05d44ad0729418162f1db79ac4fe9872921d932fb06d2b717e6434e9165cd""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-2/results.json,cold_local,205696.003397 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T12:10:02.560Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,2851.148923,204448.643628,,207299.793551,705.546875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""0c1abf53be299a461d558926f17b8cbb277bcefb52b0beba681ec5e03f1189f7""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-3/results.json,cold_local,207299.793551 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T12:21:11.991Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,2872.618462,203511.816704,,206384.436013,717.3828125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""80baf1a897b600cb94440cc26e21177685766586c0c69c9fe69aed696f8d1ec6""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-4/results.json,cold_local,206384.436013 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T12:32:28.475Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,2858.514462,207933.075474,,210791.590859,711.4765625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d0f3b90a45f3af7afb5f5091d5022f00fcf3fe8da60b32ec9d6a96d813f5abc9""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport/run-5/results.json,cold_local,210791.590859 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,2850.672923,203002.677551,,205853.352243,,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205853.352243 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,2867.334385,202867.789782,,205735.125012,759.42578125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205735.125012 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,2871.198461,202466.879089,,205338.078705,765.3828125,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205338.078705 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,2878.200308,203673.143396,,206551.344628,705.96484375,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,206551.344628 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,2881.895308,201911.566705,,204793.463089,783.296875,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,204793.463089 +input-to-proof-v1-20260807,passport_complete_age_check__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T09:29:09.857Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,2863.949461,202657.051089,,205521.00132,733.0390625,16100,270482218,270465982,270482218,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""48afe47748d2449812cf10a81ce1db5da08f78ecbabb3b736d9b74da6507cc7e""}]",,Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair.,,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-20260810/results.json,warm_reuse,205521.00132 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-0,2026-08-09T19:29:52.352Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,21931.14554,,21931.14554,473.82421875,714537,2544947,2297908,2544947,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""1adc9289e38ec836cebb9e7d02642b2280df2f552341e2d5c48f5e904edd70ee""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-0/results.json,cold_local,21931.14554 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-1,2026-08-09T21:19:58.552Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,37041.281771,,37041.281771,804.08984375,716512,2546303,2299264,2546303,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""499de31c42b13d58caba4c553b037393bd17558d272aba58810a21f88f069836""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry2-20260809/passport-p1/run-1/results.json,cold_local,37041.281771 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-2,2026-08-09T19:36:13.158Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,22010.566386,,22010.566386,475.72265625,714242,2561167,2314128,2561167,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4219d81524f94194e24a572de6701df98acfc2585ab68f1592bd23d6dc7b6a19""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-2/results.json,cold_local,22010.566386 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-3,2026-08-09T19:40:23.451Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,22004.165925,,22004.165925,470.55078125,717141,2534723,2287684,2534723,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""abb6d31172c9eb62445880fa1681bdee7a44e701428f15a5ff6d2e94e92534e7""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-3/results.json,cold_local,22004.165925 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-4,2026-08-09T19:44:30.877Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,21936.455616,,21936.455616,473.8046875,716285,2561447,2314408,2561447,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""bcb3a37e29e031da1db24ed43a49228fa57b70520f9390f51c5a94dda1a4aca3""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-4/results.json,cold_local,21936.455616 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__cold_local-5,2026-08-09T19:49:02.544Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,21932.071156,,21932.071156,474.06640625,716138,2549071,2302032,2549071,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""73f1e2b814e1e7170fe46286b2096bf6e5b5082db2c3b5519374e508b7566710""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/passport-p1/run-5/results.json,cold_local,21932.071156 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,22012.132616,,22012.132616,,715538,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22012.132616 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,22013.30554,,22013.30554,468.4765625,716398,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22013.30554 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,21946.08954,,21946.08954,472.41796875,715701,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21946.08954 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,21960.394386,,21960.394386,473.38671875,713658,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21960.394386 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,22017.082848,,22017.082848,471.8828125,713578,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,22017.082848 +input-to-proof-v1-20260807,passport_p1__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T17:13:54.322Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,21965.429847,,21965.429847,471.87890625,717491,2518091,2271052,2518091,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""23031f0830ee6aebe458efdd6fddd198ee55dc74a59126c62c137186ab66372b""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-passport-p1-v2-postreboot-20260809/results.json,warm_reuse,21965.429847 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T10:47:29.617Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1930.646462,115098.799392,,117029.447007,465.24609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c8305a812976dc175ab872236aa6b088ddbd36c47b4c5e0bc26e82ce6c0bfa8e""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-0/results.json,cold_local,117029.447007 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T10:55:00.924Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1938.775616,115207.859392,,117146.636084,459.99609375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""2d369cdc201378381b9492f05f0953ea39eb03b7f52b2c110e223b7f40eb7064""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-1/results.json,cold_local,117146.636084 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T11:02:33.065Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1934.800077,115154.204314,,117089.005468,466.125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""3776758f3143e02c849aad1358a73a39ebbfbcfc2724c5d71aa78a8752d56674""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-2/results.json,cold_local,117089.005468 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T11:10:03.637Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1938.140693,115850.475623,,117788.617315,465.1484375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""1ab20865d70ba9b594487a57d197a70b75148721eadd75a25d8e616a3211c92d""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-3/results.json,cold_local,117788.617315 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T11:17:36.073Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1938.114154,115212.368545,,117150.483622,465.85546875,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""16ecdfdc963615f034092563ea6298879949b75d88a594141840bc7edb3e1aa0""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-4/results.json,cold_local,117150.483622 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T11:25:09.090Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1940.772231,115395.711161,,117336.484622,461.2109375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""4e89cbbb427961004c4949ca99e6fbad762e23a088fc23c79d5b30868cc5f119""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-passport-p1/run-5/results.json,cold_local,117336.484622 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1940.787077,115001.471699,,116942.260392,,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,116942.260392 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1937.975769,115208.417853,,117146.394699,468.6953125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117146.394699 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1936.869308,115176.956007,,117113.826392,468.7734375,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117113.826392 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1934.062231,115440.940623,,117375.00393,470.2265625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117375.00393 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1941.104846,115179.304237,,117120.410084,475.015625,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117120.410084 +input-to-proof-v1-20260807,passport_p1__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:55:12.651Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1938.620923,115332.492545,,117271.114776,471.125,16324,271712159,271696456,271712159,,input-to-proof-v1,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""b0dfc1bdabff6abac4035af8f8ae805006d0a423f9a61e02e33288b9f773b778""}]",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-passport-p1-20260810/results.json,warm_reuse,117271.114776 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-0,2026-08-09T17:49:39.722Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,12584.178155,,12584.178155,145.85546875,632532,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""09ac8e4947b96f9397ef34b4b05de4f398f08bc9cdd677697d132111e6ecaefc""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-0/results.json,cold_local,12584.178155 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-1,2026-08-09T17:52:09.957Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,12680.550155,,12680.550155,144.88671875,636500,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""3b2677e383c3f9eacd1788ee85a3ccdd978efbf5cd4a46b5ddb108cc108e9a29""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-1/results.json,cold_local,12680.550155 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-2,2026-08-09T17:54:13.505Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,12466.876924,,12466.876924,145.1015625,634516,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9f9c74a226bcbf2c9b7afd64c23e4266b4a5c596861b4b99265d7d916833c1ee""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-2/results.json,cold_local,12466.876924 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-3,2026-08-09T21:04:59.575Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,12799.092386,,12799.092386,170.140625,634548,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""54ec9c0e17a3bebdc546c5c73fa6f139df54cb14cfd9d988ebf56b3b2fc87002""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry-20260809/oprf/run-3/results.json,cold_local,12799.092386 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-4,2026-08-09T17:58:28.620Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,12725.462078,,12725.462078,140.03515625,633096,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""2bb6eb16cf831f0e35cf8dfb8c095815ccc7c57758faadc9371e821018cf7be5""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-4/results.json,cold_local,12725.462078 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__cold_local-5,2026-08-09T18:00:33.037Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,12444.639693,,12444.639693,145.078125,634868,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""4c79106dd34e329ccedb44c559c6b4b3e7cd3b2cf9d9e42cd9f9d6af1bfd3fd8""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/oprf/run-5/results.json,cold_local,12444.639693 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,12162.576385,,12162.576385,,634836,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12162.576385 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,10413.302462,,10413.302462,145.93359375,631668,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10413.302462 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,10142.202539,,10142.202539,147.703125,632948,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10142.202539 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,10756.831616,,10756.831616,160.46484375,623775,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,10756.831616 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,12584.569463,,12584.569463,158.10546875,632852,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12584.569463 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T16:15:38.727Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,12419.088693,,12419.088693,158.046875,626597,1648269,1642416,1648269,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""5981c0f9fec3c9a3e7f89bc5f78427125c6d26b8db31ee5457cae2aa35f3cf5e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-oprf-v2-20260809/results.json,warm_reuse,12419.088693 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T07:57:50.331Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1883.057847,68266.155004,,70149.213543,318.24609375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""52c5dec4dd733ada22482652940c33f0620cca205fbc5c7127cee1133c93684e""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-0/results.json,cold_local,70149.213543 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T09:35:27.717Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1888.725538,68274.720235,,70163.445927,306.59765625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""998f6f8068611896ea01432316048f8ae03ccf7600448157a91a2d5bef52832a""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-1/results.json,cold_local,70163.445927 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T09:40:50.624Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1882.602462,68229.872619,,70112.475697,306.09375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""de0477de370a6baf2aea70c0f55edf312a8a3b51e6b2e18105436d8a0ad19b89""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-2/results.json,cold_local,70112.475697 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T09:46:12.899Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1892.495308,68252.736004,,70145.231774,305.1796875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""03340fc290cbddd7555ae20c9de7f272552952b9aa40553af91747eca7265192""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-3/results.json,cold_local,70145.231774 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T09:51:32.631Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1892.782461,68287.56185,,70180.345466,307.2578125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""57fe05ea8648843c9ecc5c83c9ac60ed8a2ec12827670903f2479366d9060b75""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-4/results.json,cold_local,70180.345466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T09:56:55.485Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1887.943385,68227.946234,,70115.891158,303.5078125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""7d1d1f7c2db24881e8cbb594f3da736032c22fb59a1934934ab68e3f66699756""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-oprf/run-5/results.json,cold_local,70115.891158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,1888.348615,68189.509312,,70077.859465,,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70077.859465 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,1889.628538,67988.621235,,69878.250696,301.96875,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,69878.250696 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,1875.327384,68222.355158,,70097.683388,302.1484375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70097.683388 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,1876.999154,68142.220927,,70019.221466,300.45703125,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70019.221466 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,1875.057154,68249.552312,,70124.610158,301.87890625,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,70124.610158 +input-to-proof-v1-20260807,oprf_o2__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:13:52.549Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,1893.020615,69120.355389,,71013.376312,300.59375,16548,271056603,271051007,271056603,,input-to-proof-v1,85aeeef539961cae5a63de794997b507a5975717,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""5b21ce8a915207ace72f668df0552e433743aee492ad8de0724e811593886e79""}]",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-oprf-20260810/results.json,warm_reuse,71013.376312 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-0,2026-08-09T18:06:53.295Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,27751.064925,,27751.064925,496.4609375,718163,2390932,2341712,2390932,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""f2e0ff7e7588dbed87ff8946aef1a8017d03860987d252ecddea0a04fc7ee65e""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-0/results.json,cold_local,27751.064925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-1,2026-08-09T18:11:05.720Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,27910.810463,,27910.810463,493.00390625,716743,2363144,2313924,2363144,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""d60fc911089738a04c32e1dc20f8472b4a00ec86ee9f3cc098c00f96d0ff0442""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-1/results.json,cold_local,27910.810463 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-2,2026-08-09T19:15:04.224Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,27714.982386,,27714.982386,500.12109375,716211,2384412,2335192,2384412,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""0a71e2ffe395f25cb86883ce326e43ea5d5ec9f415d1ff0765f4152c92d37f70""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-2/results.json,cold_local,27714.982386 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-3,2026-08-09T19:19:15.319Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,27812.34954,,27812.34954,494.33203125,714300,2322424,2273204,2322424,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""593b56a00bebece2303ebbb221ab168493bed04dc656cac067f91f82c702d7c7""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-3/results.json,cold_local,27812.34954 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-4,2026-08-09T19:23:34.521Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,28003.115386,,28003.115386,491.296875,718670,2406852,2357632,2406852,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""bf346e612a20bc5b83e06797cb94c32a9b95e697ef3ea6d830d2253a32a8d891""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold/webauthn/run-4/results.json,cold_local,28003.115386 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__cold_local-5,2026-08-09T21:09:23.421Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,27901.663771,,27901.663771,494.79296875,716291,2336580,2287360,2336580,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""6208691e252755688904025e0c40a7c4516edf2a62877a522d4ad144bca8bb62""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/attempts/cold-retry-20260809/webauthn/run-5/results.json,cold_local,27901.663771 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-0,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,warmup,0,ok,,,27986.81054,,27986.81054,,715639,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27986.81054 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-1,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,1,ok,,,27898.193771,,27898.193771,493.74609375,715277,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27898.193771 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-2,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,2,ok,,,27803.135617,,27803.135617,491.97265625,715049,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27803.135617 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-3,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,3,ok,,,27862.763617,,27862.763617,501.51171875,716193,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27862.763617 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-4,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,4,ok,,,27743.926233,,27743.926233,500.5625,712986,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27743.926233 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__provekit_v1__warm_reuse-5,2026-08-09T16:30:47.313Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-native,integrated-noir-beta11-witness,measured,5,ok,,,27767.005925,,27767.005925,502.0390625,710361,2362084,2312864,2362084,,input-to-proof-v1,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""mobench"":""0.1.48"",""noir"":""1.0.0-beta.11""}","[{""raw_evidence_sha256"":""9056119b12163297f45ff807f506e0cda3609e7128e6d74488fc499ace1f643f""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Native ProveKit exposes witness generation and proving as one integrated timed operation, so witness_time_ms is intentionally blank.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/provekit-webauthn-v2-postreboot-20260809/results.json,warm_reuse,27767.005925 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-0,2026-08-10T10:04:06.562Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,7453.589847,107470.601853,,114924.192853,486.23828125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""3d3e0937e8ecb2a964b3ae04e58eba0ba1ad220f3dd426ad73580efdd2794a37""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-0/results.json,cold_local,114924.192853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-1,2026-08-10T10:11:16.913Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,7464.466385,106320.877467,,113785.344853,490.734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""1959c4bb4de693d8e213388939aa3fff408ce6a4bfd39bb7430079b7d7399cae""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-1/results.json,cold_local,113785.344853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-2,2026-08-10T10:18:26.772Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,7463.362462,107215.131775,,114678.495315,493.37890625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""c7eebf005b62db532f56b4ba72caaa77ddf7fa4da0229c941fcf5b3dde183ede""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-2/results.json,cold_local,114678.495315 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-3,2026-08-10T10:25:39.076Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,7442.536539,107617.012622,,115059.550238,492.9296875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d727ff17466c2d0280bf99f6391ed4e4c78714a199bf8d4fd58c4624b14ec071""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-3/results.json,cold_local,115059.550238 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-4,2026-08-10T10:32:50.164Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,7455.639385,107196.120929,,114651.761238,494.9140625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""76261f17a59e8f803f69b08b1569e91056b5bacc951373fa414e09ec45285e4b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-4/results.json,cold_local,114651.761238 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__cold_local-5,2026-08-10T10:39:59.829Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,7464.392616,106954.437853,,114418.831468,494.05078125,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d050f00a18626bf659e7f8efbb3c68361c40c320237f99acb68ab0d9a69e6422""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/cold/barretenberg-webauthn/run-5/results.json,cold_local,114418.831468 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-0,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,warmup,0,ok,,7427.613232,107333.576545,,114761.191161,,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114761.191161 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-1,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,1,ok,,7449.868847,107294.658468,,114744.528315,494.7265625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114744.528315 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-2,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,2,ok,,7461.823385,107155.801468,,114617.625853,502.796875,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114617.625853 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-3,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,3,ok,,7443.431078,107235.876545,,114679.308623,504.30859375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114679.308623 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-4,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,4,ok,,7451.634231,107122.822776,,114574.458468,506.52734375,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114574.458468 +input-to-proof-v1-20260807,webauthn_closest_analogue__motorola_e15__noir_barretenberg__warm_reuse-5,2026-08-10T08:33:58.785Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-rs-4.2.0-aztecnr-rc.2,acvm-beta19,measured,5,ok,,7443.167308,107202.061775,,114645.229776,506.37890625,21092,271131517,271127379,271131517,,input-to-proof-v1,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""mopro"":""0.3.7"",""barretenberg_rs"":""4.2.0-aztecnr-rc.2"",""noir"":""1.0.0-beta.19""}","[{""raw_evidence_sha256"":""d24eee657c18b7d6e429f4650ed6caba9af28e15650d86f51f0bd13cbec56a7b""}]",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/e15/publication/warm/barretenberg-webauthn-20260810/results.json,warm_reuse,114645.229776 +input-to-proof-v1-20260807-taceo-candidate,passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local-gap,2026-08-11T00:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""register_reference_wtns_sha256"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""disclose_reference_wtns_sha256"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f"",""raw_evidence_sha256"":""a007c866671dfceb42177242183c512db51c2eb9b3af418e3416d1595bcf5016"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,unsupported_dynamic_witness_graph,circom-witness-rs cannot generate qualified graphs for either required Self stage: register generated C++ requires unsupported Fr_bor/Fr_bxor and contains runtime control flow; vc_and_disclose aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> VERIFY_COMMITMENT -> VC_AND_DISCLOSE. No qualified graph/material exists for an iPhone run. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_complete_age_check__iphone_se_2022__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-20260807-taceo-candidate,passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse-gap,2026-08-11T00:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""register_reference_wtns_sha256"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""disclose_reference_wtns_sha256"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f"",""raw_evidence_sha256"":""3408be61e63c7edecd8d15170e9db2224d8ac3a14825559f4f154f415c3ec949"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,unsupported_dynamic_witness_graph,circom-witness-rs cannot generate qualified graphs for either required Self stage: register generated C++ requires unsupported Fr_bor/Fr_bxor and contains runtime control flow; vc_and_disclose aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> VERIFY_COMMITMENT -> VC_AND_DISCLOSE. No qualified graph/material exists for an iPhone run; therefore warm reuse is unavailable too. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_complete_age_check__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807-taceo-candidate,passport_complete_age_check__motorola_e15__circom_groth16__cold_local-gap,2026-08-11T00:00:00.000Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""register_reference_wtns_sha256"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""disclose_reference_wtns_sha256"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f"",""raw_evidence_sha256"":""aa6dc79057e3cd5e7923fbda06cbd8fce00ed943599089be341dc3cfe7173baa"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,witness_graph_unsupported,circom-witness-rs cannot generate qualified graphs for either required Self stage: register generated C++ requires unsupported Fr_bor/Fr_bxor and contains runtime control flow; vc_and_disclose aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> VERIFY_COMMITMENT -> VC_AND_DISCLOSE. No graph/material runnable on E15. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_complete_age_check__motorola_e15__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-20260807-taceo-candidate,passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse-gap,2026-08-11T00:00:00.000Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""register_reference_wtns_sha256"":""9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a"",""disclose_reference_wtns_sha256"":""53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f"",""raw_evidence_sha256"":""63f6a640030bec48cc2d1e8ace0446c92ec9554785753c736f9cca6e296feb75"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,witness_graph_unsupported,circom-witness-rs cannot generate qualified graphs for either required Self stage: register generated C++ requires unsupported Fr_bor/Fr_bxor and contains runtime control flow; vc_and_disclose aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> VERIFY_COMMITMENT -> VC_AND_DISCLOSE. No graph/material runnable on E15; therefore warm reuse is unavailable too. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_complete_age_check__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807-taceo-candidate,passport_p1__iphone_se_2022__circom_groth16__cold_local-gap,2026-08-11T00:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""raw_evidence_sha256"":""8c74d81f1f20ffa588db9033d53f239fefbf2bd487f18dc50caa3cb204a662d6"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,unsupported_dynamic_witness_graph,"circom-witness-rs fails to compile the exact P1 generator because Fr_bxor/Fr_bor are undeclared; after a diagnostic local implementation of those operations, graph generation aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> PassportP1. No qualified graph/material runnable on E15. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_p1__iphone_se_2022__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-20260807-taceo-candidate,passport_p1__iphone_se_2022__circom_groth16__warm_reuse-gap,2026-08-11T00:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""raw_evidence_sha256"":""0aba309f5d50462f2382dfe80af0ee443aae95525b279f1347e632ed207dd403"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,unsupported_dynamic_witness_graph,"circom-witness-rs fails to compile the exact P1 generator because Fr_bxor/Fr_bor are undeclared; after a diagnostic local implementation of those operations, graph generation aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> PassportP1. No qualified graph/material runnable on E15; therefore warm reuse is unavailable too. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_p1__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807-taceo-candidate,passport_p1__motorola_e15__circom_groth16__cold_local-gap,2026-08-11T00:00:00.000Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""raw_evidence_sha256"":""9a1e65bef0c8dd4fd15391d458b3c2d91f8160d936a530b96639ecdd02260dce"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,witness_graph_unsupported,"circom-witness-rs fails to compile the exact P1 generator because Fr_bxor/Fr_bor are undeclared; after a diagnostic local implementation of those operations, graph generation aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> PassportP1. No qualified graph/material runnable on E15. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_p1__motorola_e15__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-20260807-taceo-candidate,passport_p1__motorola_e15__circom_groth16__warm_reuse-gap,2026-08-11T00:00:00.000Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""0754ae5733f6e3a4bf4baaf87b732cb57d5e633e671517f14ab05d19602cf3cd"",""raw_evidence_sha256"":""0833763540016764d23866bca5b620660ca76c7f01d3d1d9be520cc6b8c219cf"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,witness_graph_unsupported,"circom-witness-rs fails to compile the exact P1 generator because Fr_bxor/Fr_bor are undeclared; after a diagnostic local implementation of those operations, graph generation aborts at runtime-dependent Fr_isTrue (assertion failed: constant[a]) in BinaryMerkleRoot -> PassportP1. No qualified graph/material runnable on E15; therefore warm reuse is unavailable too. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/passport_p1__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__cold_local-0,2026-08-11T13:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,warmup,0,ok,4130.652792,38.899499,737.331375,,4906.883666,205.5,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_report_0_sha256"":""30d49e37276a5274bd0b1d5e851fea709a8681aca74d29d685cf55aa90c63327"",""cold_report_1_sha256"":""3834d4ea1567c48d5fa3268073ec1944ff90aca5415df5e144ab3696291e4e81"",""cold_report_2_sha256"":""5ad02701246ef532e4210cb7758b6dbe29b3ef96222b4acd1a4debc164c46024"",""cold_report_3_sha256"":""2c41babd0b9ddca6736969b463cf8d983084d4ce085c36665d3996112e82b2b4"",""cold_report_4_sha256"":""199156627c15424a963718f52d28bd77278c9f1c5ddd49385bb849c35ec0b264"",""cold_report_5_sha256"":""9d4c6e6c71b950c4b92997e31bd79bfcf223a3ee2ba40588400d327bbc16510a"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""1feb377edee4d73b719407081231f2197ee16232e5906c1264860bb24cfce84f"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","3bfaabf408dff51d5f9f444bab5fab93ca881db6,a266d7282ad737ba6f00ba8b67c70632b03b2fff,02a2383c29e00b623e36ae661d7127341c111a3b,c01b863df25659d6a2d2acfc45522ec660708fbe,11d6943518ef3c81a0f8cd0e4accc845c654aae5,b85be7d1ceb4b24b59fb4c4d466b5eeb47b20501","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__cold_local.json,cold_local,4906.883666 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__cold_local-1,2026-08-11T13:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,1,ok,4057.771542,36.0585,717.559875,,4811.389917,205.484375,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_report_0_sha256"":""30d49e37276a5274bd0b1d5e851fea709a8681aca74d29d685cf55aa90c63327"",""cold_report_1_sha256"":""3834d4ea1567c48d5fa3268073ec1944ff90aca5415df5e144ab3696291e4e81"",""cold_report_2_sha256"":""5ad02701246ef532e4210cb7758b6dbe29b3ef96222b4acd1a4debc164c46024"",""cold_report_3_sha256"":""2c41babd0b9ddca6736969b463cf8d983084d4ce085c36665d3996112e82b2b4"",""cold_report_4_sha256"":""199156627c15424a963718f52d28bd77278c9f1c5ddd49385bb849c35ec0b264"",""cold_report_5_sha256"":""9d4c6e6c71b950c4b92997e31bd79bfcf223a3ee2ba40588400d327bbc16510a"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""1feb377edee4d73b719407081231f2197ee16232e5906c1264860bb24cfce84f"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","3bfaabf408dff51d5f9f444bab5fab93ca881db6,a266d7282ad737ba6f00ba8b67c70632b03b2fff,02a2383c29e00b623e36ae661d7127341c111a3b,c01b863df25659d6a2d2acfc45522ec660708fbe,11d6943518ef3c81a0f8cd0e4accc845c654aae5,b85be7d1ceb4b24b59fb4c4d466b5eeb47b20501","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__cold_local.json,cold_local,4811.389917 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__cold_local-2,2026-08-11T13:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,2,ok,4026.770875,36.440792,684.736667,,4747.948334,203.546875,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_report_0_sha256"":""30d49e37276a5274bd0b1d5e851fea709a8681aca74d29d685cf55aa90c63327"",""cold_report_1_sha256"":""3834d4ea1567c48d5fa3268073ec1944ff90aca5415df5e144ab3696291e4e81"",""cold_report_2_sha256"":""5ad02701246ef532e4210cb7758b6dbe29b3ef96222b4acd1a4debc164c46024"",""cold_report_3_sha256"":""2c41babd0b9ddca6736969b463cf8d983084d4ce085c36665d3996112e82b2b4"",""cold_report_4_sha256"":""199156627c15424a963718f52d28bd77278c9f1c5ddd49385bb849c35ec0b264"",""cold_report_5_sha256"":""9d4c6e6c71b950c4b92997e31bd79bfcf223a3ee2ba40588400d327bbc16510a"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""1feb377edee4d73b719407081231f2197ee16232e5906c1264860bb24cfce84f"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","3bfaabf408dff51d5f9f444bab5fab93ca881db6,a266d7282ad737ba6f00ba8b67c70632b03b2fff,02a2383c29e00b623e36ae661d7127341c111a3b,c01b863df25659d6a2d2acfc45522ec660708fbe,11d6943518ef3c81a0f8cd0e4accc845c654aae5,b85be7d1ceb4b24b59fb4c4d466b5eeb47b20501","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__cold_local.json,cold_local,4747.948334 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__cold_local-3,2026-08-11T13:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,3,ok,4050.218125,36.535875,709.763667,,4796.517667,204.59375,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_report_0_sha256"":""30d49e37276a5274bd0b1d5e851fea709a8681aca74d29d685cf55aa90c63327"",""cold_report_1_sha256"":""3834d4ea1567c48d5fa3268073ec1944ff90aca5415df5e144ab3696291e4e81"",""cold_report_2_sha256"":""5ad02701246ef532e4210cb7758b6dbe29b3ef96222b4acd1a4debc164c46024"",""cold_report_3_sha256"":""2c41babd0b9ddca6736969b463cf8d983084d4ce085c36665d3996112e82b2b4"",""cold_report_4_sha256"":""199156627c15424a963718f52d28bd77278c9f1c5ddd49385bb849c35ec0b264"",""cold_report_5_sha256"":""9d4c6e6c71b950c4b92997e31bd79bfcf223a3ee2ba40588400d327bbc16510a"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""1feb377edee4d73b719407081231f2197ee16232e5906c1264860bb24cfce84f"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","3bfaabf408dff51d5f9f444bab5fab93ca881db6,a266d7282ad737ba6f00ba8b67c70632b03b2fff,02a2383c29e00b623e36ae661d7127341c111a3b,c01b863df25659d6a2d2acfc45522ec660708fbe,11d6943518ef3c81a0f8cd0e4accc845c654aae5,b85be7d1ceb4b24b59fb4c4d466b5eeb47b20501","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__cold_local.json,cold_local,4796.517667 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__cold_local-4,2026-08-11T13:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,4,ok,4080.596999,36.288709,726.123542,,4843.00925,202.46875,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_report_0_sha256"":""30d49e37276a5274bd0b1d5e851fea709a8681aca74d29d685cf55aa90c63327"",""cold_report_1_sha256"":""3834d4ea1567c48d5fa3268073ec1944ff90aca5415df5e144ab3696291e4e81"",""cold_report_2_sha256"":""5ad02701246ef532e4210cb7758b6dbe29b3ef96222b4acd1a4debc164c46024"",""cold_report_3_sha256"":""2c41babd0b9ddca6736969b463cf8d983084d4ce085c36665d3996112e82b2b4"",""cold_report_4_sha256"":""199156627c15424a963718f52d28bd77278c9f1c5ddd49385bb849c35ec0b264"",""cold_report_5_sha256"":""9d4c6e6c71b950c4b92997e31bd79bfcf223a3ee2ba40588400d327bbc16510a"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""1feb377edee4d73b719407081231f2197ee16232e5906c1264860bb24cfce84f"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","3bfaabf408dff51d5f9f444bab5fab93ca881db6,a266d7282ad737ba6f00ba8b67c70632b03b2fff,02a2383c29e00b623e36ae661d7127341c111a3b,c01b863df25659d6a2d2acfc45522ec660708fbe,11d6943518ef3c81a0f8cd0e4accc845c654aae5,b85be7d1ceb4b24b59fb4c4d466b5eeb47b20501","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__cold_local.json,cold_local,4843.00925 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__cold_local-5,2026-08-11T13:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,5,ok,4008.304125,36.35125,693.277541,,4737.932916,206.25,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_report_0_sha256"":""30d49e37276a5274bd0b1d5e851fea709a8681aca74d29d685cf55aa90c63327"",""cold_report_1_sha256"":""3834d4ea1567c48d5fa3268073ec1944ff90aca5415df5e144ab3696291e4e81"",""cold_report_2_sha256"":""5ad02701246ef532e4210cb7758b6dbe29b3ef96222b4acd1a4debc164c46024"",""cold_report_3_sha256"":""2c41babd0b9ddca6736969b463cf8d983084d4ce085c36665d3996112e82b2b4"",""cold_report_4_sha256"":""199156627c15424a963718f52d28bd77278c9f1c5ddd49385bb849c35ec0b264"",""cold_report_5_sha256"":""9d4c6e6c71b950c4b92997e31bd79bfcf223a3ee2ba40588400d327bbc16510a"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""1feb377edee4d73b719407081231f2197ee16232e5906c1264860bb24cfce84f"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","3bfaabf408dff51d5f9f444bab5fab93ca881db6,a266d7282ad737ba6f00ba8b67c70632b03b2fff,02a2383c29e00b623e36ae661d7127341c111a3b,c01b863df25659d6a2d2acfc45522ec660708fbe,11d6943518ef3c81a0f8cd0e4accc845c654aae5,b85be7d1ceb4b24b59fb4c4d466b5eeb47b20501","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__cold_local.json,cold_local,4737.932916 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-0,2026-08-11T13:11:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-setup-plus-cached-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,warmup,0,ok,4043.358666,36.366709,707.531167,,4787.756542,206.859375,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warmup_report_sha256"":""25c4615d8446b5e04a0f3d2f36aa33c287dad838abda641fc6fa1322dc186df5"",""measured_report_sha256"":""bc2f32dba23e0eb99e9079a5ca0dd9ebb6aaabd7491eae7199dfbbea32f819b9"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""37e9b38d3bf85990a0504b315265703c97586ad8fb9084fb3cfaeeb9e9e6f5a4"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","c6a726387e633b7eaafe94d349a236849e304349,4a322480f07a46b7648388d07a403d95667baa39","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse,4787.756542 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-1,2026-08-11T13:11:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-setup-plus-cached-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,1,ok,,,,,481.246042,188.640625,128,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warmup_report_sha256"":""25c4615d8446b5e04a0f3d2f36aa33c287dad838abda641fc6fa1322dc186df5"",""measured_report_sha256"":""bc2f32dba23e0eb99e9079a5ca0dd9ebb6aaabd7491eae7199dfbbea32f819b9"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""37e9b38d3bf85990a0504b315265703c97586ad8fb9084fb3cfaeeb9e9e6f5a4"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","c6a726387e633b7eaafe94d349a236849e304349,4a322480f07a46b7648388d07a403d95667baa39","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse,481.246042 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-2,2026-08-11T13:11:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-setup-plus-cached-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,2,ok,,,,,490.326083,185.5,128,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warmup_report_sha256"":""25c4615d8446b5e04a0f3d2f36aa33c287dad838abda641fc6fa1322dc186df5"",""measured_report_sha256"":""bc2f32dba23e0eb99e9079a5ca0dd9ebb6aaabd7491eae7199dfbbea32f819b9"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""37e9b38d3bf85990a0504b315265703c97586ad8fb9084fb3cfaeeb9e9e6f5a4"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","c6a726387e633b7eaafe94d349a236849e304349,4a322480f07a46b7648388d07a403d95667baa39","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse,490.326083 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-3,2026-08-11T13:11:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-setup-plus-cached-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,3,ok,,,,,492.248125,178.40625,128,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warmup_report_sha256"":""25c4615d8446b5e04a0f3d2f36aa33c287dad838abda641fc6fa1322dc186df5"",""measured_report_sha256"":""bc2f32dba23e0eb99e9079a5ca0dd9ebb6aaabd7491eae7199dfbbea32f819b9"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""37e9b38d3bf85990a0504b315265703c97586ad8fb9084fb3cfaeeb9e9e6f5a4"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","c6a726387e633b7eaafe94d349a236849e304349,4a322480f07a46b7648388d07a403d95667baa39","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse,492.248125 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-4,2026-08-11T13:11:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-setup-plus-cached-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,4,ok,,,,,529.01125,184.65625,128,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warmup_report_sha256"":""25c4615d8446b5e04a0f3d2f36aa33c287dad838abda641fc6fa1322dc186df5"",""measured_report_sha256"":""bc2f32dba23e0eb99e9079a5ca0dd9ebb6aaabd7491eae7199dfbbea32f819b9"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""37e9b38d3bf85990a0504b315265703c97586ad8fb9084fb3cfaeeb9e9e6f5a4"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","c6a726387e633b7eaafe94d349a236849e304349,4a322480f07a46b7648388d07a403d95667baa39","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse,529.01125 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__iphone_se_2022__circom_groth16__warm_reuse-5,2026-08-11T13:11:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,oprf_nullifier,O2-updated-production-query-setup-plus-cached-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,5,ok,,,,,512.7745,177.75,128,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warmup_report_sha256"":""25c4615d8446b5e04a0f3d2f36aa33c287dad838abda641fc6fa1322dc186df5"",""measured_report_sha256"":""bc2f32dba23e0eb99e9079a5ca0dd9ebb6aaabd7491eae7199dfbbea32f819b9"",""correctness_canary_sha256"":""dd77e701bc1321938c2aaecf8494d31e17b6bf14849f1798360cc9857b8e14ad"",""raw_evidence_sha256"":""37e9b38d3bf85990a0504b315265703c97586ad8fb9084fb3cfaeeb9e9e6f5a4"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}","c6a726387e633b7eaafe94d349a236849e304349,4a322480f07a46b7648388d07a403d95667baa39","TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse,512.7745 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__cold_local-0,2026-08-11T12:37:06.672Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,warmup,0,ok,,,,,11952.049924,245.91015625,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_query_0_sha256"":""d7f5d8f3c25273a2b48cb56b5db43856449060daa08e697ecf7de64e9097d8d0"",""cold_query_1_sha256"":""5372920b3b5f30ac0fd9f1cc547c6294247114a18e76116b2fbcec8508ef9327"",""cold_query_2_sha256"":""46d96b9d50378d956819b15ce44733955bd473f8a5cd6b0012128f5b4c61544f"",""cold_query_3_sha256"":""65e8ee9db54f82117a789954b4acbb87a52f4f076f8c20860e16719191a05fad"",""cold_query_4_sha256"":""005cbb122ce1f46fbc3485401ee7182fab1866296c5655dc98dd970ca10757c6"",""cold_query_5_sha256"":""c03d87e1dffff3170d5c8b068e7676b700f623421a57588947d4b6cedc55afbf"",""cold_nullifier_0_sha256"":""93f2022589408d624916ccd186716ef490c754b6aebbf6287b402f42b328e8fa"",""cold_nullifier_1_sha256"":""b4ff31d16dd58f98bb4a2484945fd2de59f82c2067af306eacf437ed9b754d95"",""cold_nullifier_2_sha256"":""19628ad6ad604a502ee06ded76eb49e38d06d77205043e4892c473f1640257da"",""cold_nullifier_3_sha256"":""8e107f85b9e285baa7a18ec5f73798749fcd58c8ef1f254afe30d4ced8dbf738"",""cold_nullifier_4_sha256"":""bed0a472b120b877b583f4ec51d73d2eda691526536f4918839eb06a6e4ee5cf"",""cold_nullifier_5_sha256"":""1994a84f2eb24b5e2549d9e322b46c7857f8660765609d823d59d441d891c687"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""c9378ba65e9c4b0233eb40dfeef0a6bf99ac5a1460cc91d31cc25b287e3b6f6d"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-cold,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11952.049924 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__cold_local-1,2026-08-11T12:37:06.672Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,1,ok,,,,,11921.065616,245.68359375,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_query_0_sha256"":""d7f5d8f3c25273a2b48cb56b5db43856449060daa08e697ecf7de64e9097d8d0"",""cold_query_1_sha256"":""5372920b3b5f30ac0fd9f1cc547c6294247114a18e76116b2fbcec8508ef9327"",""cold_query_2_sha256"":""46d96b9d50378d956819b15ce44733955bd473f8a5cd6b0012128f5b4c61544f"",""cold_query_3_sha256"":""65e8ee9db54f82117a789954b4acbb87a52f4f076f8c20860e16719191a05fad"",""cold_query_4_sha256"":""005cbb122ce1f46fbc3485401ee7182fab1866296c5655dc98dd970ca10757c6"",""cold_query_5_sha256"":""c03d87e1dffff3170d5c8b068e7676b700f623421a57588947d4b6cedc55afbf"",""cold_nullifier_0_sha256"":""93f2022589408d624916ccd186716ef490c754b6aebbf6287b402f42b328e8fa"",""cold_nullifier_1_sha256"":""b4ff31d16dd58f98bb4a2484945fd2de59f82c2067af306eacf437ed9b754d95"",""cold_nullifier_2_sha256"":""19628ad6ad604a502ee06ded76eb49e38d06d77205043e4892c473f1640257da"",""cold_nullifier_3_sha256"":""8e107f85b9e285baa7a18ec5f73798749fcd58c8ef1f254afe30d4ced8dbf738"",""cold_nullifier_4_sha256"":""bed0a472b120b877b583f4ec51d73d2eda691526536f4918839eb06a6e4ee5cf"",""cold_nullifier_5_sha256"":""1994a84f2eb24b5e2549d9e322b46c7857f8660765609d823d59d441d891c687"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""c9378ba65e9c4b0233eb40dfeef0a6bf99ac5a1460cc91d31cc25b287e3b6f6d"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-cold,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11921.065616 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__cold_local-2,2026-08-11T12:37:06.672Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,2,ok,,,,,12192.952,245.91796875,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_query_0_sha256"":""d7f5d8f3c25273a2b48cb56b5db43856449060daa08e697ecf7de64e9097d8d0"",""cold_query_1_sha256"":""5372920b3b5f30ac0fd9f1cc547c6294247114a18e76116b2fbcec8508ef9327"",""cold_query_2_sha256"":""46d96b9d50378d956819b15ce44733955bd473f8a5cd6b0012128f5b4c61544f"",""cold_query_3_sha256"":""65e8ee9db54f82117a789954b4acbb87a52f4f076f8c20860e16719191a05fad"",""cold_query_4_sha256"":""005cbb122ce1f46fbc3485401ee7182fab1866296c5655dc98dd970ca10757c6"",""cold_query_5_sha256"":""c03d87e1dffff3170d5c8b068e7676b700f623421a57588947d4b6cedc55afbf"",""cold_nullifier_0_sha256"":""93f2022589408d624916ccd186716ef490c754b6aebbf6287b402f42b328e8fa"",""cold_nullifier_1_sha256"":""b4ff31d16dd58f98bb4a2484945fd2de59f82c2067af306eacf437ed9b754d95"",""cold_nullifier_2_sha256"":""19628ad6ad604a502ee06ded76eb49e38d06d77205043e4892c473f1640257da"",""cold_nullifier_3_sha256"":""8e107f85b9e285baa7a18ec5f73798749fcd58c8ef1f254afe30d4ced8dbf738"",""cold_nullifier_4_sha256"":""bed0a472b120b877b583f4ec51d73d2eda691526536f4918839eb06a6e4ee5cf"",""cold_nullifier_5_sha256"":""1994a84f2eb24b5e2549d9e322b46c7857f8660765609d823d59d441d891c687"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""c9378ba65e9c4b0233eb40dfeef0a6bf99ac5a1460cc91d31cc25b287e3b6f6d"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-cold,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,12192.952 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__cold_local-3,2026-08-11T12:37:06.672Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,3,ok,,,,,12897.432001,243.70703125,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_query_0_sha256"":""d7f5d8f3c25273a2b48cb56b5db43856449060daa08e697ecf7de64e9097d8d0"",""cold_query_1_sha256"":""5372920b3b5f30ac0fd9f1cc547c6294247114a18e76116b2fbcec8508ef9327"",""cold_query_2_sha256"":""46d96b9d50378d956819b15ce44733955bd473f8a5cd6b0012128f5b4c61544f"",""cold_query_3_sha256"":""65e8ee9db54f82117a789954b4acbb87a52f4f076f8c20860e16719191a05fad"",""cold_query_4_sha256"":""005cbb122ce1f46fbc3485401ee7182fab1866296c5655dc98dd970ca10757c6"",""cold_query_5_sha256"":""c03d87e1dffff3170d5c8b068e7676b700f623421a57588947d4b6cedc55afbf"",""cold_nullifier_0_sha256"":""93f2022589408d624916ccd186716ef490c754b6aebbf6287b402f42b328e8fa"",""cold_nullifier_1_sha256"":""b4ff31d16dd58f98bb4a2484945fd2de59f82c2067af306eacf437ed9b754d95"",""cold_nullifier_2_sha256"":""19628ad6ad604a502ee06ded76eb49e38d06d77205043e4892c473f1640257da"",""cold_nullifier_3_sha256"":""8e107f85b9e285baa7a18ec5f73798749fcd58c8ef1f254afe30d4ced8dbf738"",""cold_nullifier_4_sha256"":""bed0a472b120b877b583f4ec51d73d2eda691526536f4918839eb06a6e4ee5cf"",""cold_nullifier_5_sha256"":""1994a84f2eb24b5e2549d9e322b46c7857f8660765609d823d59d441d891c687"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""c9378ba65e9c4b0233eb40dfeef0a6bf99ac5a1460cc91d31cc25b287e3b6f6d"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-cold,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,12897.432001 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__cold_local-4,2026-08-11T12:37:06.672Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,4,ok,,,,,11794.62554,247.3515625,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_query_0_sha256"":""d7f5d8f3c25273a2b48cb56b5db43856449060daa08e697ecf7de64e9097d8d0"",""cold_query_1_sha256"":""5372920b3b5f30ac0fd9f1cc547c6294247114a18e76116b2fbcec8508ef9327"",""cold_query_2_sha256"":""46d96b9d50378d956819b15ce44733955bd473f8a5cd6b0012128f5b4c61544f"",""cold_query_3_sha256"":""65e8ee9db54f82117a789954b4acbb87a52f4f076f8c20860e16719191a05fad"",""cold_query_4_sha256"":""005cbb122ce1f46fbc3485401ee7182fab1866296c5655dc98dd970ca10757c6"",""cold_query_5_sha256"":""c03d87e1dffff3170d5c8b068e7676b700f623421a57588947d4b6cedc55afbf"",""cold_nullifier_0_sha256"":""93f2022589408d624916ccd186716ef490c754b6aebbf6287b402f42b328e8fa"",""cold_nullifier_1_sha256"":""b4ff31d16dd58f98bb4a2484945fd2de59f82c2067af306eacf437ed9b754d95"",""cold_nullifier_2_sha256"":""19628ad6ad604a502ee06ded76eb49e38d06d77205043e4892c473f1640257da"",""cold_nullifier_3_sha256"":""8e107f85b9e285baa7a18ec5f73798749fcd58c8ef1f254afe30d4ced8dbf738"",""cold_nullifier_4_sha256"":""bed0a472b120b877b583f4ec51d73d2eda691526536f4918839eb06a6e4ee5cf"",""cold_nullifier_5_sha256"":""1994a84f2eb24b5e2549d9e322b46c7857f8660765609d823d59d441d891c687"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""c9378ba65e9c4b0233eb40dfeef0a6bf99ac5a1460cc91d31cc25b287e3b6f6d"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-cold,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11794.62554 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__cold_local-5,2026-08-11T12:37:06.672Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,5,ok,,,,,11785.861155,244.08984375,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""cold_query_0_sha256"":""d7f5d8f3c25273a2b48cb56b5db43856449060daa08e697ecf7de64e9097d8d0"",""cold_query_1_sha256"":""5372920b3b5f30ac0fd9f1cc547c6294247114a18e76116b2fbcec8508ef9327"",""cold_query_2_sha256"":""46d96b9d50378d956819b15ce44733955bd473f8a5cd6b0012128f5b4c61544f"",""cold_query_3_sha256"":""65e8ee9db54f82117a789954b4acbb87a52f4f076f8c20860e16719191a05fad"",""cold_query_4_sha256"":""005cbb122ce1f46fbc3485401ee7182fab1866296c5655dc98dd970ca10757c6"",""cold_query_5_sha256"":""c03d87e1dffff3170d5c8b068e7676b700f623421a57588947d4b6cedc55afbf"",""cold_nullifier_0_sha256"":""93f2022589408d624916ccd186716ef490c754b6aebbf6287b402f42b328e8fa"",""cold_nullifier_1_sha256"":""b4ff31d16dd58f98bb4a2484945fd2de59f82c2067af306eacf437ed9b754d95"",""cold_nullifier_2_sha256"":""19628ad6ad604a502ee06ded76eb49e38d06d77205043e4892c473f1640257da"",""cold_nullifier_3_sha256"":""8e107f85b9e285baa7a18ec5f73798749fcd58c8ef1f254afe30d4ced8dbf738"",""cold_nullifier_4_sha256"":""bed0a472b120b877b583f4ec51d73d2eda691526536f4918839eb06a6e4ee5cf"",""cold_nullifier_5_sha256"":""1994a84f2eb24b5e2549d9e322b46c7857f8660765609d823d59d441d891c687"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""c9378ba65e9c4b0233eb40dfeef0a6bf99ac5a1460cc91d31cc25b287e3b6f6d"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-cold,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__cold_local.json,cold_local,11785.861155 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__warm_reuse-0,2026-08-11T12:35:26.332Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,warmup,0,ok,,,,,12522.99054,245.7890625,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warm_query_report_sha256"":""7daedf7754968f86f58731f5b7bad054dec4ce3b0eaabc75a177c6e7ff55a4b6"",""warm_nullifier_report_sha256"":""a9f97ddb95310d18b046c8bce5cee6239f45cd01ce49558c4a5578bf78f174fd"",""recorded_warmup_query_report_sha256"":""bcb36e2dcf0ab5766a272d0d2b4bb707ff4ad8abddbcd0e2289a006e3212e600"",""recorded_warmup_nullifier_report_sha256"":""e4e080e2b228304ba29761ddcdcd0e4c3953e05f2945dfad4d2b6982d9e4c29e"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""a3bc81ce343326a8bfd4fa15e12bed5e32f6129d1c1168333c9a149079342606"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-warm,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,12522.99054 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__warm_reuse-1,2026-08-11T12:35:26.332Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,1,ok,,,,,7279.671616,229.328125,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warm_query_report_sha256"":""7daedf7754968f86f58731f5b7bad054dec4ce3b0eaabc75a177c6e7ff55a4b6"",""warm_nullifier_report_sha256"":""a9f97ddb95310d18b046c8bce5cee6239f45cd01ce49558c4a5578bf78f174fd"",""recorded_warmup_query_report_sha256"":""bcb36e2dcf0ab5766a272d0d2b4bb707ff4ad8abddbcd0e2289a006e3212e600"",""recorded_warmup_nullifier_report_sha256"":""e4e080e2b228304ba29761ddcdcd0e4c3953e05f2945dfad4d2b6982d9e4c29e"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""a3bc81ce343326a8bfd4fa15e12bed5e32f6129d1c1168333c9a149079342606"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-warm,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,7279.671616 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__warm_reuse-2,2026-08-11T12:35:26.332Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,2,ok,,,,,7374.066999,234.94921875,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warm_query_report_sha256"":""7daedf7754968f86f58731f5b7bad054dec4ce3b0eaabc75a177c6e7ff55a4b6"",""warm_nullifier_report_sha256"":""a9f97ddb95310d18b046c8bce5cee6239f45cd01ce49558c4a5578bf78f174fd"",""recorded_warmup_query_report_sha256"":""bcb36e2dcf0ab5766a272d0d2b4bb707ff4ad8abddbcd0e2289a006e3212e600"",""recorded_warmup_nullifier_report_sha256"":""e4e080e2b228304ba29761ddcdcd0e4c3953e05f2945dfad4d2b6982d9e4c29e"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""a3bc81ce343326a8bfd4fa15e12bed5e32f6129d1c1168333c9a149079342606"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-warm,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,7374.066999 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__warm_reuse-3,2026-08-11T12:35:26.332Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,3,ok,,,,,7210.021462,233.828125,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warm_query_report_sha256"":""7daedf7754968f86f58731f5b7bad054dec4ce3b0eaabc75a177c6e7ff55a4b6"",""warm_nullifier_report_sha256"":""a9f97ddb95310d18b046c8bce5cee6239f45cd01ce49558c4a5578bf78f174fd"",""recorded_warmup_query_report_sha256"":""bcb36e2dcf0ab5766a272d0d2b4bb707ff4ad8abddbcd0e2289a006e3212e600"",""recorded_warmup_nullifier_report_sha256"":""e4e080e2b228304ba29761ddcdcd0e4c3953e05f2945dfad4d2b6982d9e4c29e"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""a3bc81ce343326a8bfd4fa15e12bed5e32f6129d1c1168333c9a149079342606"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-warm,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,7210.021462 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__warm_reuse-4,2026-08-11T12:35:26.332Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,4,ok,,,,,7227.164154,238.96484375,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warm_query_report_sha256"":""7daedf7754968f86f58731f5b7bad054dec4ce3b0eaabc75a177c6e7ff55a4b6"",""warm_nullifier_report_sha256"":""a9f97ddb95310d18b046c8bce5cee6239f45cd01ce49558c4a5578bf78f174fd"",""recorded_warmup_query_report_sha256"":""bcb36e2dcf0ab5766a272d0d2b4bb707ff4ad8abddbcd0e2289a006e3212e600"",""recorded_warmup_nullifier_report_sha256"":""e4e080e2b228304ba29761ddcdcd0e4c3953e05f2945dfad4d2b6982d9e4c29e"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""a3bc81ce343326a8bfd4fa15e12bed5e32f6129d1c1168333c9a149079342606"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-warm,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,7227.164154 +input-to-proof-v1-20260807-taceo-candidate,oprf_o2__motorola_e15__circom_groth16__warm_reuse-5,2026-08-11T12:35:26.332Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,oprf_nullifier,O2-updated-production-query-plus-nullifier,ccaac272c72012daa18608a62d00f8b10908b560,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,measured,5,ok,,,,,7304.641539,252.4296875,256,39947373,38044784,39947373,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""query_zkey_sha256"":""616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"",""query_graph_sha256"":""6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"",""nullifier_zkey_sha256"":""4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"",""nullifier_graph_sha256"":""c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"",""warm_query_report_sha256"":""7daedf7754968f86f58731f5b7bad054dec4ce3b0eaabc75a177c6e7ff55a4b6"",""warm_nullifier_report_sha256"":""a9f97ddb95310d18b046c8bce5cee6239f45cd01ce49558c4a5578bf78f174fd"",""recorded_warmup_query_report_sha256"":""bcb36e2dcf0ab5766a272d0d2b4bb707ff4ad8abddbcd0e2289a006e3212e600"",""recorded_warmup_nullifier_report_sha256"":""e4e080e2b228304ba29761ddcdcd0e4c3953e05f2945dfad4d2b6982d9e4c29e"",""correctness_canary_report_sha256"":""9d96c43ed913f49a6dc28605d71f994ebdcfbfaf4393b07b18d72ae435a860db"",""raw_evidence_sha256"":""a3bc81ce343326a8bfd4fa15e12bed5e32f6129d1c1168333c9a149079342606"",""public_outputs_sha256"":""ca0bbf8cfc3f1b9db66f7c94a32f536beb74e14c6ab02cc871c862cafe7cde29""}",adb-ZY32M6782K-production-world-id-oprf-warm,"TACEO updated-production OPRF query+nullifier. Public outputs match, but optimized witness graphs and matching Ark zkeys differ from the frozen Rapidsnark material; this is not a backend-only strict-parity comparison.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/oprf_o2__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse,7304.641539 +input-to-proof-v1-20260807-taceo-candidate,webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local-gap,2026-08-11T00:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""raw_evidence_sha256"":""bfa8a4b4c9b98a33761d6664f26808590ee351b2d26958157b479a3c2cc6ce9d"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,unsupported_witness_graph_operations,"circom-witness-rs cannot compile the exact WebAuthn generated C++ because it requires unsupported Fr_bor and Fr_bxor; the circuit also contains runtime Fr_isTrue control flow, and no qualified serialized graph was emitted. No qualified graph/material exists for an iPhone run. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/webauthn_closest_analogue__iphone_se_2022__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-20260807-taceo-candidate,webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse-gap,2026-08-11T00:00:00.000Z,iphone_se_2022,iPhone SE (2022),15.4,arm64,ios_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""raw_evidence_sha256"":""98422028f65fcbeae7ee1a4d8a55e06d31daf3dcbceded4c8f721a831a24de92"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,unsupported_witness_graph_operations,"circom-witness-rs cannot compile the exact WebAuthn generated C++ because it requires unsupported Fr_bor and Fr_bxor; the circuit also contains runtime Fr_isTrue control flow, and no qualified serialized graph was emitted. No qualified graph/material exists for an iPhone run; therefore warm reuse is unavailable too. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/webauthn_closest_analogue__iphone_se_2022__circom_groth16__warm_reuse.json,warm_reuse, +input-to-proof-v1-20260807-taceo-candidate,webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local-gap,2026-08-11T00:00:00.000Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""raw_evidence_sha256"":""77fb18e0e1feea2ebb52ca7a38ee1f7a987ea3246128f58c8c21ba9cfe404718"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,witness_graph_unsupported,"circom-witness-rs cannot compile the exact WebAuthn generated C++ because it requires unsupported Fr_bor and Fr_bxor; the circuit also contains runtime Fr_isTrue control flow, and no qualified serialized graph was emitted. No graph/material runnable on E15. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/webauthn_closest_analogue__motorola_e15__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-20260807-taceo-candidate,webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse-gap,2026-08-11T00:00:00.000Z,motorola_e15,moto e15,14,armeabi-v7a,android_native,,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,taceo-groth16-0.1.3,circom-witness-rs-0.2.3,gap,,unsupported,,,,,,,,,,,,taceo-native-circom-v1,dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44,"{""circom"":""2.2.2"",""circom_helpers"":""dfe86b7cc2ca89fbf806e05e8140e3e7551a8a44"",""circom_witness_rs"":""0.2.3"",""taceo_groth16"":""0.1.3"",""taceo_groth16_material"":""0.3.0"",""world_id_protocol"":""ccaac272c72012daa18608a62d00f8b10908b560""}","{""compatibility_audit_sha256"":""e45f9e3fb5d229581fad18132269f5ed34790d76060bec304bc54ab9a08dd774"",""reference_wtns_sha256"":""294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8"",""raw_evidence_sha256"":""c2ff3f2e67a0a5207d91ca85f4e97e9fa49ddd9347b9a0e4118659ab86981ddb"",""public_outputs_sha256"":""""}",compatibility-audit-no-device-run,TACEO native Circom compatibility gap; no Rapidsnark timing was substituted.,witness_graph_unsupported,"circom-witness-rs cannot compile the exact WebAuthn generated C++ because it requires unsupported Fr_bor and Fr_bxor; the circuit also contains runtime Fr_isTrue control flow, and no qualified serialized graph was emitted. No graph/material runnable on E15; therefore warm reuse is unavailable too. Evidence: target/v1-benchmarks/input-to-proof/taceo-candidate/compatibility/README.md",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/benchmarks/v1/input-to-proof-data/taceo-candidate/evidence/webauthn_closest_analogue__motorola_e15__circom_groth16__warm_reuse.json,warm_reuse, diff --git a/benchmarks/v1/legacy/wasm/wasm-multithread-16-samples.csv b/benchmarks/v1/legacy/wasm/wasm-multithread-16-samples.csv new file mode 100644 index 000000000..c73a8df06 --- /dev/null +++ b/benchmarks/v1/legacy/wasm/wasm-multithread-16-samples.csv @@ -0,0 +1,135 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path,timing_mode,input_to_proof_time_ms +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,2842.120000001043,1049.1049999985844,3412.5250000003725,117.99000000022352,7303.75,1416.921875,993532,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7303.75 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,2843.0149999987334,1054.925000000745,3336.464999999851,115.00499999895692,7234.404999999329,1413.21875,992764,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7234.404999999329 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,2966.2099999990314,1293.480000000447,5916.785000000149,248.48499999940395,10176.474999999627,1420.65625,992976,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10176.474999999627 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,3724.609999999404,1383.6300000008196,4081.754999998957,158.14499999955297,9189.99499999918,1419.609375,994300,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,9189.99499999918 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,2845.2599999997765,1049.1100000012666,7035.0999999996275,183.36500000022352,10929.47000000067,1419.28125,993444,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10929.47000000067 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:24:57.427Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,2926.5499999988824,1043.7250000014901,4237.64999999851,176.7299999985844,8207.924999998882,1420.109375,992764,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""23ccc0627c3a190d081d48c95e8722baf12ff4bd80164cf0fc5ea872c6053ee9""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,8207.924999998882 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1102.394999999553,1050.0649999994785,4727.995000001043,212.54000000096858,6880.4550000000745,1608.015625,999632,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6880.4550000000745 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1278,845.375,5043.015000000596,193.625,7166.390000000596,1608.015625,991652,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7166.390000000596 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1296.464999999851,837.320000000298,5037,188.37000000104308,7170.790000000969,1608.015625,994596,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7170.790000000969 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1419.265000000596,847.160000000149,4606.530000001192,203.87999999895692,6872.960000000894,1608.015625,993188,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6872.960000000894 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1471.960000000894,856.9949999991804,4651.714999999851,276.445000000298,6980.680000001565,1608.015625,995280,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6980.680000001565 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:25:44.117Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1389.769999999553,853.2999999988824,4474.6850000005215,171.2649999987334,6717.754999998957,1608.015625,994212,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d5eee6b12c46bc81ef9c2d72240276e2b16212a08c11b91ef5643b53fe184106""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6717.754999998957 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,4348.745,712.235,4976.885,1633.795,10037.865,1735.34375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10037.865 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2858.755,710.165,8026.005,1542.55,11594.925,1723,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,11594.925 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2587.665,760.585,5524.04,1231.715,8872.29,1796.5,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,8872.29 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,3637.7,709.45,6380.82,1819.1,10727.97,1726.03125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10727.97 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2077.69,711.37,3863.43,1273.755,6652.49,1792.515625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6652.49 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:27:08.738Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2128.095,706.23,6831.17,1896.58,9665.495,1734.90625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""591c154ba0f4effb22b571e260aa1542d3c71a6d34d4a0bfd82c9ef911fdeed7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,9665.495 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,745.05,4944.695,0,5689.8,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5689.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,645.265,5698.31,0,6343.62,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6343.62 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,725.91,5898.43,0,6624.385,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6624.385 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,924.91,5710.09,0,6635.05,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6635.05 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,678.5,6780.515,0,7459.05,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,7459.05 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:28:02.015Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,733.24,5886.9,0,6620.185,2270.578125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2ec31b98a722c5528ac50e0d7e2d0e450d976b56f53be5b8a454e7b05c5f26ef""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6620.185 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,11.4,4416.835,16579.795,19.46,21008.03,14760.9375,1441,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,21008.03 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,7.95,4300.735,13689.82,17.665,17998.505,15044.921875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,17998.505 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,6.095,4306.37,12557.965,16.465,16870.43,15168.8125,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,16870.43 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,9.255,4454.065,15041.63,18.3,19504.95,14813.609375,1441,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,19504.95 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,5.645,4261.645,11047.29,11.54,15314.58,15569.78125,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15314.58 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:31:15.953Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,7.26,4299.855,16407.645,15.345,20714.76,15893.671875,1450,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""f7e45a5d2f1eaf8bb6836541342a5ef2c398e9c1d307a7e8432e3ccc1c4cfa6c""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,20714.76 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4364.78,15077.205,21.55,19442.24,15174.21875,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,19442.24 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,5048.455,16275.19,12.84,21323.915,15174.21875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,21323.915 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4316.945,11655.63,11.43,15972.8,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,15972.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4267.2,14298.215,21.66,18565.625,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,18565.625 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4448.685,12469.445,18.435,16918.345,15174.21875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,16918.345 +input-to-proof-v1-mac-multithread-16-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:33:09.060Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4656.93,14999.81,15.19,19660.13,15174.21875,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2c88d34c11ed77b3443804513985cdcefee5ed53787a66020551b90a637e429b""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,19660.13 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1622.155000001192,821.625,1708.1150000002235,91.07000000029802,4151.895000001416,887.65625,961017,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4151.895000001416 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1876.5550000015646,863.4749999996275,2735.339999999851,157,5475.370000001043,885.640625,960377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5475.370000001043 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1978.160000000149,858.0500000007451,2795.269999999553,137.18500000052154,5631.480000000447,884.828125,962809,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5631.480000000447 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,2322.0200000014156,924.875,2671.699999999255,130.57499999925494,5918.595000000671,885.421875,960721,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,5918.595000000671 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1575.8499999996275,789.035000000149,2135.5200000014156,103.67999999970198,4500.405000001192,886.015625,960549,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4500.405000001192 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:33:49.296Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1558.5550000015646,790.3249999992549,2642.1199999991804,177.17999999970198,4991,881.140625,963833,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""08c38e5b28821c29c170216309b32db935c530da407d1e14ad069dfedbf9b08f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4991 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,554.570000000298,791.8149999994785,2604.7599999997765,100.02500000037253,3951.1500000003725,1033.078125,962085,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3951.1500000003725 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,627.5750000011176,641.9700000006706,1930.6199999991804,89.50499999895692,3200.1699999999255,1033.078125,967377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3200.1699999999255 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,622.910000000149,638.0800000000745,1897.769999999553,122.30000000074506,3158.765000000596,1033.078125,965157,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3158.765000000596 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,709.3000000007451,696.6549999993294,2027.339999999851,88.50500000081956,3433.2949999999255,1033.078125,967121,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3433.2949999999255 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,629.6500000003725,626.6699999999255,1691.1150000002235,87.52999999932945,2947.4350000005215,1033.078125,960081,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2947.4350000005215 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:34:35.034Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,621.5750000011176,626.6300000008196,1825.390000000596,82.08499999903142,3073.605000000447,1033.078125,960165,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""d4e17833dc9485d6bd1c864a87def556d7b302334f349581f1d7ab7a1d51fd23""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3073.605000000447 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2916.98,552.065,2213.25,702.77,5682.295,1430.578125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5682.295 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2141.505,536.83,2088.175,668.555,4766.51,1403.203125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4766.51 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2354.715,535.86,2067.005,660.255,4957.58,1403.03125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4957.58 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2234.14,544.745,2088.39,659.525,4867.275,1400.828125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4867.275 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2889.57,544.465,2114.875,660.43,5548.91,1402.609375,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5548.91 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:35:19.884Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2350.105,540.185,2061.27,666.545,4951.56,1428.515625,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""46724fd127966c508a3e0bb63ac55da8c43b3d64a62f26f6ae869d136fa2f67d""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4951.56 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,423.71,1908.505,0,2332.245,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2332.245 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,420.66,1922.74,0,2343.43,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2343.43 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,421.22,1889.3,0,2310.545,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2310.545 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,422.685,1893.075,0,2315.79,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2315.79 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,422.365,1914.91,0,2337.32,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2337.32 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:36:05.736Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,421.46,1896.29,0,2317.765,1687.953125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""2d9c847a62d785f666141b2d65ecc7e3475ffe5643a7036ddbfd6602fcdc990f""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2317.765 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,4.1,3941.765,8451.815,6.63,12397.68,14436.53125,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12397.68 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.2,3979.935,8573.535,6.4,12555.67,14977.96875,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12555.67 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.29,3990.985,8595,6.45,12588.275,14629.671875,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12588.275 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,2.6,4003.765,8502.03,7.605,12508.395,14588.578125,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12508.395 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,2.835,4043.31,8677.805,6.39,12723.95,14386.03125,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12723.95 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:37:27.242Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,3.035,4000.415,8485.75,6.555,12489.2,15473.25,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""640db1f56335257afe51f6f5eec19181c9f7f2a9434ca9e416bac7110793edf3""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12489.2 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4012.1,8717.49,6.325,12729.71,15019.90625,720,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12729.71 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,3988.105,8483.55,6.95,12471.8,15019.90625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12471.8 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4044.51,8580.92,5.825,12625.545,15019.90625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12625.545 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4018.445,8761.28,5.825,12779.825,15019.90625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12779.825 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4029.195,8587.455,13.035,12616.765,15019.90625,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12616.765 +input-to-proof-v1-mac-multithread-16-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:38:44.302Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4001.05,8682.295,5.76,12683.45,15019.90625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""c28d686d07d9c55f7495094001a5631997e1047a07da99c5b8080a6434236fc8""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12683.45 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1102.2249999977648,1399.0800000000745,506.47000000067055,49.955000000074506,3007.77499999851,601.46875,845390,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3007.77499999851 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1112.339999999851,1406.695000000298,499.23000000044703,50.93999999947846,3018.265000000596,601.828125,849014,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3018.265000000596 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1122.7799999993294,1401.7249999996275,538.410000000149,48.63499999977648,3062.914999999106,599.890625,848206,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3062.914999999106 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1119.824999999255,1411.894999999553,491.42500000074506,49.11500000022352,3023.144999999553,600.46875,845302,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3023.144999999553 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1125.464999999851,1418.699999999255,498.2450000010431,50.519999999552965,3042.410000000149,601,849826,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3042.410000000149 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:39:09.013Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1116.035000000149,1412.355000000447,491.714999999851,49.665000000968575,3020.105000000447,600.71875,846454,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""349e1cc57025ef6a7613ae9ea14b0c396a6a2a756691cdc915391d42e43c8659""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3020.105000000447 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,364.76999999955297,1398.605000000447,490.695000000298,49.25,2254.0800000000745,744.796875,844918,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2254.0800000000745 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,364.5300000011921,1343.714999999851,435.964999999851,44.21499999985099,2144.2200000006706,744.796875,848334,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2144.2200000006706 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,373.6150000002235,1333.690000001341,433.195000000298,42.475000001490116,2140.5050000008196,744.796875,848802,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2140.5050000008196 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,365.8700000010431,1325.429999999702,427.99499999918044,43.05000000074506,2119.2949999999255,744.796875,848462,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2119.2949999999255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,364.25,1319.949999999255,424.179999999702,41.665000000968575,2108.394999999553,744.796875,847266,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2108.394999999553 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:39:24.172Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,364.7600000016391,1326.844999998808,454.5049999989569,52.91000000014901,2146.1150000002235,744.796875,846414,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""175bef79f195b241fc49c8d25c1383b49828f1d20df599fd9343d6af669e1ede""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2146.1150000002235 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2874.525,609.985,1589.755,512.375,5074.265,1283.734375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5074.265 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2113.02,592.025,1290.605,411.71,3995.65,1277.78125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,3995.65 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2187.07,586.075,1299.35,402.915,4072.495,1279.1875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4072.495 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2291.4,590.185,1309.965,409.05,4191.55,1280.671875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4191.55 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2265.82,590.995,1272.485,407.635,4129.3,1285.4375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4129.3 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:40:01.294Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2254.585,590.63,1280.035,433.58,4125.25,1279.1875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""3ccbcefb260f1d37f9c64f3686b586b56912cb9fa1c77bc54c60b5851dbb3ded""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4125.25 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,527.085,1345.135,0,1872.255,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1872.255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,529.895,1297.735,0,1827.67,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1827.67 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,525.56,1253.17,0,1778.755,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1778.755 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,530.225,1258.44,0,1788.705,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1788.705 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,523.49,1362.685,0,1886.21,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1886.21 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:40:18.470Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,525.145,1343.915,0,1869.085,1439.21875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""78c41b513c3eed8ea180d4401a893ab993d86313957360cc6c4f840046faffaa""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1869.085 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-0,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,3.825,128.76,1409.79,6.28,1542.375,3642.625,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1542.375 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-1,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.54,125.145,1407.61,6.205,1535.295,3526.3125,722,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1535.295 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-2,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.43,125.14,1357.23,6.185,1484.8,3703.40625,726,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1484.8 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-3,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,2.57,124.77,1383.9,6.375,1511.24,3444.484375,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1511.24 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-4,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,2.605,130.03,1409.48,6.205,1542.115,3625.328125,722,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1542.115 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-5,2026-08-12T12:40:39.020Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,2.26,127.155,1428.825,6.09,1558.24,3367.109375,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""588582de4933fd74fd9ac7488b6b05d1ef1072b1af4a938ab4a3b688216720ba""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1558.24 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,125.645,1402.39,5.865,1528.385,3240.375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1528.385 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,126.58,1359.86,5.83,1486.95,3240.375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1486.95 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,125.71,1353,5.775,1479.255,3240.375,726,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1479.255 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,126.835,1361.78,5.76,1489.14,3240.375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1489.14 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,124.985,1369.025,6.115,1494.575,3240.375,725,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1494.575 +input-to-proof-v1-mac-multithread-16-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T12:40:53.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,128,1336.785,5.745,1465.28,3240.375,719,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""2500e41a9f45d6766e869a523777d6c29fe4f8bc060382fb89edbbb05c85ebc4""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1465.28 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-0,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1616.809999998659,1637.0100000016391,1810.684999998659,88.18999999947846,5064.504999998957,972.234375,975568,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5064.504999998957 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-1,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1625.339999999851,1645.684999998659,1764.335000000894,83.01500000059605,5035.359999999404,966.484375,969336,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5035.359999999404 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-2,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1624.2799999993294,1640.5400000009686,1824.894999999553,85.48000000044703,5089.714999999851,969.21875,973092,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5089.714999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-3,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1610.9700000006706,1636.7649999987334,1841.6000000014901,88.2350000012666,5089.335000000894,970.484375,973604,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5089.335000000894 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-4,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1614.519999999553,1652.5,1762.0499999988824,83.30499999970198,5029.069999998435,970.859375,972708,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5029.069999998435 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-5,2026-08-12T12:41:31.005Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1607.535000000149,1635.164999999106,1840.355000000447,84.55499999970198,5083.054999999702,965.53125,972664,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""995bd237c7b4feba72ffc9f7a2a1b69c81bfbbc8990ad1435f479df0a47d7b3e""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5083.054999999702 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,597.4350000005215,1611.844999998808,1764.6850000005215,80.91000000014901,3973.964999999851,1057.625,976720,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3973.964999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,594.089999999851,1218.7050000000745,1669.4199999999255,81.71499999985099,3482.214999999851,1057.625,971256,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3482.214999999851 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,592.8300000000745,1223.0499999988824,1678.910000000149,73.68500000052154,3494.7949999999255,1057.625,972112,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3494.7949999999255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,592.875,1224.1650000009686,1695.5099999997765,73.42999999970198,3512.554999999702,1057.625,972024,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3512.554999999702 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,602.2899999991059,1220.445000000298,1658.9000000003725,73.1699999999255,3481.6349999997765,1057.625,972240,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3481.6349999997765 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T12:42:16.679Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,606.5800000000745,1229.515000000596,1702.125,73.20999999903142,3538.2249999996275,1057.625,975096,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""74544fb047cc5ed171ec2d751c5d2cf688c1e4651959e33f448eb1d8978c4d33""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3538.2249999996275 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2310.06,1291.51,2047.705,635.2,5649.275,1415.90625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5649.275 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2363.25,1290.04,2062.965,635.955,5716.255,1416.578125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5716.255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2282.265,1283.095,2083.845,637.12,5649.205,1416.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5649.205 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2092.845,1278.405,2095.845,679.85,5467.095,1441.609375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5467.095 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2149.255,1277.985,2071.745,639.71,5498.985,1414.421875,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5498.985 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T12:43:04.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2101.3,1273.695,2074.26,633.575,5449.255,1415.890625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""581689ddf484bbf164d6b68cc6a8102c774d66051094c028ab5f0d365bdbe8b7""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5449.255 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,1034.07,1801.57,0,2835.67,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2835.67 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,1026.735,1780.15,0,2806.915,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2806.915 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,1031.615,1799.2,0,2830.845,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2830.845 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,1040.36,2184.33,0,3224.73,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,3224.73 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,1061.88,1884.545,0,2946.455,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2946.455 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T12:43:49.533Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,1044.965,1866.935,0,2911.925,1928.109375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""82ab2ecbc6126cbe044146be18bd8b705c4fd5896285423ae3a9e49608e1dc54""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2911.925 +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-gap,2026-08-12T12:43:50.009Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,gap,,runtime_failed,,,,,,,,,,,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16","{""raw_evidence_sha256"":""b6a994516dc5a9e7f59d2fb67434402197b569ff71a9924d7789bd1b0f54f7ef""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.",out_of_memory,"The 16-worker SnarkJS WebAuthn attempt did not produce a proof. The dedicated Chrome renderer reached 14,559,360 KiB RSS (10.4 GiB current physical footprint; 21.7 GiB peak), then remained CPU-idle with all worker threads sleeping for 18 minutes 59 seconds. The attempt was terminated after preserving process evidence; no timing was recorded.",/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local, +input-to-proof-v1-mac-multithread-16-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-gap,2026-08-12T12:43:50.009Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.138,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,gap,,not_run,,,,,,,,,,,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16","{""raw_evidence_sha256"":""5fbc6616d8d3e872d396948d811baf33977b263da165b0b2e13c840526670f83""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Fixed-16 SnarkJS WebAuthn gap; no prior four-worker timing was substituted.",blocked_by_cold_failure,Warm-reuse measurements were not started because the required fixed-16 cold WebAuthn attempt stalled in the renderer before producing a valid proof.,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread-16/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse, diff --git a/benchmarks/v1/legacy/wasm/wasm-multithread-samples.csv b/benchmarks/v1/legacy/wasm/wasm-multithread-samples.csv new file mode 100644 index 000000000..5db6a6bba --- /dev/null +++ b/benchmarks/v1/legacy/wasm/wasm-multithread-samples.csv @@ -0,0 +1,145 @@ +campaign_id,attempt_id,recorded_at_utc,hardware,device_model,os_version,abi,runtime,browser,circuit,circuit_variant,circuit_commit,prover,frontend,prover_backend,witness_backend,sample_kind,sample_index,status,initialization_time_ms,witness_time_ms,prover_time_ms,verify_time_ms,total_time_ms,peak_memory_mib,proof_size_bytes,circuit_size_bytes,artifact_size_bytes,bundle_size_bytes,constraint_count,artifact_version,source_commit,package_versions,artifact_hashes,session_id,non_equivalence_note,failure_code,failure_detail,evidence_path,timing_mode,input_to_proof_time_ms +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-0,2026-08-12T08:40:54.109Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,5559.554999999935,2384.804999999935,5373.450000000186,178.83499999996275,13317.810000000056,1393.390625,994896,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""959475433831c4413bc4cc0a59c51589d690478279fff3111e141ee02e2fb3b1""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,13317.810000000056 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-1,2026-08-12T08:40:54.109Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,3605.445000000065,1340.5149999998976,6759.135000000009,168.6149999999907,11705.094999999972,1399.953125,993020,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""959475433831c4413bc4cc0a59c51589d690478279fff3111e141ee02e2fb3b1""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,11705.094999999972 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-2,2026-08-12T08:40:54.109Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,2856.25,1037.6499999999069,6384.260000000009,180.68500000005588,10278.159999999916,1393.1875,993020,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""959475433831c4413bc4cc0a59c51589d690478279fff3111e141ee02e2fb3b1""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10278.159999999916 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-3,2026-08-12T08:40:54.109Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,3022.0699999998324,1051.2350000001024,5927.560000000056,178.49499999987893,10000.86499999999,1399.765625,996092,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""959475433831c4413bc4cc0a59c51589d690478279fff3111e141ee02e2fb3b1""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,10000.86499999999 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-4,2026-08-12T08:40:54.109Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,2872.7099999999627,1050.1500000001397,3811.5400000000373,135.28000000002794,7734.40000000014,1401.375,994684,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""959475433831c4413bc4cc0a59c51589d690478279fff3111e141ee02e2fb3b1""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7734.40000000014 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__cold_local-5,2026-08-12T08:40:54.109Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,2850.1749999998137,1045.4250000000466,3784.845000000205,138.12999999988824,7680.445000000065,1397.734375,992124,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""959475433831c4413bc4cc0a59c51589d690478279fff3111e141ee02e2fb3b1""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__cold_local.json,cold_local,7680.445000000065 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T08:41:43.050Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1118.2650000001304,1044.285000000149,3821.4849999998696,150.2949999999255,5984.040000000037,1582.515625,991952,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""1010618184007a8c939e13e1f2ef79bf2d49d7fad158afe6e8ab81de81daacab""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,5984.040000000037 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T08:41:43.050Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1175.5600000000559,836.1949999998324,3995.7949999999255,195.54000000003725,6007.554999999935,1582.515625,994896,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""1010618184007a8c939e13e1f2ef79bf2d49d7fad158afe6e8ab81de81daacab""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,6007.554999999935 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T08:41:43.050Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1392.1149999999907,935.7649999998976,7211.719999999972,204.1699999999255,9539.610000000102,1582.515625,993788,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""1010618184007a8c939e13e1f2ef79bf2d49d7fad158afe6e8ab81de81daacab""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,9539.610000000102 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T08:41:43.050Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1300.0500000000466,841.7549999998882,5026.550000000047,218.31500000017695,7168.354999999981,1582.515625,994300,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""1010618184007a8c939e13e1f2ef79bf2d49d7fad158afe6e8ab81de81daacab""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7168.354999999981 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T08:41:43.050Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1281.5100000000093,853.8950000000186,5158.549999999814,224.97999999998137,7293.965000000084,1582.515625,997712,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""1010618184007a8c939e13e1f2ef79bf2d49d7fad158afe6e8ab81de81daacab""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,7293.965000000084 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T08:41:43.050Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1538.2299999999814,892.6550000000279,5696.699999999953,225.96500000008382,8127.589999999851,1582.515625,995920,4056714,4015100,22025968,711664,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""1010618184007a8c939e13e1f2ef79bf2d49d7fad158afe6e8ab81de81daacab""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,8127.589999999851 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T08:42:47.424Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,4631.045,1088.795,5197.69,1211.045,10917.53,1794.078125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""b28394e49de56370ee7b30ad5ed12bb14de6b860988e9b8b7d41db7fddb0cbbb""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,10917.53 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T08:42:47.424Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2150.55,715.515,3479.975,1104.28,6346.04,1795.953125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""b28394e49de56370ee7b30ad5ed12bb14de6b860988e9b8b7d41db7fddb0cbbb""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6346.04 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T08:42:47.424Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2179.785,712.02,3550.035,1108.485,6441.84,1796.78125,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""b28394e49de56370ee7b30ad5ed12bb14de6b860988e9b8b7d41db7fddb0cbbb""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6441.84 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T08:42:47.424Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2957.775,707.95,3664.17,1177.645,7329.895,1796.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""b28394e49de56370ee7b30ad5ed12bb14de6b860988e9b8b7d41db7fddb0cbbb""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,7329.895 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T08:42:47.424Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2147.905,704.1,3563.59,1213.17,6415.595,1796.71875,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""b28394e49de56370ee7b30ad5ed12bb14de6b860988e9b8b7d41db7fddb0cbbb""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6415.595 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T08:42:47.424Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2222.53,710.72,3633.84,1226.135,6567.09,1795.65625,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""b28394e49de56370ee7b30ad5ed12bb14de6b860988e9b8b7d41db7fddb0cbbb""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__cold_local.json,cold_local,6567.09 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T08:43:34.118Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,617.33,4436.81,0,5054.175,2388.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""dc37ba4b71ff73f2674d2ed472ef06cf8a66b739dd69394b7cb5dada1356b915""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5054.175 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T08:43:34.118Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,776.905,4291.25,0,5068.19,2388.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""dc37ba4b71ff73f2674d2ed472ef06cf8a66b739dd69394b7cb5dada1356b915""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5068.19 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T08:43:34.118Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,732.33,6008.54,0,6740.905,2388.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""dc37ba4b71ff73f2674d2ed472ef06cf8a66b739dd69394b7cb5dada1356b915""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,6740.905 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T08:43:34.118Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,707.105,4083.565,0,4790.71,2388.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""dc37ba4b71ff73f2674d2ed472ef06cf8a66b739dd69394b7cb5dada1356b915""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,4790.71 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T08:43:34.118Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,628.445,4711.99,0,5340.465,2388.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""dc37ba4b71ff73f2674d2ed472ef06cf8a66b739dd69394b7cb5dada1356b915""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5340.465 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T08:43:34.118Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,721.63,4561.535,0,5283.195,2388.609375,16000,73375498,73333886,73375498,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""dc37ba4b71ff73f2674d2ed472ef06cf8a66b739dd69394b7cb5dada1356b915""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,5283.195 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-0,2026-08-12T09:31:06.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,5.015,4217.78,11474.635,13.01,15697.43,14611.5625,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""d3f11f5f3633dd7b0e23f8ea67f375f771806408e074bfa27a56ee21ffc53cf0""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15697.43 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-1,2026-08-12T09:31:06.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,5.825,4275.205,11541.94,12.18,15822.97,15049.8125,1450,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""d3f11f5f3633dd7b0e23f8ea67f375f771806408e074bfa27a56ee21ffc53cf0""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15822.97 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-2,2026-08-12T09:31:06.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,6.355,4236.66,11582.605,12.205,15825.62,15743.796875,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""d3f11f5f3633dd7b0e23f8ea67f375f771806408e074bfa27a56ee21ffc53cf0""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15825.62 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-3,2026-08-12T09:31:06.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,5.91,4254.45,11591.65,11.425,15852.01,15150.515625,1445,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""d3f11f5f3633dd7b0e23f8ea67f375f771806408e074bfa27a56ee21ffc53cf0""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15852.01 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-4,2026-08-12T09:31:06.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,6.325,4224.245,11061.52,11.575,15292.09,14678.046875,1444,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""d3f11f5f3633dd7b0e23f8ea67f375f771806408e074bfa27a56ee21ffc53cf0""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15292.09 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__cold_local-5,2026-08-12T09:31:06.467Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,5.64,4255.655,11098.29,11.61,15359.585,14399.5625,1452,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""d3f11f5f3633dd7b0e23f8ea67f375f771806408e074bfa27a56ee21ffc53cf0""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__cold_local.json,cold_local,15359.585 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T09:32:45.695Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4239.625,11468.56,12.11,15708.42,15280.375,1448,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""9fd5aeb0d839c6bfeddd17332cc3c1ebde4bda9c8b6b5552f2ac6b95d8cac4b7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,15708.42 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T09:32:45.695Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,4238.17,11785.135,17.665,16023.56,15280.375,1443,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""9fd5aeb0d839c6bfeddd17332cc3c1ebde4bda9c8b6b5552f2ac6b95d8cac4b7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,16023.56 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T09:32:45.695Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4242.36,13017.335,15.13,17259.98,15280.375,1443,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""9fd5aeb0d839c6bfeddd17332cc3c1ebde4bda9c8b6b5552f2ac6b95d8cac4b7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,17259.98 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T09:32:45.695Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4354.52,11535.45,11.12,15890.215,15280.375,1448,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""9fd5aeb0d839c6bfeddd17332cc3c1ebde4bda9c8b6b5552f2ac6b95d8cac4b7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,15890.215 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T09:32:45.695Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4289.36,12599.53,12.045,16889.195,15280.375,1446,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""9fd5aeb0d839c6bfeddd17332cc3c1ebde4bda9c8b6b5552f2ac6b95d8cac4b7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,16889.195 +input-to-proof-v1-mac-multithread-20260812,passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T09:32:45.695Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_complete_age_check,historical-monolithic-age-integrity,9b2a6f37c67691eab4b0cec6c35e35c520e93285,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4230.865,11964.915,13.16,16195.975,15280.375,1447,588352242,568828944,588352242,,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""9fd5aeb0d839c6bfeddd17332cc3c1ebde4bda9c8b6b5552f2ac6b95d8cac4b7""}",,"Historical monolithic Passport age and integrity lane retained separately from the additional exact P1 source pair. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_complete_age_check__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,16195.975 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-0,2026-08-12T08:47:26.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1556.0049999998882,794.6700000003912,1873.3799999998882,77.32000000029802,4224.055000000168,860.90625,963365,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""7e35ceb5f9e32bbc89a890810ec89028882dc3838449438256d6cc6729ddb5a1""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4224.055000000168 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-1,2026-08-12T08:47:26.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1567.1299999998882,789.8799999998882,1869.6350000002421,79.48499999986961,4226.645000000019,858.8125,959481,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""7e35ceb5f9e32bbc89a890810ec89028882dc3838449438256d6cc6729ddb5a1""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4226.645000000019 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-2,2026-08-12T08:47:26.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1570.5,790.9199999999255,1897.3100000000559,79.14000000013039,4258.729999999981,862.71875,960377,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""7e35ceb5f9e32bbc89a890810ec89028882dc3838449438256d6cc6729ddb5a1""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4258.729999999981 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-3,2026-08-12T08:47:26.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1560.9699999997392,797.3700000001118,1900.3349999999627,79.89000000013039,4258.674999999814,860.515625,965969,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""7e35ceb5f9e32bbc89a890810ec89028882dc3838449438256d6cc6729ddb5a1""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4258.674999999814 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-4,2026-08-12T08:47:26.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1558.3900000001304,797.6949999998324,1880.070000000298,78.07500000018626,4236.155000000261,861.125,958673,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""7e35ceb5f9e32bbc89a890810ec89028882dc3838449438256d6cc6729ddb5a1""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4236.155000000261 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__cold_local-5,2026-08-12T08:47:26.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1567.5499999998137,800.8400000003166,1943.9150000000373,81.3249999997206,4312.305000000168,862.65625,962681,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""7e35ceb5f9e32bbc89a890810ec89028882dc3838449438256d6cc6729ddb5a1""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__cold_local.json,cold_local,4312.305000000168 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T08:48:12.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,561.1150000002235,796.8149999999441,1875.0400000000373,79.65500000026077,3232.975000000093,1019.078125,963921,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""e5c4b1d94a0481f0babb0f58e295b8ca354b5e040af72a49fccb7aa5da38bd47""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3232.975000000093 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T08:48:12.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,553.8349999999627,638.5849999999627,1815.6400000001304,73.18999999994412,3008.060000000056,1019.078125,961745,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""e5c4b1d94a0481f0babb0f58e295b8ca354b5e040af72a49fccb7aa5da38bd47""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3008.060000000056 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T08:48:12.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,557.589999999851,643.2849999996834,1819.285000000149,70.02499999990687,3020.1650000000373,1019.078125,963577,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""e5c4b1d94a0481f0babb0f58e295b8ca354b5e040af72a49fccb7aa5da38bd47""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3020.1650000000373 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T08:48:12.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,558.9850000003353,631.7050000000745,1786.8799999998882,75.11499999975786,2977.5800000000745,1019.078125,966053,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""e5c4b1d94a0481f0babb0f58e295b8ca354b5e040af72a49fccb7aa5da38bd47""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2977.5800000000745 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T08:48:12.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,559.1549999997951,631.8999999999069,1789.8500000000931,71.9949999996461,2980.9099999996834,1019.078125,966309,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""e5c4b1d94a0481f0babb0f58e295b8ca354b5e040af72a49fccb7aa5da38bd47""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2980.9099999996834 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T08:48:12.955Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,559.0449999999255,631.0150000001304,1789.0049999998882,72.5749999997206,2979.0699999998324,1019.078125,961957,2292299,2261616,14993274,294402,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""e5c4b1d94a0481f0babb0f58e295b8ca354b5e040af72a49fccb7aa5da38bd47""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2979.0699999998324 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T08:48:57.771Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2587.265,546.215,2092.895,707.795,5226.375,1403.359375,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""d96f64bd4327f2f1369978932309eda0937e4920b9e00b3cb2febb5be401aafd""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5226.375 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T08:48:57.771Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2397.165,540.22,2120.03,682.9,5057.415,1401.453125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""d96f64bd4327f2f1369978932309eda0937e4920b9e00b3cb2febb5be401aafd""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5057.415 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T08:48:57.771Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2465.25,538.815,2129.34,673.54,5133.405,1402.96875,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""d96f64bd4327f2f1369978932309eda0937e4920b9e00b3cb2febb5be401aafd""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5133.405 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T08:48:57.771Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2242.905,550.005,2140.325,692.51,4933.235,1398.71875,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""d96f64bd4327f2f1369978932309eda0937e4920b9e00b3cb2febb5be401aafd""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4933.235 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T08:48:57.771Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2307.295,538.425,2104.66,683.22,4950.38,1400.6875,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""d96f64bd4327f2f1369978932309eda0937e4920b9e00b3cb2febb5be401aafd""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4950.38 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T08:48:57.771Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2336.38,541.88,2108.8,670.33,4987.06,1402.359375,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""d96f64bd4327f2f1369978932309eda0937e4920b9e00b3cb2febb5be401aafd""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4987.06 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T08:49:45.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,428.23,1984.41,0,2412.675,1691.078125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""18c0339354d702c4adffb15ddb4d2d2eb73aa9897409947c02e5ab8f510ebb8b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2412.675 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T08:49:45.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,428.36,1979.7,0,2408.085,1691.078125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""18c0339354d702c4adffb15ddb4d2d2eb73aa9897409947c02e5ab8f510ebb8b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2408.085 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T08:49:45.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,432.18,2004.12,0,2436.325,1691.078125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""18c0339354d702c4adffb15ddb4d2d2eb73aa9897409947c02e5ab8f510ebb8b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2436.325 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T08:49:45.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,425.89,1952.165,0,2378.09,1691.078125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""18c0339354d702c4adffb15ddb4d2d2eb73aa9897409947c02e5ab8f510ebb8b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2378.09 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T08:49:45.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,424.015,1926.325,0,2350.37,1691.078125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""18c0339354d702c4adffb15ddb4d2d2eb73aa9897409947c02e5ab8f510ebb8b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2350.37 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T08:49:45.018Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,422.41,1971.145,0,2393.585,1691.078125,16000,74595035,74564360,74595035,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""18c0339354d702c4adffb15ddb4d2d2eb73aa9897409947c02e5ab8f510ebb8b""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2393.585 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-0,2026-08-12T09:35:05.753Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,3.255,3990.845,10072.8,8.135,14066.9,14722.25,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""61299ce62a0527e9691b12faa1c5dbe6110b39d2787f353e9cc46a37d250942c""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,14066.9 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-1,2026-08-12T09:35:05.753Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.225,4022.235,9034.755,8.305,13059.215,14633.140625,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""61299ce62a0527e9691b12faa1c5dbe6110b39d2787f353e9cc46a37d250942c""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,13059.215 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-2,2026-08-12T09:35:05.753Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.825,4002.785,9897.215,8.945,13902.825,14377.703125,720,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""61299ce62a0527e9691b12faa1c5dbe6110b39d2787f353e9cc46a37d250942c""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,13902.825 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-3,2026-08-12T09:35:05.753Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,4.145,4390.805,14737.945,9.63,19132.895,15792.421875,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""61299ce62a0527e9691b12faa1c5dbe6110b39d2787f353e9cc46a37d250942c""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,19132.895 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-4,2026-08-12T09:35:05.753Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,2.59,4063.85,8667.63,7.015,12734.07,15021.8125,720,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""61299ce62a0527e9691b12faa1c5dbe6110b39d2787f353e9cc46a37d250942c""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12734.07 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__cold_local-5,2026-08-12T09:35:05.753Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,2.655,4014.895,8696.455,6.585,12714.005,15498.421875,725,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""61299ce62a0527e9691b12faa1c5dbe6110b39d2787f353e9cc46a37d250942c""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__cold_local.json,cold_local,12714.005 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T09:36:23.777Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,4024.695,8801.33,7.255,12826.18,14579.015625,720,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""60bd88534e40676bb4237eb7857d6962d4d8989b4272fa50e56dfac0165a0211""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12826.18 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T09:36:23.777Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,4019.685,8799.49,5.715,12819.285,14579.015625,722,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""60bd88534e40676bb4237eb7857d6962d4d8989b4272fa50e56dfac0165a0211""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12819.285 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T09:36:23.777Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,4054.96,8711.055,5.81,12766.125,14579.015625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""60bd88534e40676bb4237eb7857d6962d4d8989b4272fa50e56dfac0165a0211""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12766.125 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T09:36:23.777Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,4009.8,8823.785,5.88,12833.69,14579.015625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""60bd88534e40676bb4237eb7857d6962d4d8989b4272fa50e56dfac0165a0211""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12833.69 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T09:36:23.777Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,4021.47,8725.495,11.58,12747.075,14579.015625,723,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""60bd88534e40676bb4237eb7857d6962d4d8989b4272fa50e56dfac0165a0211""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12747.075 +input-to-proof-v1-mac-multithread-20260812,passport_p1__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T09:36:23.777Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,passport_age_integrity,P1-matched-monolithic-RSA4096,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,4043.655,8872.05,11.67,12915.82,14579.015625,724,508332927,498212512,508332927,,input-to-proof-v1-multithread,092621d721cfef9ff39b0787f5ba2c1f07eb6d95,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""60bd88534e40676bb4237eb7857d6962d4d8989b4272fa50e56dfac0165a0211""}",,"Matched P1 profile: monolithic RSA-4096 passport integrity, registry authorization, DG1 validity, and minimum-age assertion. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/passport_p1__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,12915.82 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-0,2026-08-12T08:52:47.912Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1132.8250000001863,1410.4599999999627,488.8900000001304,49.84499999973923,3032.1750000002794,584.328125,841294,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""a56529c5b7b375e011cd956363487e059fb98f14fbcadec9008a87f97abd6290""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3032.1750000002794 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-1,2026-08-12T08:52:47.912Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1113.029999999795,1407.25,477.68000000016764,49.37000000011176,2997.9599999999627,583.171875,846286,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""a56529c5b7b375e011cd956363487e059fb98f14fbcadec9008a87f97abd6290""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,2997.9599999999627 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-2,2026-08-12T08:52:47.912Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1110.7400000002235,1413.125,489.6549999997951,49.830000000074506,3013.5200000000186,583.78125,842658,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""a56529c5b7b375e011cd956363487e059fb98f14fbcadec9008a87f97abd6290""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3013.5200000000186 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-3,2026-08-12T08:52:47.912Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1125.9849999998696,1408.7749999999069,489.820000000298,49.47999999998137,3024.5800000000745,582.90625,849954,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""a56529c5b7b375e011cd956363487e059fb98f14fbcadec9008a87f97abd6290""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3024.5800000000745 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-4,2026-08-12T08:52:47.912Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1106.404999999795,1410.5900000003166,495,49.859999999869615,3011.9950000001118,584.40625,845646,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""a56529c5b7b375e011cd956363487e059fb98f14fbcadec9008a87f97abd6290""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3011.9950000001118 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__cold_local-5,2026-08-12T08:52:47.912Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1110.6649999995716,1401.9750000000931,489.7400000002235,49.56000000005588,3002.3799999998882,584.203125,845858,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""a56529c5b7b375e011cd956363487e059fb98f14fbcadec9008a87f97abd6290""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__cold_local.json,cold_local,3002.3799999998882 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T08:53:02.983Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,368.3300000000745,1410.2349999998696,492.54000000003725,49.47000000020489,2271.1099999998696,728.09375,844238,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""36187354b89a0c9706969272a0c67633f6852a208b620af093f959c21b546880""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2271.1099999998696 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T08:53:02.983Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,361.96500000031665,1331.1299999998882,433.9849999998696,43.13499999977648,2127.0849999999627,728.09375,846070,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""36187354b89a0c9706969272a0c67633f6852a208b620af093f959c21b546880""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2127.0849999999627 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T08:53:02.983Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,360,1323.0900000003166,432.9199999999255,44.375,2116.010000000242,728.09375,848118,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""36187354b89a0c9706969272a0c67633f6852a208b620af093f959c21b546880""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2116.010000000242 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T08:53:02.983Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,363.97500000009313,1339.1949999998324,429.70999999996275,46.89500000001863,2132.8849999997765,728.09375,848462,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""36187354b89a0c9706969272a0c67633f6852a208b620af093f959c21b546880""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2132.8849999997765 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T08:53:02.983Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,362.83499999996275,1321.1800000001676,442.99500000011176,42.89500000001863,2127.0150000001304,728.09375,844706,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""36187354b89a0c9706969272a0c67633f6852a208b620af093f959c21b546880""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2127.0150000001304 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T08:53:02.983Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,359.35500000044703,1327.3549999999814,440.8249999997206,43.139999999664724,2127.5400000000373,728.09375,845390,1644635,1638340,11878021,95921,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""36187354b89a0c9706969272a0c67633f6852a208b620af093f959c21b546880""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,2127.5400000000373 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T08:53:40.257Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,3842.195,601.855,1276.53,400.1,5720.58,1280.65625,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""5332ee62c21062b964c78975531141ce86a9fe28ed9c2c4b430017ddd1e04b33""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5720.58 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T08:53:40.257Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2609.385,587.34,1282.33,415.545,4479.055,1280.296875,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""5332ee62c21062b964c78975531141ce86a9fe28ed9c2c4b430017ddd1e04b33""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4479.055 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T08:53:40.257Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2378.44,589.395,1297.92,421.225,4265.755,1281.578125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""5332ee62c21062b964c78975531141ce86a9fe28ed9c2c4b430017ddd1e04b33""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4265.755 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T08:53:40.257Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2148.33,586.795,1284.885,402.675,4020.01,1277.328125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""5332ee62c21062b964c78975531141ce86a9fe28ed9c2c4b430017ddd1e04b33""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4020.01 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T08:53:40.257Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,2122.785,586.22,1322.76,421.89,4031.765,1279.9375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""5332ee62c21062b964c78975531141ce86a9fe28ed9c2c4b430017ddd1e04b33""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4031.765 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T08:53:40.257Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2254.96,589.23,1275.08,408.435,4119.27,1280.859375,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""5332ee62c21062b964c78975531141ce86a9fe28ed9c2c4b430017ddd1e04b33""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__cold_local.json,cold_local,4119.27 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T08:53:56.273Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,517.32,1159.99,0,1677.34,1435.703125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""1190000cae3814724426d1bc935697913381f56d6d025f6935363575cbefa4f6""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1677.34 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T08:53:56.273Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,519.86,1191.145,0,1711.04,1435.703125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""1190000cae3814724426d1bc935697913381f56d6d025f6935363575cbefa4f6""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1711.04 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T08:53:56.273Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,534.135,1176.945,0,1711.11,1435.703125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""1190000cae3814724426d1bc935697913381f56d6d025f6935363575cbefa4f6""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1711.11 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T08:53:56.273Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,515.445,1184.575,0,1700.055,1435.703125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""1190000cae3814724426d1bc935697913381f56d6d025f6935363575cbefa4f6""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1700.055 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T08:53:56.273Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,514.79,1184.29,0,1699.11,1435.703125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""1190000cae3814724426d1bc935697913381f56d6d025f6935363575cbefa4f6""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1699.11 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T08:53:56.273Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,531.545,1152.04,0,1683.605,1435.703125,16000,73925206,73918911,73925206,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""1190000cae3814724426d1bc935697913381f56d6d025f6935363575cbefa4f6""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,1683.605 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-0,2026-08-12T09:36:44.935Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,2.94,128.22,1440.795,6.575,1571.955,3663.65625,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""09e6402c01ecd284d9fc00a9aaf61ed19dbb5d801d94f89c7a1a8239db17c396""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1571.955 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-1,2026-08-12T09:36:44.935Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.315,126.685,1471.905,6.265,1600.905,3652.515625,721,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""09e6402c01ecd284d9fc00a9aaf61ed19dbb5d801d94f89c7a1a8239db17c396""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1600.905 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-2,2026-08-12T09:36:44.935Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,2.155,130.19,1461.705,6.045,1594.05,3501.359375,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""09e6402c01ecd284d9fc00a9aaf61ed19dbb5d801d94f89c7a1a8239db17c396""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1594.05 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-3,2026-08-12T09:36:44.935Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,2.62,128.85,1496.065,6.195,1627.535,3508.15625,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""09e6402c01ecd284d9fc00a9aaf61ed19dbb5d801d94f89c7a1a8239db17c396""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1627.535 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-4,2026-08-12T09:36:44.935Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,3.255,126.655,1409.1,6.745,1539.01,3634.0625,723,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""09e6402c01ecd284d9fc00a9aaf61ed19dbb5d801d94f89c7a1a8239db17c396""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1539.01 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__cold_local-5,2026-08-12T09:36:44.935Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,2.675,126.475,1428.03,6.395,1557.18,3583.21875,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""09e6402c01ecd284d9fc00a9aaf61ed19dbb5d801d94f89c7a1a8239db17c396""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__cold_local.json,cold_local,1557.18 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T09:35:39.033Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,159.36,2469.265,16.525,2629,3146.125,719,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""1ff20872a6084168dfd9e403cb03bdd8ff86a789fe6ee2a31c69bb9d6b84bbc5""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,2629 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T09:35:39.033Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,160.285,2422.51,7.935,2584.965,3146.125,725,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""1ff20872a6084168dfd9e403cb03bdd8ff86a789fe6ee2a31c69bb9d6b84bbc5""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,2584.965 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T09:35:39.033Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,162.16,2274.925,7.71,2439.33,3146.125,726,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""1ff20872a6084168dfd9e403cb03bdd8ff86a789fe6ee2a31c69bb9d6b84bbc5""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,2439.33 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T09:35:39.033Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,164.61,2992.42,9.57,3159.6,3146.125,722,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""1ff20872a6084168dfd9e403cb03bdd8ff86a789fe6ee2a31c69bb9d6b84bbc5""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,3159.6 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T09:35:39.033Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,242.64,1926.65,7.175,2169.96,3146.125,724,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""1ff20872a6084168dfd9e403cb03bdd8ff86a789fe6ee2a31c69bb9d6b84bbc5""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,2169.96 +input-to-proof-v1-mac-multithread-20260812,oprf_o2__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T09:35:39.033Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,oprf_nullifier,O2-world-id-nullifier,85aeeef539961cae5a63de794997b507a5975717,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,151.78,1567.245,7.145,1719.785,3146.125,725,39203507,38279392,39203507,,input-to-proof-v1-multithread,85aeeef539961cae5a63de794997b507a5975717,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=16;threads_effective=16;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""1ff20872a6084168dfd9e403cb03bdd8ff86a789fe6ee2a31c69bb9d6b84bbc5""}",,"Matched O2 profile: World ID nullifier statement and frozen semantic inputs, including the same public nullifier. Browser execution policy: multithread; requested threads=16, effective threads=16; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/oprf_o2__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,1719.785 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-0,2026-08-12T08:55:08.927Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,1610.2050000000745,1646.7549999998882,1996.3449999997392,88.43999999994412,5253.304999999702,949.328125,971640,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""07c9de831423a5154070a59e38617b145de8575b8f6f74b00313e861f0d35c52""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5253.304999999702 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-1,2026-08-12T08:55:08.927Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,1614.5949999997392,1643.3650000002235,1982.7549999998882,87.64500000001863,5240.714999999851,950.96875,971640,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""07c9de831423a5154070a59e38617b145de8575b8f6f74b00313e861f0d35c52""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5240.714999999851 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-2,2026-08-12T08:55:08.927Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,1629.2599999997765,1628.4300000001676,1993.7599999997765,88.20999999996275,5251.449999999721,951.21875,974756,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""07c9de831423a5154070a59e38617b145de8575b8f6f74b00313e861f0d35c52""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5251.449999999721 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-3,2026-08-12T08:55:08.927Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,1609.6099999998696,1636.6500000003725,1974.625,88.98499999986961,5220.885000000242,950.9375,973732,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""07c9de831423a5154070a59e38617b145de8575b8f6f74b00313e861f0d35c52""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5220.885000000242 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-4,2026-08-12T08:55:08.927Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,1609.9950000001118,1631.429999999702,1979.5100000002421,89.10000000009313,5220.935000000056,949.375,971044,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""07c9de831423a5154070a59e38617b145de8575b8f6f74b00313e861f0d35c52""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5220.935000000056 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local-5,2026-08-12T08:55:08.927Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,1593.910000000149,1619.5449999999255,1994.8199999998324,88.2050000000745,5208.274999999907,953.53125,973304,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""07c9de831423a5154070a59e38617b145de8575b8f6f74b00313e861f0d35c52""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__cold_local.json,cold_local,5208.274999999907 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-0,2026-08-12T08:55:55.588Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,warmup,0,ok,599.8599999998696,1629.6099999998696,1983.5749999997206,87.48499999986961,4213.049999999814,1039.5,974328,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""b7d8e6e2cfd73bb22645833dae8b41174acb3858b99e60f792500d2e463c2b8a""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,4213.049999999814 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-1,2026-08-12T08:55:55.588Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,1,ok,588.3650000002235,1214.9950000001118,1874.1949999998324,81.93999999994412,3677.5550000001676,1039.5,972880,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""b7d8e6e2cfd73bb22645833dae8b41174acb3858b99e60f792500d2e463c2b8a""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3677.5550000001676 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-2,2026-08-12T08:55:55.588Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,2,ok,588.4950000001118,1211.2599999997765,1868.0250000003725,80.77000000001863,3667.785000000149,1039.5,975140,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""b7d8e6e2cfd73bb22645833dae8b41174acb3858b99e60f792500d2e463c2b8a""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3667.785000000149 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-3,2026-08-12T08:55:55.588Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,3,ok,592.0800000000745,1209,1871.6899999999441,80.19499999983236,3672.774999999907,1039.5,970020,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""b7d8e6e2cfd73bb22645833dae8b41174acb3858b99e60f792500d2e463c2b8a""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3672.774999999907 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-4,2026-08-12T08:55:55.588Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,4,ok,590.4350000000559,1214.9350000000559,1870.3050000001676,80.11499999975786,3675.689999999944,1039.5,973944,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""b7d8e6e2cfd73bb22645833dae8b41174acb3858b99e60f792500d2e463c2b8a""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3675.689999999944 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse-5,2026-08-12T08:55:55.588Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,provekit_v1,noir,provekit-v1-whir-wasm-workers,@noir-lang/noir_js@1.0.0-beta.11,measured,5,ok,589.9449999998324,1211.8850000002421,1868.2000000001863,81.28499999968335,3670.0300000002608,1039.5,974628,2271295,2263464,15906430,389181,input-to-proof-v1-multithread,9b2a6f37c67691eab4b0cec6c35e35c520e93285,"{""provekit"":""9b2a6f37c67691eab4b0cec6c35e35c520e93285"",""noir_js"":""1.0.0-beta.11"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=auto;threads_effective=8;witness_backend=single;prover_backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded","{""raw_evidence_sha256"":""b7d8e6e2cfd73bb22645833dae8b41174acb3858b99e60f792500d2e463c2b8a""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=auto, effective threads=8; witness generation remains single, prover backend=provekit_v1_branch_9b2a6f_wasm_rayon_threaded.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__provekit_v1__warm_reuse.json,warm_reuse,3670.0300000002608 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-0,2026-08-12T08:56:43.678Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,2166.25,1254.675,1991.605,608.835,5412.53,1417.75,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""c2d0bb3f112c0dbcb21d8e85f32ea4e7097650537bf28bf4bf63b726751d4d01""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5412.53 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-1,2026-08-12T08:56:43.678Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,2296.025,1258.35,1949.755,614.8,5504.13,1464.65625,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""c2d0bb3f112c0dbcb21d8e85f32ea4e7097650537bf28bf4bf63b726751d4d01""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5504.13 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-2,2026-08-12T08:56:43.678Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,2126.02,1256.005,1928.485,614.235,5310.51,1418.046875,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""c2d0bb3f112c0dbcb21d8e85f32ea4e7097650537bf28bf4bf63b726751d4d01""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5310.51 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-3,2026-08-12T08:56:43.678Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,2122.025,1251.41,1939.475,606.375,5312.91,1417.578125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""c2d0bb3f112c0dbcb21d8e85f32ea4e7097650537bf28bf4bf63b726751d4d01""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5312.91 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-4,2026-08-12T08:56:43.678Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,4385.805,1253.86,1947.295,604.89,7586.96,1483.234375,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""c2d0bb3f112c0dbcb21d8e85f32ea4e7097650537bf28bf4bf63b726751d4d01""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,7586.96 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local-5,2026-08-12T08:56:43.678Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,2526.53,1263.12,1955.26,616.9,5744.91,1465.046875,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""c2d0bb3f112c0dbcb21d8e85f32ea4e7097650537bf28bf4bf63b726751d4d01""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__cold_local.json,cold_local,5744.91 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-0,2026-08-12T08:57:29.968Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,warmup,0,ok,0,1029.425,1777.02,0,2806.47,1928.8125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""6e9e5739932390f925bc851f099d79064284bfaad0c3c2fc1a8b249469e415b9""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2806.47 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-1,2026-08-12T08:57:29.968Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,1,ok,0,1023.83,1768.65,0,2792.52,1928.8125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""6e9e5739932390f925bc851f099d79064284bfaad0c3c2fc1a8b249469e415b9""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2792.52 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-2,2026-08-12T08:57:29.968Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,2,ok,0,1026.015,1772.52,0,2798.56,1928.8125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""6e9e5739932390f925bc851f099d79064284bfaad0c3c2fc1a8b249469e415b9""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2798.56 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-3,2026-08-12T08:57:29.968Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,3,ok,0,1021.57,1796.53,0,2818.135,1928.8125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""6e9e5739932390f925bc851f099d79064284bfaad0c3c2fc1a8b249469e415b9""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2818.135 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-4,2026-08-12T08:57:29.968Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,4,ok,0,1030.085,1795.645,0,2825.76,1928.8125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""6e9e5739932390f925bc851f099d79064284bfaad0c3c2fc1a8b249469e415b9""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2825.76 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse-5,2026-08-12T08:57:29.968Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,noir_barretenberg,noir,barretenberg-ultrahonk-wasm-workers,@noir-lang/noir_js@1.0.0-beta.19,measured,5,ok,0,1023.425,1764.955,0,2788.405,1928.8125,16000,74003114,73995283,74003114,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""bb_js"":""4.2.0-aztecnr-rc.2"",""noir_js"":""1.0.0-beta.19"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=32;threads_effective=16;witness_backend=single;prover_backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers","{""raw_evidence_sha256"":""6e9e5739932390f925bc851f099d79064284bfaad0c3c2fc1a8b249469e415b9""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=32, effective threads=16; witness generation remains single, prover backend=barretenberg_4.2.0-aztecnr-rc.2_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__noir_barretenberg__warm_reuse.json,warm_reuse,2788.405 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-0,2026-08-12T09:14:43.579Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,3.035,63175.365,53206.565,7.685,116384.965,22292.234375,723,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""8e7e3c1223361692753d5b81b96a5d137d0547d0aaa13aeaa762e052ebf8815b""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,116384.965 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-1,2026-08-12T09:14:43.579Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,2.735,63264.915,53901.2,7.985,117168.85,22313.140625,727,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""8e7e3c1223361692753d5b81b96a5d137d0547d0aaa13aeaa762e052ebf8815b""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,117168.85 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-2,2026-08-12T09:14:43.579Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,3.745,63196.165,53501.4,16.685,116701.31,22290.34375,725,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""8e7e3c1223361692753d5b81b96a5d137d0547d0aaa13aeaa762e052ebf8815b""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,116701.31 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-3,2026-08-12T09:14:43.579Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,5.82,63338.975,53181.76,7.74,116526.555,22302.234375,723,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""8e7e3c1223361692753d5b81b96a5d137d0547d0aaa13aeaa762e052ebf8815b""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,116526.555 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-4,2026-08-12T09:14:43.579Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,3.545,62986.715,53262.85,7.065,116253.11,22299.921875,723,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""8e7e3c1223361692753d5b81b96a5d137d0547d0aaa13aeaa762e052ebf8815b""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,116253.11 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local-5,2026-08-12T09:14:43.579Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,3.77,63422.265,53410.92,16.595,116836.955,22286.375,721,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""8e7e3c1223361692753d5b81b96a5d137d0547d0aaa13aeaa762e052ebf8815b""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__cold_local.json,cold_local,116836.955 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-0,2026-08-12T09:26:41.042Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,warmup,0,ok,0,63257.39,53521.215,15.485,116779.38,22291.9375,723,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""32753ac1e182fa992f70c700ae24698ff25cd1369260a237904f721ca128e500""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,116779.38 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-1,2026-08-12T09:26:41.042Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,1,ok,0,63118.3,53057.075,7.545,116175.5,22291.9375,723,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""32753ac1e182fa992f70c700ae24698ff25cd1369260a237904f721ca128e500""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,116175.5 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-2,2026-08-12T09:26:41.042Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,2,ok,0,63275.53,53749.825,8.235,117025.475,22291.9375,723,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""32753ac1e182fa992f70c700ae24698ff25cd1369260a237904f721ca128e500""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,117025.475 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-3,2026-08-12T09:26:41.042Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,3,ok,0,62934.11,54451.96,8.93,117386.19,22291.9375,722,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""32753ac1e182fa992f70c700ae24698ff25cd1369260a237904f721ca128e500""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,117386.19 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-4,2026-08-12T09:26:41.042Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,4,ok,0,62906.065,54016.835,7.89,116923.02,22291.9375,722,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""32753ac1e182fa992f70c700ae24698ff25cd1369260a237904f721ca128e500""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,116923.02 +input-to-proof-v1-mac-multithread-20260812,webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse-5,2026-08-12T09:26:41.042Z,macbook_m4,MacBook Pro (Apple M4 Max),26.6.1 (25G76),arm64,browser_wasm,Google Chrome 151.0.7922.109,webauthn,closest-analogue,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,circom_groth16,circom,snarkjs-groth16-browser-wasm-workers,circom-witness-wasm,measured,5,ok,0,62516.09,52972.2,7.075,115488.405,22291.9375,725,1753618376,1733145772,1753618376,,input-to-proof-v1-multithread,0fb5b4aa1398281c2fd3dbe14db147e05b61f201,"{""circom"":""2.2.2"",""snarkjs"":""0.7.6"",""execution_policy"":""workers""};execution_policy=multithread;threads_requested=4;threads_effective=4;witness_backend=circom_runtime_wasm_single;prover_backend=snarkjs_0.7.6_browser_wasm_workers","{""raw_evidence_sha256"":""32753ac1e182fa992f70c700ae24698ff25cd1369260a237904f721ca128e500""}",,"Closest analogue, not equivalent: Noir binds challenge, type, origin, RP-ID hash, flags, and public key; the Circom counterpart omits several bindings. Browser execution policy: multithread; requested threads=4, effective threads=4; witness generation remains circom_runtime_wasm_single, prover backend=snarkjs_0.7.6_browser_wasm_workers.",,,/Users/dcbuilder/Code/world/.worktrees/provekit-v1-cross-device-campaign/target/v1-benchmarks/input-to-proof/mac-chrome-multithread/webauthn_closest_analogue__mac_chrome__circom_groth16__warm_reuse.json,warm_reuse,115488.405 diff --git a/benchmarks/v1/mopro/e15_circom_frozen_mobench.rs b/benchmarks/v1/mopro/e15_circom_frozen_mobench.rs new file mode 100644 index 000000000..7722af64f --- /dev/null +++ b/benchmarks/v1/mopro/e15_circom_frozen_mobench.rs @@ -0,0 +1,239 @@ +//! Circom/Arkworks proof-only benchmark for 32-bit Android. +//! +//! Each APK carries one independently validated SnarkJS WTNS and matching zkey +//! as native-library resources. Loading and correctness canaries happen outside +//! the measured proving interval. + +use { + circom_prover::prover::{self, CircomProof, ProofLib}, + num_bigint::BigUint, + std::{ + env, fs, + hint::black_box, + path::{Path, PathBuf}, + sync::OnceLock, + thread, + time::Instant, + }, +}; + +const ZKEY_RESOURCE: &str = "libmobench_proving_key.so"; +const WTNS_RESOURCE: &str = "libmobench_witness.so"; + +pub(crate) struct PreparedProve { + witnesses: Vec, + zkey_path: String, +} + +fn checked_file(path: PathBuf) -> PathBuf { + let metadata = fs::metadata(&path) + .unwrap_or_else(|error| panic!("read fixture metadata for {}: {error}", path.display())); + assert!( + metadata.is_file(), + "fixture is not a file: {}", + path.display() + ); + path +} + +fn resource_path(name: &str) -> PathBuf { + if let Some(directory) = env::var_os("MOBENCH_CIRCOM_RESOURCE_DIR") { + return checked_file(PathBuf::from(directory).join(name)); + } + + #[cfg(target_os = "android")] + { + let library_name = format!("lib{}.so", env!("CARGO_PKG_NAME").replace('-', "_")); + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(&library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + return checked_file( + PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .join(name), + ); + } + + #[cfg(not(target_os = "android"))] + { + let executable = env::current_exe().expect("resolve benchmark executable path"); + checked_file( + executable + .parent() + .expect("benchmark executable has a parent") + .join(name), + ) + } +} + +fn read_u32(bytes: &[u8], offset: &mut usize) -> u32 { + let end = offset.checked_add(4).expect("WTNS u32 offset overflow"); + let value = u32::from_le_bytes( + bytes + .get(*offset..end) + .expect("truncated WTNS u32") + .try_into() + .expect("WTNS u32 width"), + ); + *offset = end; + value +} + +fn read_u64(bytes: &[u8], offset: &mut usize) -> u64 { + let end = offset.checked_add(8).expect("WTNS u64 offset overflow"); + let value = u64::from_le_bytes( + bytes + .get(*offset..end) + .expect("truncated WTNS u64") + .try_into() + .expect("WTNS u64 width"), + ); + *offset = end; + value +} + +fn parse_wtns(path: &Path) -> Vec { + let bytes = + fs::read(path).unwrap_or_else(|error| panic!("read WTNS {}: {error}", path.display())); + assert_eq!( + bytes.get(..4), + Some(b"wtns".as_slice()), + "invalid WTNS magic" + ); + let mut offset = 4; + assert_eq!(read_u32(&bytes, &mut offset), 2, "unsupported WTNS version"); + let section_count = read_u32(&bytes, &mut offset); + let mut field_bytes = None; + let mut witness_count = None; + let mut witness_section = None; + + for _ in 0..section_count { + let section_id = read_u32(&bytes, &mut offset); + let section_len = usize::try_from(read_u64(&bytes, &mut offset)) + .expect("WTNS section length exceeds usize"); + let end = offset + .checked_add(section_len) + .expect("WTNS section offset overflow"); + let section = bytes.get(offset..end).expect("truncated WTNS section"); + match section_id { + 1 => { + let mut header_offset = 0; + let width = usize::try_from(read_u32(section, &mut header_offset)) + .expect("WTNS field width exceeds usize"); + let prime_end = header_offset + .checked_add(width) + .expect("WTNS prime offset overflow"); + section + .get(header_offset..prime_end) + .expect("truncated WTNS prime"); + header_offset = prime_end; + field_bytes = Some(width); + witness_count = Some( + usize::try_from(read_u32(section, &mut header_offset)) + .expect("WTNS witness count exceeds usize"), + ); + } + 2 => witness_section = Some(section), + _ => {} + } + offset = end; + } + + let width = field_bytes.expect("WTNS header section missing"); + let count = witness_count.expect("WTNS witness count missing"); + let witness_bytes = witness_section.expect("WTNS witness section missing"); + assert_eq!( + witness_bytes.len(), + width + .checked_mul(count) + .expect("WTNS witness size overflow"), + "WTNS witness section length mismatch" + ); + witness_bytes + .chunks_exact(width) + .map(BigUint::from_bytes_le) + .collect() +} + +fn prove(prepared: PreparedProve) -> CircomProof { + prover::prove( + ProofLib::Arkworks, + prepared.zkey_path, + thread::spawn(move || prepared.witnesses), + ) + .expect("Mopro Arkworks proof") +} + +fn validation_gate() { + static VALIDATED: OnceLock<()> = OnceLock::new(); + VALIDATED.get_or_init(|| { + let zkey = resource_path(ZKEY_RESOURCE); + let witness = resource_path(WTNS_RESOURCE); + let proof = prove(PreparedProve { + witnesses: parse_wtns(&witness), + zkey_path: zkey.to_string_lossy().into_owned(), + }); + assert!( + prover::verify( + ProofLib::Arkworks, + zkey.to_string_lossy().into_owned(), + proof.clone(), + ) + .expect("verify valid Mopro Arkworks canary"), + "valid Mopro Arkworks canary was rejected" + ); + + let mut tampered = proof; + if let Some(public_input) = tampered.pub_inputs.0.first_mut() { + *public_input += BigUint::from(1u32); + } else { + // Use the valid point at infinity instead of corrupting a curve + // coordinate. Arkworks rejects malformed affine points while + // deserializing them, before Groth16 verification can return false. + tampered.proof.a.x = BigUint::from(0u32); + tampered.proof.a.y = BigUint::from(0u32); + tampered.proof.a.z = BigUint::from(0u32); + } + let rejected = match prover::verify( + ProofLib::Arkworks, + zkey.to_string_lossy().into_owned(), + tampered, + ) { + Ok(valid) => !valid, + Err(_) => true, + }; + assert!(rejected, "tampered Mopro Arkworks canary was accepted"); + }); +} + +pub(crate) fn setup_prove() -> PreparedProve { + validation_gate(); + let zkey = resource_path(ZKEY_RESOURCE); + let witness = resource_path(WTNS_RESOURCE); + let zkey_size = fs::metadata(&zkey).expect("read zkey metadata").len(); + let witness_size = fs::metadata(&witness).expect("read WTNS metadata").len(); + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("witness_size_bytes", witness_size); + mobench_sdk::record_run_u64("proving_payload_size_bytes", zkey_size + witness_size); + PreparedProve { + witnesses: parse_wtns(&witness), + zkey_path: zkey.to_string_lossy().into_owned(), + } +} + +pub(crate) fn bench_prove(prepared: PreparedProve) { + let started = Instant::now(); + let proof = prove(prepared); + let prove_time_ns = started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let proof_size = serde_json::to_vec(&proof) + .expect("serialize exact Arkworks Groth16 proof") + .len() as u64; + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof_size); + black_box(proof); +} diff --git a/benchmarks/v1/mopro/ios15_charconv_shim.cpp b/benchmarks/v1/mopro/ios15_charconv_shim.cpp new file mode 100644 index 000000000..8587debb3 --- /dev/null +++ b/benchmarks/v1/mopro/ios15_charconv_shim.cpp @@ -0,0 +1,159 @@ +#include +#include +#include + +namespace { +template +std::to_chars_result format_float( + char* first, + char* last, + Float value, + std::chars_format format, + int precision) +{ + if (first >= last) { + return {last, std::errc::value_too_large}; + } + + const char* specifier = "%.*g"; + switch (format) { + case std::chars_format::fixed: + specifier = "%.*f"; + break; + case std::chars_format::scientific: + specifier = "%.*e"; + break; + case std::chars_format::hex: + specifier = "%.*a"; + break; + case std::chars_format::general: + break; + } + + const int available = static_cast(last - first); + const int written = snprintf(first, static_cast(available), specifier, precision, value); + if (written < 0 || written >= available) { + return {last, std::errc::value_too_large}; + } + return {first + written, std::errc{}}; +} + +template +std::to_chars_result format_float( + char* first, + char* last, + Float value, + std::chars_format format) +{ + return format_float(first, last, value, format, std::numeric_limits::max_digits10); +} +} // namespace + +// The Barretenberg 4.2.0 iOS archive was built against a newer libc++ and +// imports the std::__1 floating-point to_chars ABI that iOS 15 does not +// provide. Export those exact historical symbols from the application. +extern "C" std::to_chars_result shim_float(char*, char*, float) + __asm("__ZNSt3__18to_charsEPcS0_f"); +extern "C" std::to_chars_result shim_double(char*, char*, double) + __asm("__ZNSt3__18to_charsEPcS0_d"); +extern "C" std::to_chars_result shim_long_double(char*, char*, long double) + __asm("__ZNSt3__18to_charsEPcS0_e"); +extern "C" std::to_chars_result shim_float_format(char*, char*, float, std::chars_format) + __asm("__ZNSt3__18to_charsEPcS0_fNS_12chars_formatE"); +extern "C" std::to_chars_result shim_double_format(char*, char*, double, std::chars_format) + __asm("__ZNSt3__18to_charsEPcS0_dNS_12chars_formatE"); +extern "C" std::to_chars_result shim_long_double_format( + char*, + char*, + long double, + std::chars_format) __asm("__ZNSt3__18to_charsEPcS0_eNS_12chars_formatE"); +extern "C" std::to_chars_result shim_float_precision( + char*, + char*, + float, + std::chars_format, + int) __asm("__ZNSt3__18to_charsEPcS0_fNS_12chars_formatEi"); +extern "C" std::to_chars_result shim_double_precision( + char*, + char*, + double, + std::chars_format, + int) __asm("__ZNSt3__18to_charsEPcS0_dNS_12chars_formatEi"); +extern "C" std::to_chars_result shim_long_double_precision( + char*, + char*, + long double, + std::chars_format, + int) __asm("__ZNSt3__18to_charsEPcS0_eNS_12chars_formatEi"); + +std::to_chars_result shim_float(char* first, char* last, float value) +{ + return format_float(first, last, value, std::chars_format::general); +} + +std::to_chars_result shim_double(char* first, char* last, double value) +{ + return format_float(first, last, value, std::chars_format::general); +} + +std::to_chars_result shim_long_double(char* first, char* last, long double value) +{ + return format_float(first, last, static_cast(value), std::chars_format::general); +} + +std::to_chars_result shim_float_format( + char* first, + char* last, + float value, + std::chars_format format) +{ + return format_float(first, last, value, format); +} + +std::to_chars_result shim_double_format( + char* first, + char* last, + double value, + std::chars_format format) +{ + return format_float(first, last, value, format); +} + +std::to_chars_result shim_long_double_format( + char* first, + char* last, + long double value, + std::chars_format format) +{ + return format_float(first, last, static_cast(value), format); +} + +std::to_chars_result shim_float_precision( + char* first, + char* last, + float value, + std::chars_format format, + int precision) +{ + return format_float(first, last, value, format, precision); +} + +std::to_chars_result shim_double_precision( + char* first, + char* last, + double value, + std::chars_format format, + int precision) +{ + return format_float(first, last, value, format, precision); +} + +std::to_chars_result shim_long_double_precision( + char* first, + char* last, + long double value, + std::chars_format format, + int precision) +{ + return format_float(first, last, static_cast(value), format, precision); +} diff --git a/benchmarks/v1/mopro/mobench_host.rs b/benchmarks/v1/mopro/mobench_host.rs new file mode 100644 index 000000000..c807b536f --- /dev/null +++ b/benchmarks/v1/mopro/mobench_host.rs @@ -0,0 +1,48 @@ +use { + mobench_sdk::{run_benchmark, BenchSpec}, + provekit_v1_mobile_adapters as _, + std::process::ExitCode, +}; + +fn main() -> ExitCode { + let mut args = std::env::args().skip(1); + let Some(name) = args.next() else { + eprintln!("usage: mobench-host [warmup] [iterations]"); + return ExitCode::FAILURE; + }; + let warmup = args + .next() + .and_then(|value| value.parse().ok()) + .unwrap_or(1); + let iterations = args + .next() + .and_then(|value| value.parse().ok()) + .unwrap_or(5); + let output = args.next(); + match run_benchmark(BenchSpec { + name, + iterations, + warmup, + }) { + Ok(report) => match serde_json::to_string_pretty(&report) { + Ok(json) => { + if let Some(path) = output { + if let Err(error) = std::fs::write(&path, &json) { + eprintln!("failed to write {path}: {error}"); + return ExitCode::FAILURE; + } + } + println!("{json}"); + ExitCode::SUCCESS + } + Err(error) => { + eprintln!("failed to serialize report: {error}"); + ExitCode::FAILURE + } + }, + Err(error) => { + eprintln!("benchmark failed: {error}"); + ExitCode::FAILURE + } + } +} diff --git a/benchmarks/v1/mopro/noir_mobench.rs b/benchmarks/v1/mopro/noir_mobench.rs new file mode 100644 index 000000000..f5a870010 --- /dev/null +++ b/benchmarks/v1/mopro/noir_mobench.rs @@ -0,0 +1,459 @@ +//! Mobench functions for the native Mopro Noir/Barretenberg lanes. +//! +//! The proof-only functions retain frozen beta.19 `WitnessStack` files for the +//! historical campaign. The input-to-proof functions parse the frozen raw +//! Prover TOML, execute ACVM, serialize the resulting witness, and prove inside +//! one measured region. + +use { + noir_rs::{ + acir::{native_types::{WitnessMap, WitnessStack}, FieldElement}, + barretenberg::{ + api::{ + circuit_prove, configure_memory, proof_fields_to_bytes, + settings_ultra_honk_poseidon2, + }, + srs::setup_srs_from_bytecode, + verify::{get_ultra_honk_verification_key, verify_ultra_honk}, + }, + circuit::get_acir_buffer_uncompressed, + execute::execute, + witness::serialize_witness, + }, + noirc_abi::{input_parser::Format, Abi}, + serde_json::Value, + std::{ + env, fs, + hint::black_box, + path::PathBuf, + sync::{Once, OnceLock}, + time::Instant, + }, +}; + +const SRS_NAME: &str = "noir_beta19_campaign.dat"; +const WEBAUTHN_CIRCUIT: &str = include_str!("../test-vectors/noir/campaign/webauthn/circuit.json"); +const WEBAUTHN_WITNESS: &[u8] = include_bytes!("../test-vectors/noir/campaign/webauthn/witness.gz"); +const WEBAUTHN_INPUT: &str = include_str!("../test-vectors/noir/campaign/webauthn/Prover.toml"); +const PASSPORT_CIRCUIT: &str = include_str!("../test-vectors/noir/campaign/passport/circuit.json"); +const PASSPORT_WITNESS: &[u8] = include_bytes!("../test-vectors/noir/campaign/passport/witness.gz"); +const PASSPORT_INPUT: &str = include_str!("../test-vectors/noir/campaign/passport/Prover.toml"); +const PASSPORT_P1_CIRCUIT: &str = include_str!("../test-vectors/noir/campaign/passport_p1/circuit.json"); +const PASSPORT_P1_WITNESS: &[u8] = include_bytes!("../test-vectors/noir/campaign/passport_p1/witness.gz"); +const PASSPORT_P1_INPUT: &str = include_str!("../test-vectors/noir/campaign/passport_p1/Prover.toml"); +const OPRF_CIRCUIT: &str = include_str!("../test-vectors/noir/campaign/oprf/circuit.json"); +const OPRF_WITNESS: &[u8] = include_bytes!("../test-vectors/noir/campaign/oprf/witness.gz"); +const OPRF_INPUT: &str = include_str!("../test-vectors/noir/campaign/oprf/Prover.toml"); + +#[derive(Clone)] +pub(crate) struct PreparedProve { + bytecode: &'static str, + verification_key: Vec, + serialized_witness: Vec, +} + +#[derive(Clone)] +pub(crate) struct PreparedInputToProof { + workload: &'static FrozenWorkload, + verification_key: Vec, +} + +pub(crate) struct PreparedVerify { + proof: Vec, + verification_key: Vec, +} + +struct FrozenWorkload { + name: &'static str, + bytecode: &'static str, + serialized_witness: Vec, + abi: Abi, + input_toml: &'static str, + circuit_size_bytes: usize, + witness_size_bytes: usize, + input_size_bytes: usize, +} + +fn checked_file(path: PathBuf) -> String { + let metadata = fs::metadata(&path) + .unwrap_or_else(|error| panic!("read fixture metadata for {}: {error}", path.display())); + assert!( + metadata.is_file(), + "fixture is not a file: {}", + path.display() + ); + path.to_string_lossy().into_owned() +} + +fn srs_path() -> String { + if let Some(path) = env::var_os("MOBENCH_NOIR_SRS") { + return checked_file(PathBuf::from(path)); + } + + #[cfg(target_os = "android")] + { + let library_name = format!("lib{}.so", env!("CARGO_PKG_NAME").replace('-', "_")); + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(&library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + return checked_file( + PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .join("libnoir_beta19_campaign.so"), + ); + } + + #[cfg(not(target_os = "android"))] + { + let executable = env::current_exe().expect("resolve benchmark executable path"); + checked_file( + executable + .parent() + .expect("benchmark executable has an app-bundle parent") + .join(SRS_NAME), + ) + } +} + +fn load_workload( + name: &'static str, + circuit_json: &'static str, + witness_bytes: &'static [u8], + input_toml: &'static str, +) -> FrozenWorkload { + let circuit: Value = serde_json::from_str(circuit_json).expect("parse frozen Noir circuit"); + let bytecode = circuit["bytecode"] + .as_str() + .expect("frozen Noir circuit has bytecode") + .to_owned(); + // Each workload is initialized once, so retaining one decoded bytecode + // string for the process lifetime is bounded and avoids repeated parsing. + let bytecode = Box::leak(bytecode.into_boxed_str()); + let abi = serde_json::from_value(circuit["abi"].clone()).expect("parse frozen Noir ABI"); + + let stack: WitnessStack = + WitnessStack::deserialize(witness_bytes).expect("decode frozen beta.19 WitnessStack"); + assert_eq!( + stack.length(), + 1, + "frozen benchmark must contain one witness frame" + ); + let serialized_witness = + serialize_witness(stack).expect("serialize solved witness for Barretenberg"); + FrozenWorkload { + name, + bytecode, + serialized_witness, + abi, + input_toml, + circuit_size_bytes: circuit_json.len(), + witness_size_bytes: witness_bytes.len(), + input_size_bytes: input_toml.len(), + } +} + +fn webauthn() -> &'static FrozenWorkload { + static WORKLOAD: OnceLock = OnceLock::new(); + WORKLOAD.get_or_init(|| load_workload("webauthn", WEBAUTHN_CIRCUIT, WEBAUTHN_WITNESS, WEBAUTHN_INPUT)) +} + +fn oprf() -> &'static FrozenWorkload { + static WORKLOAD: OnceLock = OnceLock::new(); + WORKLOAD.get_or_init(|| load_workload("oprf", OPRF_CIRCUIT, OPRF_WITNESS, OPRF_INPUT)) +} + +fn passport() -> &'static FrozenWorkload { + static WORKLOAD: OnceLock = OnceLock::new(); + WORKLOAD.get_or_init(|| load_workload("passport", PASSPORT_CIRCUIT, PASSPORT_WITNESS, PASSPORT_INPUT)) +} + +fn passport_p1() -> &'static FrozenWorkload { + static WORKLOAD: OnceLock = OnceLock::new(); + WORKLOAD.get_or_init(|| load_workload( + "passport_p1", + PASSPORT_P1_CIRCUIT, + PASSPORT_P1_WITNESS, + PASSPORT_P1_INPUT, + )) +} + +fn prepare(workload: &'static FrozenWorkload) -> PreparedProve { + setup_srs_from_bytecode(workload.bytecode, Some(&srs_path()), false) + .expect("initialize frozen Noir SRS"); + let verification_key = get_ultra_honk_verification_key(workload.bytecode, true) + .expect("compute native Noir verification key"); + PreparedProve { + bytecode: workload.bytecode, + verification_key, + serialized_witness: workload.serialized_witness.clone(), + } +} + +fn prove(prepared: PreparedProve) -> Vec { + configure_memory(true, None); + let acir = get_acir_buffer_uncompressed(prepared.bytecode) + .expect("decode frozen Noir circuit for Barretenberg"); + let response = circuit_prove( + &acir, + &prepared.serialized_witness, + &prepared.verification_key, + &settings_ultra_honk_poseidon2(), + ) + .expect("native Mopro Noir proof"); + let mut proof = (response.public_inputs.len() as u32).to_be_bytes().to_vec(); + proof.extend(proof_fields_to_bytes(&response.public_inputs)); + proof.extend(proof_fields_to_bytes(&response.proof)); + proof +} + +fn initial_witness(workload: &FrozenWorkload) -> WitnessMap { + let inputs = Format::Toml + .parse(workload.input_toml, &workload.abi) + .expect("parse frozen Noir Prover TOML"); + workload + .abi + .encode(&inputs, None) + .expect("encode frozen Noir inputs") +} + +fn solve_witness(workload: &FrozenWorkload) -> Vec { + let witness = execute(workload.bytecode, initial_witness(workload)) + .expect("execute native Noir witness generation"); + serialize_witness(witness).expect("serialize live native Noir witness") +} + +fn prove_serialized( + bytecode: &'static str, + verification_key: &[u8], + serialized_witness: &[u8], +) -> Vec { + configure_memory(true, None); + let acir = get_acir_buffer_uncompressed(bytecode) + .expect("decode frozen Noir circuit for Barretenberg"); + let response = circuit_prove( + &acir, + serialized_witness, + verification_key, + &settings_ultra_honk_poseidon2(), + ) + .expect("native Mopro Noir proof"); + let mut proof = (response.public_inputs.len() as u32).to_be_bytes().to_vec(); + proof.extend(proof_fields_to_bytes(&response.public_inputs)); + proof.extend(proof_fields_to_bytes(&response.proof)); + proof +} + +fn prepare_input_to_proof(workload: &'static FrozenWorkload) -> PreparedInputToProof { + setup_srs_from_bytecode(workload.bytecode, Some(&srs_path()), false) + .expect("initialize frozen Noir SRS"); + let verification_key = get_ultra_honk_verification_key(workload.bytecode, true) + .expect("compute native Noir verification key"); + PreparedInputToProof { + workload, + verification_key, + } +} + +fn validate(workload: &'static FrozenWorkload, gate: &'static Once) { + gate.call_once(|| { + let prepared = prepare_input_to_proof(workload); + let verification_key = prepared.verification_key.clone(); + let witness = solve_witness(workload); + let mut proof = prove_serialized(workload.bytecode, &verification_key, &witness); + assert!( + verify_ultra_honk(proof.clone(), verification_key.clone()) + .expect("verify valid native Noir canary"), + "valid native Noir canary was rejected" + ); + let proof_size_bytes = proof.len(); + let middle = proof.len() / 2; + proof[middle] ^= 1; + let rejected = match verify_ultra_honk(proof, verification_key) { + Ok(valid) => !valid, + Err(_) => true, + }; + assert!(rejected, "tampered native Noir canary was accepted"); + let srs_size_bytes = fs::metadata(srs_path()) + .expect("read native Noir SRS metadata") + .len(); + println!( + "MOBENCH_METRIC_JSON {}", + serde_json::json!({ + "schema_version": 1, + "stack": "noir_barretenberg", + "workload": workload.name, + "proof_size_bytes": proof_size_bytes, + "proving_payload": { + "circuit_size_bytes": workload.circuit_size_bytes, + "witness_size_bytes": workload.witness_size_bytes, + "srs_size_bytes": srs_size_bytes, + "deduplicated_total_bytes": workload.circuit_size_bytes as u64 + + workload.witness_size_bytes as u64 + + srs_size_bytes, + }, + "tampered_proof_rejected": true, + "timing_scope": "outside_measured_region", + }) + ); + }); +} + +fn record_proving_payload(workload: &'static FrozenWorkload) { + let srs_size_bytes = fs::metadata(srs_path()) + .expect("read native Noir SRS metadata") + .len(); + mobench_sdk::record_run_u64("circuit_size_bytes", workload.circuit_size_bytes as u64); + mobench_sdk::record_run_u64("witness_size_bytes", workload.witness_size_bytes as u64); + mobench_sdk::record_run_u64("srs_size_bytes", srs_size_bytes); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + workload.circuit_size_bytes as u64 + + workload.witness_size_bytes as u64 + + srs_size_bytes, + ); +} + +fn record_input_to_proof_payload(workload: &'static FrozenWorkload) { + let srs_size_bytes = fs::metadata(srs_path()) + .expect("read native Noir SRS metadata") + .len(); + mobench_sdk::record_run_u64("circuit_size_bytes", workload.circuit_size_bytes as u64); + mobench_sdk::record_run_u64("input_size_bytes", workload.input_size_bytes as u64); + mobench_sdk::record_run_u64("srs_size_bytes", srs_size_bytes); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + workload.circuit_size_bytes as u64 + workload.input_size_bytes as u64 + srs_size_bytes, + ); +} + +fn setup_prove(workload: &'static FrozenWorkload, gate: &'static Once) -> PreparedProve { + validate(workload, gate); + record_proving_payload(workload); + prepare(workload) +} + +fn setup_verify(workload: &'static FrozenWorkload, gate: &'static Once) -> PreparedVerify { + validate(workload, gate); + let prepared = prepare(workload); + let verification_key = prepared.verification_key.clone(); + let proof = prove(prepared); + assert!( + verify_ultra_honk(proof.clone(), verification_key.clone()) + .expect("verify prepared native Noir proof"), + "prepared native Noir proof was rejected" + ); + PreparedVerify { + proof, + verification_key, + } +} + +static WEBAUTHN_VALIDATED: Once = Once::new(); +static PASSPORT_VALIDATED: Once = Once::new(); +static PASSPORT_P1_VALIDATED: Once = Once::new(); +static OPRF_VALIDATED: Once = Once::new(); + +pub(crate) fn setup_webauthn_prove() -> PreparedProve { + setup_prove(webauthn(), &WEBAUTHN_VALIDATED) +} + +pub(crate) fn setup_webauthn_verify() -> PreparedVerify { + setup_verify(webauthn(), &WEBAUTHN_VALIDATED) +} + +pub(crate) fn setup_oprf_prove() -> PreparedProve { + setup_prove(oprf(), &OPRF_VALIDATED) +} + +pub(crate) fn setup_passport_prove() -> PreparedProve { + setup_prove(passport(), &PASSPORT_VALIDATED) +} + +pub(crate) fn setup_passport_verify() -> PreparedVerify { + setup_verify(passport(), &PASSPORT_VALIDATED) +} + +pub(crate) fn setup_oprf_verify() -> PreparedVerify { + setup_verify(oprf(), &OPRF_VALIDATED) +} + +fn setup_input_to_proof( + workload: &'static FrozenWorkload, + gate: &'static Once, +) -> PreparedInputToProof { + validate(workload, gate); + record_input_to_proof_payload(workload); + prepare_input_to_proof(workload) +} + +pub(crate) fn setup_webauthn_input_to_proof() -> PreparedInputToProof { + setup_input_to_proof(webauthn(), &WEBAUTHN_VALIDATED) +} + +pub(crate) fn setup_passport_input_to_proof() -> PreparedInputToProof { + setup_input_to_proof(passport(), &PASSPORT_VALIDATED) +} + +pub(crate) fn setup_passport_p1_input_to_proof() -> PreparedInputToProof { + setup_input_to_proof(passport_p1(), &PASSPORT_P1_VALIDATED) +} + +pub(crate) fn setup_oprf_input_to_proof() -> PreparedInputToProof { + setup_input_to_proof(oprf(), &OPRF_VALIDATED) +} + +pub(crate) fn bench_input_to_proof_impl(prepared: PreparedInputToProof) { + let input_to_proof_started = Instant::now(); + let witness_started = Instant::now(); + let serialized_witness = solve_witness(prepared.workload); + let witness_time_ns = witness_started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let prove_started = Instant::now(); + let proof = prove_serialized( + prepared.workload.bytecode, + &prepared.verification_key, + &serialized_witness, + ); + let prove_time_ns = prove_started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let input_to_proof_time_ns = input_to_proof_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("witness_time_ns", witness_time_ns); + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof.len() as u64); + black_box(proof); +} + +pub(crate) fn bench_prove_impl(prepared: PreparedProve) { + let started = Instant::now(); + let proof = prove(prepared); + let prove_time_ns = started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof.len() as u64); + black_box(proof); +} + +pub(crate) fn bench_verify_impl(prepared: &PreparedVerify) { + let valid = verify_ultra_honk(prepared.proof.clone(), prepared.verification_key.clone()) + .expect("native Mopro Noir verification"); + assert!(valid, "valid native Mopro Noir proof was rejected"); + black_box(valid); +} + +pub(crate) fn bench_proof_verify_impl(prepared: PreparedProve) { + let verification_key = prepared.verification_key.clone(); + let proof = prove(prepared); + let valid = + verify_ultra_honk(proof, verification_key).expect("native Mopro Noir proof-and-verify"); + assert!( + valid, + "native Mopro Noir proof-and-verify rejected its proof" + ); + black_box(valid); +} diff --git a/benchmarks/v1/mopro/noir_srs_host.rs b/benchmarks/v1/mopro/noir_srs_host.rs new file mode 100644 index 000000000..1d620a928 --- /dev/null +++ b/benchmarks/v1/mopro/noir_srs_host.rs @@ -0,0 +1,63 @@ +//! Prepare one immutable local SRS large enough for all supplied Noir circuits. + +use { + noir_rs::barretenberg::{ + srs::{localsrs::LocalSrs, netsrs::NetSrs}, + utils::{compute_subgroup_size, get_circuit_size}, + }, + serde_json::Value, + std::{env, fs, path::PathBuf, process::ExitCode}, +}; + +fn main() -> ExitCode { + let mut args = env::args().skip(1); + let Some(output) = args.next() else { + eprintln!("usage: noir-srs-host ..."); + return ExitCode::FAILURE; + }; + let circuits: Vec = args.collect(); + if circuits.is_empty() { + eprintln!("at least one circuit is required"); + return ExitCode::FAILURE; + } + + let mut required_points = 0u32; + for path in &circuits { + let json: Value = serde_json::from_slice( + &fs::read(path).unwrap_or_else(|error| panic!("read {path}: {error}")), + ) + .unwrap_or_else(|error| panic!("parse {path}: {error}")); + let bytecode = json["bytecode"] + .as_str() + .unwrap_or_else(|| panic!("{path} has no bytecode")); + let dyadic_gates = get_circuit_size(bytecode, false); + assert!( + dyadic_gates > 0, + "failed to inspect circuit size for {path}" + ); + let prover_points = compute_subgroup_size( + dyadic_gates + .checked_mul(8) + .expect("UltraHonk SRS point count overflow"), + ) + .checked_add(1) + .expect("UltraHonk SRS point count overflow"); + eprintln!("{path}: dyadic_gates={dyadic_gates} srs_points={prover_points}"); + required_points = required_points.max(prover_points); + } + + if env::var_os("NOIR_SRS_DRY_RUN").is_some() { + eprintln!("dry run: required_points={required_points}"); + return ExitCode::SUCCESS; + } + + let output = PathBuf::from(output); + if let Some(parent) = output.parent() { + fs::create_dir_all(parent) + .unwrap_or_else(|error| panic!("create {}: {error}", parent.display())); + } + let local = LocalSrs(NetSrs::new(required_points).to_srs()); + local.save(output.to_str()); + eprintln!("wrote {} points to {}", required_points, output.display()); + ExitCode::SUCCESS +} diff --git a/benchmarks/v1/mopro/webauthn_mobench.rs b/benchmarks/v1/mopro/webauthn_mobench.rs new file mode 100644 index 000000000..7c02ebbe6 --- /dev/null +++ b/benchmarks/v1/mopro/webauthn_mobench.rs @@ -0,0 +1,294 @@ +//! Mobench functions for the Mopro Circom/Arkworks WebAuthn assertion lane. +//! +//! The zkey is installed as an application resource before the benchmark +//! starts. Fixture discovery and witness preparation happen in Mobench setup +//! callbacks unless the function explicitly measures that phase. + +use { + circom_prover::prover::{self, CircomProof, ProofLib}, + num_bigint::{BigInt, BigUint}, + serde_json::Value, + std::{ + collections::HashMap, + env, + fs, + hint::black_box, + path::PathBuf, + str::FromStr, + sync::Once, + thread, + time::Instant, + }, +}; + +const INPUTS: &str = include_str!("../test-vectors/circom/input_webauthn_default.json"); +const ZKEY_NAME: &str = "webauthn_default_benchmark.zkey"; + +pub(crate) struct PreparedProve { + witnesses: Vec, + zkey_path: String, +} + +pub(crate) struct PreparedVerify { + proof: CircomProof, + zkey_path: String, +} + +fn zkey_path() -> String { + if let Some(path) = env::var_os("MOBENCH_WEBAUTHN_ZKEY") { + return checked_file(PathBuf::from(path)); + } + + #[cfg(target_os = "android")] + { + let library_name = format!("lib{}.so", env!("CARGO_PKG_NAME").replace('-', "_")); + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(&library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + return checked_file( + PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .join("libmobench_webauthn_zkey.so"), + ); + } + + #[cfg(not(target_os = "android"))] + { + let executable = env::current_exe().expect("resolve benchmark executable path"); + checked_file( + executable + .parent() + .expect("benchmark executable has an app-bundle parent") + .join(ZKEY_NAME), + ) + } +} + +fn checked_file(path: PathBuf) -> String { + let metadata = fs::metadata(&path) + .unwrap_or_else(|error| panic!("read fixture metadata for {}: {error}", path.display())); + assert!( + metadata.is_file(), + "fixture is not a file: {}", + path.display() + ); + path.to_string_lossy().into_owned() +} + +fn flatten_input(value: &Value, output: &mut Vec) { + match value { + Value::Array(values) => { + for value in values { + flatten_input(value, output); + } + } + Value::String(value) => { + output.push(BigInt::from_str(value).expect("decimal Circom input")); + } + Value::Number(value) => { + output.push(BigInt::from_str(&value.to_string()).expect("numeric Circom input")); + } + _ => panic!("unsupported Circom input value: {value}"), + } +} + +fn generate_witnesses(inputs: &str) -> Vec { + let values: Value = serde_json::from_str(inputs).expect("parse WebAuthn inputs"); + let object = values.as_object().expect("WebAuthn inputs are an object"); + let inputs: HashMap> = object + .iter() + .map(|(name, value)| { + let mut flattened = Vec::new(); + flatten_input(value, &mut flattened); + (name.clone(), flattened) + }) + .collect(); + super::witness::webauthndefault_witness(inputs) + .into_iter() + .map(|value| value.to_biguint().expect("non-negative Circom witness")) + .collect() +} + +fn spawn_witnesses(inputs: String) -> thread::JoinHandle> { + thread::spawn(move || generate_witnesses(&inputs)) +} + +fn prove(prepared: PreparedProve) -> CircomProof { + prover::prove( + ProofLib::Arkworks, + prepared.zkey_path, + thread::spawn(move || prepared.witnesses), + ) + .expect("Mopro Arkworks WebAuthn proof") +} + +fn validation_gate() { + static VALIDATED: Once = Once::new(); + VALIDATED.call_once(|| { + let zkey_path = zkey_path(); + let proof = prove(PreparedProve { + witnesses: generate_witnesses(INPUTS), + zkey_path: zkey_path.clone(), + }); + assert!( + prover::verify(ProofLib::Arkworks, zkey_path.clone(), proof.clone()) + .expect("verify valid Mopro Arkworks WebAuthn canary"), + "valid Mopro Arkworks WebAuthn canary was rejected" + ); + + let mut tampered = proof; + tampered.proof.a.x += BigUint::from(1u32); + let rejected = match prover::verify(ProofLib::Arkworks, zkey_path, tampered) { + Ok(valid) => !valid, + Err(_) => true, + }; + assert!( + rejected, + "tampered Mopro Arkworks WebAuthn canary was accepted" + ); + }); +} + +pub(crate) fn setup_inputs() -> String { + validation_gate(); + INPUTS.to_owned() +} + +pub(crate) fn setup_prove() -> PreparedProve { + validation_gate(); + let zkey_path = zkey_path(); + let zkey_size = fs::metadata(&zkey_path) + .expect("read WebAuthn zkey metadata") + .len(); + let input_size = INPUTS.len() as u64; + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("input_size_bytes", input_size); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + zkey_size + input_size, + ); + PreparedProve { + witnesses: generate_witnesses(INPUTS), + zkey_path, + } +} + +pub(crate) fn setup_verify() -> PreparedVerify { + validation_gate(); + let zkey_path = zkey_path(); + let proof = prove(PreparedProve { + witnesses: generate_witnesses(INPUTS), + zkey_path: zkey_path.clone(), + }); + assert!( + prover::verify(ProofLib::Arkworks, zkey_path.clone(), proof.clone()) + .expect("verify prepared Mopro Arkworks WebAuthn proof"), + "prepared Mopro Arkworks WebAuthn proof must verify" + ); + PreparedVerify { proof, zkey_path } +} + +pub(crate) fn bench_webauthn_arkworks_witness_impl(inputs: String) { + let witnesses = generate_witnesses(&inputs); + black_box(witnesses); +} + +pub(crate) fn bench_webauthn_arkworks_prove_impl(prepared: PreparedProve) { + let started = Instant::now(); + let proof = prove(prepared); + let prove_time_ns = started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let proof_size = serde_json::to_vec(&proof) + .expect("serialize exact Arkworks Groth16 proof") + .len() as u64; + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", proof_size); + black_box(proof); +} + +pub(crate) fn bench_webauthn_arkworks_verify_impl(prepared: &PreparedVerify) { + let valid = prover::verify( + ProofLib::Arkworks, + prepared.zkey_path.clone(), + prepared.proof.clone(), + ) + .expect("Mopro Arkworks WebAuthn verification"); + assert!(valid, "valid Mopro Arkworks WebAuthn proof was rejected"); + black_box(valid); +} + +pub(crate) fn bench_webauthn_arkworks_e2e_impl(inputs: String) { + let witnesses = spawn_witnesses(inputs); + let proof = prover::prove(ProofLib::Arkworks, zkey_path(), witnesses) + .expect("Mopro Arkworks WebAuthn end-to-end proof"); + let valid = prover::verify(ProofLib::Arkworks, zkey_path(), proof) + .expect("Mopro Arkworks WebAuthn end-to-end verification"); + assert!( + valid, + "end-to-end Mopro Arkworks WebAuthn proof was rejected" + ); + black_box(valid); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn fixture_generates_expected_witness_size() { + assert_eq!(generate_witnesses(INPUTS).len(), 3_413_073); + } + + #[test] + #[ignore = "requires the independently validated SnarkJS WTNS"] + fn rust_witness_matches_snarkjs_wtns() { + let path = env::var_os("MOBENCH_WEBAUTHN_WTNS") + .expect("set MOBENCH_WEBAUTHN_WTNS to the validated fixture"); + let bytes = fs::read(path).expect("read validated SnarkJS WTNS"); + assert_eq!(&bytes[0..4], b"wtns"); + assert_eq!(u32::from_le_bytes(bytes[4..8].try_into().unwrap()), 2); + assert_eq!(u32::from_le_bytes(bytes[12..16].try_into().unwrap()), 1); + let header_len = u64::from_le_bytes(bytes[16..24].try_into().unwrap()) as usize; + let header = &bytes[24..24 + header_len]; + let field_bytes = u32::from_le_bytes(header[0..4].try_into().unwrap()) as usize; + let witness_count = + u32::from_le_bytes(header[4 + field_bytes..8 + field_bytes].try_into().unwrap()) + as usize; + let section_offset = 24 + header_len; + assert_eq!( + u32::from_le_bytes( + bytes[section_offset..section_offset + 4] + .try_into() + .unwrap() + ), + 2 + ); + let witness_data_offset = section_offset + 12; + let generated = generate_witnesses(INPUTS); + assert_eq!(generated.len(), witness_count); + for (index, (expected, actual)) in bytes[witness_data_offset..] + .chunks_exact(field_bytes) + .map(BigUint::from_bytes_le) + .zip(generated) + .enumerate() + { + assert_eq!(actual, expected, "witness mismatch at index {index}"); + } + } + + #[test] + #[ignore = "requires the cached 1.6 GiB WebAuthn zkey"] + fn frozen_fixture_proves_and_verifies() { + let prepared = setup_verify(); + let proof_json = serde_json::to_vec(&prepared.proof).expect("serialize Circom proof"); + eprintln!("MOPRO_WEBAUTHN_PROOF_JSON_BYTES={}", proof_json.len()); + if let Some(path) = env::var_os("MOBENCH_WEBAUTHN_PROOF_OUTPUT") { + fs::write(path, proof_json).expect("write retained Circom proof"); + } + black_box(prepared); + } +} diff --git a/benchmarks/v1/noir/generate-oprf-parity-fixture.ts b/benchmarks/v1/noir/generate-oprf-parity-fixture.ts new file mode 100644 index 000000000..0a323d242 --- /dev/null +++ b/benchmarks/v1/noir/generate-oprf-parity-fixture.ts @@ -0,0 +1,66 @@ +import { resolve } from "node:path"; + +const repoRoot = resolve(import.meta.dir, "../../.."); +const source = resolve( + repoRoot, + "target/v1-benchmarks/circom-browser/oprf/oprf_nullifier.input.json", +); +const destination = resolve(repoRoot, "noir-examples/oprf/Prover.toml"); + +const input = await Bun.file(source).json() as Record; +const q = (value: unknown) => JSON.stringify(String(value)); +const point = (value: unknown[]) => `{ x = ${q(value[0])}, y = ${q(value[1])} }`; +const points = (values: unknown[][]) => `[ +${values.map((value) => ` ${point(value)},`).join("\n")} +]`; +const fields = (values: unknown[]) => `[ +${values.map((value) => ` ${q(value)},`).join("\n")} +]`; + +const toml = `# Generated from the immutable World ID Protocol Circom fixture. +# Do not edit by hand; run this generator and compare hashes instead. +issuer_schema_id = ${q(input.issuer_schema_id)} +cred_pk = ${point(input.cred_pk)} +current_time_stamp = ${q(input.current_timestamp)} +cred_genesis_issued_at_min = ${q(input.cred_genesis_issued_at_min)} +root = ${q(input.merkle_root)} +depth = ${q(input.depth)} +rp_id = ${q(input.rp_id)} +action = ${q(input.action)} +oprf_pk = ${point(input.oprf_pk)} +nonce = ${q(input.nonce)} +signal_hash = ${q(input.signal_hash)} +id_commitment = ${q(input.id_commitment)} + +[inputs] +dlog_e = ${q(input.dlog_e)} +dlog_s = ${q(input.dlog_s)} +oprf_response_blinded = ${point(input.oprf_response_blinded)} +oprf_response = ${point(input.oprf_response)} +id_commitment_r = ${q(input.id_commitment_r)} + +[inputs.query_inputs] +user_pk = ${points(input.pk)} +pk_index = ${q(input.pk_index)} +query_s = ${q(input.s)} +query_r = [${input.r.map(q).join(", ")}] +cred_type_id = ${q(input.issuer_schema_id)} +cred_genesis_issued_at = ${q(input.cred_genesis_issued_at)} +cred_expires_at = ${q(input.cred_expires_at)} +cred_user_id_r = ${q(input.cred_user_id_r)} +cred_id = ${q(input.cred_id)} +cred_s = ${q(input.cred_s)} +cred_r = [${input.cred_r.map(q).join(", ")}] +beta = ${q(input.beta)} + +[inputs.query_inputs.cred_hashes] +claims_hash = ${q(input.cred_hashes[0])} +associated_data_hash = ${q(input.cred_hashes[1])} + +[inputs.query_inputs.merkle_proof] +mt_index = ${q(input.mt_index)} +siblings = ${fields(input.siblings)} +`; + +await Bun.write(destination, toml); +console.log(`wrote ${destination} from ${source}`); diff --git a/benchmarks/v1/noir/passport_p1/Nargo.toml b/benchmarks/v1/noir/passport_p1/Nargo.toml new file mode 100644 index 000000000..8a763f1ee --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/Nargo.toml @@ -0,0 +1,14 @@ +[package] +name = "passport_p1" +type = "bin" +description = "P1 Passport input-to-proof benchmark: Self SHA256/RSA-4096/registry statement" +authors = ["World Foundation"] +license = "MIT" +compiler_version = ">=1.0.0" + +[dependencies] +poseidon = { path = "../../../../target/v1-benchmarks/noir-beta19-compat/passport/poseidon" } +bignum = { path = "../../../../target/v1-benchmarks/noir-beta19-compat/passport/noir-bignum" } +rsa = { path = "../../../../target/v1-benchmarks/noir-beta19-compat/passport/noir-rsa" } +utils = { path = "../../../../noir-examples/noir-passport-monolithic/utils/utils" } +sha256 = { tag = "v0.3.0", git = "https://github.com/noir-lang/sha256" } diff --git a/benchmarks/v1/noir/passport_p1/Prover.toml b/benchmarks/v1/noir/passport_p1/Prover.toml new file mode 100644 index 000000000..f26df3748 --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/Prover.toml @@ -0,0 +1,21 @@ +# Generated from the P1 canonical record; do not edit by hand. +raw_dsc = [48, 130, 3, 118, 160, 3, 2, 1, 2, 2, 20, 120, 65, 169, 162, 14, 221, 98, 4, 13, 247, 28, 143, 180, 31, 18, 208, 115, 62, 212, 68, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48, 96, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 12, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 12, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 12, 9, 77, 111, 99, 107, 32, 67, 83, 67, 65, 49, 12, 48, 10, 6, 3, 85, 4, 11, 12, 3, 80, 75, 73, 49, 17, 48, 15, 6, 3, 85, 4, 3, 12, 8, 77, 111, 99, 107, 67, 83, 67, 65, 48, 30, 23, 13, 50, 53, 48, 50, 49, 57, 48, 52, 51, 50, 48, 55, 90, 23, 13, 51, 53, 48, 50, 49, 55, 48, 52, 51, 50, 48, 55, 90, 48, 94, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 12, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 12, 5, 80, 97, 114, 105, 115, 49, 17, 48, 15, 6, 3, 85, 4, 10, 12, 8, 77, 111, 99, 107, 32, 68, 83, 67, 49, 12, 48, 10, 6, 3, 85, 4, 11, 12, 3, 80, 75, 73, 49, 16, 48, 14, 6, 3, 85, 4, 3, 12, 7, 77, 111, 99, 107, 68, 83, 67, 48, 130, 2, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 2, 15, 0, 48, 130, 2, 10, 2, 130, 2, 1, 0, 159, 254, 198, 186, 214, 49, 130, 110, 254, 213, 99, 226, 121, 87, 48, 97, 125, 71, 205, 237, 251, 8, 18, 215, 68, 171, 221, 24, 161, 163, 167, 78, 18, 80, 245, 47, 222, 236, 140, 255, 54, 101, 74, 219, 168, 124, 123, 245, 166, 178, 61, 225, 166, 88, 127, 240, 185, 106, 69, 116, 166, 27, 48, 86, 201, 197, 108, 100, 176, 191, 155, 232, 176, 223, 229, 213, 87, 252, 237, 197, 244, 2, 250, 87, 112, 149, 113, 247, 235, 19, 81, 212, 169, 167, 195, 75, 62, 223, 29, 37, 13, 21, 21, 116, 151, 245, 218, 102, 137, 89, 102, 30, 196, 175, 43, 84, 248, 171, 20, 47, 17, 178, 198, 160, 184, 17, 108, 81, 181, 61, 105, 165, 67, 24, 105, 43, 206, 231, 22, 164, 6, 30, 108, 222, 112, 91, 85, 15, 229, 149, 64, 209, 107, 213, 146, 29, 90, 13, 157, 210, 99, 49, 27, 106, 126, 63, 86, 126, 57, 83, 170, 52, 143, 29, 218, 107, 122, 110, 24, 163, 247, 50, 168, 175, 224, 39, 37, 165, 11, 81, 56, 161, 39, 253, 231, 208, 37, 162, 63, 186, 36, 40, 255, 94, 60, 58, 174, 209, 131, 243, 151, 13, 95, 248, 165, 199, 146, 157, 203, 31, 130, 51, 206, 246, 44, 221, 39, 111, 157, 86, 160, 219, 48, 21, 76, 170, 165, 11, 78, 15, 222, 200, 71, 13, 19, 166, 157, 218, 91, 225, 186, 131, 70, 37, 116, 220, 166, 154, 173, 118, 118, 7, 140, 211, 92, 48, 64, 42, 226, 140, 33, 194, 30, 60, 84, 155, 96, 239, 61, 34, 160, 21, 21, 96, 248, 10, 92, 35, 26, 202, 144, 172, 31, 71, 5, 232, 87, 33, 161, 39, 194, 16, 253, 153, 226, 190, 221, 21, 106, 46, 93, 220, 205, 80, 27, 232, 215, 75, 136, 103, 128, 153, 1, 84, 203, 187, 44, 212, 44, 191, 123, 0, 32, 186, 137, 2, 175, 48, 189, 4, 160, 47, 77, 162, 8, 66, 88, 168, 177, 204, 59, 23, 197, 83, 155, 148, 251, 97, 231, 140, 229, 29, 150, 78, 232, 229, 119, 5, 26, 218, 23, 112, 165, 23, 23, 17, 56, 36, 13, 60, 232, 2, 161, 254, 125, 93, 208, 103, 139, 114, 102, 47, 136, 145, 65, 140, 50, 254, 19, 1, 190, 233, 77, 11, 26, 59, 206, 146, 81, 242, 105, 21, 247, 70, 3, 44, 42, 14, 202, 104, 120, 32, 253, 132, 163, 153, 239, 8, 27, 22, 107, 237, 200, 155, 29, 135, 20, 136, 18, 110, 193, 153, 172, 200, 227, 30, 191, 69, 40, 4, 112, 31, 247, 42, 245, 115, 241, 8, 73, 63, 189, 130, 83, 195, 254, 244, 123, 180, 188, 152, 184, 89, 9, 146, 148, 200, 162, 129, 107, 96, 139, 165, 70, 169, 187, 2, 201, 173, 127, 149, 180, 212, 117, 153, 132, 48, 84, 200, 21, 184, 152, 130, 70, 81, 237, 1, 43, 234, 24, 3, 14, 175, 2, 3, 1, 0, 1, 163, 66, 48, 64, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 245, 119, 22, 106, 5, 164, 212, 20, 189, 219, 248, 148, 106, 80, 114, 38, 40, 63, 193, 184, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 4, 157, 196, 126, 87, 96, 207, 104, 127, 119, 174, 145, 170, 99, 133, 55, 48, 166, 234, 211, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +raw_dsc_actual_length = 890 +dsc_pubkey_offset = 305 +dsc_pubkey_actual_size = 512 +dg1 = [97, 91, 95, 31, 88, 80, 60, 70, 82, 65, 68, 85, 80, 79, 78, 84, 60, 60, 65, 76, 80, 72, 79, 78, 83, 69, 60, 72, 85, 71, 72, 85, 69, 83, 60, 65, 76, 66, 69, 82, 84, 60, 60, 60, 60, 60, 60, 60, 60, 49, 53, 65, 65, 56, 49, 50, 51, 52, 52, 70, 82, 65, 48, 48, 48, 49, 48, 49, 49, 77, 51, 48, 48, 49, 48, 49, 53, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 48, 50] +dg1_hash_offset = 70 +econtent = [82, 215, 93, 217, 28, 204, 16, 239, 13, 56, 40, 89, 39, 173, 193, 208, 248, 114, 98, 163, 43, 167, 201, 160, 146, 134, 135, 160, 84, 187, 192, 214, 94, 236, 195, 45, 70, 4, 79, 86, 51, 226, 182, 70, 128, 99, 61, 75, 40, 5, 82, 5, 65, 133, 150, 204, 255, 61, 191, 113, 12, 48, 214, 0, 0, 0, 0, 0, 0, 0, 155, 69, 163, 24, 248, 167, 161, 54, 179, 18, 174, 196, 232, 60, 51, 198, 140, 219, 196, 229, 145, 248, 154, 203, 178, 114, 17, 33, 54, 80, 127, 173, 0, 0, 0, 0, 0, 0, 0, 14, 139, 118, 24, 144, 18, 24, 54, 15, 247, 52, 152, 128, 111, 155, 92, 125, 169, 232, 1, 177, 159, 246, 136, 206, 165, 56, 214, 209, 161, 93, 131, 0, 0, 0, 0, 0, 0, 0, 161, 38, 236, 81, 73, 228, 168, 240, 75, 34, 246, 218, 220, 54, 159, 97, 0, 43, 137, 63, 212, 14, 96, 60, 133, 150, 64, 197, 187, 22, 204, 119, 0, 0, 0, 0, 0, 0, 0, 118, 246, 89, 8, 172, 21, 8, 22, 28, 230, 253, 167, 45, 27, 16, 137, 205, 39, 154, 196, 156, 9, 83, 208, 229, 6, 71, 80, 43, 95, 103, 112, 0, 0, 0, 0, 0, 0, 0, 72, 25, 64, 46, 108, 99, 202, 58, 117, 71, 111, 30, 111, 143, 175, 229, 49, 39, 2, 125, 112, 87, 225, 112, 181, 165, 22, 208, 14, 57, 180, 89, 0, 0, 0, 0, 0, 0, 0, 114, 3, 108, 42, 29, 32, 4, 166, 109, 28, 54, 82, 1, 26, 68, 187, 27, 6, 236, 200, 150, 84, 164, 254, 220, 244, 56, 145, 182, 115, 60, 81, 0, 0, 0, 0, 0, 0, 0, 249, 123, 232, 211, 60, 49, 78, 85, 63, 19, 255, 72, 165, 85, 153, 131, 31, 246, 200, 122, 60, 240, 182, 17, 103, 74, 253, 211, 216, 243, 138, 171, 0, 0, 0, 0, 0, 0, 0, 128, 157, 7, 119, 37, 17, 199, 246, 72, 171, 62, 251, 131, 240, 124, 233, 117, 124, 71, 218, 114, 174, 182, 243, 136, 209, 122, 202, 142, 178, 47, 239, 128, 0, 0, 0, 0, 0, 0, 11, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +econtent_padded_length = 384 +signed_attr = [49, 102, 48, 21, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 3, 49, 8, 6, 6, 103, 129, 8, 1, 1, 1, 48, 28, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 5, 49, 15, 23, 13, 49, 57, 49, 50, 49, 54, 49, 55, 50, 50, 51, 56, 90, 48, 47, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 4, 49, 34, 4, 32, 254, 147, 143, 229, 209, 93, 203, 250, 146, 64, 81, 190, 179, 35, 170, 104, 52, 253, 58, 9, 12, 87, 197, 155, 66, 69, 75, 92, 51, 91, 244, 14, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +signed_attr_padded_length = 128 +signed_attr_econtent_hash_offset = 72 +signature_passport = [105, 16, 81, 52, 60, 185, 119, 120, 35, 70, 19, 9, 78, 72, 41, 237, 19, 139, 119, 81, 254, 151, 0, 63, 0, 48, 117, 202, 188, 220, 137, 1, 199, 120, 106, 219, 41, 185, 239, 219, 169, 64, 233, 130, 138, 219, 38, 163, 176, 241, 52, 4, 75, 240, 21, 240, 91, 242, 214, 63, 95, 152, 203, 38, 142, 118, 150, 32, 131, 55, 240, 90, 174, 130, 7, 57, 76, 247, 30, 17, 74, 114, 109, 171, 135, 88, 63, 226, 40, 123, 81, 171, 92, 245, 6, 199, 199, 103, 209, 42, 231, 104, 52, 51, 125, 19, 142, 104, 235, 153, 198, 225, 132, 136, 32, 193, 202, 101, 166, 43, 177, 178, 107, 119, 70, 54, 87, 49, 219, 241, 189, 130, 190, 39, 59, 194, 115, 220, 249, 81, 154, 132, 125, 62, 237, 191, 51, 88, 217, 193, 115, 7, 172, 125, 78, 71, 74, 159, 211, 101, 236, 243, 68, 93, 27, 111, 239, 46, 32, 165, 101, 59, 110, 30, 50, 172, 14, 219, 204, 108, 32, 38, 141, 251, 252, 216, 215, 33, 156, 77, 88, 198, 69, 181, 34, 234, 45, 169, 193, 212, 182, 12, 143, 234, 185, 160, 11, 156, 247, 107, 21, 95, 175, 215, 41, 204, 30, 83, 213, 64, 121, 43, 175, 109, 49, 103, 123, 5, 31, 49, 106, 250, 138, 143, 169, 116, 234, 210, 180, 98, 20, 185, 208, 197, 18, 167, 54, 253, 239, 196, 252, 144, 4, 200, 14, 236, 111, 190, 10, 146, 180, 32, 43, 35, 27, 222, 149, 215, 65, 236, 155, 128, 193, 152, 4, 11, 91, 8, 111, 136, 183, 7, 25, 219, 58, 69, 205, 41, 183, 135, 52, 201, 97, 27, 80, 151, 87, 14, 148, 69, 95, 124, 120, 237, 115, 91, 127, 136, 11, 130, 36, 176, 83, 19, 206, 4, 34, 79, 89, 137, 159, 179, 67, 106, 237, 98, 11, 88, 105, 115, 12, 157, 179, 155, 166, 239, 196, 146, 148, 195, 42, 17, 135, 178, 76, 82, 252, 146, 92, 62, 195, 212, 88, 162, 96, 81, 60, 145, 164, 79, 36, 218, 51, 7, 88, 87, 168, 239, 124, 34, 71, 53, 121, 54, 242, 108, 142, 176, 128, 85, 94, 200, 151, 142, 242, 203, 49, 226, 93, 24, 207, 21, 14, 198, 241, 18, 69, 61, 203, 50, 186, 198, 84, 163, 99, 145, 33, 226, 108, 186, 20, 212, 55, 104, 164, 215, 92, 225, 11, 158, 61, 232, 28, 140, 247, 235, 15, 220, 117, 223, 209, 189, 205, 149, 205, 64, 190, 116, 10, 132, 195, 191, 2, 206, 48, 213, 13, 47, 143, 228, 32, 43, 183, 168, 196, 79, 230, 123, 55, 200, 15, 176, 77, 249, 6, 102, 209, 126, 43, 112, 161, 188, 91, 18, 148, 6, 87, 221, 114, 38, 49, 230, 17, 131, 249, 70, 130, 159, 38, 209, 234, 57, 252, 142, 23, 118, 131, 89, 40, 27, 45, 139, 68, 65, 188, 154, 138, 11, 32, 50, 17, 193] +dsc_barrett_mu = [102, 103, 46, 230, 30, 51, 100, 89, 134, 251, 221, 47, 212, 242, 242, 134, 160, 68, 99, 25, 94, 112, 170, 21, 45, 46, 211, 91, 84, 52, 6, 65, 254, 126, 118, 162, 42, 145, 153, 194, 206, 58, 191, 103, 202, 5, 134, 14, 82, 126, 252, 122, 57, 45, 135, 108, 39, 169, 144, 227, 11, 170, 88, 164, 132, 148, 11, 145, 105, 195, 44, 249, 189, 251, 106, 32, 166, 1, 165, 2, 197, 222, 54, 166, 21, 40, 119, 204, 175, 102, 75, 190, 223, 202, 24, 41, 144, 237, 176, 157, 27, 36, 1, 66, 11, 158, 166, 237, 155, 123, 24, 204, 126, 75, 202, 10, 129, 137, 63, 30, 185, 80, 246, 247, 133, 230, 166, 194, 157, 88, 219, 174, 237, 18, 50, 235, 203, 60, 114, 199, 111, 109, 248, 205, 12, 128, 138, 95, 89, 11, 31, 190, 228, 227, 164, 210, 141, 115, 105, 189, 193, 167, 16, 11, 195, 237, 124, 26, 208, 209, 16, 116, 109, 170, 1, 40, 65, 41, 45, 191, 128, 164, 74, 124, 33, 155, 155, 193, 88, 24, 186, 41, 139, 156, 32, 14, 144, 68, 66, 155, 91, 80, 23, 23, 188, 49, 91, 152, 196, 159, 97, 1, 110, 186, 192, 224, 216, 68, 246, 253, 44, 4, 108, 81, 232, 104, 175, 187, 140, 129, 128, 65, 101, 141, 96, 60, 53, 17, 151, 6, 227, 43, 119, 37, 53, 220, 13, 167, 40, 36, 109, 124, 202, 7, 145, 224, 79, 79, 79, 72, 196, 104, 58, 0, 167, 250, 150, 234, 5, 120, 61, 238, 85, 156, 173, 236, 109, 212, 219, 212, 106, 160, 38, 138, 70, 174, 216, 102, 243, 252, 164, 16, 123, 107, 55, 18, 25, 113, 126, 86, 187, 212, 189, 2, 168, 140, 173, 9, 42, 119, 170, 59, 187, 46, 21, 170, 28, 102, 221, 123, 91, 161, 144, 88, 221, 60, 143, 81, 37, 144, 217, 205, 226, 222, 139, 42, 166, 228, 90, 88, 60, 75, 131, 70, 203, 19, 4, 168, 240, 87, 22, 142, 100, 86, 91, 5, 174, 9, 231, 212, 94, 74, 17, 102, 168, 38, 17, 36, 119, 24, 79, 91, 52, 255, 183, 136, 87, 161, 119, 200, 71, 4, 41, 173, 161, 125, 224, 71, 5, 153, 40, 70, 4, 216, 88, 39, 21, 98, 90, 127, 103, 188, 161, 177, 247, 137, 173, 65, 36, 217, 202, 233, 123, 86, 144, 146, 8, 184, 82, 164, 21, 38, 252, 107, 213, 65, 177, 74, 93, 189, 146, 223, 7, 162, 199, 211, 244, 66, 58, 255, 75, 174, 108, 227, 234, 34, 91, 93, 33, 98, 218, 227, 157, 76, 241, 23, 208, 206, 148, 3, 80, 108, 141, 152, 71, 51, 76, 31, 60, 233, 26, 13, 138, 201, 153, 45, 171, 129, 177, 188, 67, 250, 72, 167, 19, 220, 65, 21, 102, 47, 38, 240, 91, 141, 233, 237, 155, 129, 104, 155, 45, 23, 7, 234, 177, 155, 69, 233, 181, 0, 218, 32, 205] +merkle_root = "8048950770293257795621184348033164133320434623462496804361333333092676277328" +leaf_depth = 6 +path = [0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +siblings = ["481787392403338571656555722870122978065125892949434958835001773033712625191", "13274185831698258062222380040619002789261859777320412772656200198102970880660", "5410620983195375911090727814270361454832036795917695206544043001420960637777", "14051265975676700947307684161194350004461344333425480053688928239949267718326", "20387009608350563521735170556423317268483084337333204688511143658578884542027", "18750662081915815314957644349407925351070379442022960205812752721018444618817", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"] +csca_tree_leaf = "18390019689329531194486865663275817993149098196912806933141622083576329149060" +current_date = [2, 6, 0, 7, 2, 3] +minimum_age = [49, 56] diff --git a/benchmarks/v1/noir/passport_p1/canonical-record.json b/benchmarks/v1/noir/passport_p1/canonical-record.json new file mode 100644 index 000000000..671dd5caf --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/canonical-record.json @@ -0,0 +1,19 @@ +{ + "schema_version": 1, + "profile": "P1", + "self_source_revision": "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e", + "registration_fixture": { + "path": "benchmarks/v1/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json", + "sha256": "2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030" + }, + "passport": { + "signature": "rsa_sha256_65537_4096", + "dg1_birth_date_offset": 62, + "dg1_expiry_date_offset": 70 + }, + "public_statement": { + "current_date_yymmdd": "260723", + "minimum_age": "18", + "fixture_id": "self-pack-bytes-and-poseidon-dg1" + } +} diff --git a/benchmarks/v1/noir/passport_p1/generate-fixture.ts b/benchmarks/v1/noir/passport_p1/generate-fixture.ts new file mode 100644 index 000000000..20a4a780f --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/generate-fixture.ts @@ -0,0 +1,85 @@ +import { resolve } from "node:path"; + +const repoRoot = resolve(import.meta.dir, "../../../.."); +const canonicalPath = resolve(repoRoot, "benchmarks/v1/noir/passport_p1/canonical-record.json"); +const circomInputPath = resolve(repoRoot, "benchmarks/v1/circom/fixtures/passport_p1/input.json"); +const outputPath = resolve(import.meta.dir, "Prover.toml"); + +const canonical = await Bun.file(canonicalPath).json() as { + registration_fixture: { sha256: string }; + public_statement: { current_date_yymmdd: string; minimum_age: string }; +}; +const source = await Bun.file(circomInputPath).json() as Record; + +const sha256 = (input: string) => new Bun.CryptoHasher("sha256").update(input).digest("hex"); +const contents = await Bun.file(resolve(repoRoot, "benchmarks/v1/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json")).text(); +if (sha256(contents) !== canonical.registration_fixture.sha256) { + throw new Error("P1 source registration fixture hash drifted from canonical-record.json"); +} + +const numbers = (key: string) => source[key].map((value) => BigInt(value)); +const bytes = (key: string) => numbers(key).map((value) => { + if (value < 0n || value > 255n) throw new Error(`${key} contains a non-byte value`); + return Number(value); +}); +const scalar = (key: string) => { + const values = numbers(key); + if (values.length !== 1) throw new Error(`${key} must be scalar`); + return values[0]; +}; +const int = (key: string) => Number(scalar(key)); +const toTomlArray = (value: readonly (string | number | bigint)[]) => `[${value.join(", ")}]`; +const toTomlFieldArray = (value: readonly bigint[]) => `[${value.map((entry) => `"${entry}"`).join(", ")}]`; +const wordsToBigEndianBytes = (words: bigint[], byteLength: number) => { + let value = 0n; + for (let i = 0; i < words.length; i += 1) value |= words[i] << BigInt(120 * i); + const hex = value.toString(16).padStart(byteLength * 2, "0"); + if (hex.length !== byteLength * 2) throw new Error("Self RSA word array does not fit its declared byte length"); + return [...Buffer.from(hex, "hex")]; +}; + +const dscOffset = int("dsc_pubKey_offset"); +const rawDsc = bytes("raw_dsc"); +const dscKey = rawDsc.slice(dscOffset, dscOffset + 512); +const selfDscKey = wordsToBigEndianBytes(numbers("pubKey_dsc"), 512); +if (Buffer.compare(Buffer.from(dscKey), Buffer.from(selfDscKey)) !== 0) { + throw new Error("Self pubKey_dsc words do not match the DSC modulus extracted from raw_dsc"); +} +const modulus = BigInt(`0x${Buffer.from(dscKey).toString("hex")}`); +const barrettMu = (1n << 8198n) / modulus; // floor(2^(2*4096 + 6) / n), Noir RSA v0.11.0. +const barrettHex = barrettMu.toString(16).padStart(1026, "0"); +const barrettBytes = [...Buffer.from(barrettHex, "hex")]; +if (barrettBytes.length !== 513) throw new Error("P1 Barrett parameter is not 513 bytes"); + +const currentDate = [...canonical.public_statement.current_date_yymmdd].map(Number); +const minAgeAscii = [...canonical.public_statement.minimum_age].map((digit) => digit.charCodeAt(0)); +const path = numbers("path"); +if (path.some((bit) => bit !== 0n && bit !== 1n)) throw new Error("P1 path is not binary"); + +const toml = [ + "# Generated from the P1 canonical record; do not edit by hand.", + `raw_dsc = ${toTomlArray(rawDsc)}`, + `raw_dsc_actual_length = ${int("raw_dsc_actual_length")}`, + `dsc_pubkey_offset = ${dscOffset}`, + `dsc_pubkey_actual_size = ${int("dsc_pubKey_actual_size")}`, + `dg1 = ${toTomlArray(bytes("dg1"))}`, + `dg1_hash_offset = ${int("dg1_hash_offset")}`, + `econtent = ${toTomlArray(bytes("eContent"))}`, + `econtent_padded_length = ${int("eContent_padded_length")}`, + `signed_attr = ${toTomlArray(bytes("signed_attr"))}`, + `signed_attr_padded_length = ${int("signed_attr_padded_length")}`, + `signed_attr_econtent_hash_offset = ${int("signed_attr_econtent_hash_offset")}`, + `signature_passport = ${toTomlArray(wordsToBigEndianBytes(numbers("signature_passport"), 512))}`, + `dsc_barrett_mu = ${toTomlArray(barrettBytes)}`, + `merkle_root = "${scalar("merkle_root")}"`, + `leaf_depth = ${int("leaf_depth")}`, + `path = ${toTomlArray(path)}`, + `siblings = ${toTomlFieldArray(numbers("siblings"))}`, + `csca_tree_leaf = "${scalar("csca_tree_leaf")}"`, + `current_date = ${toTomlArray(currentDate)}`, + `minimum_age = ${toTomlArray(minAgeAscii)}`, + "", +].join("\n"); + +await Bun.write(outputPath, toml); +console.log(`wrote ${outputPath}`); diff --git a/benchmarks/v1/noir/passport_p1/package.json b/benchmarks/v1/noir/passport_p1/package.json new file mode 100644 index 000000000..78c8433bb --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/package.json @@ -0,0 +1,10 @@ +{ + "name": "provekit-v1-passport-p1-noir", + "private": true, + "type": "module", + "scripts": { + "fixture": "bun run generate-fixture.ts", + "test:mutations": "bun run test-mutations.ts", + "smoke:barretenberg-chrome": "bun run web/smoke.ts" + } +} diff --git a/benchmarks/v1/noir/passport_p1/src/main.nr b/benchmarks/v1/noir/passport_p1/src/main.nr new file mode 100644 index 000000000..b8e3ee880 --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/src/main.nr @@ -0,0 +1,355 @@ +// P1 is deliberately isolated from the historical Passport examples. It +// mirrors the P1 Circom profile in benchmarks/v1/circom/passport_p1: +// * 93-byte Self DG1 and the Self fixed SOD buffers; +// * SHA-256 DG1/eContent/signed-attributes integrity; +// * PKCS#1 v1.5 SHA-256, e=65537, 4096-bit DSC verification; +// * the original circomlib Poseidon DSC registry leaf and binary path; +// * YYMMDD expiry and minimum-age checks. +// +// `poseidon::poseidon::bn254` is the original Poseidon implementation. Do +// not replace it with the package's Poseidon2 API: Self's registry is built +// with circomlib Poseidon. +use poseidon::poseidon::bn254::{hash_2, hash_3, hash_4, hash_16}; +use sha256::sha256_var; +use bignum::{params::BigNumParams, RuntimeBigNum}; +use rsa::rsa::verify_sha256_pkcs1v15; +use utils::check_zero_padding; + +global DG1_LEN: u32 = 93; +global RAW_DSC_LEN: u32 = 1792; +global ECONTENT_LEN: u32 = 512; +global SIGNED_ATTR_LEN: u32 = 256; +global DSC_KEY_LEN: u32 = 512; +global DSC_REDC_LEN: u32 = 513; +global TREE_DEPTH: u32 = 21; +global PACK_BYTES: u32 = 31; +global DSC_PUBKEY_PREFIX_LEN: u32 = 33; + +fn assert_decimal_digits(digits: [u8; N]) { + for i in 0..N { + assert(digits[i] <= 9, "P1 public date must contain decimal digits"); + } +} + +fn date_less( + first: [u8; 6], + second: [u8; 6], +) -> bool { + // This is the same lexicographic YY/MM/DD predicate as Self's + // `DateIsLess`, after its ASCII-to-digit conversion. + let first_year = first[0] * 10 + first[1]; + let second_year = second[0] * 10 + second[1]; + let first_month = first[2] * 10 + first[3]; + let second_month = second[2] * 10 + second[3]; + let first_day = first[4] * 10 + first[5]; + let second_day = second[4] * 10 + second[5]; + (first_year < second_year) + | ((first_year == second_year) & (first_month < second_month)) + | ((first_year == second_year) & (first_month == second_month) & (first_day < second_day)) +} + +fn ascii_yymmdd(input: [u8; 6]) -> [u8; 6] { + let mut result = [0; 6]; + for i in 0..6 { + assert(input[i] >= 48, "DG1 YYMMDD digit is below ASCII 0"); + assert(input[i] <= 57, "DG1 YYMMDD digit is above ASCII 9"); + result[i] = input[i] - 48; + } + result +} + +fn assert_valid_and_old_enough(dg1: [u8; DG1_LEN], current_date: [u8; 6], minimum_age_ascii: [u8; 2]) { + assert_decimal_digits(current_date); + assert(minimum_age_ascii[0] >= 48 & minimum_age_ascii[0] <= 57, "minimum age tens must be ASCII decimal"); + assert(minimum_age_ascii[1] >= 48 & minimum_age_ascii[1] <= 57, "minimum age units must be ASCII decimal"); + + let mut dob_ascii = [0; 6]; + let mut expiry_ascii = [0; 6]; + for i in 0..6 { + dob_ascii[i] = dg1[62 + i]; + expiry_ascii[i] = dg1[70 + i]; + } + let dob = ascii_yymmdd(dob_ascii); + let expiry = ascii_yymmdd(expiry_ascii); + + // Self uses a strict comparison: a passport dated today is not valid. + assert(date_less(current_date, expiry), "passport is expired at the public date"); + + let age = (minimum_age_ascii[0] - 48) * 10 + (minimum_age_ascii[1] - 48); + let current_year = current_date[0] * 10 + current_date[1]; + let normalized_current_year = if current_year < dob[0] * 10 + dob[1] { + current_year + 100 + } else { + current_year + }; + let qualifying_birth = [ + dob[0] * 10 + dob[1] + age, + dob[2], + dob[3], + dob[4], + dob[5], + 0, + ]; + let qualifying_current = [ + normalized_current_year, + current_date[2], + current_date[3], + current_date[4], + current_date[5], + 0, + ]; + // Convert the two three-part dates back to six digits to keep the source + // visibly equivalent to Self's `DateIsLess` call. + let birth_plus_age = [ + qualifying_birth[0] / 10, + qualifying_birth[0] % 10, + qualifying_birth[1], + qualifying_birth[2], + qualifying_birth[3], + qualifying_birth[4], + ]; + let today = [ + qualifying_current[0] / 10, + qualifying_current[0] % 10, + qualifying_current[1], + qualifying_current[2], + qualifying_current[3], + qualifying_current[4], + ]; + assert(date_less(birth_plus_age, today), "holder is not older than the public minimum age"); +} + +fn pack_bytes_le(bytes: [u8; N]) -> [Field; CHUNKS] { + let mut packed = [0; CHUNKS]; + for i in 0..CHUNKS { + let mut value: Field = 0; + let mut multiplier: Field = 1; + for j in 0..PACK_BYTES { + let index = i * PACK_BYTES + j; + if index < N { + value += (bytes[index] as Field) * multiplier; + } + multiplier *= 256; + } + packed[i] = value; + } + packed +} + +fn self_custom_hash_3(bytes: [u8; DG1_LEN]) -> Field { + // DG1_LEN / 31 = 3, so Self's CustomHasher takes the direct Poseidon(3) + // branch after little-endian byte packing. + hash_3(pack_bytes_le::(bytes)) +} + +fn self_custom_hash_58(bytes: [u8; RAW_DSC_LEN]) -> Field { + // 1792 bytes produce 58 field chunks. Self hashes four 16-wide chunks, + // zero-pads the final ten inputs, then hashes those four outputs. + let packed = pack_bytes_le::(bytes); + let h0 = hash_16([ + packed[0], packed[1], packed[2], packed[3], packed[4], packed[5], packed[6], packed[7], + packed[8], packed[9], packed[10], packed[11], packed[12], packed[13], packed[14], packed[15], + ]); + let h1 = hash_16([ + packed[16], packed[17], packed[18], packed[19], packed[20], packed[21], packed[22], packed[23], + packed[24], packed[25], packed[26], packed[27], packed[28], packed[29], packed[30], packed[31], + ]); + let h2 = hash_16([ + packed[32], packed[33], packed[34], packed[35], packed[36], packed[37], packed[38], packed[39], + packed[40], packed[41], packed[42], packed[43], packed[44], packed[45], packed[46], packed[47], + ]); + let h3 = hash_16([ + packed[48], packed[49], packed[50], packed[51], packed[52], packed[53], packed[54], packed[55], + packed[56], packed[57], 0, 0, 0, 0, 0, 0, + ]); + hash_4([h0, h1, h2, h3]) +} + +fn self_registry_root( + raw_dsc: [u8; RAW_DSC_LEN], + raw_dsc_actual_length: u32, + csca_tree_leaf: Field, + leaf_depth: u32, + path: [u1; TREE_DEPTH], + siblings: [Field; TREE_DEPTH], +) -> Field { + assert(raw_dsc_actual_length <= RAW_DSC_LEN, "raw DSC length is out of range"); + assert(leaf_depth <= TREE_DEPTH, "Self registry depth is out of range"); + let dsc_hash = self_custom_hash_58(raw_dsc); + let mut current = hash_2([hash_2([dsc_hash, raw_dsc_actual_length as Field]), csca_tree_leaf]); + for i in 0..TREE_DEPTH { + let next = if path[i] == 0 { + hash_2([current, siblings[i]]) + } else { + hash_2([siblings[i], current]) + }; + if i < leaf_depth { + current = next; + } + } + current +} + +fn sha256_padded_block(bytes: [u8; N], start: u32) -> [u32; 16] { + let mut block = [0; 16]; + for i in 0..16 { + let mut word: u32 = 0; + for j in 0..4 { + word = (word << 8) + bytes[start + i * 4 + j] as u32; + } + block[i] = word; + } + block +} + +fn sha256_padded(bytes: [u8; N], padded_length: u32) -> [u8; 32] { + // Self supplies SHA-pre-padded messages. Hashing them with sha256_var + // would add a second padding block and change the signed digest. + assert(padded_length <= N, "SHA padded length is out of range"); + assert(padded_length % 64 == 0, "SHA padded length is not block aligned"); + let mut state: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, + ]; + for i in 0..(N / 64) { + if i * 64 < padded_length { + state = std::hash::sha256_compression(sha256_padded_block(bytes, i * 64), state); + } + } + let mut digest = [0; 32]; + for i in 0..8 { + digest[i * 4] = ((state[i] >> 24) & 0xff) as u8; + digest[i * 4 + 1] = ((state[i] >> 16) & 0xff) as u8; + digest[i * 4 + 2] = ((state[i] >> 8) & 0xff) as u8; + digest[i * 4 + 3] = (state[i] & 0xff) as u8; + } + digest +} + +fn assert_self_rsa_4096_pubkey_prefix(raw_dsc: [u8; RAW_DSC_LEN], dsc_pubkey_offset: u32) { + // CheckPubkeyPosition takes the 33 bytes immediately before the modulus. + // P1 fixes the modulus to 4096 bits, so only Self's RSA prefix entries + // 4, 5, and 6 may match (the last is its Estonia compatibility form). + assert(dsc_pubkey_offset >= DSC_PUBKEY_PREFIX_LEN, "DSC key offset is before its DER prefix"); + let prefix_65537 = [ + 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, + ]; + let prefix_e3 = [ + 0x30, 0x82, 0x02, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x0d, 0x00, 0x30, 0x82, 0x02, 0x08, 0x02, 0x82, 0x02, 0x01, 0x00, + ]; + let prefix_estonia = [ + 0x69, 0x61, 0x30, 0x82, 0x02, 0x20, 0x30, 0x0b, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x03, 0x82, 0x02, + 0x0f, 0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02, 0x01, 0x00, + ]; + let mut matches_65537 = true; + let mut matches_e3 = true; + let mut matches_estonia = true; + for i in 0..DSC_PUBKEY_PREFIX_LEN { + let actual = raw_dsc[dsc_pubkey_offset - DSC_PUBKEY_PREFIX_LEN + i]; + matches_65537 = matches_65537 & (actual == prefix_65537[i]); + matches_e3 = matches_e3 & (actual == prefix_e3[i]); + matches_estonia = matches_estonia & (actual == prefix_estonia[i]); + } + assert( + matches_65537 | matches_e3 | matches_estonia, + "DSC key does not have a Self-compatible RSA-4096 DER prefix", + ); +} + +fn verify_self_rsa_4096( + pubkey_bytes: [u8; DSC_KEY_LEN], + signature: [u8; DSC_KEY_LEN], + redc_param_bytes: [u8; DSC_REDC_LEN], + digest: [u8; 32], +) -> bool { + let modulus = utils::pack_be_bytes_into_u128s::(pubkey_bytes); + let redc_param = utils::pack_be_bytes_into_u128s::(redc_param_bytes); + let params: BigNumParams<35, 4096> = BigNumParams::new(false, modulus, redc_param); + let signature_number: RuntimeBigNum<35, 4096> = RuntimeBigNum::from_be_bytes(params, signature); + verify_sha256_pkcs1v15::<35, 4096>(digest, signature_number, 65537) +} + +fn check_integrity( + dg1: [u8; DG1_LEN], + dg1_hash_offset: u32, + econtent: [u8; ECONTENT_LEN], + econtent_padded_length: u32, + signed_attr: [u8; SIGNED_ATTR_LEN], + signed_attr_padded_length: u32, + signed_attr_econtent_hash_offset: u32, +) { + assert(econtent_padded_length <= ECONTENT_LEN, "eContent length is out of range"); + assert(signed_attr_padded_length <= SIGNED_ATTR_LEN, "signed-attributes length is out of range"); + assert(dg1_hash_offset + 32 <= econtent_padded_length, "DG1 digest offset is out of range"); + assert(signed_attr_econtent_hash_offset + 32 <= signed_attr_padded_length, "eContent digest offset is out of range"); + check_zero_padding(econtent, econtent_padded_length); + check_zero_padding(signed_attr, signed_attr_padded_length); + let dg1_digest = sha256_var(dg1, DG1_LEN); + let econtent_digest = sha256_padded(econtent, econtent_padded_length); + for i in 0..32 { + assert(dg1_digest[i] == econtent[dg1_hash_offset + i], "DG1 SHA-256 is not bound into eContent"); + assert(econtent_digest[i] == signed_attr[signed_attr_econtent_hash_offset + i], "eContent SHA-256 is not bound into signed attributes"); + } +} + +fn main( + raw_dsc: [u8; RAW_DSC_LEN], + raw_dsc_actual_length: u32, + dsc_pubkey_offset: u32, + dsc_pubkey_actual_size: u32, + dg1: [u8; DG1_LEN], + dg1_hash_offset: u32, + econtent: [u8; ECONTENT_LEN], + econtent_padded_length: u32, + signed_attr: [u8; SIGNED_ATTR_LEN], + signed_attr_padded_length: u32, + signed_attr_econtent_hash_offset: u32, + signature_passport: [u8; DSC_KEY_LEN], + dsc_barrett_mu: [u8; DSC_REDC_LEN], + merkle_root: pub Field, + leaf_depth: u32, + path: [u1; TREE_DEPTH], + siblings: [Field; TREE_DEPTH], + csca_tree_leaf: Field, + current_date: pub [u8; 6], + minimum_age: pub [u8; 2], +) -> pub Field { + assert(dsc_pubkey_actual_size == DSC_KEY_LEN, "P1 requires a 4096-bit DSC modulus"); + assert_self_rsa_4096_pubkey_prefix(raw_dsc, dsc_pubkey_offset); + assert(dsc_pubkey_offset + DSC_KEY_LEN <= raw_dsc_actual_length, "DSC key lies outside the raw DSC"); + let mut dsc_pubkey = [0; DSC_KEY_LEN]; + for i in 0..DSC_KEY_LEN { + dsc_pubkey[i] = raw_dsc[dsc_pubkey_offset + i]; + } + + check_integrity( + dg1, + dg1_hash_offset, + econtent, + econtent_padded_length, + signed_attr, + signed_attr_padded_length, + signed_attr_econtent_hash_offset, + ); + assert( + verify_self_rsa_4096( + dsc_pubkey, + signature_passport, + dsc_barrett_mu, + sha256_padded(signed_attr, signed_attr_padded_length), + ), + "DSC RSA-4096 PKCS#1 v1.5 signature is invalid", + ); + assert( + self_registry_root(raw_dsc, raw_dsc_actual_length, csca_tree_leaf, leaf_depth, path, siblings) + == merkle_root, + "Self DSC registry path does not reach the public root", + ); + assert_valid_and_old_enough(dg1, current_date, minimum_age); + self_custom_hash_3(dg1) +} diff --git a/benchmarks/v1/noir/passport_p1/test-mutations.ts b/benchmarks/v1/noir/passport_p1/test-mutations.ts new file mode 100644 index 000000000..86c8bc19c --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/test-mutations.ts @@ -0,0 +1,73 @@ +import { mkdtemp } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +const nargo = process.env.P1_NARGO ?? + "../../../../target/v1-benchmarks/tools/nargo-1.0.0-beta.19-aarch64-apple-darwin/nargo"; +const canonical = await Bun.file("Prover.toml").text(); +const evidence: Array<{ name: string; accepted: boolean; output: string }> = []; + +function replaceArrayEntry(input: string, key: string, index: number, next: string): string { + const pattern = new RegExp(`^${key} = \\[([^\\]]+)\\]$`, "m"); + const match = input.match(pattern); + if (!match) throw new Error(`missing array ${key}`); + const values = match[1].split(",").map((value) => value.trim()); + values[index] = next; + return input.replace(pattern, `${key} = [${values.join(", ")}]`); +} + +function arrayEntry(input: string, key: string, index: number): number { + const pattern = new RegExp(`^${key} = \\[([^\\]]+)\\]$`, "m"); + const match = input.match(pattern); + if (!match) throw new Error(`missing array ${key}`); + const value = Number.parseInt(match[1].split(",")[index]?.trim() ?? "", 10); + if (!Number.isInteger(value)) throw new Error(`missing ${key}[${index}]`); + return value; +} + +function scalar(input: string, key: string): number { + const match = input.match(new RegExp(`^${key} = (\\d+)$`, "m")); + if (!match) throw new Error(`missing scalar ${key}`); + return Number.parseInt(match[1], 10); +} + +const dscPubkeyOffset = scalar(canonical, "dsc_pubkey_offset"); +const derPrefixMutationIndex = dscPubkeyOffset - 33; +const derPrefixByte = arrayEntry(canonical, "raw_dsc", derPrefixMutationIndex); + +const cases = [ + { name: "positive", contents: canonical, expected: true }, + { name: "dg1-byte-mutated", contents: replaceArrayEntry(canonical, "dg1", 0, "98"), expected: false }, + { + name: "registry-root-mutated", + contents: canonical.replace(/^merkle_root = "(\d+)"$/m, (_, root) => `merkle_root = "${BigInt(root) + 1n}"`), + expected: false, + }, + { name: "current-date-expired", contents: replaceArrayEntry(canonical, "current_date", 0, "9"), expected: false }, + { name: "minimum-age-raised", contents: replaceArrayEntry(canonical, "minimum_age", 0, "57"), expected: false }, + { + name: "dsc-der-prefix-mutated", + contents: replaceArrayEntry(canonical, "raw_dsc", derPrefixMutationIndex, String(derPrefixByte ^ 1)), + expected: false, + }, +]; + +const root = await mkdtemp(join(tmpdir(), "passport-p1-mutations-")); +for (const testCase of cases) { + const inputBase = join(root, testCase.name); + await Bun.write(`${inputBase}.toml`, testCase.contents); + const child = Bun.spawnSync([nargo, "execute", `p1-${testCase.name}`, "--prover-name", inputBase, "--silence-warnings"], { + cwd: import.meta.dir, + stdout: "pipe", + stderr: "pipe", + }); + const output = `${new TextDecoder().decode(child.stdout)}${new TextDecoder().decode(child.stderr)}`; + const accepted = child.exitCode === 0; + evidence.push({ name: testCase.name, accepted, output }); + if (accepted !== testCase.expected) { + await Bun.write("target/p1-mutation-evidence.json", JSON.stringify(evidence, null, 2) + "\n"); + throw new Error(`${testCase.name}: expected accepted=${testCase.expected}, got accepted=${accepted}`); + } +} +await Bun.write("target/p1-mutation-evidence.json", JSON.stringify(evidence, null, 2) + "\n"); +console.log("P1 positive and DG1/root/current-date/minimum-age/DER-prefix mutation gates passed"); diff --git a/benchmarks/v1/noir/passport_p1/web/build.sh b/benchmarks/v1/noir/passport_p1/web/build.sh new file mode 100644 index 000000000..63dfda157 --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/web/build.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail +root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)" +web_root="${root}/benchmarks/v1/noir/passport_p1/web" +dist="${web_root}/dist" +barretenberg="${root}/benchmarks/v1/barretenberg" +rm -rf "${dist}" +mkdir -p "${dist}/assets/passport_p1" "${dist}/vendor" +( + cd "${barretenberg}" + bun build "${web_root}/runner.ts" --outdir "${dist}" --target browser --format esm --minify --external '*vendor/bb/index.js' + bun run inputs -- "${root}/benchmarks/v1/noir/passport_p1/Prover.toml" "${dist}/assets/passport_p1/inputs.json" +) +cp "${web_root}/index.html" "${dist}/index.html" +cp -R "${barretenberg}/web/dist/vendor/bb" "${dist}/vendor/bb" +cp "${barretenberg}/node_modules/@noir-lang/acvm_js/web/acvm_js_bg.wasm" "${dist}/acvm_js_bg.wasm" +cp "${barretenberg}/node_modules/@noir-lang/noirc_abi/web/noirc_abi_wasm_bg.wasm" "${dist}/noirc_abi_wasm_bg.wasm" +cp "${root}/benchmarks/v1/noir/passport_p1/target/passport_p1.json" "${dist}/assets/passport_p1/circuit.json" diff --git a/benchmarks/v1/noir/passport_p1/web/index.html b/benchmarks/v1/noir/passport_p1/web/index.html new file mode 100644 index 000000000..6db7b91b2 --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/web/index.html @@ -0,0 +1,3 @@ + +P1 Barretenberg WASM +
P1 Barretenberg runner ready.
diff --git a/benchmarks/v1/noir/passport_p1/web/runner.ts b/benchmarks/v1/noir/passport_p1/web/runner.ts new file mode 100644 index 000000000..9afafc443 --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/web/runner.ts @@ -0,0 +1,66 @@ +type ProofData = { proof: Uint8Array; publicInputs: string[] }; + +async function loadJson(path: string): Promise { + const response = await fetch(path, { cache: "no-store" }); + if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`); + return await response.json() as T; +} + +function durationNs(start: number): number { + return Math.round((performance.now() - start) * 1_000_000); +} + +async function run(warmup: number, iterations: number): Promise { + // Expose the runner before loading the large WASM-backed modules. This lets + // the harness distinguish module initialization from proving failures. + const [{ BackendType, Barretenberg, UltraHonkBackend }, { Noir }] = await Promise.all([ + import("./vendor/bb/index.js"), + import("@noir-lang/noir_js"), + ]); + const [circuit, inputs] = await Promise.all([ + loadJson<{ bytecode: string }>("./assets/passport_p1/circuit.json"), + loadJson>("./assets/passport_p1/inputs.json"), + ]); + const noir = new Noir(circuit); + const api = await Barretenberg.new({ backend: BackendType.Wasm, threads: 1 }); + const backend = new UltraHonkBackend(circuit.bytecode, api); + try { + const witness = (await noir.execute(inputs)).witness; + const canary = await backend.generateProof(witness) as ProofData; + if (!(await backend.verifyProof(canary))) throw new Error("Barretenberg rejected the P1 canary proof"); + const tampered = canary.proof.slice(); + tampered[Math.floor(tampered.byteLength / 2)] ^= 1; + let tamperedProofRejected = false; + try { + tamperedProofRejected = !(await backend.verifyProof({ ...canary, proof: tampered })); + } catch { + tamperedProofRejected = true; + } + if (!tamperedProofRejected) throw new Error("Barretenberg accepted a tampered P1 proof"); + + const samples: Array<{ warmup: boolean; sample_index: number; prove_time_ns: number }> = []; + for (let run = 0; run < warmup + iterations; run += 1) { + const started = performance.now(); + const proof = await backend.generateProof(witness) as ProofData; + if (!(await backend.verifyProof(proof))) throw new Error("Barretenberg rejected a P1 sample proof"); + samples.push({ warmup: run < warmup, sample_index: run < warmup ? run : run - warmup, prove_time_ns: durationNs(started) }); + } + return { + workload: "passport_p1", + backend: "barretenberg_4.2.0-aztecnr-rc.2_wasm_single", + warmup, + iterations, + samples, + proof_size_bytes: canary.proof.byteLength, + public_inputs: canary.publicInputs, + tampered_proof_rejected: tamperedProofRejected, + user_agent: navigator.userAgent, + }; + } finally { + await api.destroy(); + const destroy = (noir as typeof noir & { destroy?: () => Promise | void }).destroy; + if (destroy) await destroy.call(noir); + } +} + +Object.assign(window, { passportP1: { run } }); diff --git a/benchmarks/v1/noir/passport_p1/web/serve.ts b/benchmarks/v1/noir/passport_p1/web/serve.ts new file mode 100644 index 000000000..48c2bc467 --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/web/serve.ts @@ -0,0 +1,15 @@ +const root = new URL("./dist/", import.meta.url); +Bun.serve({ + hostname: "0.0.0.0", + port: 4188, + fetch(request) { + const url = new URL(request.url); + const path = new URL(url.pathname === "/" ? "index.html" : url.pathname.slice(1), root); + return new Response(Bun.file(path), { headers: { + "Content-Type": path.pathname.endsWith(".wasm") ? "application/wasm" : path.pathname.endsWith(".json") ? "application/json" : "text/javascript", + "Cross-Origin-Embedder-Policy": "require-corp", + "Cross-Origin-Opener-Policy": "same-origin", + }}); + }, +}); +console.log("http://0.0.0.0:4188/"); diff --git a/benchmarks/v1/noir/passport_p1/web/smoke.ts b/benchmarks/v1/noir/passport_p1/web/smoke.ts new file mode 100644 index 000000000..8d64d7f8b --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/web/smoke.ts @@ -0,0 +1,83 @@ +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join, resolve, sep } from "node:path"; +import { chromium } from "../../../barretenberg/node_modules/playwright-core/index.mjs"; +import { startRendererRssSampler } from "../../../scripts/browser-process-memory"; + +const root = resolve(import.meta.dir, "dist"); +const mimeTypes: Record = { + ".html": "text/html; charset=utf-8", + ".js": "text/javascript; charset=utf-8", + ".json": "application/json; charset=utf-8", + ".wasm": "application/wasm", +}; +const server = Bun.serve({ + hostname: "127.0.0.1", + port: 4189, + async fetch(request) { + const url = new URL(request.url); + const requested = resolve(root, `.${url.pathname === "/" ? "/index.html" : url.pathname}`); + if (requested !== root && !requested.startsWith(`${root}${sep}`)) return new Response("not found", { status: 404 }); + const file = Bun.file(requested); + if (!(await file.exists())) return new Response("not found", { status: 404 }); + const extension = requested.slice(requested.lastIndexOf(".")); + return new Response(file, { headers: { + "Content-Type": mimeTypes[extension] ?? "application/octet-stream", + "Cross-Origin-Embedder-Policy": "require-corp", + "Cross-Origin-Opener-Policy": "same-origin", + }}); + }, +}); +const executablePath = process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; +const profile = await mkdtemp(join(tmpdir(), "provekit-p1-barretenberg-chrome-")); +const context = await chromium.launchPersistentContext(profile, { + executablePath, + headless: true, + args: ["--enable-precise-memory-info", "--js-flags=--max-old-space-size=32768"], +}); +let sampler: ReturnType | undefined; +const browserDiagnostics: string[] = []; +try { + const page = context.pages()[0] ?? await context.newPage(); + page.on("console", (message) => browserDiagnostics.push(`[console:${message.type()}] ${message.text()}`)); + page.on("pageerror", (error) => browserDiagnostics.push(`[pageerror] ${error.message}`)); + await page.goto(server.url.toString()); + await page.waitForFunction(() => typeof window.passportP1?.run === "function", undefined, { timeout: 60_000 }); + sampler = startRendererRssSampler(profile); + const warmup = Number.parseInt(process.env.MOBENCH_WARMUP ?? "1", 10); + const iterations = Number.parseInt(process.env.MOBENCH_ITERATIONS ?? "5", 10); + const report = await page.evaluate( + ({ warmupCount, iterationCount }) => window.passportP1.run(warmupCount, iterationCount), + { warmupCount: warmup, iterationCount: iterations }, + ); + const processMemory = await sampler.stop(); + sampler = undefined; + const evidence = { + schema_version: 1, + profile: "P1", + browser: { name: "Google Chrome", version: context.browser()?.version() ?? "unknown", headless: true }, + report, + process_memory: processMemory, + }; + await Bun.write(resolve(import.meta.dir, "../target/barretenberg-chrome-evidence.json"), `${JSON.stringify(evidence, null, 2)}\n`); + console.log(JSON.stringify(evidence, null, 2)); +} catch (error) { + const diagnostic = { + schema_version: 1, + profile: "P1", + status: "error", + error: error instanceof Error ? `${error.name}: ${error.message}\n${error.stack ?? ""}` : String(error), + browser_diagnostics: browserDiagnostics, + }; + await Bun.write(resolve(import.meta.dir, "../target/barretenberg-chrome-error.json"), `${JSON.stringify(diagnostic, null, 2)}\n`); + throw error; +} finally { + if (sampler) await sampler.stop(); + await context.close(); + server.stop(true); + await rm(profile, { recursive: true, force: true }); +} + +declare global { + interface Window { passportP1: { run(warmup: number, iterations: number): Promise } } +} diff --git a/benchmarks/v1/noir/passport_p1/web/vendor/bb/index.js b/benchmarks/v1/noir/passport_p1/web/vendor/bb/index.js new file mode 100644 index 000000000..66abbac8e --- /dev/null +++ b/benchmarks/v1/noir/passport_p1/web/vendor/bb/index.js @@ -0,0 +1,2 @@ +// Build-time placeholder: build.sh externalizes this specifier and copies the +// locked Barretenberg browser bundle into web/dist/vendor/bb. diff --git a/benchmarks/v1/noir/webauthn_assertion/Nargo.toml b/benchmarks/v1/noir/webauthn_assertion/Nargo.toml new file mode 100644 index 000000000..ff0875d01 --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/Nargo.toml @@ -0,0 +1,10 @@ +[package] +name = "webauthn_assertion" +type = "bin" +description = "Reproducible ES256 WebAuthn assertion benchmark" +authors = ["World Foundation"] +license = "MIT" +compiler_version = ">=1.0.0" + +[dependencies] +webauthn = { path = "../../../../target/v1-benchmarks/noir-beta19-compat/vendor/webauthn" } diff --git a/benchmarks/v1/noir/webauthn_assertion/Prover.toml b/benchmarks/v1/noir/webauthn_assertion/Prover.toml new file mode 100644 index 000000000..fd588596d --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/Prover.toml @@ -0,0 +1,36 @@ +# Generated by generate-fixture.ts. Do not edit by hand. +# Deterministic candidate: 34. +challenge = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 34] +rp_id_hash = [171, 23, 204, 113, 2, 78, 136, 164, 213, 184, 139, 33, 92, 251, 216, 28, 142, 123, 24, 90, 218, 203, 208, 42, 184, 169, 63, 153, 224, 254, 49, 155] +origin = [104, 116, 116, 112, 115, 58, 47, 47, 98, 101, 110, 99, 104, 109, 97, 114, 107, 46, 112, 114, 111, 118, 101, 107, 105, 116, 46, 100, 101, 118] +required_flags = 5 +public_key_x = [107, 23, 209, 242, 225, 44, 66, 71, 248, 188, 230, 229, 99, 164, 64, 242, 119, 3, 125, 129, 45, 235, 51, 160, 244, 161, 57, 69, 216, 152, 194, 150] +public_key_y = [79, 227, 66, 226, 254, 26, 127, 155, 142, 231, 235, 74, 124, 15, 158, 22, 43, 206, 51, 87, 107, 49, 94, 206, 203, 182, 64, 104, 55, 191, 81, 245] +signature = [143, 27, 191, 17, 211, 136, 32, 241, 190, 42, 245, 249, 84, 0, 32, 42, 172, 237, 154, 253, 215, 133, 70, 248, 130, 189, 235, 206, 24, 194, 10, 211, 78, 110, 144, 64, 132, 11, 178, 74, 28, 100, 179, 24, 32, 189, 136, 20, 157, 1, 43, 247, 146, 252, 110, 239, 151, 136, 97, 165, 37, 243, 210, 68] +challenge_index = "36" +origin_index = "91" +r_point_y = [128, 174, 9, 26, 222, 29, 0, 195, 108, 54, 56, 67, 25, 195, 71, 73, 127, 109, 44, 56, 151, 40, 40, 4, 7, 231, 242, 227, 95, 199, 129, 176] +message_limbs = ["1252077452649690502193323225490403917", "1267537139923359010285294327193846989", "42105"] +public_key_x_limbs = ["18122426420192101155211945327510166", "1090116226591897800739809229101134455", "27415"] +public_key_y_limbs = ["1070654481772680600868973157705273845", "347295549387880961540639289465771563", "20451"] +signature_r_limbs = ["1233717957977232009549638550480358099", "992090260215493225451761667460311724", "36635"] +signature_s_limbs = ["6084055317617493211446355384586820", "748999283580974651119022563496826013", "20078"] +r_point_y_limbs = ["566857267160740168635055578743800240", "47275612004574701209215851393665407", "32942"] +s_g_limbs = ["1299664560779745870154237368174199698", "603827768490310896519923245289230580", "680"] +s_g_slices = [8, 0, 1, 5, 4, 3, 10, 2, 5, 8, 0, 15, 5, 13, 12, 2, 11, 14, 12, 5, 9, 3, 8, 15, 15, 13, 7, 1, 11, 13, 7, 6, 8, 7, 10, 7, 13, 2, 7, 3, 4, 7, 14, 12, 5, 10, 0, 3, 12, 13, 3, 4, 3, 13, 12, 8, 12, 14, 14, 12, 10, 10, 1, 12, 9] +s_g_skew = true +s_g_borrow_low = true +s_g_borrow_mid = true +s_p_limbs = ["1116346107969790039295790316306563537", "91919423734292403700734355799908956", "7044"] +s_p_slices = [8, 0, 13, 12, 2, 0, 8, 13, 9, 15, 13, 1, 14, 5, 7, 0, 6, 13, 2, 9, 1, 11, 10, 1, 13, 9, 1, 1, 15, 2, 4, 13, 1, 2, 14, 6, 11, 8, 0, 0, 14, 6, 9, 0, 1, 13, 1, 13, 4, 6, 8, 4, 9, 5, 4, 6, 9, 8, 15, 3, 8, 0, 0, 14, 8] +s_p_skew = false +s_p_borrow_low = true +s_p_borrow_mid = true + +[client_data_json] +storage = [123, 34, 116, 121, 112, 101, 34, 58, 34, 119, 101, 98, 97, 117, 116, 104, 110, 46, 103, 101, 116, 34, 44, 34, 99, 104, 97, 108, 108, 101, 110, 103, 101, 34, 58, 34, 65, 81, 73, 68, 66, 65, 85, 71, 66, 119, 103, 74, 67, 103, 115, 77, 68, 81, 52, 80, 69, 66, 69, 83, 69, 120, 81, 86, 70, 104, 99, 89, 71, 82, 111, 98, 72, 66, 48, 101, 65, 67, 73, 34, 44, 34, 111, 114, 105, 103, 105, 110, 34, 58, 34, 104, 116, 116, 112, 115, 58, 47, 47, 98, 101, 110, 99, 104, 109, 97, 114, 107, 46, 112, 114, 111, 118, 101, 107, 105, 116, 46, 100, 101, 118, 34, 44, 34, 99, 114, 111, 115, 115, 79, 114, 105, 103, 105, 110, 34, 58, 102, 97, 108, 115, 101, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +len = "143" + +[authenticator_data] +storage = [171, 23, 204, 113, 2, 78, 136, 164, 213, 184, 139, 33, 92, 251, 216, 28, 142, 123, 24, 90, 218, 203, 208, 42, 184, 169, 63, 153, 224, 254, 49, 155, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +len = "37" diff --git a/benchmarks/v1/noir/webauthn_assertion/README.md b/benchmarks/v1/noir/webauthn_assertion/README.md new file mode 100644 index 000000000..ac0977ce1 --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/README.md @@ -0,0 +1,21 @@ +# Noir WebAuthn assertion fixture + +This fixture is the canonical Noir WebAuthn counterpart. It binds the P-256 +credential key, challenge, RP-ID hash, `webauthn.get` ceremony type, expected +origin, and required UP/UV flags. Registration, slot commitments, and +uniqueness are intentionally outside this isolated assertion profile. + +The native campaign uses Noir beta.19 and Barretenberg rs 4.2.0-aztecnr-rc.2; +the ProveKit V1 browser lane uses its separately pinned beta.11 artifact. Keep +these frontends distinct in row provenance. + +Generate the deterministic fixture and run the locked native preparation: + +```bash +bun install --frozen-lockfile +bun run fixture +bash benchmarks/v1/scripts/build-provekit-webauthn.sh +``` + +The closest Circom counterpart is pinned in `sources.lock.json` and is not +statement-equivalent; the CSV retains that warning on every Circom row. diff --git a/benchmarks/v1/noir/webauthn_assertion/bun.lock b/benchmarks/v1/noir/webauthn_assertion/bun.lock new file mode 100644 index 000000000..90be5563b --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/bun.lock @@ -0,0 +1,17 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "provekit-v1-webauthn-fixture", + "dependencies": { + "@noble/curves": "2.2.0", + }, + }, + }, + "packages": { + "@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + } +} diff --git a/benchmarks/v1/noir/webauthn_assertion/generate-fixture.ts b/benchmarks/v1/noir/webauthn_assertion/generate-fixture.ts new file mode 100644 index 000000000..d8be71eaa --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/generate-fixture.ts @@ -0,0 +1,310 @@ +import { p256 } from "@noble/curves/nist.js"; + +const TOML_OUTPUT = new URL("./Prover.toml", import.meta.url); +const JSON_OUTPUT = new URL("./inputs.json", import.meta.url); +const ORIGIN = "https://benchmark.provekit.dev"; +const RP_ID = "benchmark.provekit.dev"; +const CLIENT_DATA_MAX = 256; +const AUTHENTICATOR_DATA_MAX = 64; +const SCALAR_SLICES = 65; +const LIMB_BASE = 1n << 120n; +const LIMB_MASK = LIMB_BASE - 1n; + +function concat(left: Uint8Array, right: Uint8Array): Uint8Array { + const output = new Uint8Array(left.length + right.length); + output.set(left); + output.set(right, left.length); + return output; +} + +async function sha256(value: Uint8Array): Promise { + return new Uint8Array(await crypto.subtle.digest("SHA-256", value)); +} + +function base64url(value: Uint8Array): string { + return Buffer.from(value).toString("base64url"); +} + +function bytesToBigint(value: Uint8Array): bigint { + let output = 0n; + for (const byte of value) output = (output << 8n) | BigInt(byte); + return output; +} + +function bigintToBytes(value: bigint): Uint8Array { + const output = new Uint8Array(32); + let remaining = value; + for (let index = output.length - 1; index >= 0; index -= 1) { + output[index] = Number(remaining & 0xffn); + remaining >>= 8n; + } + if (remaining !== 0n) throw new Error("P-256 value does not fit in 32 bytes"); + return output; +} + +function limbs(value: bigint): [string, string, string] { + return [ + String(value & LIMB_MASK), + String((value >> 120n) & LIMB_MASK), + String(value >> 240n), + ]; +} + +function foldSignedSlices(values: readonly number[]): bigint { + return values.reduce((accumulator, value) => accumulator * 16n + BigInt(value * 2 - 15), 0n); +} + +function scalarWitness(value: bigint) { + const skew = (value & 1n) === 0n; + let remaining = value + (skew ? 1n : 0n); + const littleEndianSlices: number[] = []; + + for (let index = 0; index < SCALAR_SLICES; index += 1) { + let digit = Number(remaining & 0xfn); + let next = (remaining - BigInt(digit)) >> 4n; + if (index < SCALAR_SLICES - 1 && (next & 1n) === 0n) { + digit -= 16; + next += 1n; + } + const slice = (digit + 15) / 2; + if (!Number.isInteger(slice) || slice < 0 || slice > 15) { + throw new Error("failed to encode signed radix-16 scalar"); + } + littleEndianSlices.push(slice); + remaining = next; + } + if (remaining !== 0n) throw new Error("signed radix-16 scalar overflow"); + + const slices = littleEndianSlices.reverse(); + const [lowLimb, midLimb, highLimb] = limbs(value).map(BigInt); + const high = foldSignedSlices(slices.slice(0, 5)); + const mid = foldSignedSlices(slices.slice(5, 35)); + const low = foldSignedSlices(slices.slice(35)); + const borrowMid = high - highLimb; + const borrowLow = mid + borrowMid * LIMB_BASE - midLimb; + + if (![borrowLow, borrowMid].every((borrow) => borrow === 0n || borrow === 1n)) { + throw new Error("signed radix-16 borrow is not boolean"); + } + if (low + borrowLow * LIMB_BASE !== lowLimb + (skew ? 1n : 0n)) { + throw new Error("signed radix-16 limbs do not reconstruct the scalar"); + } + + return { + limbs: limbs(value), + slices, + skew, + borrowLow: borrowLow === 1n, + borrowMid: borrowMid === 1n, + }; +} + +const BIGCURVE_MODULUS_SLICES = [ + 8, 1, 8, 3, 2, 2, 7, 3, 9, 7, 0, 9, 8, 13, 0, 1, 4, 13, 12, 2, 8, 2, 2, 13, 11, 4, 0, + 12, 0, 10, 12, 2, 14, 9, 4, 1, 9, 15, 4, 2, 4, 3, 12, 13, 12, 11, 8, 4, 8, 10, 1, 15, 0, + 15, 10, 12, 9, 15, 8, 0, 0, 0, 0, 0, 0, +] as const; + +function acceptedByVendoredBigcurve(slices: readonly number[]): boolean { + for (let index = 0; index < BIGCURVE_MODULUS_SLICES.length; index += 1) { + if (slices[index] < BIGCURVE_MODULUS_SLICES[index]) return true; + if (slices[index] > BIGCURVE_MODULUS_SLICES[index]) return false; + } + return true; +} + +function quoteStrings(values: readonly string[]): string { + return `[${values.map((value) => JSON.stringify(value)).join(", ")}]`; +} + +function numbers(values: Uint8Array | readonly number[]): string { + return `[${Array.from(values).join(", ")}]`; +} + +function pad(values: Uint8Array, length: number): Uint8Array { + if (values.length > length) throw new Error(`fixture length ${values.length} exceeds ${length}`); + const output = new Uint8Array(length); + output.set(values); + return output; +} + +const privateKey = new Uint8Array(32); +privateKey[31] = 1; +const publicKey = p256.getPublicKey(privateKey, false); +const publicKeyX = publicKey.slice(1, 33); +const publicKeyY = publicKey.slice(33); +async function makeCandidate(attempt: number) { + const challenge = Uint8Array.from({ length: 32 }, (_, index) => index + 1); + challenge[30] = attempt >> 8; + challenge[31] = attempt & 0xff; + const clientDataJson = new TextEncoder().encode( + JSON.stringify({ + type: "webauthn.get", + challenge: base64url(challenge), + origin: ORIGIN, + crossOrigin: false, + }), + ); + const rpIdHash = await sha256(new TextEncoder().encode(RP_ID)); + const authenticatorData = new Uint8Array(37); + authenticatorData.set(rpIdHash); + authenticatorData[32] = 0x05; + const clientDataHash = await sha256(clientDataJson); + const signedBytes = concat(authenticatorData, clientDataHash); + const messageDigest = await sha256(signedBytes); + const signature = p256.sign(signedBytes, privateKey); + const r = bytesToBigint(signature.slice(0, 32)); + const s = bytesToBigint(signature.slice(32)); + const message = bytesToBigint(messageDigest); + const scalarField = p256.Point.Fn; + const inverseS = scalarField.inv(s); + const sGValue = scalarField.mul(scalarField.create(message), inverseS); + const sPValue = scalarField.mul(r, inverseS); + const sG = scalarWitness(sGValue); + const sP = scalarWitness(sPValue); + return { + attempt, + authenticatorData, + challenge, + clientDataJson, + message, + publicKeyX, + publicKeyY, + r, + rpIdHash, + s, + sG, + sGValue, + signature, + sP, + sPValue, + }; +} + +let candidate = await makeCandidate(0); +while ( + (!acceptedByVendoredBigcurve(candidate.sG.slices) || + !acceptedByVendoredBigcurve(candidate.sP.slices)) && + candidate.attempt < 65_535 +) { + candidate = await makeCandidate(candidate.attempt + 1); +} +if ( + !acceptedByVendoredBigcurve(candidate.sG.slices) || + !acceptedByVendoredBigcurve(candidate.sP.slices) +) { + throw new Error("could not find a deterministic assertion accepted by vendored BigCurve"); +} + +const { + attempt, + authenticatorData, + challenge, + clientDataJson, + message, + r, + rpIdHash, + s, + sG, + signature, + sP, +} = candidate; +const clientDataText = new TextDecoder().decode(clientDataJson); +const challengeIndex = clientDataText.indexOf(base64url(challenge)); +const originIndex = clientDataText.indexOf(ORIGIN); +if (challengeIndex < 0 || originIndex < 0) throw new Error("fixture fields are absent from clientDataJSON"); + +const scalarField = p256.Point.Fn; +const inverseS = scalarField.inv(s); +const sGValue = scalarField.mul(scalarField.create(message), inverseS); +const sPValue = scalarField.mul(r, inverseS); +const rPoint = p256.Point.BASE.multiply(sGValue).add(p256.Point.fromAffine({ + x: bytesToBigint(publicKeyX), + y: bytesToBigint(publicKeyY), +}).multiply(sPValue)); +const affineR = rPoint.toAffine(); +if (affineR.x !== r) throw new Error("fixture does not satisfy the circuit's direct R.x check"); + +const rPointY = bigintToBytes(affineR.y); +const lines = [ + "# Generated by generate-fixture.ts. Do not edit by hand.", + `# Deterministic candidate: ${attempt}.`, + `challenge = ${numbers(challenge)}`, + `rp_id_hash = ${numbers(rpIdHash)}`, + `origin = ${numbers(new TextEncoder().encode(ORIGIN))}`, + "required_flags = 5", + `public_key_x = ${numbers(publicKeyX)}`, + `public_key_y = ${numbers(publicKeyY)}`, + `signature = ${numbers(signature)}`, + `challenge_index = ${JSON.stringify(String(challengeIndex))}`, + `origin_index = ${JSON.stringify(String(originIndex))}`, + `r_point_y = ${numbers(rPointY)}`, + `message_limbs = ${quoteStrings(limbs(message))}`, + `public_key_x_limbs = ${quoteStrings(limbs(bytesToBigint(publicKeyX)))}`, + `public_key_y_limbs = ${quoteStrings(limbs(bytesToBigint(publicKeyY)))}`, + `signature_r_limbs = ${quoteStrings(limbs(r))}`, + `signature_s_limbs = ${quoteStrings(limbs(s))}`, + `r_point_y_limbs = ${quoteStrings(limbs(affineR.y))}`, + `s_g_limbs = ${quoteStrings(sG.limbs)}`, + `s_g_slices = ${numbers(sG.slices)}`, + `s_g_skew = ${sG.skew}`, + `s_g_borrow_low = ${sG.borrowLow}`, + `s_g_borrow_mid = ${sG.borrowMid}`, + `s_p_limbs = ${quoteStrings(sP.limbs)}`, + `s_p_slices = ${numbers(sP.slices)}`, + `s_p_skew = ${sP.skew}`, + `s_p_borrow_low = ${sP.borrowLow}`, + `s_p_borrow_mid = ${sP.borrowMid}`, + "", + "[client_data_json]", + `storage = ${numbers(pad(clientDataJson, CLIENT_DATA_MAX))}`, + `len = ${JSON.stringify(String(clientDataJson.length))}`, + "", + "[authenticator_data]", + `storage = ${numbers(pad(authenticatorData, AUTHENTICATOR_DATA_MAX))}`, + `len = ${JSON.stringify(String(authenticatorData.length))}`, + "", +]; + +const inputs = { + challenge: Array.from(challenge), + rp_id_hash: Array.from(rpIdHash), + origin: Array.from(new TextEncoder().encode(ORIGIN)), + required_flags: "5", + public_key_x: Array.from(publicKeyX), + public_key_y: Array.from(publicKeyY), + signature: Array.from(signature), + client_data_json: { + storage: Array.from(pad(clientDataJson, CLIENT_DATA_MAX)), + len: String(clientDataJson.length), + }, + authenticator_data: { + storage: Array.from(pad(authenticatorData, AUTHENTICATOR_DATA_MAX)), + len: String(authenticatorData.length), + }, + challenge_index: String(challengeIndex), + origin_index: String(originIndex), + r_point_y: Array.from(rPointY), + message_limbs: limbs(message), + public_key_x_limbs: limbs(bytesToBigint(publicKeyX)), + public_key_y_limbs: limbs(bytesToBigint(publicKeyY)), + signature_r_limbs: limbs(r), + signature_s_limbs: limbs(s), + r_point_y_limbs: limbs(affineR.y), + s_g_limbs: sG.limbs, + s_g_slices: sG.slices, + s_g_skew: sG.skew, + s_g_borrow_low: sG.borrowLow, + s_g_borrow_mid: sG.borrowMid, + s_p_limbs: sP.limbs, + s_p_slices: sP.slices, + s_p_skew: sP.skew, + s_p_borrow_low: sP.borrowLow, + s_p_borrow_mid: sP.borrowMid, +}; + +await Promise.all([ + Bun.write(TOML_OUTPUT, lines.join("\n")), + Bun.write(JSON_OUTPUT, `${JSON.stringify(inputs, null, 2)}\n`), +]); +console.log(`wrote deterministic WebAuthn fixtures to ${TOML_OUTPUT.pathname} and ${JSON_OUTPUT.pathname}`); diff --git a/benchmarks/v1/noir/webauthn_assertion/inputs.json b/benchmarks/v1/noir/webauthn_assertion/inputs.json new file mode 100644 index 000000000..b5abc2238 --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/inputs.json @@ -0,0 +1,783 @@ +{ + "challenge": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 0, + 34 + ], + "rp_id_hash": [ + 171, + 23, + 204, + 113, + 2, + 78, + 136, + 164, + 213, + 184, + 139, + 33, + 92, + 251, + 216, + 28, + 142, + 123, + 24, + 90, + 218, + 203, + 208, + 42, + 184, + 169, + 63, + 153, + 224, + 254, + 49, + 155 + ], + "origin": [ + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 46, + 112, + 114, + 111, + 118, + 101, + 107, + 105, + 116, + 46, + 100, + 101, + 118 + ], + "required_flags": "5", + "public_key_x": [ + 107, + 23, + 209, + 242, + 225, + 44, + 66, + 71, + 248, + 188, + 230, + 229, + 99, + 164, + 64, + 242, + 119, + 3, + 125, + 129, + 45, + 235, + 51, + 160, + 244, + 161, + 57, + 69, + 216, + 152, + 194, + 150 + ], + "public_key_y": [ + 79, + 227, + 66, + 226, + 254, + 26, + 127, + 155, + 142, + 231, + 235, + 74, + 124, + 15, + 158, + 22, + 43, + 206, + 51, + 87, + 107, + 49, + 94, + 206, + 203, + 182, + 64, + 104, + 55, + 191, + 81, + 245 + ], + "signature": [ + 143, + 27, + 191, + 17, + 211, + 136, + 32, + 241, + 190, + 42, + 245, + 249, + 84, + 0, + 32, + 42, + 172, + 237, + 154, + 253, + 215, + 133, + 70, + 248, + 130, + 189, + 235, + 206, + 24, + 194, + 10, + 211, + 78, + 110, + 144, + 64, + 132, + 11, + 178, + 74, + 28, + 100, + 179, + 24, + 32, + 189, + 136, + 20, + 157, + 1, + 43, + 247, + 146, + 252, + 110, + 239, + 151, + 136, + 97, + 165, + 37, + 243, + 210, + 68 + ], + "client_data_json": { + "storage": [ + 123, + 34, + 116, + 121, + 112, + 101, + 34, + 58, + 34, + 119, + 101, + 98, + 97, + 117, + 116, + 104, + 110, + 46, + 103, + 101, + 116, + 34, + 44, + 34, + 99, + 104, + 97, + 108, + 108, + 101, + 110, + 103, + 101, + 34, + 58, + 34, + 65, + 81, + 73, + 68, + 66, + 65, + 85, + 71, + 66, + 119, + 103, + 74, + 67, + 103, + 115, + 77, + 68, + 81, + 52, + 80, + 69, + 66, + 69, + 83, + 69, + 120, + 81, + 86, + 70, + 104, + 99, + 89, + 71, + 82, + 111, + 98, + 72, + 66, + 48, + 101, + 65, + 67, + 73, + 34, + 44, + 34, + 111, + 114, + 105, + 103, + 105, + 110, + 34, + 58, + 34, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 46, + 112, + 114, + 111, + 118, + 101, + 107, + 105, + 116, + 46, + 100, + 101, + 118, + 34, + 44, + 34, + 99, + 114, + 111, + 115, + 115, + 79, + 114, + 105, + 103, + 105, + 110, + 34, + 58, + 102, + 97, + 108, + 115, + 101, + 125, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "len": "143" + }, + "authenticator_data": { + "storage": [ + 171, + 23, + 204, + 113, + 2, + 78, + 136, + 164, + 213, + 184, + 139, + 33, + 92, + 251, + 216, + 28, + 142, + 123, + 24, + 90, + 218, + 203, + 208, + 42, + 184, + 169, + 63, + 153, + 224, + 254, + 49, + 155, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "len": "37" + }, + "challenge_index": "36", + "origin_index": "91", + "r_point_y": [ + 128, + 174, + 9, + 26, + 222, + 29, + 0, + 195, + 108, + 54, + 56, + 67, + 25, + 195, + 71, + 73, + 127, + 109, + 44, + 56, + 151, + 40, + 40, + 4, + 7, + 231, + 242, + 227, + 95, + 199, + 129, + 176 + ], + "message_limbs": [ + "1252077452649690502193323225490403917", + "1267537139923359010285294327193846989", + "42105" + ], + "public_key_x_limbs": [ + "18122426420192101155211945327510166", + "1090116226591897800739809229101134455", + "27415" + ], + "public_key_y_limbs": [ + "1070654481772680600868973157705273845", + "347295549387880961540639289465771563", + "20451" + ], + "signature_r_limbs": [ + "1233717957977232009549638550480358099", + "992090260215493225451761667460311724", + "36635" + ], + "signature_s_limbs": [ + "6084055317617493211446355384586820", + "748999283580974651119022563496826013", + "20078" + ], + "r_point_y_limbs": [ + "566857267160740168635055578743800240", + "47275612004574701209215851393665407", + "32942" + ], + "s_g_limbs": [ + "1299664560779745870154237368174199698", + "603827768490310896519923245289230580", + "680" + ], + "s_g_slices": [ + 8, + 0, + 1, + 5, + 4, + 3, + 10, + 2, + 5, + 8, + 0, + 15, + 5, + 13, + 12, + 2, + 11, + 14, + 12, + 5, + 9, + 3, + 8, + 15, + 15, + 13, + 7, + 1, + 11, + 13, + 7, + 6, + 8, + 7, + 10, + 7, + 13, + 2, + 7, + 3, + 4, + 7, + 14, + 12, + 5, + 10, + 0, + 3, + 12, + 13, + 3, + 4, + 3, + 13, + 12, + 8, + 12, + 14, + 14, + 12, + 10, + 10, + 1, + 12, + 9 + ], + "s_g_skew": true, + "s_g_borrow_low": true, + "s_g_borrow_mid": true, + "s_p_limbs": [ + "1116346107969790039295790316306563537", + "91919423734292403700734355799908956", + "7044" + ], + "s_p_slices": [ + 8, + 0, + 13, + 12, + 2, + 0, + 8, + 13, + 9, + 15, + 13, + 1, + 14, + 5, + 7, + 0, + 6, + 13, + 2, + 9, + 1, + 11, + 10, + 1, + 13, + 9, + 1, + 1, + 15, + 2, + 4, + 13, + 1, + 2, + 14, + 6, + 11, + 8, + 0, + 0, + 14, + 6, + 9, + 0, + 1, + 13, + 1, + 13, + 4, + 6, + 8, + 4, + 9, + 5, + 4, + 6, + 9, + 8, + 15, + 3, + 8, + 0, + 0, + 14, + 8 + ], + "s_p_skew": false, + "s_p_borrow_low": true, + "s_p_borrow_mid": true +} diff --git a/benchmarks/v1/noir/webauthn_assertion/package.json b/benchmarks/v1/noir/webauthn_assertion/package.json new file mode 100644 index 000000000..ef35d3534 --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/package.json @@ -0,0 +1,11 @@ +{ + "name": "provekit-v1-webauthn-fixture", + "private": true, + "type": "module", + "scripts": { + "fixture": "bun run generate-fixture.ts" + }, + "dependencies": { + "@noble/curves": "2.2.0" + } +} diff --git a/benchmarks/v1/noir/webauthn_assertion/src/main.nr b/benchmarks/v1/noir/webauthn_assertion/src/main.nr new file mode 100644 index 000000000..5da19faa7 --- /dev/null +++ b/benchmarks/v1/noir/webauthn_assertion/src/main.nr @@ -0,0 +1,81 @@ +global CLIENT_DATA_JSON_MAX_LEN: u32 = 256; +global AUTHENTICATOR_DATA_MAX_LEN: u32 = 64; +global P256_LIMBS: u32 = 3; +global P256_SCALAR_SLICES: u32 = 65; +global ORIGIN_LEN: u32 = 30; +global WEBAUTHN_GET: [u8; 12] = [ + 119, 101, 98, 97, 117, 116, 104, 110, 46, 103, 101, 116, +]; + +pub fn main( + challenge: pub [u8; 32], + rp_id_hash: pub [u8; 32], + origin: pub [u8; ORIGIN_LEN], + required_flags: pub u8, + public_key_x: pub [u8; 32], + public_key_y: pub [u8; 32], + signature: [u8; 64], + client_data_json: BoundedVec, + authenticator_data: BoundedVec, + challenge_index: u32, + origin_index: u32, + r_point_y: [u8; 32], + message_limbs: [u128; P256_LIMBS], + public_key_x_limbs: [u128; P256_LIMBS], + public_key_y_limbs: [u128; P256_LIMBS], + signature_r_limbs: [u128; P256_LIMBS], + signature_s_limbs: [u128; P256_LIMBS], + r_point_y_limbs: [u128; P256_LIMBS], + s_g_limbs: [u128; P256_LIMBS], + s_g_slices: [u8; P256_SCALAR_SLICES], + s_g_skew: bool, + s_g_borrow_low: bool, + s_g_borrow_mid: bool, + s_p_limbs: [u128; P256_LIMBS], + s_p_slices: [u8; P256_SCALAR_SLICES], + s_p_skew: bool, + s_p_borrow_low: bool, + s_p_borrow_mid: bool, +) { + assert(authenticator_data.len() >= 37); + assert(client_data_json.len() >= origin_index + ORIGIN_LEN); + + for i in 0..32 { + assert(authenticator_data.storage()[i] == rp_id_hash[i]); + } + assert((authenticator_data.storage()[32] & required_flags) == required_flags); + + for i in 0..WEBAUTHN_GET.len() { + assert(client_data_json.storage()[9 + i] == WEBAUTHN_GET[i]); + } + for i in 0..ORIGIN_LEN { + assert(client_data_json.storage()[origin_index + i] == origin[i]); + } + + assert(webauthn::verify_signature( + public_key_x, + public_key_y, + signature, + client_data_json, + authenticator_data, + challenge, + challenge_index, + r_point_y, + message_limbs, + public_key_x_limbs, + public_key_y_limbs, + signature_r_limbs, + signature_s_limbs, + r_point_y_limbs, + s_g_limbs, + s_g_slices, + s_g_skew, + s_g_borrow_low, + s_g_borrow_mid, + s_p_limbs, + s_p_slices, + s_p_skew, + s_p_borrow_low, + s_p_borrow_mid, + )); +} diff --git a/benchmarks/v1/rapidsnark/mobench-ios-scaffold/Cargo.lock b/benchmarks/v1/rapidsnark/mobench-ios-scaffold/Cargo.lock new file mode 100644 index 000000000..025a95d97 --- /dev/null +++ b/benchmarks/v1/rapidsnark/mobench-ios-scaffold/Cargo.lock @@ -0,0 +1,354 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror", + "toml", + "wasm-bindgen", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-mobench-ios-scaffold" +version = "0.1.0" +dependencies = [ + "anyhow", + "mobench-sdk", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/rapidsnark/mobench-ios-scaffold/Cargo.toml b/benchmarks/v1/rapidsnark/mobench-ios-scaffold/Cargo.toml new file mode 100644 index 000000000..a7e1ade7c --- /dev/null +++ b/benchmarks/v1/rapidsnark/mobench-ios-scaffold/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "provekit-v1-mobench-ios-scaffold" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" + +[dependencies] +anyhow = "1" +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" } + +[workspace] diff --git a/benchmarks/v1/rapidsnark/mobench-ios-scaffold/src/main.rs b/benchmarks/v1/rapidsnark/mobench-ios-scaffold/src/main.rs new file mode 100644 index 000000000..7b82bcc99 --- /dev/null +++ b/benchmarks/v1/rapidsnark/mobench-ios-scaffold/src/main.rs @@ -0,0 +1,45 @@ +use { + anyhow::{ensure, Context, Result}, + mobench_sdk::{ + codegen::{ + generate_ios_project_with_backend_options, IosDeploymentTarget, IosProjectOptions, + IosRunner, + }, + FfiBackend, + }, + std::{env, path::PathBuf}, +}; + +fn main() -> Result<()> { + let mut arguments = env::args_os().skip(1); + let output = PathBuf::from(arguments.next().context("missing output directory")?); + let library_name = arguments + .next() + .context("missing library name")? + .into_string() + .map_err(|_| anyhow::anyhow!("library name is not UTF-8"))?; + let default_function = arguments + .next() + .context("missing default benchmark function")? + .into_string() + .map_err(|_| anyhow::anyhow!("default benchmark function is not UTF-8"))?; + ensure!( + arguments.next().is_none(), + "usage: provekit-v1-mobench-ios-scaffold OUTPUT LIBRARY_NAME DEFAULT_FUNCTION" + ); + + generate_ios_project_with_backend_options( + &output, + &library_name, + "BenchRunner", + "dev.world.provekitv1rapidsnarkoprf", + &default_function, + FfiBackend::NativeCAbi, + IosProjectOptions { + deployment_target: IosDeploymentTarget::parse("15.0")?, + runner: IosRunner::Swiftui, + ios_benchmark_timeout_secs: 7_200, + }, + ) + .context("generate pinned Mobench iOS native-C-ABI scaffold") +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-ios-low-memory.patch b/benchmarks/v1/rapidsnark/rapidsnark-ios-low-memory.patch new file mode 100644 index 000000000..cf013dcb9 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-ios-low-memory.patch @@ -0,0 +1,333 @@ +diff --git a/src/groth16.cpp b/src/groth16.cpp +index a4acc14..bc34ac7 100644 +--- a/src/groth16.cpp ++++ b/src/groth16.cpp +@@ -4,9 +4,48 @@ + #include + #include + #include ++#include ++#include ++#include ++ ++#if defined(__APPLE__) && defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) ++#include ++#include ++#include ++#endif + + namespace Groth16 { + ++#if defined(__APPLE__) && defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) ++static void logPhaseMemory(const char *phase) { ++ mach_task_basic_info_data_t info; ++ mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; ++ if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, ++ reinterpret_cast(&info), &count) == KERN_SUCCESS) { ++ std::fprintf(stderr, ++ "RAPIDSNARK_PHASE_MEMORY phase=%s resident_bytes=%llu\n", ++ phase, ++ static_cast(info.resident_size)); ++ } ++} ++ ++static void reclaimReadOnlyPages(const void *address, size_t length) { ++ const long pageSize = sysconf(_SC_PAGESIZE); ++ if (!address || length == 0 || pageSize <= 0) return; ++ ++ const uintptr_t begin = reinterpret_cast(address); ++ const uintptr_t page = static_cast(pageSize); ++ const uintptr_t alignedBegin = (begin + page - 1) & ~(page - 1); ++ const uintptr_t alignedEnd = (begin + length) & ~(page - 1); ++ if (alignedEnd > alignedBegin) { ++ munmap(reinterpret_cast(alignedBegin), alignedEnd - alignedBegin); ++ } ++} ++#else ++static void logPhaseMemory(const char *) {} ++static void reclaimReadOnlyPages(const void *, size_t) {} ++#endif ++ + template + std::unique_ptr> makeProver( + u_int32_t nVars, +@@ -23,7 +62,8 @@ std::unique_ptr> makeProver( + void *pointsB1, + void *pointsB2, + void *pointsC, +- void *pointsH ++ void *pointsH, ++ bool reclaimZkeyPages + ) { + Prover *p = new Prover( + Engine::engine, +@@ -41,7 +81,8 @@ std::unique_ptr> makeProver( + (typename Engine::G1PointAffine *)pointsB1, + (typename Engine::G2PointAffine *)pointsB2, + (typename Engine::G1PointAffine *)pointsC, +- (typename Engine::G1PointAffine *)pointsH ++ (typename Engine::G1PointAffine *)pointsH, ++ reclaimZkeyPages + ); + return std::unique_ptr< Prover >(p); + } +@@ -50,35 +91,8 @@ template + std::unique_ptr> Prover::prove(typename Engine::FrElement *wtns) { + + ThreadPool &threadPool = ThreadPool::defaultPool(); +- +- LOG_TRACE("Start Multiexp A"); + uint32_t sW = sizeof(wtns[0]); +- typename Engine::G1Point pi_a; +- E.g1.multiMulByScalarMSM(pi_a, pointsA, (uint8_t *)wtns, sW, nVars); +- std::ostringstream ss2; +- ss2 << "pi_a: " << E.g1.toString(pi_a); +- LOG_DEBUG(ss2); +- +- LOG_TRACE("Start Multiexp B1"); +- typename Engine::G1Point pib1; +- E.g1.multiMulByScalarMSM(pib1, pointsB1, (uint8_t *)wtns, sW, nVars); +- std::ostringstream ss3; +- ss3 << "pib1: " << E.g1.toString(pib1); +- LOG_DEBUG(ss3); +- +- LOG_TRACE("Start Multiexp B2"); +- typename Engine::G2Point pi_b; +- E.g2.multiMulByScalarMSM(pi_b, pointsB2, (uint8_t *)wtns, sW, nVars); +- std::ostringstream ss4; +- ss4 << "pi_b: " << E.g2.toString(pi_b); +- LOG_DEBUG(ss4); +- +- LOG_TRACE("Start Multiexp C"); +- typename Engine::G1Point pi_c; +- E.g1.multiMulByScalarMSM(pi_c, pointsC, (uint8_t *)((uint64_t)wtns + (nPublic +1)*sW), sW, nVars-nPublic-1); +- std::ostringstream ss5; +- ss5 << "pi_c: " << E.g1.toString(pi_c); +- LOG_DEBUG(ss5); ++ logPhaseMemory("start"); + + LOG_TRACE("Start Initializing a b c A"); + auto a = new typename Engine::FrElement[domainSize]; +@@ -117,6 +131,12 @@ std::unique_ptr> Prover::prove(typename Engine::FrElement + ); + } + }); ++ if (reclaimZkeyPages) { ++ reclaimReadOnlyPages( ++ reinterpret_cast(coefs) - sizeof(u_int32_t), ++ sizeof(u_int32_t) + nCoefs * sizeof(Coef)); ++ } ++ logPhaseMemory("qap_coefficients"); + LOG_TRACE("Calculating c"); + threadPool.parallelFor(0, domainSize, [&] (int64_t begin, int64_t end, uint64_t idThread) { + for (u_int64_t i=begin; i> Prover::prove(typename Engine::FrElement + }); + + LOG_TRACE("Initializing fft"); ++ std::unique_ptr> fft( ++ new FFT(domainSize*2)); + u_int32_t domainPower = fft->log2(domainSize); + + LOG_TRACE("Start iFFT A"); +@@ -206,10 +228,63 @@ std::unique_ptr> Prover::prove(typename Engine::FrElement + + delete [] b; + delete [] c; ++ fft.reset(); ++ logPhaseMemory("qap_fft_complete"); ++ ++ LOG_TRACE("Start Multiexp A"); ++ typename Engine::G1Point pi_a; ++ E.g1.multiMulByScalarMSM(pi_a, pointsA, (uint8_t *)wtns, sW, nVars); ++ if (reclaimZkeyPages) { ++ reclaimReadOnlyPages(pointsA, nVars * sizeof(typename Engine::G1PointAffine)); ++ } ++ logPhaseMemory("multiexp_a"); ++ std::ostringstream ss2; ++ ss2 << "pi_a: " << E.g1.toString(pi_a); ++ LOG_DEBUG(ss2); ++ ++ LOG_TRACE("Start Multiexp B1"); ++ typename Engine::G1Point pib1; ++ E.g1.multiMulByScalarMSM(pib1, pointsB1, (uint8_t *)wtns, sW, nVars); ++ if (reclaimZkeyPages) { ++ reclaimReadOnlyPages(pointsB1, nVars * sizeof(typename Engine::G1PointAffine)); ++ } ++ logPhaseMemory("multiexp_b1"); ++ std::ostringstream ss3; ++ ss3 << "pib1: " << E.g1.toString(pib1); ++ LOG_DEBUG(ss3); ++ ++ LOG_TRACE("Start Multiexp B2"); ++ typename Engine::G2Point pi_b; ++ E.g2.multiMulByScalarMSM(pi_b, pointsB2, (uint8_t *)wtns, sW, nVars); ++ if (reclaimZkeyPages) { ++ reclaimReadOnlyPages(pointsB2, nVars * sizeof(typename Engine::G2PointAffine)); ++ } ++ logPhaseMemory("multiexp_b2"); ++ std::ostringstream ss4; ++ ss4 << "pi_b: " << E.g2.toString(pi_b); ++ LOG_DEBUG(ss4); ++ ++ LOG_TRACE("Start Multiexp C"); ++ typename Engine::G1Point pi_c; ++ E.g1.multiMulByScalarMSM(pi_c, pointsC, (uint8_t *)((uint64_t)wtns + (nPublic +1)*sW), sW, nVars-nPublic-1); ++ if (reclaimZkeyPages) { ++ reclaimReadOnlyPages(pointsC, ++ (nVars - nPublic - 1) * ++ sizeof(typename Engine::G1PointAffine)); ++ } ++ logPhaseMemory("multiexp_c"); ++ std::ostringstream ss5; ++ ss5 << "pi_c: " << E.g1.toString(pi_c); ++ LOG_DEBUG(ss5); + + LOG_TRACE("Start Multiexp H"); + typename Engine::G1Point pih; + E.g1.multiMulByScalarMSM(pih, pointsH, (uint8_t *)a, sizeof(a[0]), domainSize); ++ if (reclaimZkeyPages) { ++ reclaimReadOnlyPages(pointsH, ++ domainSize * sizeof(typename Engine::G1PointAffine)); ++ } ++ logPhaseMemory("multiexp_h"); + std::ostringstream ss1; + ss1 << "pih: " << E.g1.toString(pih); + LOG_DEBUG(ss1); +@@ -259,6 +334,7 @@ std::unique_ptr> Prover::prove(typename Engine::FrElement + E.g1.copy(p->A, pi_a); + E.g2.copy(p->B, pi_b); + E.g1.copy(p->C, pi_c); ++ logPhaseMemory("proof_complete"); + + return std::unique_ptr>(p); + } +diff --git a/src/groth16.hpp b/src/groth16.hpp +index c113491..5b39f41 100644 +--- a/src/groth16.hpp ++++ b/src/groth16.hpp +@@ -67,8 +67,7 @@ namespace Groth16 { + typename Engine::G2PointAffine *pointsB2; + typename Engine::G1PointAffine *pointsC; + typename Engine::G1PointAffine *pointsH; +- +- FFT *fft; ++ bool reclaimZkeyPages; + public: + Prover( + Engine &_E, +@@ -86,7 +85,8 @@ namespace Groth16 { + typename Engine::G1PointAffine *_pointsB1, + typename Engine::G2PointAffine *_pointsB2, + typename Engine::G1PointAffine *_pointsC, +- typename Engine::G1PointAffine *_pointsH ++ typename Engine::G1PointAffine *_pointsH, ++ bool _reclaimZkeyPages + ) : + E(_E), + nVars(_nVars), +@@ -103,14 +103,9 @@ namespace Groth16 { + pointsB1(_pointsB1), + pointsB2(_pointsB2), + pointsC(_pointsC), +- pointsH(_pointsH) +- { +- fft = new FFT(domainSize*2); +- } +- +- ~Prover() { +- delete fft; +- } ++ pointsH(_pointsH), ++ reclaimZkeyPages(_reclaimZkeyPages) ++ { } + + std::unique_ptr> prove(typename Engine::FrElement *wtns); + }; +@@ -131,7 +126,8 @@ namespace Groth16 { + void *pointsB1, + void *pointsB2, + void *pointsC, +- void *pointsH ++ void *pointsH, ++ bool reclaimZkeyPages + ); + + template +diff --git a/src/prover.cpp b/src/prover.cpp +index 8221cd6..2d72507 100644 +--- a/src/prover.cpp ++++ b/src/prover.cpp +@@ -102,7 +102,8 @@ class Groth16Prover + + public: + Groth16Prover(const void *zkey_buffer, +- unsigned long long zkey_size) ++ unsigned long long zkey_size, ++ bool reclaim_zkey_pages = false) + + : zkey(zkey_buffer, zkey_size, "zkey", 1), + zkeyHeader(ZKeyUtils::loadHeader(&zkey)) +@@ -126,7 +127,8 @@ public: + zkey.getSectionData(6), // pointsB1 + zkey.getSectionData(7), // pointsB2 + zkey.getSectionData(8), // pointsC +- zkey.getSectionData(9) // pointsH1 ++ zkey.getSectionData(9), // pointsH1 ++ reclaim_zkey_pages + ); + } + +@@ -431,6 +433,43 @@ groth16_prover( + return error; + } + ++static int ++groth16_prover_mapped_zkey( ++ const void *zkey_buffer, ++ unsigned long long zkey_size, ++ const void *wtns_buffer, ++ unsigned long long wtns_size, ++ char *proof_buffer, ++ unsigned long long *proof_size, ++ char *public_buffer, ++ unsigned long long *public_size, ++ char *error_msg, ++ unsigned long long error_msg_maxsize) ++{ ++ void *prover = NULL; ++ ++ try { ++ prover = new Groth16Prover(zkey_buffer, zkey_size, true); ++ } catch (std::exception& e) { ++ CopyError(error_msg, error_msg_maxsize, e); ++ return PROVER_ERROR; ++ } ++ ++ int error = groth16_prover_prove( ++ prover, ++ wtns_buffer, ++ wtns_size, ++ proof_buffer, ++ proof_size, ++ public_buffer, ++ public_size, ++ error_msg, ++ error_msg_maxsize); ++ ++ groth16_prover_destroy(prover); ++ return error; ++} ++ + int + groth16_prover_zkey_file( + const char *zkey_file_path, +@@ -453,7 +492,7 @@ groth16_prover_zkey_file( + return PROVER_ERROR; + } + +- return groth16_prover( ++ return groth16_prover_mapped_zkey( + fileLoader.dataBuffer(), + fileLoader.dataSize(), + wtns_buffer, diff --git a/benchmarks/v1/rapidsnark/rapidsnark-ios-single-thread.patch b/benchmarks/v1/rapidsnark/rapidsnark-ios-single-thread.patch new file mode 100644 index 000000000..e2197d8c1 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-ios-single-thread.patch @@ -0,0 +1,19 @@ +diff --git a/c/misc.hpp b/c/misc.hpp +index 96be43d..441dcd7 100644 +--- a/c/misc.hpp ++++ b/c/misc.hpp +@@ -168,7 +168,14 @@ public: + } + + static unsigned int defaultThreadCount() { ++#if defined(__APPLE__) && defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) ++ // Large proving keys can exceed iOS's per-process memory allowance when ++ // each MSM worker allocates its own bucket matrix. Keep the native iOS ++ // benchmark deterministic and bounded to one worker. ++ return 1; ++#else + unsigned int n = std::thread::hardware_concurrency(); + + return n == 0 ? 1 : n; ++#endif + } diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/Cargo.lock b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/Cargo.lock new file mode 100644 index 000000000..541547f84 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/Cargo.lock @@ -0,0 +1,1224 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cc" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9066c49992464636f92905fa096ec58baaa4d57ec19a5c096c68d3e25ef3d136" +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 = "chkstk_stub" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047f6ab2f3b9bcaf23b593d1580898e4244d27eadf1a1fae99212ee5735d3d1c" +dependencies = [ + "cc", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "downcast-rs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "multi-stash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685a9ac4b61f4e728e1d2c6a7844609c16527aeb5e6c865915c08e619c16410f" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-rapidsnark-mobile-oprf" +version = "0.1.0" +dependencies = [ + "anyhow", + "cc", + "chkstk_stub", + "inventory", + "mobench-sdk", + "num-bigint", + "rust-witness", + "serde_json", + "uniffi", + "wasmi", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rust-witness" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b59361683f7b6b3b0d343fc77e797ee5a267b8a470b9531ed9911aeed160dea0" +dependencies = [ + "cc", + "fnv", + "num-bigint", + "num-traits", + "paste", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string-interner" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23de088478b31c349c9ba67816fa55d9355232d63c3afea8bf513e31f0f1d2c0" +dependencies = [ + "hashbrown 0.15.5", + "serde", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "uniffi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +dependencies = [ + "anyhow", + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.255.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b524283fb5df62eec102ed0574838961bdd7ba5ac9c50d38e2756c51c971a42" +dependencies = [ + "leb128fmt", + "wasmparser 0.255.0", +] + +[[package]] +name = "wasmi" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c602dd253549139314b217cb18557ac290135ed25a3d806c81d73db6b0effd49" +dependencies = [ + "arrayvec", + "multi-stash", + "smallvec", + "spin", + "wasmi_collections", + "wasmi_core", + "wasmi_ir", + "wasmparser 0.228.0", + "wat", +] + +[[package]] +name = "wasmi_collections" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "001f3a73d68df33e164c935fd64a4bf63bcd6cd6a6e88ae0e4328fd5aff1b7a7" +dependencies = [ + "string-interner", +] + +[[package]] +name = "wasmi_core" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909e4dcf38f60274b2d098802371e232d92c2c612b0b47a0016ec5234a3f425d" +dependencies = [ + "downcast-rs", + "libm", +] + +[[package]] +name = "wasmi_ir" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab7c61bb8aa9de5b09fb63f95649af9d206f3a912b54508756a827f29eae678" +dependencies = [ + "wasmi_core", +] + +[[package]] +name = "wasmparser" +version = "0.228.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4abf1132c1fdf747d56bbc1bb52152400c70f336870f968b85e89ea422198ae3" +dependencies = [ + "bitflags", + "indexmap", +] + +[[package]] +name = "wasmparser" +version = "0.255.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e329ef4b5d46e73b91d3ac6924417cad55a8cbbf869c199283383427c3320b" +dependencies = [ + "bitflags", + "indexmap", +] + +[[package]] +name = "wast" +version = "255.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ffec530f199bd3d553ac442c13dd108353cad533cad8514bc41e1f1f0fe686" +dependencies = [ + "bumpalo", + "leb128fmt", + "memchr", + "unicode-width", + "wasm-encoder", +] + +[[package]] +name = "wat" +version = "1.255.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dda82c82e1486c7eed42a0465e544d80fff37abc3b39482e0d34dbaabe2fe5b1" +dependencies = [ + "wast", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/Cargo.toml b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/Cargo.toml new file mode 100644 index 000000000..01b85f54c --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "provekit-v1-rapidsnark-mobile-oprf" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" +build = "../rapidsnark-mobile/build.rs" + +[lib] +crate-type = ["lib", "cdylib", "staticlib"] +doctest = false + +[features] +default = ["oprf-query"] +oprf-query = [] +oprf-nullifier = [] + +[dependencies] +anyhow = "1" +inventory = "0.3" +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" } +uniffi = { version = "0.31", features = ["cli"] } +num-bigint = "0.4" +serde_json = "1" +wasmi = "=0.46.0" + +[build-dependencies] +cc = "1" +chkstk_stub = "=0.1.0" +rust-witness = "=0.1.6" + +[workspace] diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/src/lib.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/src/lib.rs new file mode 100644 index 000000000..4f70bfc80 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/src/lib.rs @@ -0,0 +1,347 @@ +//! Native Mobench adapter for World ID Circom/Rapidsnark OPRF counterparts. +//! +//! Query and nullifier are separate named variants and are packaged as +//! separate apps. Input-to-proof functions generate a fresh WTNS from raw +//! inputs and then prove within one measured region. + +use { + mobench_sdk::benchmark, + std::{ + env, fs, + hint::black_box, + path::{Path, PathBuf}, + sync::Once, + time::Instant, + }, +}; + +#[path = "../../rapidsnark-mobile/src/rapidsnark.rs"] +mod rapidsnark; +mod wasmi_witness; + +#[cfg(feature = "oprf-query")] +const WITNESS_WASM: &[u8] = + include_bytes!("../../circom/web/dist/assets/oprf/oprf_query.wasm"); +#[cfg(feature = "oprf-nullifier")] +const WITNESS_WASM: &[u8] = + include_bytes!("../../circom/web/dist/assets/oprf/oprf_nullifier.wasm"); + +#[cfg(feature = "oprf-query")] +const INPUTS: &str = include_str!("../../circom/web/dist/assets/oprf/oprf_query.input.json"); +#[cfg(feature = "oprf-nullifier")] +const INPUTS: &str = include_str!("../../circom/web/dist/assets/oprf/oprf_nullifier.input.json"); + +#[cfg(all(feature = "oprf-query", feature = "oprf-nullifier"))] +compile_error!("enable exactly one OPRF workload feature"); +#[cfg(not(any(feature = "oprf-query", feature = "oprf-nullifier")))] +compile_error!("enable one of oprf-query or oprf-nullifier"); + +pub struct PreparedProof { + zkey_path: String, + witness: Vec, +} + +pub struct PreparedVerification { + proof: rapidsnark::ProofResult, + verification_key: String, +} + +pub struct PreparedProofVerify { + proof: PreparedProof, + verification_key: String, +} + +pub struct PreparedInputToProof { + zkey_path: String, +} + +fn generate_witness() -> Vec { + wasmi_witness::generate_wtns(WITNESS_WASM, INPUTS).expect("calculate OPRF witness") +} + +fn fixture_root() -> PathBuf { + if let Some(path) = env::var_os("MOBENCH_GROTH16_FIXTURE_ROOT") { + return PathBuf::from(path); + } + + #[cfg(target_os = "android")] + { + let library_name = "libprovekit_v1_mobile_adapters.so"; + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + return PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .to_path_buf(); + } + + #[cfg(not(target_os = "android"))] + { + env::current_exe() + .expect("resolve benchmark executable path") + .parent() + .expect("benchmark executable has an app-bundle parent") + .to_path_buf() + } +} + +fn checked_fixture_file(root: &Path, name: &str) -> PathBuf { + #[cfg(target_os = "android")] + let packaged_name = match name { + "proving_key.zkey" => "libmobench_proving_key.so", + "reference.wtns" => "libmobench_reference_wtns.so", + "verification_key.json" => "libmobench_verification_key.so", + _ => name, + }; + #[cfg(not(target_os = "android"))] + let packaged_name = name; + let path = root.join(packaged_name); + let metadata = fs::metadata(&path) + .unwrap_or_else(|error| panic!("read fixture metadata for {}: {error}", path.display())); + assert!( + metadata.is_file(), + "fixture is not a file: {}", + path.display() + ); + path +} + +fn load_proof_fixture() -> PreparedProof { + let root = fixture_root(); + let zkey = checked_fixture_file(&root, "proving_key.zkey"); + let witness_path = checked_fixture_file(&root, "reference.wtns"); + let witness = fs::read(&witness_path) + .unwrap_or_else(|error| panic!("read {}: {error}", witness_path.display())); + PreparedProof { + zkey_path: zkey.to_string_lossy().into_owned(), + witness, + } +} + +fn verification_key() -> String { + let path = checked_fixture_file(&fixture_root(), "verification_key.json"); + fs::read_to_string(&path).unwrap_or_else(|error| panic!("read {}: {error}", path.display())) +} + +fn prove(prepared: PreparedProof) -> rapidsnark::ProofResult { + rapidsnark::prove(&prepared.zkey_path, &prepared.witness) + .expect("Rapidsnark World ID OPRF proof") +} + +fn serialized_proof_size(proof: &rapidsnark::ProofResult) -> usize { + format!( + r#"{{"proof":{},"public_signals":{}}}"#, + proof.proof, proof.public_signals + ) + .len() +} + +fn tampered_proof_is_rejected(mut proof: rapidsnark::ProofResult, verification_key: &str) -> bool { + let digit = proof + .proof + .find(|character: char| character.is_ascii_digit()) + .expect("proof JSON contains a digit"); + let replacement = if proof.proof.as_bytes()[digit] == b'0' { + "1" + } else { + "0" + }; + proof.proof.replace_range(digit..=digit, replacement); + match rapidsnark::verify(&proof, verification_key) { + Ok(valid) => !valid, + Err(_) => true, + } +} + +fn validation_gate() { + static VALIDATED: Once = Once::new(); + VALIDATED.call_once(|| { + let verification_key = verification_key(); + let frozen = load_proof_fixture(); + let generated = generate_witness(); + assert_eq!( + generated, frozen.witness, + "live OPRF WTNS differs from frozen canary" + ); + let proof = + rapidsnark::prove(&frozen.zkey_path, &generated).expect("Rapidsnark live OPRF canary"); + assert!( + rapidsnark::verify(&proof, &verification_key) + .expect("verify valid Rapidsnark OPRF canary"), + "valid Rapidsnark OPRF canary was rejected" + ); + assert!( + tampered_proof_is_rejected(proof, &verification_key), + "tampered Rapidsnark OPRF canary was accepted" + ); + }); +} + +fn setup_input_to_proof() -> PreparedInputToProof { + validation_gate(); + let zkey_path = checked_fixture_file(&fixture_root(), "proving_key.zkey"); + let zkey_size = fs::metadata(&zkey_path) + .expect("read OPRF zkey metadata") + .len(); + let wasm_size = env!("MOBENCH_LIVE_WITNESS_WASM_BYTES") + .parse::() + .expect("live witness WASM byte count"); + let input_size = INPUTS.len() as u64; + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("witness_wasm_size_bytes", wasm_size); + mobench_sdk::record_run_u64("input_size_bytes", input_size); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + zkey_size + wasm_size + input_size, + ); + PreparedInputToProof { + zkey_path: zkey_path.to_string_lossy().into_owned(), + } +} + +fn bench_input_to_proof(prepared: PreparedInputToProof) { + let input_to_proof_started = Instant::now(); + let witness_started = Instant::now(); + let witness = generate_witness(); + let witness_time_ns = witness_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + let prove_started = Instant::now(); + let proof = rapidsnark::prove(&prepared.zkey_path, &witness) + .expect("Rapidsnark live-witness OPRF proof"); + let prove_time_ns = prove_started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let input_to_proof_time_ns = input_to_proof_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("witness_time_ns", witness_time_ns); + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", serialized_proof_size(&proof) as u64); + black_box(proof); +} + +fn setup_proof() -> PreparedProof { + validation_gate(); + let root = fixture_root(); + let zkey_size = fs::metadata(checked_fixture_file(&root, "proving_key.zkey")) + .expect("read OPRF zkey metadata") + .len(); + let witness_size = fs::metadata(checked_fixture_file(&root, "reference.wtns")) + .expect("read OPRF witness metadata") + .len(); + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("witness_size_bytes", witness_size); + mobench_sdk::record_run_u64("proving_payload_size_bytes", zkey_size + witness_size); + load_proof_fixture() +} + +fn setup_verification() -> PreparedVerification { + validation_gate(); + let proof = prove(load_proof_fixture()); + let verification_key = verification_key(); + assert!( + rapidsnark::verify(&proof, &verification_key) + .expect("verify prepared Rapidsnark OPRF proof"), + "prepared Rapidsnark OPRF proof must verify" + ); + PreparedVerification { + proof, + verification_key, + } +} + +fn setup_proof_verify() -> PreparedProofVerify { + validation_gate(); + PreparedProofVerify { + proof: load_proof_fixture(), + verification_key: verification_key(), + } +} + +macro_rules! benchmarks { + ($input_to_proof:ident, $prove:ident, $verify:ident, $proof_verify:ident) => { + #[benchmark(setup = setup_input_to_proof, per_iteration)] + pub fn $input_to_proof(prepared: PreparedInputToProof) { + bench_input_to_proof(prepared); + } + + #[benchmark(setup = setup_proof, per_iteration)] + pub fn $prove(prepared: PreparedProof) { + let started = Instant::now(); + let proof = prove(prepared); + let prove_time_ns = started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64( + "proof_size_bytes", + serialized_proof_size(&proof) as u64, + ); + black_box(proof); + } + + #[benchmark(setup = setup_verification)] + pub fn $verify(prepared: &PreparedVerification) { + let valid = rapidsnark::verify(&prepared.proof, &prepared.verification_key) + .expect("Rapidsnark OPRF verification"); + assert!(valid, "valid Rapidsnark OPRF proof was rejected"); + black_box(valid); + } + + #[benchmark(setup = setup_proof_verify, per_iteration)] + pub fn $proof_verify(prepared: PreparedProofVerify) { + let proof = prove(prepared.proof); + let valid = rapidsnark::verify(&proof, &prepared.verification_key) + .expect("Rapidsnark OPRF proof-and-verify"); + assert!(valid, "Rapidsnark OPRF proof-and-verify rejected its proof"); + black_box((proof, valid)); + } + }; +} + +#[cfg(feature = "oprf-query")] +benchmarks!( + bench_oprf_query_rapidsnark_input_to_proof, + bench_oprf_query_rapidsnark_prove, + bench_oprf_query_rapidsnark_verify, + bench_oprf_query_rapidsnark_proof_verify +); + +#[cfg(feature = "oprf-nullifier")] +benchmarks!( + bench_oprf_nullifier_rapidsnark_input_to_proof, + bench_oprf_nullifier_rapidsnark_prove, + bench_oprf_nullifier_rapidsnark_verify, + bench_oprf_nullifier_rapidsnark_proof_verify +); + +uniffi::setup_scaffolding!(); +mobench_sdk::export_native_c_abi!(); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn registers_three_variant_specific_functions() { + let names = mobench_sdk::list_benchmark_names(); + assert_eq!( + names + .iter() + .filter(|name| name.contains("oprf_") && name.contains("_rapidsnark_")) + .count(), + 4, + "registered benchmarks: {names:?}" + ); + } + + #[test] + fn frozen_fixture_proves_verifies_and_rejects_tampering() { + validation_gate(); + } +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/src/wasmi_witness.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/src/wasmi_witness.rs new file mode 100644 index 000000000..c8ce68614 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-oprf/src/wasmi_witness.rs @@ -0,0 +1,180 @@ +//! Interpreter-only Circom 2 witness generation for iOS-safe native runs. + +use { + anyhow::{Context, Result}, + num_bigint::{BigInt, Sign}, + serde_json::Value, + std::{collections::HashMap, str::FromStr}, + wasmi::{Engine, Linker, Module, Store, TypedFunc}, +}; + +pub(crate) fn generate_wtns(wasm: &[u8], input_json: &str) -> Result> { + let engine = Engine::default(); + let module = Module::new(&engine, wasm).context("compile Circom witness module")?; + let mut store = Store::new(&engine, ()); + let mut linker = Linker::new(&engine); + linker.func_wrap( + "runtime", + "error", + |_: i32, _: i32, _: i32, _: i32, _: i32, _: i32| {}, + )?; + linker.func_wrap("runtime", "exceptionHandler", |_: i32| {})?; + linker.func_wrap("runtime", "showSharedRWMemory", || {})?; + linker.func_wrap("runtime", "printErrorMessage", || {})?; + linker.func_wrap("runtime", "writeBufferMessage", || {})?; + linker.func_wrap("runtime", "logSetSignal", |_: i32, _: i32| {})?; + linker.func_wrap("runtime", "logGetSignal", |_: i32, _: i32| {})?; + linker.func_wrap("runtime", "logFinishComponent", |_: i32| {})?; + linker.func_wrap("runtime", "logStartComponent", |_: i32| {})?; + linker.func_wrap("runtime", "log", |_: i32| {})?; + let instance = linker + .instantiate(&mut store, &module) + .context("instantiate Circom witness module")? + .start(&mut store) + .context("start Circom witness module")?; + + let get_version = typed::<(), i32>(&instance, &store, "getVersion")?; + anyhow::ensure!( + get_version.call(&mut store, ())? == 2, + "only Circom witness ABI v2 is supported" + ); + let get_field_num_len32 = typed::<(), i32>(&instance, &store, "getFieldNumLen32")?; + let get_raw_prime = typed::<(), ()>(&instance, &store, "getRawPrime")?; + let read_shared = typed::(&instance, &store, "readSharedRWMemory")?; + let write_shared = typed::<(i32, i32), ()>(&instance, &store, "writeSharedRWMemory")?; + let init = typed::(&instance, &store, "init")?; + let set_input = typed::<(i32, i32, i32), ()>(&instance, &store, "setInputSignal")?; + let get_witness_size = typed::<(), i32>(&instance, &store, "getWitnessSize")?; + let get_witness = typed::(&instance, &store, "getWitness")?; + + let n32 = usize::try_from(get_field_num_len32.call(&mut store, ())?) + .context("negative Circom field limb count")?; + get_raw_prime.call(&mut store, ())?; + let mut prime_limbs = vec![0_u32; n32]; + for index in 0..n32 { + prime_limbs[n32 - index - 1] = read_shared.call(&mut store, index as i32)? as u32; + } + let prime = from_array32(&prime_limbs); + init.call(&mut store, 0)?; + + for (name, values) in parse_inputs(input_json)? { + let (msb, lsb) = fnv(&name); + for (index, value) in values.into_iter().enumerate() { + let normalized = ((value % &prime) + &prime) % ′ + let limbs = to_array32(&normalized, n32); + for limb in 0..n32 { + write_shared.call( + &mut store, + (limb as i32, limbs[n32 - limb - 1] as i32), + )?; + } + set_input.call(&mut store, (msb as i32, lsb as i32, index as i32))?; + } + } + + let witness_size = usize::try_from(get_witness_size.call(&mut store, ())?) + .context("negative Circom witness size")?; + let mut witness = Vec::with_capacity(witness_size); + for index in 0..witness_size { + get_witness.call(&mut store, index as i32)?; + let mut limbs = vec![0_u32; n32]; + for limb in 0..n32 { + limbs[n32 - limb - 1] = read_shared.call(&mut store, limb as i32)? as u32; + } + witness.push(from_array32(&limbs)); + } + Ok(serialize_wtns(&witness)) +} + +fn typed( + instance: &wasmi::Instance, + store: &Store<()>, + name: &str, +) -> Result> +where + Params: wasmi::WasmParams, + Results: wasmi::WasmResults, +{ + instance + .get_typed_func(store, name) + .with_context(|| format!("resolve Circom export {name}")) +} + +fn parse_inputs(input_json: &str) -> Result>> { + fn flatten(value: &Value, output: &mut Vec) -> Result<()> { + match value { + Value::Array(values) => { + for value in values { + flatten(value, output)?; + } + } + Value::String(value) => output.push(BigInt::from_str(value)?), + Value::Number(value) => output.push(BigInt::from_str(&value.to_string())?), + _ => anyhow::bail!("unsupported Circom input value: {value}"), + } + Ok(()) + } + + serde_json::from_str::(input_json)? + .as_object() + .context("Circom inputs must be an object")? + .iter() + .map(|(name, value)| { + let mut values = Vec::new(); + flatten(value, &mut values)?; + Ok((name.clone(), values)) + }) + .collect() +} + +fn fnv(value: &str) -> (u32, u32) { + let mut hasher = 0xcbf29ce484222325_u64; + for byte in value.bytes() { + hasher ^= u64::from(byte); + hasher = hasher.wrapping_mul(0x100000001b3); + } + ((hasher >> 32) as u32, hasher as u32) +} + +fn from_array32(limbs: &[u32]) -> BigInt { + limbs.iter().fold(BigInt::from(0_u8), |value, limb| { + (value << 32) + BigInt::from(*limb) + }) +} + +fn to_array32(value: &BigInt, size: usize) -> Vec { + let (_, bytes) = value.to_bytes_be(); + let mut padded = vec![0_u8; size * 4]; + let start = padded.len() - bytes.len(); + padded[start..].copy_from_slice(&bytes); + padded + .chunks_exact(4) + .map(|chunk| u32::from_be_bytes(chunk.try_into().expect("four-byte chunk"))) + .collect() +} + +fn serialize_wtns(witness: &[BigInt]) -> Vec { + const FIELD_BYTES: usize = 32; + const BN254_SCALAR_MODULUS_LE: [u8; FIELD_BYTES] = [ + 1, 0, 0, 240, 147, 245, 225, 67, 145, 112, 185, 121, 72, 232, 51, 40, 93, 88, 129, 129, + 182, 69, 80, 184, 41, 160, 49, 225, 114, 78, 100, 48, + ]; + let mut output = Vec::with_capacity(76 + witness.len() * FIELD_BYTES); + output.extend_from_slice(b"wtns"); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&1_u32.to_le_bytes()); + output.extend_from_slice(&(4_u64 + FIELD_BYTES as u64 + 4).to_le_bytes()); + output.extend_from_slice(&(FIELD_BYTES as u32).to_le_bytes()); + output.extend_from_slice(&BN254_SCALAR_MODULUS_LE); + output.extend_from_slice(&(witness.len() as u32).to_le_bytes()); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&((witness.len() * FIELD_BYTES) as u64).to_le_bytes()); + for value in witness { + let (sign, bytes) = value.to_bytes_le(); + assert!(sign != Sign::Minus, "negative canonical Circom witness"); + output.extend_from_slice(&bytes); + output.resize(output.len() + FIELD_BYTES - bytes.len(), 0); + } + output +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/Cargo.lock b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/Cargo.lock new file mode 100644 index 000000000..0f69c4d2b --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/Cargo.lock @@ -0,0 +1,1053 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cc" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9066c49992464636f92905fa096ec58baaa4d57ec19a5c096c68d3e25ef3d136" +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 = "chkstk_stub" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047f6ab2f3b9bcaf23b593d1580898e4244d27eadf1a1fae99212ee5735d3d1c" +dependencies = [ + "cc", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-rapidsnark-mobile-register" +version = "0.1.0" +dependencies = [ + "anyhow", + "cc", + "chkstk_stub", + "inventory", + "mobench-sdk", + "num-bigint", + "rust-witness", + "serde_json", + "uniffi", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rust-witness" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b59361683f7b6b3b0d343fc77e797ee5a267b8a470b9531ed9911aeed160dea0" +dependencies = [ + "cc", + "fnv", + "num-bigint", + "num-traits", + "paste", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "uniffi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +dependencies = [ + "anyhow", + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/Cargo.toml b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/Cargo.toml new file mode 100644 index 000000000..7ef2a2340 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "provekit-v1-rapidsnark-mobile-register" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" +build = "../rapidsnark-mobile/build.rs" + +[lib] +path = "../rapidsnark-mobile/src/lib.rs" +crate-type = ["lib", "cdylib", "staticlib"] +doctest = false + +[features] +default = ["passport-register"] +passport-register = [] +passport-disclose = [] +passport-p1 = [] + +[dependencies] +anyhow = "1" +inventory = "0.3" +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" } +uniffi = { version = "0.31", features = ["cli"] } +num-bigint = "0.4" +rust-witness = "=0.1.6" +serde_json = "1" + +[build-dependencies] +cc = "1" +chkstk_stub = "=0.1.0" +rust-witness = "=0.1.6" + +[workspace] diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/README.md b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/README.md new file mode 100644 index 000000000..c1fbe0933 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/README.md @@ -0,0 +1,7 @@ +# Native Self Passport registration adapter + +This package is the registration half of the historical Self Passport +counterpart. It is paired with the disclosure adapter for the named +`passport_complete_age_check` product-flow rows; it is not a monolithic Noir +age-check proof. The exact zkey, witness, and source commit are retained in +the row provenance and lock files. diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/src/lib.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/src/lib.rs new file mode 100644 index 000000000..4df4a7f40 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-register/src/lib.rs @@ -0,0 +1,18 @@ +//! Static benchmark declarations for Mobench 0.1.48 source discovery. +//! +//! The package compiles the shared implementation selected by `[lib].path` in +//! `Cargo.toml`. Mobench 0.1.48 scans only this conventional path when choosing +//! the generated runner's default function, so these compile-disabled +//! declarations keep its generated metadata aligned with the runtime registry. + +#[cfg(any())] +#[benchmark] +pub fn bench_passport_rapidsnark_prove() {} + +#[cfg(any())] +#[benchmark] +pub fn bench_passport_rapidsnark_verify() {} + +#[cfg(any())] +#[benchmark] +pub fn bench_passport_rapidsnark_proof_verify() {} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/Cargo.lock b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/Cargo.lock new file mode 100644 index 000000000..53feb0a4a --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/Cargo.lock @@ -0,0 +1,284 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +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 = "chkstk_stub" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047f6ab2f3b9bcaf23b593d1580898e4244d27eadf1a1fae99212ee5735d3d1c" +dependencies = [ + "cc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-rapidsnark-mobile-webauthn-witness" +version = "0.1.0" +dependencies = [ + "cc", + "chkstk_stub", + "num-bigint", + "rust-witness", + "serde_json", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rust-witness" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b59361683f7b6b3b0d343fc77e797ee5a267b8a470b9531ed9911aeed160dea0" +dependencies = [ + "cc", + "fnv", + "num-bigint", + "num-traits", + "paste", + "walkdir", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/Cargo.toml b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/Cargo.toml new file mode 100644 index 000000000..2d88814d6 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "provekit-v1-rapidsnark-mobile-webauthn-witness" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" +build = "build.rs" + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +num-bigint = "0.4" +rust-witness = "=0.1.6" +serde_json = "1" + +[build-dependencies] +cc = "1" +chkstk_stub = "=0.1.0" +rust-witness = "=0.1.6" + +[workspace] diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/build.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/build.rs new file mode 100644 index 000000000..f627421ed --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/build.rs @@ -0,0 +1,27 @@ +use std::{env, path::PathBuf}; + +fn main() { + chkstk_stub::build(); + + let manifest_dir = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").expect("manifest dir")); + let benchmark_root = manifest_dir + .parent() + .expect("WebAuthn witness helper lives below benchmarks/v1"); + let source = benchmark_root.join("circom/web/dist/assets/webauthn/webauthn_default.wasm"); + assert!( + source.is_file(), + "missing live witness WASM: {}", + source.display() + ); + println!("cargo:rerun-if-changed={}", source.display()); + + let witness_dir = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR")) + .join("live-witness-wasm"); + std::fs::create_dir_all(&witness_dir).expect("create live witness WASM directory"); + std::fs::copy( + &source, + witness_dir.join("webauthndefault.wasm"), + ) + .expect("copy live witness WASM"); + rust_witness::transpile::transpile_wasm(witness_dir.to_string_lossy().into_owned()); +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/src/lib.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/src/lib.rs new file mode 100644 index 000000000..1e5b07fce --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn-witness/src/lib.rs @@ -0,0 +1,109 @@ +//! Short-lived native witness generator for the 32-bit E15 WebAuthn lane. +//! +//! The generated Rust witness engine is intentionally kept out of the main +//! Rapidsnark adapter. The adapter loads this library, copies the WTNS into a +//! caller-owned buffer, and unloads it before the 1.73 GiB proving key is +//! mapped. This is required to fit the complete input-to-proof path in the +//! E15's 32-bit address space. + +use { + num_bigint::{BigInt, Sign}, + serde_json::Value, +}; + +mod witness { + rust_witness::witness!(webauthndefault); +} + +const INPUTS: &str = + include_str!("../../circom/web/dist/assets/webauthn/webauthn_default.input.json"); + +fn parse_inputs(input_json: &str) -> std::collections::HashMap> { + fn flatten(value: &Value, output: &mut Vec) { + match value { + Value::Array(values) => values.iter().for_each(|value| flatten(value, output)), + Value::String(value) => { + output.push(value.parse::().expect("Circom decimal input")) + } + Value::Number(value) => { + output.push(value.to_string().parse::().expect("Circom numeric input")) + } + _ => panic!("unsupported Circom input value: {value}"), + } + } + + serde_json::from_str::(input_json) + .expect("parse Circom input JSON") + .as_object() + .expect("Circom inputs must be an object") + .iter() + .map(|(name, value)| { + let mut values = Vec::new(); + flatten(value, &mut values); + (name.clone(), values) + }) + .collect() +} + +fn serialize_wtns(witness: &[BigInt]) -> Vec { + const FIELD_BYTES: usize = 32; + const BN254_SCALAR_MODULUS_LE: [u8; FIELD_BYTES] = [ + 1, 0, 0, 240, 147, 245, 225, 67, 145, 112, 185, 121, 72, 232, 51, 40, 93, 88, 129, + 129, 182, 69, 80, 184, 41, 160, 49, 225, 114, 78, 100, 48, + ]; + + let witness_bytes = witness + .len() + .checked_mul(FIELD_BYTES) + .expect("WTNS witness byte length overflow"); + let mut output = Vec::with_capacity(76 + witness_bytes); + output.extend_from_slice(b"wtns"); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&1_u32.to_le_bytes()); + output.extend_from_slice(&(4_u64 + FIELD_BYTES as u64 + 4).to_le_bytes()); + output.extend_from_slice(&(FIELD_BYTES as u32).to_le_bytes()); + output.extend_from_slice(&BN254_SCALAR_MODULUS_LE); + output.extend_from_slice( + &u32::try_from(witness.len()) + .expect("WTNS witness count exceeds u32") + .to_le_bytes(), + ); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&(witness_bytes as u64).to_le_bytes()); + for value in witness { + let (sign, bytes) = value.to_bytes_le(); + assert!(sign != Sign::Minus, "negative canonical Circom witness"); + assert!( + bytes.len() <= FIELD_BYTES, + "Circom witness exceeds BN254 field width" + ); + output.extend_from_slice(&bytes); + output.resize(output.len() + FIELD_BYTES - bytes.len(), 0); + } + output +} + +/// Generate the live WTNS into a caller-owned buffer. +/// +/// Returns the serialized length, or zero when `out` is null or the provided +/// buffer is too small. The caller owns the buffer and may unload this helper +/// immediately after the function returns. +#[no_mangle] +pub unsafe extern "C" fn mobench_generate_webauthn_witness( + out: *mut u8, + out_len: usize, +) -> usize { + if out.is_null() { + return 0; + } + let values = witness::webauthndefault_witness(parse_inputs(INPUTS)); + let bytes = serialize_wtns(&values); + if bytes.len() > out_len { + return 0; + } + // SAFETY: The caller promises that `out` points to a writable buffer of + // at least `out_len` bytes; the explicit length check bounds the copy. + std::ptr::copy_nonoverlapping(bytes.as_ptr(), out, bytes.len()); + bytes.len() +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/Cargo.lock b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/Cargo.lock new file mode 100644 index 000000000..746c389bb --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/Cargo.lock @@ -0,0 +1,1064 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cc" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9066c49992464636f92905fa096ec58baaa4d57ec19a5c096c68d3e25ef3d136" +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 = "chkstk_stub" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047f6ab2f3b9bcaf23b593d1580898e4244d27eadf1a1fae99212ee5735d3d1c" +dependencies = [ + "cc", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-rapidsnark-mobile-webauthn" +version = "0.1.0" +dependencies = [ + "anyhow", + "cc", + "chkstk_stub", + "inventory", + "libc", + "memmap2", + "mobench-sdk", + "num-bigint", + "rust-witness", + "serde_json", + "uniffi", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rust-witness" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b59361683f7b6b3b0d343fc77e797ee5a267b8a470b9531ed9911aeed160dea0" +dependencies = [ + "cc", + "fnv", + "num-bigint", + "num-traits", + "paste", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "uniffi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +dependencies = [ + "anyhow", + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/Cargo.toml b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/Cargo.toml new file mode 100644 index 000000000..ec34eb184 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "provekit-v1-rapidsnark-mobile-webauthn" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" +build = "../rapidsnark-mobile/build.rs" + +[lib] +crate-type = ["lib", "cdylib", "staticlib"] +doctest = false + +[dependencies] +anyhow = "1" +inventory = "0.3" +memmap2 = "0.9" +libc = "0.2" +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" } +serde_json = "1" +uniffi = { version = "0.31", features = ["cli"] } +num-bigint = "0.4" +rust-witness = "=0.1.6" + +[build-dependencies] +cc = "1" +chkstk_stub = "=0.1.0" +rust-witness = "=0.1.6" + +[workspace] diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/README.md b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/README.md new file mode 100644 index 000000000..012ba4106 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/README.md @@ -0,0 +1,9 @@ +# Native Circom WebAuthn adapter + +This package wraps the pinned `privacy-ethereum/webauth-circom` fixture with +the native Rapidsnark backend. Its witness and prover phases are recorded in +the canonical input-to-proof boundary, with proof verification and tamper +rejection as mandatory gates. + +The E15 32-bit cold lane is retained as a structured OOM gap when the zkey and +WTNS cannot be mapped. It is never replaced with a browser or iPhone timing. diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/build.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/build.rs new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/bin/mobench-host.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/bin/mobench-host.rs new file mode 100644 index 000000000..4924b948a --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/bin/mobench-host.rs @@ -0,0 +1,48 @@ +use { + mobench_sdk::{run_benchmark, BenchSpec}, + provekit_v1_rapidsnark_mobile_webauthn as _, + std::process::ExitCode, +}; + +fn main() -> ExitCode { + let mut args = std::env::args().skip(1); + let Some(name) = args.next() else { + eprintln!("usage: mobench-host [warmup] [iterations]"); + return ExitCode::FAILURE; + }; + let warmup = args + .next() + .and_then(|value| value.parse().ok()) + .unwrap_or(1); + let iterations = args + .next() + .and_then(|value| value.parse().ok()) + .unwrap_or(5); + let output = args.next(); + match run_benchmark(BenchSpec { + name, + iterations, + warmup, + }) { + Ok(report) => match serde_json::to_string_pretty(&report) { + Ok(json) => { + if let Some(path) = output { + if let Err(error) = std::fs::write(&path, &json) { + eprintln!("failed to write {path}: {error}"); + return ExitCode::FAILURE; + } + } + println!("{json}"); + ExitCode::SUCCESS + } + Err(error) => { + eprintln!("failed to serialize report: {error}"); + ExitCode::FAILURE + } + }, + Err(error) => { + eprintln!("benchmark failed: {error}"); + ExitCode::FAILURE + } + } +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/lib.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/lib.rs new file mode 100644 index 000000000..9f2ac1095 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/lib.rs @@ -0,0 +1,479 @@ +//! Native Mobench adapter for the Circom/Rapidsnark WebAuthn assertion lane. +//! +//! Input-to-proof functions generate a fresh WTNS from raw inputs and run +//! Rapidsnark in the same measured region. The frozen WTNS remains only as an +//! independently validated correctness canary. + +use { + libc::{c_char, c_void}, + memmap2::{Mmap, MmapOptions}, + mobench_sdk::benchmark, + std::{ + env, + ffi::{CStr, CString}, + fs::{self, File}, + hint::black_box, + path::{Path, PathBuf}, + sync::Once, + time::Instant, + }, +}; + +#[path = "../../rapidsnark-mobile/src/rapidsnark.rs"] +mod rapidsnark; + +const INPUTS: &str = + include_str!("../../circom/web/dist/assets/webauthn/webauthn_default.input.json"); + +pub struct PreparedProof { + zkey_path: String, + witness: Mmap, +} + +pub struct PreparedVerification { + proof: rapidsnark::ProofResult, + verification_key: String, +} + +pub struct PreparedProofVerify { + proof: PreparedProof, + verification_key: String, +} + +pub struct PreparedInputToProof { + zkey_path: String, +} + +type GenerateWitness = unsafe extern "C" fn(*mut u8, usize) -> usize; + +fn generate_witness() -> Vec { + let root = fixture_root(); + let helper_path = checked_fixture_file(&root, "witness.so"); + let expected_size = fs::metadata(checked_fixture_file(&root, "reference.wtns")) + .expect("read WebAuthn witness metadata") + .len(); + let helper_path = CString::new(helper_path.to_string_lossy().as_bytes()) + .expect("witness helper path contains no NUL"); + let (handle, output, written) = std::thread::spawn(move || { + // SAFETY: The path is a valid NUL-terminated string and Android's + // dynamic linker owns the returned handle until the matching dlclose. + let handle = unsafe { + libc::dlopen(helper_path.as_ptr(), libc::RTLD_NOW | libc::RTLD_LOCAL) + }; + assert!(!handle.is_null(), "load WebAuthn witness helper: {}", dl_error()); + let symbol = CString::new("mobench_generate_webauthn_witness") + .expect("witness symbol contains no NUL"); + // SAFETY: `handle` is a live dlopen handle and the symbol name is valid. + let address = unsafe { libc::dlsym(handle, symbol.as_ptr()) }; + assert!(!address.is_null(), "resolve WebAuthn witness helper: {}", dl_error()); + // SAFETY: The helper exports exactly this C ABI function. + let generate: GenerateWitness = unsafe { std::mem::transmute(address) }; + let mut output = + vec![0_u8; usize::try_from(expected_size).expect("witness size fits usize")]; + // SAFETY: `output` is writable for its full length and the helper + // checks the capacity before copying the generated WTNS. + let written = unsafe { generate(output.as_mut_ptr(), output.len()) }; + // Keep the handle open: dlclose on a Rust cdylib can run its TLS + // destructors on Android's benchmark thread. The caller releases the + // large read-only image without invoking those destructors. + (handle as usize, output, written) + }) + .join() + .expect("WebAuthn witness helper thread"); + release_helper_readonly_mapping(handle); + assert_eq!(written, output.len(), "WebAuthn witness helper output length"); + output +} + +fn release_helper_readonly_mapping(handle: usize) { + // Keep the library loaded so its dynamic-loader/TLS bookkeeping remains + // valid, but release the large first PT_LOAD (ELF headers + witness + // tables) after generation. The first page contains the ELF header used by + // loader diagnostics; the rest is immutable data no longer referenced. + std::hint::black_box(handle); + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + for line in maps.lines() { + let mut fields = line.split_whitespace(); + let range = match fields.next() { + Some(value) => value, + None => continue, + }; + let permissions = match fields.next() { + Some(value) => value, + None => continue, + }; + let offset = match fields.next() { + Some(value) => value, + None => continue, + }; + let path = fields.last().unwrap_or_default(); + if !permissions.starts_with("r--") + || offset != "00000000" + || !path.ends_with("libmobench_witness.so") + { + continue; + } + let (start, end) = match range.split_once('-') { + Some((start, end)) => ( + usize::from_str_radix(start, 16).ok(), + usize::from_str_radix(end, 16).ok(), + ), + None => (None, None), + }; + let (Some(start), Some(end)) = (start, end) else { + continue; + }; + let page = 4096_usize; + let keep = start.saturating_add(page); + if end <= keep { + continue; + } + // SAFETY: This is the helper's private, file-backed read-only mapping; + // witness generation has returned and no later benchmark code calls + // into the helper. The first page remains mapped for loader metadata. + let status = unsafe { libc::munmap(keep as *mut c_void, end - keep) }; + assert_eq!(status, 0, "release WebAuthn witness helper mapping"); + break; + } +} + +fn dl_error() -> String { + // SAFETY: `dlerror` returns either a NUL-terminated diagnostic owned by + // the dynamic linker or null; the string is copied before the next call. + unsafe { + let error = libc::dlerror(); + if error.is_null() { + "unknown dynamic-loader error".to_owned() + } else { + CStr::from_ptr(error.cast::()) + .to_string_lossy() + .into_owned() + } + } +} + +fn fixture_root() -> PathBuf { + if let Some(path) = env::var_os("MOBENCH_GROTH16_FIXTURE_ROOT") { + return PathBuf::from(path); + } + + #[cfg(target_os = "android")] + { + let library_name = "libprovekit_v1_mobile_adapters.so"; + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(&library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + return PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .to_path_buf(); + } + + #[cfg(not(target_os = "android"))] + { + env::current_exe() + .expect("resolve benchmark executable path") + .parent() + .expect("benchmark executable has an app-bundle parent") + .to_path_buf() + } +} + +fn checked_fixture_file(root: &Path, name: &str) -> PathBuf { + #[cfg(target_os = "android")] + let packaged_name = match name { + "proving_key.zkey" => "libmobench_proving_key.so", + "reference.wtns" => "libmobench_reference_wtns.so", + "verification_key.json" => "libmobench_verification_key.so", + "witness.so" => "libmobench_witness.so", + _ => name, + }; + #[cfg(not(target_os = "android"))] + let packaged_name = name; + let path = root.join(packaged_name); + let metadata = fs::metadata(&path) + .unwrap_or_else(|error| panic!("read fixture metadata for {}: {error}", path.display())); + assert!( + metadata.is_file(), + "fixture is not a file: {}", + path.display() + ); + path +} + +fn load_proof_fixture() -> PreparedProof { + let root = fixture_root(); + let zkey = checked_fixture_file(&root, "proving_key.zkey"); + let witness_path = checked_fixture_file(&root, "reference.wtns"); + let witness_file = File::open(&witness_path) + .unwrap_or_else(|error| panic!("open {}: {error}", witness_path.display())); + // SAFETY: The frozen witness file is immutable for the lifetime of each + // benchmark process, and the mapping is retained in PreparedProof until + // the native prover has finished reading it. + let witness = unsafe { MmapOptions::new().map(&witness_file) } + .unwrap_or_else(|error| panic!("mmap {}: {error}", witness_path.display())); + PreparedProof { + zkey_path: zkey.to_string_lossy().into_owned(), + witness, + } +} + +fn prove(prepared: PreparedProof) -> rapidsnark::ProofResult { + rapidsnark::prove(&prepared.zkey_path, &prepared.witness) + .expect("Rapidsnark WebAuthn Groth16 proof") +} + +fn serialized_proof_size(proof: &rapidsnark::ProofResult) -> usize { + format!( + r#"{{"proof":{},"public_signals":{}}}"#, + proof.proof, proof.public_signals + ) + .len() +} + +fn tampered_proof_is_rejected(mut proof: rapidsnark::ProofResult, verification_key: &str) -> bool { + let digit = proof + .proof + .find(|character: char| character.is_ascii_digit()) + .expect("proof JSON contains a digit"); + let replacement = if proof.proof.as_bytes()[digit] == b'0' { + "1" + } else { + "0" + }; + proof.proof.replace_range(digit..=digit, replacement); + match rapidsnark::verify(&proof, verification_key) { + Ok(valid) => !valid, + Err(_) => true, + } +} + +fn validation_gate() { + static VALIDATED: Once = Once::new(); + VALIDATED.call_once(|| { + let verification_key = verification_key(); + let frozen = load_proof_fixture(); + let generated = generate_witness(); + assert_eq!( + generated.as_slice(), + frozen.witness.as_ref(), + "live WebAuthn WTNS differs from frozen canary" + ); + // The frozen witness is only an independently validated canary. On + // the 32-bit E15, retaining its mapping while Rapidsnark maps the + // 1.73 GiB proving key exhausts the available address space. Keep + // the path, release the mapping, and prove from the live WTNS. + let zkey_path = frozen.zkey_path.clone(); + drop(frozen); + let proof = rapidsnark::prove(&zkey_path, &generated) + .expect("Rapidsnark live WebAuthn canary"); + let proof_size_bytes = serialized_proof_size(&proof); + assert!( + rapidsnark::verify(&proof, &verification_key) + .expect("verify valid Rapidsnark WebAuthn canary"), + "valid Rapidsnark WebAuthn canary was rejected" + ); + assert!( + tampered_proof_is_rejected(proof, &verification_key), + "tampered Rapidsnark WebAuthn canary was accepted" + ); + let root = fixture_root(); + let zkey_size_bytes = fs::metadata(checked_fixture_file(&root, "proving_key.zkey")) + .expect("read WebAuthn zkey metadata") + .len(); + let witness_size_bytes = fs::metadata(checked_fixture_file(&root, "reference.wtns")) + .expect("read WebAuthn witness metadata") + .len(); + let verification_key_size_bytes = + fs::metadata(checked_fixture_file(&root, "verification_key.json")) + .expect("read WebAuthn verification-key metadata") + .len(); + println!( + "MOBENCH_METRIC_JSON {}", + serde_json::json!({ + "schema_version": 1, + "stack": "circom_rapidsnark", + "workload": "webauthn", + "proof_size_bytes": proof_size_bytes, + "proving_payload": { + "zkey_size_bytes": zkey_size_bytes, + "witness_size_bytes": witness_size_bytes, + "verification_key_size_bytes": verification_key_size_bytes, + "deduplicated_total_bytes": zkey_size_bytes + + witness_size_bytes + + verification_key_size_bytes, + }, + "tampered_proof_rejected": true, + "timing_scope": "outside_measured_region", + }) + ); + }); +} + +fn setup_input_to_proof() -> PreparedInputToProof { + validation_gate(); + let zkey_path = checked_fixture_file(&fixture_root(), "proving_key.zkey"); + let zkey_size = fs::metadata(&zkey_path) + .expect("read WebAuthn zkey metadata") + .len(); + let wasm_size = env!("MOBENCH_LIVE_WITNESS_WASM_BYTES") + .parse::() + .expect("live witness WASM byte count"); + let input_size = INPUTS.len() as u64; + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("witness_wasm_size_bytes", wasm_size); + mobench_sdk::record_run_u64("input_size_bytes", input_size); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + zkey_size + wasm_size + input_size, + ); + PreparedInputToProof { + zkey_path: zkey_path.to_string_lossy().into_owned(), + } +} + +#[benchmark(setup = setup_input_to_proof, per_iteration)] +pub fn bench_webauthn_rapidsnark_input_to_proof(prepared: PreparedInputToProof) { + let input_to_proof_started = Instant::now(); + let witness_started = Instant::now(); + let witness = generate_witness(); + let witness_time_ns = witness_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + let prove_started = Instant::now(); + let proof = rapidsnark::prove(&prepared.zkey_path, &witness) + .expect("Rapidsnark live-witness WebAuthn proof"); + let prove_time_ns = prove_started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let input_to_proof_time_ns = input_to_proof_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("witness_time_ns", witness_time_ns); + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", serialized_proof_size(&proof) as u64); + black_box(proof); +} + +fn setup_proof() -> PreparedProof { + validation_gate(); + let root = fixture_root(); + let zkey_size_bytes = fs::metadata(checked_fixture_file(&root, "proving_key.zkey")) + .expect("read WebAuthn zkey metadata") + .len(); + let witness_size_bytes = fs::metadata(checked_fixture_file(&root, "reference.wtns")) + .expect("read WebAuthn witness metadata") + .len(); + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size_bytes); + mobench_sdk::record_run_u64("witness_size_bytes", witness_size_bytes); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + zkey_size_bytes + witness_size_bytes, + ); + load_proof_fixture() +} + +fn verification_key() -> String { + let path = checked_fixture_file(&fixture_root(), "verification_key.json"); + fs::read_to_string(&path).unwrap_or_else(|error| panic!("read {}: {error}", path.display())) +} + +fn setup_verification() -> PreparedVerification { + validation_gate(); + let proof = prove(load_proof_fixture()); + let verification_key = verification_key(); + assert!( + rapidsnark::verify(&proof, &verification_key) + .expect("verify prepared Rapidsnark WebAuthn proof"), + "prepared Rapidsnark WebAuthn proof must verify" + ); + PreparedVerification { + proof, + verification_key, + } +} + +fn setup_proof_verify() -> PreparedProofVerify { + validation_gate(); + PreparedProofVerify { + proof: load_proof_fixture(), + verification_key: verification_key(), + } +} + +#[benchmark(setup = setup_proof, per_iteration)] +pub fn bench_webauthn_rapidsnark_prove(prepared: PreparedProof) { + let started = Instant::now(); + let proof = prove(prepared); + let prove_time_ns = started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", serialized_proof_size(&proof) as u64); + black_box(proof); +} + +#[benchmark(setup = setup_verification)] +pub fn bench_webauthn_rapidsnark_verify(prepared: &PreparedVerification) { + let valid = rapidsnark::verify(&prepared.proof, &prepared.verification_key) + .expect("Rapidsnark WebAuthn verification"); + assert!(valid, "valid Rapidsnark WebAuthn proof was rejected"); + black_box(valid); +} + +#[benchmark(setup = setup_proof_verify, per_iteration)] +pub fn bench_webauthn_rapidsnark_proof_verify(prepared: PreparedProofVerify) { + let proof = prove(prepared.proof); + let valid = rapidsnark::verify(&proof, &prepared.verification_key) + .expect("Rapidsnark WebAuthn end-to-end verification"); + assert!(valid, "end-to-end Rapidsnark WebAuthn proof was rejected"); + black_box((proof, valid)); +} + +uniffi::setup_scaffolding!(); +mobench_sdk::export_native_c_abi!(); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn registers_expected_mobench_functions() { + let names = mobench_sdk::list_benchmark_names(); + for suffix in [ + "::bench_webauthn_rapidsnark_prove", + "::bench_webauthn_rapidsnark_verify", + "::bench_webauthn_rapidsnark_proof_verify", + ] { + assert!( + names.iter().any(|name| name.ends_with(suffix)), + "missing {suffix}: {names:?}" + ); + } + } + + #[test] + fn frozen_fixture_proves_verifies_and_rejects_tampering() { + validation_gate(); + let prepared = setup_verification(); + let proof_json = format!( + r#"{{"proof":{},"public_signals":{}}}"#, + prepared.proof.proof, prepared.proof.public_signals + ); + eprintln!("RAPIDSNARK_WEBAUTHN_PROOF_JSON_BYTES={}", proof_json.len()); + if let Some(path) = env::var_os("MOBENCH_WEBAUTHN_PROOF_OUTPUT") { + fs::write(path, proof_json).expect("write retained Rapidsnark proof"); + } + assert!( + rapidsnark::verify(&prepared.proof, &prepared.verification_key) + .expect("verify valid proof") + ); + assert!(tampered_proof_is_rejected( + prepared.proof, + &prepared.verification_key + )); + } +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/rapidsnark.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile-webauthn/src/rapidsnark.rs new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/Cargo.lock b/benchmarks/v1/rapidsnark/rapidsnark-mobile/Cargo.lock new file mode 100644 index 000000000..1d5b317b1 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/Cargo.lock @@ -0,0 +1,1053 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow 0.7.15", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cc" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9066c49992464636f92905fa096ec58baaa4d57ec19a5c096c68d3e25ef3d136" +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 = "chkstk_stub" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047f6ab2f3b9bcaf23b593d1580898e4244d27eadf1a1fae99212ee5735d3d1c" +dependencies = [ + "cc", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mobench-macros" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mobench-sdk" +version = "0.1.48" +source = "git+https://github.com/worldcoin/mobile-bench-rs.git?rev=e992596a786cc18047102a318d40131c953e57b8#e992596a786cc18047102a318d40131c953e57b8" +dependencies = [ + "include_dir", + "inventory", + "libc", + "mobench-macros", + "serde", + "serde_json", + "thiserror 1.0.69", + "toml 0.8.23", + "wasm-bindgen", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "provekit-v1-rapidsnark-mobile" +version = "0.1.0" +dependencies = [ + "anyhow", + "cc", + "chkstk_stub", + "inventory", + "mobench-sdk", + "num-bigint", + "rust-witness", + "serde_json", + "uniffi", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rust-witness" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b59361683f7b6b3b0d343fc77e797ee5a267b8a470b9531ed9911aeed160dea0" +dependencies = [ + "cc", + "fnv", + "num-bigint", + "num-traits", + "paste", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "uniffi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml 0.9.12+spec-1.1.0", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +dependencies = [ + "anyhow", + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "toml 0.9.12+spec-1.1.0", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/Cargo.toml b/benchmarks/v1/rapidsnark/rapidsnark-mobile/Cargo.toml new file mode 100644 index 000000000..16bd0f367 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "provekit-v1-rapidsnark-mobile" +version = "0.1.0" +edition = "2021" +publish = false +license = "Apache-2.0" + +[lib] +crate-type = ["lib", "cdylib", "staticlib"] +doctest = false + +[features] +default = ["passport-disclose"] +passport-register = [] +passport-disclose = [] +passport-p1 = [] + +[dependencies] +anyhow = "1" +inventory = "0.3" +mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" } +uniffi = { version = "0.31", features = ["cli"] } +num-bigint = "0.4" +rust-witness = "=0.1.6" +serde_json = "1" + +[build-dependencies] +cc = "1" +chkstk_stub = "=0.1.0" +rust-witness = "=0.1.6" + +[workspace] diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/README.md b/benchmarks/v1/rapidsnark/rapidsnark-mobile/README.md new file mode 100644 index 000000000..e12d8171b --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/README.md @@ -0,0 +1,11 @@ +# Native Rapidsnark adapter + +This crate is the shared native Groth16 wrapper used by the canonical iPhone +and E15 Circom lanes. It consumes frozen Circom WTNS inputs and standard zkeys, +and exposes witness, prove, verify, tamper, and input-to-proof Mobench +functions. Passport registration and disclosure are separate product stages; +Passport P1 is a distinct monolithic profile. + +Builds are driven by the scripts in `../scripts/` and the exact adapter/prover +versions in `../toolchains.lock.json`. Generated mobile packages and raw +BrowserStack evidence stay under `target/v1-benchmarks/`. diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/build.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile/build.rs new file mode 100644 index 000000000..c87fa7b15 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/build.rs @@ -0,0 +1,117 @@ +use std::{env, path::PathBuf}; + +fn main() { + chkstk_stub::build(); + + let manifest_dir = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").expect("manifest dir")); + let repository_root = manifest_dir + .ancestors() + .nth(3) + .expect("benchmark crate is nested below repository root"); + let target = env::var("TARGET").expect("target"); + + let default_lib_dir = if target == "aarch64-apple-ios" { + repository_root.join("target/v1-benchmarks/native-libs/rapidsnark/aarch64-apple-ios") + } else if target == "aarch64-apple-ios-sim" { + repository_root.join("target/v1-benchmarks/native-libs/rapidsnark/aarch64-apple-ios-sim") + } else if target == "x86_64-apple-ios" { + repository_root.join("target/v1-benchmarks/native-libs/rapidsnark/x86_64-apple-ios") + } else if target == "aarch64-apple-darwin" { + repository_root.join("target/v1-benchmarks/native-libs/rapidsnark/aarch64-apple-darwin") + } else if target == "aarch64-linux-android" { + repository_root.join("target/v1-benchmarks/native-libs/rapidsnark/aarch64-linux-android") + } else if target == "armv7-linux-androideabi" { + repository_root.join("target/v1-benchmarks/mopro/rapidsnark-armv7-libs") + } else { + panic!("unsupported Rapidsnark benchmark target: {target}"); + }; + let lib_dir = env::var_os("V1_RAPIDSNARK_LIB_DIR") + .map(PathBuf::from) + .unwrap_or(default_lib_dir); + + for library in ["librapidsnark.a", "libfr.a", "libfq.a", "libgmp.a"] { + let path = lib_dir.join(library); + assert!( + path.is_file(), + "missing {library} for {target}; run \ + benchmarks/v1/scripts/build-rapidsnark-ios-libs.sh" + ); + } + + println!("cargo:rerun-if-env-changed=V1_RAPIDSNARK_LIB_DIR"); + println!("cargo:rustc-link-search=native={}", lib_dir.display()); + println!("cargo:rustc-link-lib=static=rapidsnark"); + println!("cargo:rustc-link-lib=static=fr"); + println!("cargo:rustc-link-lib=static=fq"); + println!("cargo:rustc-link-lib=static=gmp"); + println!("cargo:rustc-link-lib=c++"); + if target.contains("android") { + // Android's libc provides pthread symbols. + println!("cargo:rustc-link-lib=c"); + } else { + println!("cargo:rustc-link-lib=pthread"); + } + + let benchmark_root = manifest_dir + .parent() + .expect("Rapidsnark crates live below benchmarks/v1"); + let (source, output_name) = if env::var_os("CARGO_FEATURE_OPRF_NULLIFIER").is_some() { + ( + benchmark_root.join("circom/web/dist/assets/oprf/oprf_nullifier.wasm"), + "oprfnullifierproof.wasm", + ) + } else if env::var_os("CARGO_FEATURE_OPRF_QUERY").is_some() { + ( + benchmark_root.join("circom/web/dist/assets/oprf/oprf_query.wasm"), + "oprfqueryproof.wasm", + ) + } else if env::var_os("CARGO_FEATURE_PASSPORT_REGISTER").is_some() { + ( + benchmark_root.join( + "circom/web/dist/assets/passport/register_sha256_sha256_sha256_rsa_65537_4096.wasm", + ), + "registersha256sha256sha256rsa655374096.wasm", + ) + } else if env::var_os("CARGO_FEATURE_PASSPORT_P1").is_some() { + ( + repository_root + .join("target/v1-benchmarks/circom/passport_p1/passport_p1_js/passport_p1.wasm"), + "passportp1.wasm", + ) + } else if env::var("CARGO_PKG_NAME") + .expect("package name") + .contains("webauthn") + { + ( + benchmark_root.join("circom/web/dist/assets/webauthn/webauthn_default.wasm"), + "webauthndefault.wasm", + ) + } else { + ( + benchmark_root.join("circom/web/dist/assets/passport/vc_and_disclose.wasm"), + "vcanddisclose.wasm", + ) + }; + assert!( + source.is_file(), + "missing live witness WASM: {}", + source.display() + ); + println!("cargo:rerun-if-changed={}", source.display()); + println!( + "cargo:rustc-env=MOBENCH_LIVE_WITNESS_WASM_BYTES={}", + std::fs::metadata(&source) + .expect("read live witness WASM metadata") + .len() + ); + let witness_dir = + PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR")).join("live-witness-wasm"); + std::fs::create_dir_all(&witness_dir).expect("create live witness WASM directory"); + std::fs::copy(&source, witness_dir.join(output_name)).expect("copy live witness WASM"); + if !env::var("CARGO_PKG_NAME") + .expect("package name") + .contains("oprf") + { + rust_witness::transpile::transpile_wasm(witness_dir.to_string_lossy().into_owned()); + } +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/lib.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/lib.rs new file mode 100644 index 000000000..9c443c864 --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/lib.rs @@ -0,0 +1,481 @@ +//! Native Mobench adapter for the Circom/Rapidsnark passport lanes. +//! +//! The large proving key and reference witness are installed as ordinary app +//! resources. Input-to-proof functions generate a fresh WTNS from raw inputs +//! and then run the native Groth16 prover in the same measured region. + +use { + mobench_sdk::benchmark, + std::{ + env, fs, + hint::black_box, + path::{Path, PathBuf}, + sync::{Once, OnceLock}, + time::Instant, + }, +}; + +mod live_witness; +mod rapidsnark; + +#[cfg(feature = "passport-register")] +mod witness { + rust_witness::witness!(registersha256sha256sha256rsa655374096); +} +#[cfg(feature = "passport-disclose")] +mod witness { + rust_witness::witness!(vcanddisclose); +} +#[cfg(feature = "passport-p1")] +mod witness { + rust_witness::witness!(passportp1); +} + +#[cfg(feature = "passport-register")] +const INPUTS: &str = include_str!( + "../../circom/web/dist/assets/passport/register_sha256_sha256_sha256_rsa_65537_4096.input.json" +); +#[cfg(feature = "passport-disclose")] +const INPUTS: &str = + include_str!("../../circom/web/dist/assets/passport/vc_and_disclose.input.json"); +#[cfg(feature = "passport-p1")] +const INPUTS: &str = include_str!("../../circom/fixtures/passport_p1/input.json"); + +#[cfg(any( + all(feature = "passport-register", feature = "passport-disclose"), + all(feature = "passport-register", feature = "passport-p1"), + all(feature = "passport-disclose", feature = "passport-p1") +))] +compile_error!("enable exactly one passport workload feature"); +#[cfg(not(any( + feature = "passport-register", + feature = "passport-disclose", + feature = "passport-p1" +)))] +compile_error!("enable one passport workload feature"); + +#[cfg(all(feature = "passport-register", not(target_os = "android")))] +const WORKLOAD: &str = "passport-register"; +#[cfg(all(feature = "passport-disclose", not(target_os = "android")))] +const WORKLOAD: &str = "passport-disclose"; +#[cfg(all(feature = "passport-p1", not(target_os = "android")))] +const WORKLOAD: &str = "passport-p1"; + +#[derive(Debug)] +pub struct PreparedProof { + zkey_path: String, + witness: Vec, +} + +#[derive(Debug)] +pub struct PreparedVerification { + proof: rapidsnark::ProofResult, + verification_key: String, +} + +#[derive(Debug)] +pub struct PreparedProofVerify { + proof: PreparedProof, + verification_key: String, +} + +#[derive(Debug)] +pub struct PreparedInputToProof { + zkey_path: String, +} + +fn generate_witness() -> Vec { + let inputs = live_witness::parse_inputs(INPUTS); + #[cfg(feature = "passport-register")] + let values = witness::registersha256sha256sha256rsa655374096_witness(inputs); + #[cfg(feature = "passport-disclose")] + let values = witness::vcanddisclose_witness(inputs); + #[cfg(feature = "passport-p1")] + let values = witness::passportp1_witness(inputs); + live_witness::serialize_wtns(&values) +} + +fn fixture_root() -> PathBuf { + if let Some(path) = env::var_os("MOBENCH_GROTH16_FIXTURE_ROOT") { + return PathBuf::from(path); + } + + #[cfg(target_os = "android")] + { + let library_name = "libprovekit_v1_mobile_adapters.so"; + let maps = fs::read_to_string("/proc/self/maps").expect("read Android process maps"); + let library_path = maps + .lines() + .filter_map(|line| line.split_whitespace().last()) + .map(|path| path.trim_end_matches(" (deleted)")) + .find(|path| path.ends_with(&library_name)) + .unwrap_or_else(|| panic!("locate {library_name} in Android process maps")); + PathBuf::from(library_path) + .parent() + .expect("Android benchmark library has a parent") + .to_path_buf() + } + + #[cfg(not(target_os = "android"))] + let executable = env::current_exe().expect("resolve benchmark executable path"); + #[cfg(not(target_os = "android"))] + let bundle_root = executable + .parent() + .expect("benchmark executable has an app-bundle parent"); + #[cfg(not(target_os = "android"))] + let nested = bundle_root.join("groth16").join(WORKLOAD); + #[cfg(not(target_os = "android"))] + if nested.join("proving_key.zkey").is_file() { + nested + } else { + // Xcode's resources build phase flattens ordinary file references into + // the application bundle root. Each workload is packaged as a separate + // app, so these names remain unambiguous. + bundle_root.to_path_buf() + } +} + +fn checked_fixture_file(root: &Path, name: &str) -> PathBuf { + #[cfg(target_os = "android")] + let packaged_name = match name { + "proving_key.zkey" => "libmobench_proving_key.so", + "reference.wtns" => "libmobench_reference_wtns.so", + "verification_key.json" => "libmobench_verification_key.so", + _ => name, + }; + #[cfg(not(target_os = "android"))] + let packaged_name = name; + let path = root.join(packaged_name); + let metadata = fs::metadata(&path) + .unwrap_or_else(|error| panic!("read fixture metadata for {}: {error}", path.display())); + assert!( + metadata.is_file(), + "fixture is not a file: {}", + path.display() + ); + path +} + +fn proving_key_path(root: &Path) -> PathBuf { + let bundled = checked_fixture_file(root, "proving_key.zkey"); + #[cfg(target_os = "ios")] + { + static WRITABLE_COPY: OnceLock = OnceLock::new(); + return WRITABLE_COPY + .get_or_init(|| { + // Rapidsnark mmaps the zkey. Keep that mapping outside the + // read-only, code-signed application bundle: BrowserStack's + // iOS 15 re-sign/install path can otherwise leave a mapped + // bundle extent with no read permission and trigger SIGBUS. + let directory = env::temp_dir().join(format!( + "provekit-v1-rapidsnark-{}", + env!("CARGO_PKG_NAME") + )); + fs::create_dir_all(&directory) + .unwrap_or_else(|error| panic!("create {}: {error}", directory.display())); + let writable = directory.join("proving_key.zkey"); + let expected = fs::metadata(&bundled) + .unwrap_or_else(|error| panic!("read {}: {error}", bundled.display())) + .len(); + let current = fs::metadata(&writable).map(|metadata| metadata.len()).ok(); + if current != Some(expected) { + fs::copy(&bundled, &writable).unwrap_or_else(|error| { + panic!( + "copy {} to {}: {error}", + bundled.display(), + writable.display() + ) + }); + } + writable + }) + .clone(); + } + #[cfg(not(target_os = "ios"))] + bundled +} + +fn load_proof_fixture() -> PreparedProof { + let root = fixture_root(); + let zkey = proving_key_path(&root); + let witness_path = checked_fixture_file(&root, "reference.wtns"); + let witness = fs::read(&witness_path) + .unwrap_or_else(|error| panic!("read {}: {error}", witness_path.display())); + + PreparedProof { + zkey_path: zkey.to_string_lossy().into_owned(), + witness, + } +} + +fn prove(prepared: PreparedProof) -> rapidsnark::ProofResult { + rapidsnark::prove(&prepared.zkey_path, &prepared.witness) + .expect("Rapidsnark Groth16 proof generation") +} + +fn serialized_proof_size(proof: &rapidsnark::ProofResult) -> usize { + format!( + r#"{{"proof":{},"public_signals":{}}}"#, + proof.proof, proof.public_signals + ) + .len() +} + +fn verification_key() -> String { + let verification_key_path = checked_fixture_file(&fixture_root(), "verification_key.json"); + fs::read_to_string(&verification_key_path) + .unwrap_or_else(|error| panic!("read {}: {error}", verification_key_path.display())) +} + +fn tampered_proof_is_rejected(mut proof: rapidsnark::ProofResult, verification_key: &str) -> bool { + // Keep the proof points well-formed and tamper with the statement shape. + // The pinned iOS verifier can SIGBUS while pairing an otherwise well- + // shaped but invalid proof/signal tuple. Removing one public signal is a + // deterministic statement tamper that the verifier rejects while parsing + // the empty public-input vector, before entering that unsafe pairing path. + proof.public_signals = "[]".to_owned(); + match rapidsnark::verify(&proof, verification_key) { + Ok(valid) => !valid, + Err(_) => true, + } +} + +fn validation_gate() { + static VALIDATED: Once = Once::new(); + VALIDATED.call_once(|| { + let verification_mode = option_env!("MOBENCH_RAPIDSNARK_VALIDATION_MODE").unwrap_or("full"); + if matches!( + verification_mode, + "sample_verify_no_canary" | "measurement_only" + ) { + return; + } + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=verification_key_start"); + let verification_key = verification_key(); + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=fixture_load_start"); + let frozen = load_proof_fixture(); + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=witness_start"); + let generated = generate_witness(); + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=witness_done"); + assert_eq!( + generated, frozen.witness, + "live Passport WTNS differs from frozen canary" + ); + if verification_mode == "sample_verify" { + return; + } + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=prove_start"); + let proof = rapidsnark::prove(&frozen.zkey_path, &generated) + .expect("Rapidsnark live Passport canary"); + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=prove_done"); + if verification_mode != "tamper_only" && verification_mode != "sample_verify" { + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=verify_valid_start"); + assert!( + rapidsnark::verify(&proof, &verification_key) + .expect("verify valid Rapidsnark passport canary"), + "valid Rapidsnark passport canary was rejected" + ); + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=verify_valid_done"); + } + if verification_mode != "valid_only" && verification_mode != "sample_verify" { + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=verify_tampered_start"); + assert!( + tampered_proof_is_rejected(proof, &verification_key), + "tampered Rapidsnark passport canary was accepted" + ); + eprintln!("MOBENCH_RAPIDSNARK_GATE stage=verify_tampered_done"); + } + }); +} + +fn setup_input_to_proof() -> PreparedInputToProof { + validation_gate(); + let zkey_path = proving_key_path(&fixture_root()); + let zkey_size = fs::metadata(&zkey_path) + .expect("read passport zkey metadata") + .len(); + let wasm_size = env!("MOBENCH_LIVE_WITNESS_WASM_BYTES") + .parse::() + .expect("live witness WASM byte count"); + let input_size = INPUTS.len() as u64; + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("witness_wasm_size_bytes", wasm_size); + mobench_sdk::record_run_u64("input_size_bytes", input_size); + mobench_sdk::record_run_u64( + "proving_payload_size_bytes", + zkey_size + wasm_size + input_size, + ); + PreparedInputToProof { + zkey_path: zkey_path.to_string_lossy().into_owned(), + } +} + +#[cfg(not(feature = "passport-p1"))] +#[benchmark(setup = setup_input_to_proof, per_iteration)] +pub fn bench_passport_rapidsnark_input_to_proof(prepared: PreparedInputToProof) { + bench_passport_input_to_proof_impl(prepared); +} + +#[cfg(feature = "passport-p1")] +#[benchmark(setup = setup_input_to_proof, per_iteration)] +pub fn bench_passport_p1_rapidsnark_input_to_proof(prepared: PreparedInputToProof) { + bench_passport_input_to_proof_impl(prepared); +} + +fn bench_passport_input_to_proof_impl(prepared: PreparedInputToProof) { + if option_env!("MOBENCH_RAPIDSNARK_VALIDATION_MODE") == Some("tamper_only") { + black_box(prepared); + return; + } + let input_to_proof_started = Instant::now(); + let witness_started = Instant::now(); + let witness = generate_witness(); + let witness_time_ns = witness_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + let prove_started = Instant::now(); + let proof = rapidsnark::prove(&prepared.zkey_path, &witness) + .expect("Rapidsnark live-witness Passport proof"); + let prove_time_ns = prove_started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + let input_to_proof_time_ns = input_to_proof_started + .elapsed() + .as_nanos() + .min(u128::from(u64::MAX)) as u64; + if matches!( + option_env!("MOBENCH_RAPIDSNARK_VALIDATION_MODE"), + Some("sample_verify" | "sample_verify_no_canary") + ) { + let verification_key = verification_key(); + assert!( + rapidsnark::verify(&proof, &verification_key) + .expect("verify measured Rapidsnark Passport proof"), + "measured Rapidsnark Passport proof was rejected" + ); + } + mobench_sdk::record_sample_u64("witness_time_ns", witness_time_ns); + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("input_to_proof_time_ns", input_to_proof_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", serialized_proof_size(&proof) as u64); + black_box(proof); +} + +fn setup_proof() -> PreparedProof { + validation_gate(); + let root = fixture_root(); + let zkey_size = fs::metadata(checked_fixture_file(&root, "proving_key.zkey")) + .expect("read passport zkey metadata") + .len(); + let witness_size = fs::metadata(checked_fixture_file(&root, "reference.wtns")) + .expect("read passport witness metadata") + .len(); + mobench_sdk::record_run_u64("zkey_size_bytes", zkey_size); + mobench_sdk::record_run_u64("witness_size_bytes", witness_size); + mobench_sdk::record_run_u64("proving_payload_size_bytes", zkey_size + witness_size); + load_proof_fixture() +} + +fn setup_verification() -> PreparedVerification { + validation_gate(); + let prepared = load_proof_fixture(); + let proof = rapidsnark::prove(&prepared.zkey_path, &prepared.witness) + .expect("prepare verified Rapidsnark proof"); + let verification_key = verification_key(); + assert!( + rapidsnark::verify(&proof, &verification_key).expect("verify prepared Rapidsnark proof"), + "prepared Rapidsnark proof must verify" + ); + PreparedVerification { + proof, + verification_key, + } +} + +fn setup_proof_verify() -> PreparedProofVerify { + validation_gate(); + PreparedProofVerify { + proof: load_proof_fixture(), + verification_key: verification_key(), + } +} + +#[benchmark(setup = setup_proof, per_iteration)] +pub fn bench_passport_rapidsnark_prove(prepared: PreparedProof) { + let started = Instant::now(); + let proof = prove(prepared); + let prove_time_ns = started.elapsed().as_nanos().min(u128::from(u64::MAX)) as u64; + mobench_sdk::record_sample_u64("prove_time_ns", prove_time_ns); + mobench_sdk::record_sample_u64("proof_size_bytes", serialized_proof_size(&proof) as u64); + black_box(proof); +} + +#[benchmark(setup = setup_verification)] +pub fn bench_passport_rapidsnark_verify(prepared: &PreparedVerification) { + let valid = rapidsnark::verify(&prepared.proof, &prepared.verification_key) + .expect("Rapidsnark Groth16 verification"); + assert!(valid, "valid Rapidsnark proof was rejected"); + black_box(valid); +} + +#[benchmark(setup = setup_proof_verify, per_iteration)] +pub fn bench_passport_rapidsnark_proof_verify(prepared: PreparedProofVerify) { + let proof = prove(prepared.proof); + let valid = rapidsnark::verify(&proof, &prepared.verification_key) + .expect("Rapidsnark passport proof-and-verify"); + assert!( + valid, + "Rapidsnark passport proof-and-verify rejected its proof" + ); + black_box((proof, valid)); +} + +uniffi::setup_scaffolding!(); +mobench_sdk::export_native_c_abi!(); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn registers_expected_mobench_functions() { + let names = mobench_sdk::list_benchmark_names(); + eprintln!("registered benchmarks: {names:?}"); + #[cfg(not(feature = "passport-p1"))] + assert!( + names + .iter() + .any(|name| name.ends_with("::bench_passport_rapidsnark_input_to_proof")), + "registered benchmarks: {names:?}" + ); + #[cfg(feature = "passport-p1")] + assert!( + names + .iter() + .any(|name| name.ends_with("::bench_passport_p1_rapidsnark_input_to_proof")), + "registered benchmarks: {names:?}" + ); + assert!( + names + .iter() + .any(|name| name.ends_with("::bench_passport_rapidsnark_prove")), + "registered benchmarks: {names:?}" + ); + assert!( + names + .iter() + .any(|name| name.ends_with("::bench_passport_rapidsnark_verify")), + "registered benchmarks: {names:?}" + ); + assert!( + names + .iter() + .any(|name| name.ends_with("::bench_passport_rapidsnark_proof_verify")), + "registered benchmarks: {names:?}" + ); + } + + #[test] + fn frozen_fixture_proves_verifies_and_rejects_tampering() { + validation_gate(); + } +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/live_witness.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/live_witness.rs new file mode 100644 index 000000000..25f92fb6c --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/live_witness.rs @@ -0,0 +1,92 @@ +//! Shared raw-Circom-input to WTNS helpers for native Rapidsnark benchmarks. + +use { + num_bigint::{BigInt, Sign}, + serde_json::Value, + std::{collections::HashMap, str::FromStr}, +}; + +pub(crate) fn parse_inputs(input_json: &str) -> HashMap> { + fn flatten(value: &Value, output: &mut Vec) { + match value { + Value::Array(values) => values.iter().for_each(|value| flatten(value, output)), + Value::String(value) => { + output.push(BigInt::from_str(value).expect("Circom decimal input")) + } + Value::Number(value) => { + output.push(BigInt::from_str(&value.to_string()).expect("Circom numeric input")) + } + _ => panic!("unsupported Circom input value: {value}"), + } + } + + serde_json::from_str::(input_json) + .expect("parse Circom input JSON") + .as_object() + .expect("Circom inputs must be an object") + .iter() + .map(|(name, value)| { + let mut values = Vec::new(); + flatten(value, &mut values); + (name.clone(), values) + }) + .collect() +} + + +/// Serialize a solved BN254 witness using the WTNS v2 format consumed by +/// Rapidsnark. Field elements are fixed-width, little-endian canonical values. +pub(crate) fn serialize_wtns(witness: &[BigInt]) -> Vec { + const FIELD_BYTES: usize = 32; + const BN254_SCALAR_MODULUS_LE: [u8; FIELD_BYTES] = [ + 1, 0, 0, 240, 147, 245, 225, 67, 145, 112, 185, 121, 72, 232, 51, 40, 93, 88, 129, 129, + 182, 69, 80, 184, 41, 160, 49, 225, 114, 78, 100, 48, + ]; + + let witness_bytes = witness + .len() + .checked_mul(FIELD_BYTES) + .expect("WTNS witness byte length overflow"); + let mut output = Vec::with_capacity(76 + witness_bytes); + output.extend_from_slice(b"wtns"); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&1_u32.to_le_bytes()); + output.extend_from_slice(&(4_u64 + FIELD_BYTES as u64 + 4).to_le_bytes()); + output.extend_from_slice(&(FIELD_BYTES as u32).to_le_bytes()); + output.extend_from_slice(&BN254_SCALAR_MODULUS_LE); + output.extend_from_slice( + &u32::try_from(witness.len()) + .expect("WTNS witness count exceeds u32") + .to_le_bytes(), + ); + output.extend_from_slice(&2_u32.to_le_bytes()); + output.extend_from_slice(&(witness_bytes as u64).to_le_bytes()); + for value in witness { + let (sign, bytes) = value.to_bytes_le(); + assert!(sign != Sign::Minus, "negative canonical Circom witness"); + assert!( + bytes.len() <= FIELD_BYTES, + "Circom witness exceeds BN254 field width" + ); + output.extend_from_slice(&bytes); + output.resize(output.len() + FIELD_BYTES - bytes.len(), 0); + } + output +} + +#[cfg(test)] +mod tests { + use {super::serialize_wtns, num_bigint::BigInt}; + + #[test] + fn writes_wtns_v2_header_and_fixed_width_values() { + let bytes = serialize_wtns(&[BigInt::from(1_u8), BigInt::from(2_u8)]); + assert_eq!(&bytes[..4], b"wtns"); + assert_eq!(u32::from_le_bytes(bytes[4..8].try_into().unwrap()), 2); + assert_eq!(u32::from_le_bytes(bytes[60..64].try_into().unwrap()), 2); + assert_eq!(bytes.len(), 140); + assert_eq!(bytes[76], 1); + assert_eq!(bytes[108], 2); + } +} diff --git a/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs b/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs new file mode 100644 index 000000000..81934f7ee --- /dev/null +++ b/benchmarks/v1/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs @@ -0,0 +1,130 @@ +//! Minimal safe wrapper around the pinned iden3 Rapidsnark C ABI. +//! +//! Adapted from `zkmopro/rust-rapidsnark` revision +//! `df3831a8c24e25c9a7e0a8684e1b3784e02b57f2` (MIT OR Apache-2.0). The +//! upstream crate's native-binary host no longer resolves, so this benchmark +//! links the same libraries built from the campaign's pinned iden3 source. + +use { + anyhow::{anyhow, Result}, + std::{ + ffi::{c_char, c_ulong, c_void, CStr, CString}, + ptr, + }, +}; + +#[derive(Debug)] +pub struct ProofResult { + pub proof: String, + pub public_signals: String, +} + +unsafe extern "C" { + fn groth16_prover_zkey_file( + zkey_file_path: *const c_char, + wtns_buffer: *const c_void, + wtns_size: u64, + proof_buffer: *mut c_char, + proof_size: *mut u64, + public_buffer: *mut c_char, + public_size: *mut u64, + error_msg: *mut c_char, + error_msg_maxsize: u64, + ) -> i32; + + fn groth16_verify( + proof: *const c_char, + inputs: *const c_char, + verification_key: *const c_char, + error_msg: *mut c_char, + error_msg_maxsize: c_ulong, + ) -> i32; +} + +pub fn verify(proof: &ProofResult, verification_key: &str) -> Result { + let proof_json = + CString::new(proof.proof.as_str()).map_err(|_| anyhow!("proof contains a NUL"))?; + let public_json = CString::new(proof.public_signals.as_str()) + .map_err(|_| anyhow!("public signals contain a NUL"))?; + let verification_key = + CString::new(verification_key).map_err(|_| anyhow!("verification key contains a NUL"))?; + let mut error = vec![0_u8; 1024]; + + // SAFETY: All inputs are valid NUL-terminated strings and the writable + // error buffer remains live for the duration of the native call. + let status = unsafe { + groth16_verify( + proof_json.as_ptr(), + public_json.as_ptr(), + verification_key.as_ptr(), + error.as_mut_ptr().cast::(), + error.len() as c_ulong, + ) + }; + if status == 2 { + // SAFETY: The zero-initialized buffer is NUL-terminated. + let message = unsafe { CStr::from_ptr(error.as_ptr().cast::()) }.to_string_lossy(); + return Err(anyhow!("Rapidsnark verification error: {message}")); + } + Ok(status == 0) +} + +pub fn prove(zkey_path: &str, witness: &[u8]) -> Result { + let zkey_path = + CString::new(zkey_path).map_err(|_| anyhow!("zkey path contains an interior NUL"))?; + let mut proof = vec![0_u8; 4 * 1024 * 1024]; + let mut proof_size = proof.len() as u64; + let mut public = vec![0_u8; 4 * 1024 * 1024]; + let mut public_size = public.len() as u64; + let mut error = vec![0_u8; 1024]; + + // SAFETY: All pointers reference live buffers for the duration of the call. + // Output capacities are provided to the C ABI, the zkey is NUL-terminated, + // and the frozen witness bytes are passed with their exact length. + let status = unsafe { + groth16_prover_zkey_file( + zkey_path.as_ptr(), + witness.as_ptr().cast::(), + witness.len() as u64, + proof.as_mut_ptr().cast::(), + &mut proof_size, + public.as_mut_ptr().cast::(), + &mut public_size, + error.as_mut_ptr().cast::(), + error.len() as u64, + ) + }; + if status != 0 { + // SAFETY: The error buffer was zero-initialized, so it remains + // NUL-terminated even if the native library writes no message. + let message = unsafe { CStr::from_ptr(error.as_ptr().cast::()) }.to_string_lossy(); + return Err(anyhow!("Rapidsnark failed with status {status}: {message}")); + } + + fn output_string(bytes: &[u8], declared_size: u64, name: &str) -> Result { + let size = usize::try_from(declared_size).map_err(|_| anyhow!("{name} size overflow"))?; + let bounded = bytes + .get(..size.min(bytes.len())) + .ok_or_else(|| anyhow!("{name} output size is invalid"))?; + let end = bounded + .iter() + .position(|byte| *byte == 0) + .unwrap_or(bounded.len()); + String::from_utf8(bounded[..end].to_vec()) + .map_err(|error| anyhow!("{name} output is not UTF-8: {error}")) + } + + let result = ProofResult { + proof: output_string(&proof, proof_size, "proof")?, + public_signals: output_string(&public, public_size, "public signals")?, + }; + black_box_ptrs(&result); + Ok(result) +} + +#[inline(never)] +fn black_box_ptrs(result: &ProofResult) { + std::hint::black_box(result.proof.as_ptr()); + std::hint::black_box(result.public_signals.as_ptr()); + std::hint::black_box(ptr::null::()); +} diff --git a/benchmarks/v1/scripts/android-env.sh b/benchmarks/v1/scripts/android-env.sh new file mode 100755 index 000000000..ec0b34fed --- /dev/null +++ b/benchmarks/v1/scripts/android-env.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +# Source from Android build scripts. This resolves only locked, +# campaign-supported locations and never installs tools. + +readonly V1_ANDROID_JAVA_VERSION="temurin-21.0.11+10.0.LTS" +readonly V1_ANDROID_NDK_VERSION="26.1.10909125" + +if [[ -z "${JAVA_HOME:-}" ]]; then + if command -v mise >/dev/null 2>&1; then + java_home="$(mise where "java@${V1_ANDROID_JAVA_VERSION}" 2>/dev/null || true)" + [[ -z "${java_home}" ]] || export JAVA_HOME="${java_home}" + unset java_home + elif [[ -d "/Applications/Android Studio.app/Contents/jbr/Contents/Home" ]]; then + export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" + fi +fi + +if [[ -z "${ANDROID_HOME:-}" ]]; then + if [[ -n "${ANDROID_SDK_ROOT:-}" ]]; then + export ANDROID_HOME="${ANDROID_SDK_ROOT}" + elif [[ -d "${HOME}/Library/Android/sdk" ]]; then + export ANDROID_HOME="${HOME}/Library/Android/sdk" + fi +fi +if [[ -n "${ANDROID_HOME:-}" ]]; then + export ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME}}" + export ANDROID_NDK_HOME="${ANDROID_NDK_HOME:-${ANDROID_HOME}/ndk/${V1_ANDROID_NDK_VERSION}}" + export PATH="${ANDROID_HOME}/platform-tools:${PATH}" +fi + +[[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]] || { + echo "error: install locked Java with: mise install java@${V1_ANDROID_JAVA_VERSION}" >&2 + return 1 2>/dev/null || exit 1 +} +[[ "$("${JAVA_HOME}/bin/java" -version 2>&1 | head -1)" == *'"21.0.11"'* ]] || { + echo "error: Android campaign builds require locked Java 21.0.11, found:" >&2 + "${JAVA_HOME}/bin/java" -version >&2 + return 1 2>/dev/null || exit 1 +} +[[ -n "${ANDROID_HOME:-}" && -d "${ANDROID_HOME}/platforms/android-34" ]] || { + echo "error: Android SDK platform 34 is required under ANDROID_HOME" >&2 + return 1 2>/dev/null || exit 1 +} +[[ -d "${ANDROID_NDK_HOME}" ]] || { + echo "error: Android NDK ${V1_ANDROID_NDK_VERSION} is required" >&2 + return 1 2>/dev/null || exit 1 +} diff --git a/benchmarks/v1/scripts/bootstrap-android-java.sh b/benchmarks/v1/scripts/bootstrap-android-java.sh new file mode 100755 index 000000000..fbf69782b --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-android-java.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -euo pipefail + +readonly java_version="temurin-21.0.11+10.0.LTS" +command -v mise >/dev/null 2>&1 || { + echo "error: mise is required to install the locked Android JDK" >&2 + exit 1 +} +mise install "java@${java_version}" +java_home="$(mise where "java@${java_version}")" +"${java_home}/bin/java" -version diff --git a/benchmarks/v1/scripts/bootstrap-barretenberg.sh b/benchmarks/v1/scripts/bootstrap-barretenberg.sh new file mode 100755 index 000000000..ff752f442 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-barretenberg.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -euo pipefail + +version="${BARRETENBERG_VERSION:-0.87.0}" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +install_dir="${repo_root}/target/v1-benchmarks/tools/barretenberg-${version}" +archive="${install_dir}/barretenberg-arm64-darwin.tar.gz" +binary="${install_dir}/bb" + +if [[ "$(uname -s)-$(uname -m)" != "Darwin-arm64" ]]; then + echo "error: the pinned Mac benchmark currently supports Darwin arm64 only" >&2 + exit 1 +fi + +if [[ ! -x "${binary}" ]]; then + mkdir -p "${install_dir}" + if [[ ! -f "${archive}" ]]; then + gh release download "v${version}" \ + --repo AztecProtocol/aztec-packages \ + --pattern barretenberg-arm64-darwin.tar.gz \ + --dir "${install_dir}" + fi + tar -xzf "${archive}" -C "${install_dir}" +fi + +actual="$("${binary}" --version)" +if [[ "${actual}" != "v${version}" ]]; then + echo "error: expected Barretenberg v${version}, got ${actual}" >&2 + exit 1 +fi + +printf '%s\n' "${binary}" diff --git a/benchmarks/v1/scripts/bootstrap-circom.sh b/benchmarks/v1/scripts/bootstrap-circom.sh new file mode 100755 index 000000000..dd6ebec78 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-circom.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_dir="${repo_root}/target/v1-benchmarks/sources/circom" +install_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}/circom" +binary="${install_root}/bin/circom" + +for command in cargo jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +"${script_dir}/bootstrap-sources.sh" >/dev/null + +if [[ -x "${binary}" ]]; then + "${binary}" --version >&2 + echo "${binary}" + exit 0 +fi + +cargo install --locked --path "${source_dir}/circom" --root "${install_root}" +"${binary}" --version >&2 +echo "${binary}" diff --git a/benchmarks/v1/scripts/bootstrap-mobench.sh b/benchmarks/v1/scripts/bootstrap-mobench.sh new file mode 100755 index 000000000..1515aeee0 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-mobench.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/toolchains.lock.json" +install_root="${repo_root}/target/v1-benchmarks/toolchains/mobench" +revision_file="${install_root}/.source-revision" + +repository="$(jq -er '.mobench.repository' "${lock_file}")" +revision="$(jq -er '.mobench.source_revision' "${lock_file}")" + +if [[ -x "${install_root}/bin/cargo-mobench" ]] && + [[ -f "${revision_file}" ]] && + [[ "$(<"${revision_file}")" == "${revision}" ]]; then + "${install_root}/bin/cargo-mobench" --version + exit 0 +fi + +cargo install mobench \ + --git "${repository}" \ + --rev "${revision}" \ + --locked \ + --force \ + --root "${install_root}" + +printf '%s\n' "${revision}" >"${revision_file}" +"${install_root}/bin/cargo-mobench" --version diff --git a/benchmarks/v1/scripts/bootstrap-mopro.sh b/benchmarks/v1/scripts/bootstrap-mopro.sh new file mode 100755 index 000000000..04f99c47b --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-mopro.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +tool_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}" +install_root="${tool_root}/mopro" +binary="${install_root}/bin/mopro" +lock_file="${benchmark_root}/sources.lock.json" + +for command in cargo git jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +"${script_dir}/bootstrap-sources.sh" >/dev/null + +mopro_revision="$( + jq -er '.sources[] | select(.name == "mopro") | .revision' "${lock_file}" +)" +mopro_version="$( + jq -er '.sources[] | select(.name == "mopro") | .version' "${lock_file}" +)" +rapidsnark_revision="$( + jq -er '.sources[] | select(.name == "rust-rapidsnark") | .revision' "${lock_file}" +)" + +if [[ "$(git -C "${source_root}/mopro" rev-parse HEAD)" != "${mopro_revision}" ]]; then + echo "error: Mopro checkout does not match sources.lock.json" >&2 + exit 1 +fi +if [[ "$(git -C "${source_root}/rust-rapidsnark" rev-parse HEAD)" != "${rapidsnark_revision}" ]]; then + echo "error: rust-rapidsnark checkout does not match sources.lock.json" >&2 + exit 1 +fi + +if [[ ! -x "${binary}" ]]; then + cargo install \ + --locked \ + --path "${source_root}/mopro/cli" \ + --root "${install_root}" +fi + +actual_version="$("${binary}" --version | awk '{print $2}')" +if [[ "${actual_version}" != "${mopro_version}" ]]; then + echo "error: ${binary} reports ${actual_version}, expected ${mopro_version}" >&2 + exit 1 +fi + +echo "${binary}" diff --git a/benchmarks/v1/scripts/bootstrap-nargo.sh b/benchmarks/v1/scripts/bootstrap-nargo.sh new file mode 100755 index 000000000..ca0eeb688 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-nargo.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/toolchains.lock.json" +tool_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}" +lock_key="${V1_NARGO_LOCK_KEY:-noir}" + +for command in curl jq tar; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if command -v sha256sum >/dev/null 2>&1; then + hash_file() { + sha256sum "$1" | awk '{print $1}' + } +elif command -v shasum >/dev/null 2>&1; then + hash_file() { + shasum -a 256 "$1" | awk '{print $1}' + } +else + echo "error: sha256sum or shasum is required" >&2 + exit 1 +fi + +case "$(uname -m)-$(uname -s)" in + arm64-Darwin) + platform="aarch64-apple-darwin" + ;; + x86_64-Darwin) + platform="x86_64-apple-darwin" + ;; + aarch64-Linux | arm64-Linux) + platform="aarch64-unknown-linux-gnu" + ;; + x86_64-Linux) + platform="x86_64-unknown-linux-gnu" + ;; + *) + echo "error: unsupported Nargo host $(uname -m)-$(uname -s)" >&2 + exit 1 + ;; +esac + +case "${lock_key}" in + noir | noir_provekit) ;; + *) + echo "error: unsupported Nargo lock key ${lock_key}" >&2 + exit 1 + ;; +esac + +version="$(jq -r --arg key "${lock_key}" '.[$key].version' "${lock_file}")" +base_url="$(jq -r --arg key "${lock_key}" '.[$key].base_url' "${lock_file}")" +asset="$( + jq -r --arg key "${lock_key}" --arg platform "${platform}" \ + '.[$key].assets[$platform].name' "${lock_file}" +)" +expected_sha="$( + jq -r --arg key "${lock_key}" --arg platform "${platform}" \ + '.[$key].assets[$platform].sha256' "${lock_file}" +)" +destination="${tool_root}/nargo-${version}-${platform}" + +if [[ -x "${destination}/nargo" ]]; then + actual_version="$("${destination}/nargo" --version | sed -n 's/^nargo version = //p')" + if [[ "${actual_version}" != "${version}" ]]; then + echo "error: ${destination}/nargo reports ${actual_version}, expected ${version}" >&2 + exit 1 + fi + echo "${destination}/nargo" + exit 0 +fi + +mkdir -p "${tool_root}" +archive="$(mktemp "${tool_root}/nargo.XXXXXX.tar.gz")" +extract_dir="$(mktemp -d "${tool_root}/nargo.XXXXXX")" +trap 'rm -f "${archive}"; rm -rf "${extract_dir}"' EXIT + +curl --fail --location --silent --show-error "${base_url}/${asset}" --output "${archive}" +actual_sha="$(hash_file "${archive}")" +if [[ "${actual_sha}" != "${expected_sha}" ]]; then + echo "error: ${asset} has SHA-256 ${actual_sha}, expected ${expected_sha}" >&2 + exit 1 +fi + +tar -xzf "${archive}" -C "${extract_dir}" +if [[ ! -x "${extract_dir}/nargo" ]]; then + echo "error: ${asset} did not contain an executable nargo" >&2 + exit 1 +fi + +mv "${extract_dir}" "${destination}" +trap 'rm -f "${archive}"' EXIT +"${destination}/nargo" --version >&2 +echo "${destination}/nargo" diff --git a/benchmarks/v1/scripts/bootstrap-ptau.sh b/benchmarks/v1/scripts/bootstrap-ptau.sh new file mode 100755 index 000000000..5b43dad78 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-ptau.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/circom/trusted-setup.lock.json" +setup_root="${V1_BENCHMARK_SETUP_ROOT:-${repo_root}/target/v1-benchmarks/trusted-setup}" +power="${1:-20}" +selector="powersOfTau28_hez_final_${power}" +artifact="$(jq -ec --arg name "${selector}" '.artifacts[] | select(.name == $name)' "${lock_file}")" || { + echo "error: no trusted setup artifact is pinned for power ${power}" >&2 + exit 1 +} +name="$(jq -r '.name' <<<"${artifact}")" +url="$(jq -r '.url' <<<"${artifact}")" +expected_size="$(jq -r '.size' <<<"${artifact}")" +expected_sha256="$(jq -r '.sha256 // empty' <<<"${artifact}")" +expected_hash="$(jq -r '.blake2b512' <<<"${artifact}")" +destination="${setup_root}/${name}.ptau" + +for command in curl jq openssl stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +stat_size() { + if [[ "$(uname -s)" == "Darwin" ]]; then + stat -f '%z' "$1" + else + stat -c '%s' "$1" + fi +} + +verify() { + local actual_size + local actual_sha256 + local actual_hash + actual_size="$(stat_size "${destination}")" + if [[ "${actual_size}" != "${expected_size}" ]]; then + return 1 + fi + if [[ -n "${expected_sha256}" ]]; then + actual_sha256="$( + openssl dgst -sha256 "${destination}" | + awk '{print tolower($NF)}' + )" + if [[ "${actual_sha256}" != "${expected_sha256}" ]]; then + return 1 + fi + fi + actual_hash="$( + openssl dgst -blake2b512 "${destination}" | + awk '{print tolower($NF)}' + )" + [[ "${actual_hash}" == "${expected_hash}" ]] +} + +if [[ -f "${destination}" ]] && verify; then + echo "${destination}" + exit 0 +fi + +mkdir -p "${setup_root}" +curl \ + --fail \ + --location \ + --retry 3 \ + --continue-at - \ + --output "${destination}" \ + "${url}" + +if ! verify; then + echo "error: downloaded PTAU does not match the pinned size and checksums" >&2 + exit 1 +fi + +echo "${destination}" diff --git a/benchmarks/v1/scripts/bootstrap-sources.sh b/benchmarks/v1/scripts/bootstrap-sources.sh new file mode 100755 index 000000000..39b4aebc8 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-sources.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/sources.lock.json" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" + +for command in git jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +mkdir -p "${source_root}" + +jq -c '.sources[]' "${lock_file}" | while IFS= read -r source; do + name="$(jq -r '.name' <<<"${source}")" + url="$(jq -r '.url' <<<"${source}")" + revision="$(jq -r '.revision' <<<"${source}")" + destination="${source_root}/${name}" + + if [[ -e "${destination}" ]]; then + if [[ ! -d "${destination}/.git" ]]; then + echo "error: refusing to replace non-Git path ${destination}" >&2 + exit 1 + fi + + actual_revision="$(git -C "${destination}" rev-parse HEAD)" + if [[ "${actual_revision}" != "${revision}" ]]; then + echo "error: ${destination} is at ${actual_revision}, expected ${revision}" >&2 + echo "Remove or move that checkout explicitly before retrying." >&2 + exit 1 + fi + + if [[ "$(jq '.sparse_paths | length' <<<"${source}")" -gt 0 ]]; then + git -C "${destination}" sparse-checkout init --cone + jq -r '.sparse_paths[]' <<<"${source}" | + git -C "${destination}" sparse-checkout set --stdin + elif git -C "${destination}" config --bool core.sparseCheckout | grep -qx true; then + git -C "${destination}" sparse-checkout disable + fi + + if [[ "$(jq -r '.submodules // false' <<<"${source}")" == "true" ]]; then + git -C "${destination}" submodule update --init --recursive + fi + + echo "verified ${name} at ${revision}" + continue + fi + + echo "fetching ${name} at ${revision}" + git init --quiet "${destination}" + git -C "${destination}" remote add origin "${url}" + + if [[ "$(jq '.sparse_paths | length' <<<"${source}")" -gt 0 ]]; then + git -C "${destination}" sparse-checkout init --cone + jq -r '.sparse_paths[]' <<<"${source}" | + git -C "${destination}" sparse-checkout set --stdin + fi + + git -C "${destination}" fetch --quiet --depth 1 origin "${revision}" + git -C "${destination}" checkout --quiet --detach FETCH_HEAD + + actual_revision="$(git -C "${destination}" rev-parse HEAD)" + if [[ "${actual_revision}" != "${revision}" ]]; then + echo "error: fetched ${name} at ${actual_revision}, expected ${revision}" >&2 + exit 1 + fi + + if [[ "$(jq -r '.submodules // false' <<<"${source}")" == "true" ]]; then + git -C "${destination}" submodule update --init --recursive + fi + + echo "ready ${name}" +done + +echo "Pinned sources are ready under ${source_root}" diff --git a/benchmarks/v1/scripts/bootstrap-w2c2.sh b/benchmarks/v1/scripts/bootstrap-w2c2.sh new file mode 100755 index 000000000..b4ef56ae9 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-w2c2.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +tool_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}" +source_dir="${source_root}/w2c2" +build_dir="${repo_root}/target/v1-benchmarks/build/w2c2-host" +binary="${tool_root}/w2c2/bin/w2c2" + +for command in cmake git jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +"${script_dir}/bootstrap-sources.sh" >/dev/null +expected_revision="$( + jq -er '.sources[] | select(.name == "w2c2") | .revision' \ + "${benchmark_root}/sources.lock.json" +)" +if [[ "$(git -C "${source_dir}" rev-parse HEAD)" != "${expected_revision}" ]]; then + echo "error: w2c2 source revision does not match sources.lock.json" >&2 + exit 1 +fi + +if [[ ! -x "${binary}" ]]; then + cmake \ + -S "${source_dir}" \ + -B "${build_dir}" \ + -DCMAKE_BUILD_TYPE=Release + cmake --build "${build_dir}" --target w2c2 --parallel "${V1_BUILD_JOBS:-4}" + mkdir -p "$(dirname "${binary}")" + install -m 0755 "${build_dir}/w2c2/w2c2" "${binary}" +fi + +echo "${binary}" diff --git a/benchmarks/v1/scripts/bootstrap-wasm-bindgen.sh b/benchmarks/v1/scripts/bootstrap-wasm-bindgen.sh new file mode 100755 index 000000000..7f46d803a --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-wasm-bindgen.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/toolchains.lock.json" +version="$(jq -r '.wasm_bindgen_cli.version' "${lock_file}")" +install_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}/wasm-bindgen-cli-${version}" +binary="${install_root}/bin/wasm-bindgen" + +for command in cargo jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ -x "${binary}" ]]; then + actual_version="$("${binary}" --version | awk '{print $2}')" + if [[ "${actual_version}" != "${version}" ]]; then + echo "error: ${binary} reports ${actual_version}, expected ${version}" >&2 + exit 1 + fi + echo "${binary}" + exit 0 +fi + +cargo install \ + --locked \ + --root "${install_root}" \ + --version "${version}" \ + wasm-bindgen-cli + +"${binary}" --version >&2 +echo "${binary}" diff --git a/benchmarks/v1/scripts/bootstrap-webauthn-source.sh b/benchmarks/v1/scripts/bootstrap-webauthn-source.sh new file mode 100755 index 000000000..4c92ad944 --- /dev/null +++ b/benchmarks/v1/scripts/bootstrap-webauthn-source.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/sources.lock.json" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +nargo_home="${V1_BENCHMARK_NARGO_HOME:-${repo_root}/target/v1-benchmarks/nargo-home}" +destination="${source_root}/world-id-protocol" +vendor_relative="crates/proof/noir/passkey-ownership-proof/vendor" +required_manifests=( + "webauthn/Nargo.toml" + "noir-bignum-mavros/Nargo.toml" + "noir_bigcurve-mavros/Nargo.toml" + "nodash/Nargo.toml" +) + +for command in git jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +source_entry="$(jq -ce '.sources[] | select(.name == "world-id-protocol")' "${lock_file}")" +url="$(jq -r '.url' <<<"${source_entry}")" +revision="$(jq -r '.revision' <<<"${source_entry}")" + +validate_checkout() { + local checkout="$1" + local actual_revision + + actual_revision="$(git -C "${checkout}" rev-parse HEAD)" + if [[ "${actual_revision}" != "${revision}" ]]; then + echo "error: ${checkout} is at ${actual_revision}, expected ${revision}" >&2 + return 1 + fi + + for manifest in "${required_manifests[@]}"; do + if [[ ! -s "${checkout}/${vendor_relative}/${manifest}" ]]; then + echo "error: pinned WebAuthn dependency is missing ${vendor_relative}/${manifest}" >&2 + return 1 + fi + done + + if [[ -n "$(git -C "${checkout}" status --porcelain -- "${vendor_relative}")" ]]; then + echo "error: pinned World ID WebAuthn vendor source has local changes" >&2 + git -C "${checkout}" status --short -- "${vendor_relative}" >&2 + return 1 + fi +} + +if [[ -e "${destination}" ]]; then + if [[ ! -d "${destination}/.git" ]]; then + echo "error: refusing to replace non-Git path ${destination}" >&2 + exit 1 + fi + + if [[ "$(git -C "${destination}" rev-parse HEAD)" != "${revision}" ]]; then + echo "error: ${destination} is not at expected revision ${revision}" >&2 + echo "Remove or move that checkout explicitly before retrying." >&2 + exit 1 + fi + + missing_vendor_manifest=0 + for manifest in "${required_manifests[@]}"; do + if [[ ! -s "${destination}/${vendor_relative}/${manifest}" ]]; then + missing_vendor_manifest=1 + break + fi + done + + if [[ "${missing_vendor_manifest}" == "1" ]]; then + if [[ "$(git -C "${destination}" config --bool core.sparseCheckout || true)" != "true" ]]; then + echo "error: full checkout ${destination} is missing the pinned WebAuthn vendor source" >&2 + exit 1 + fi + git -C "${destination}" sparse-checkout add "${vendor_relative}" + fi +else + mkdir -p "${source_root}" + staging="$(mktemp -d "${source_root}/.world-id-protocol.XXXXXX")" + cleanup_staging() { + if [[ -n "${staging:-}" && -d "${staging}" ]]; then + rm -rf -- "${staging}" + fi + } + trap cleanup_staging EXIT + + echo "fetching the pinned World ID WebAuthn vendor source at ${revision}" + git init --quiet "${staging}" + git -C "${staging}" remote add origin "${url}" + git -C "${staging}" sparse-checkout init --cone + git -C "${staging}" sparse-checkout set "${vendor_relative}" + git -C "${staging}" fetch --quiet --depth 1 --filter=blob:none origin "${revision}" + git -C "${staging}" checkout --quiet --detach FETCH_HEAD + validate_checkout "${staging}" + mv "${staging}" "${destination}" + staging="" + trap - EXIT +fi + +validate_checkout "${destination}" + +ensure_nargo_git_dependency() { + local source_name="$1" + local repository_name="$2" + local entry url dependency_revision dependency_tag dependency_destination staging_dependency + entry="$(jq -ce --arg name "${source_name}" '.sources[] | select(.name == $name)' "${lock_file}")" + url="$(jq -r '.url' <<<"${entry}")" + dependency_revision="$(jq -r '.revision' <<<"${entry}")" + dependency_tag="$(jq -r '.tag' <<<"${entry}")" + dependency_destination="${nargo_home}/nargo/github.com/noir-lang/${repository_name}/${dependency_tag}" + + if [[ -e "${dependency_destination}" ]]; then + if [[ ! -d "${dependency_destination}/.git" ]]; then + echo "error: refusing to replace non-Git Nargo cache path ${dependency_destination}" >&2 + return 1 + fi + if [[ "$(git -C "${dependency_destination}" rev-parse HEAD)" != "${dependency_revision}" ]] || + [[ -n "$(git -C "${dependency_destination}" status --porcelain)" ]]; then + echo "error: cached ${source_name} does not match locked revision ${dependency_revision}" >&2 + return 1 + fi + return + fi + + mkdir -p "$(dirname "${dependency_destination}")" + staging_dependency="$(mktemp -d "$(dirname "${dependency_destination}")/.${source_name}.XXXXXX")" + echo "fetching pinned ${source_name} at ${dependency_revision}" + git init --quiet "${staging_dependency}" + git -C "${staging_dependency}" remote add origin "${url}" + git -C "${staging_dependency}" fetch --quiet --depth 1 --filter=blob:none origin "${dependency_revision}" + git -C "${staging_dependency}" checkout --quiet --detach FETCH_HEAD + if [[ "$(git -C "${staging_dependency}" rev-parse HEAD)" != "${dependency_revision}" ]] || + [[ -n "$(git -C "${staging_dependency}" status --porcelain)" ]]; then + echo "error: fetched ${source_name} does not match locked revision ${dependency_revision}" >&2 + return 1 + fi + mv "${staging_dependency}" "${dependency_destination}" +} + +ensure_nargo_git_dependency "noir-base64" "noir_base64" +ensure_nargo_git_dependency "noir-poseidon" "poseidon" +ensure_nargo_git_dependency "noir-sha256" "sha256" + +echo "Pinned World ID WebAuthn source and Noir dependencies are ready" diff --git a/benchmarks/v1/scripts/browser-process-memory.ts b/benchmarks/v1/scripts/browser-process-memory.ts new file mode 100644 index 000000000..7e69f9ea0 --- /dev/null +++ b/benchmarks/v1/scripts/browser-process-memory.ts @@ -0,0 +1,107 @@ +interface ProcessRow { + pid: number; + ppid: number; + rss_kib: number; + command: string; +} + +export interface RendererMemorySample { + at_ms: number; + renderer_pid: number; + renderer_rss_kib: number; +} + +export interface RendererMemoryReport { + metric: "peak_chrome_renderer_rss"; + peak_rss_kib: number | null; + peak_renderer_pid: number | null; + polling_interval_ms: number; + sample_count: number; +} + +async function processRows(): Promise { + const child = Bun.spawn(["ps", "-axo", "pid=,ppid=,rss=,command="], { + stdout: "pipe", + stderr: "pipe", + }); + const [stdout, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + child.exited, + ]); + if (exitCode !== 0) return []; + return stdout.split("\n").flatMap((line) => { + const match = line.match(/^\s*(\d+)\s+(\d+)\s+(\d+)\s+(.+)$/); + if (!match) return []; + return [{ + pid: Number.parseInt(match[1]!, 10), + ppid: Number.parseInt(match[2]!, 10), + rss_kib: Number.parseInt(match[3]!, 10), + command: match[4]!, + }]; + }); +} + +async function rendererSnapshot(profile: string): Promise { + const rows = await processRows(); + const root = rows.find( + (row) => + row.command.includes(profile) && + row.command.includes("Google Chrome") && + !row.command.includes("--type="), + ); + if (!root) return null; + const descendants = new Set([root.pid]); + let changed = true; + while (changed) { + changed = false; + for (const row of rows) { + if (descendants.has(row.ppid) && !descendants.has(row.pid)) { + descendants.add(row.pid); + changed = true; + } + } + } + const renderer = rows + .filter((row) => descendants.has(row.pid) && row.command.includes("--type=renderer")) + .sort((left, right) => right.rss_kib - left.rss_kib)[0]; + return renderer + ? { + at_ms: Date.now(), + renderer_pid: renderer.pid, + renderer_rss_kib: renderer.rss_kib, + } + : null; +} + +export function startRendererRssSampler(profile: string, pollingIntervalMs = 100) { + let sampling = true; + const samples: RendererMemorySample[] = []; + const completed = (async () => { + while (sampling) { + const sample = await rendererSnapshot(profile); + if (sample) samples.push(sample); + await Bun.sleep(pollingIntervalMs); + } + })(); + + return { + async stop(): Promise { + sampling = false; + await completed; + const peak = samples.reduce( + (current, sample) => + !current || sample.renderer_rss_kib > current.renderer_rss_kib + ? sample + : current, + undefined, + ); + return { + metric: "peak_chrome_renderer_rss", + peak_rss_kib: peak?.renderer_rss_kib ?? null, + peak_renderer_pid: peak?.renderer_pid ?? null, + polling_interval_ms: pollingIntervalMs, + sample_count: samples.length, + }; + }, + }; +} diff --git a/benchmarks/v1/scripts/browserstack-app-cache.sh b/benchmarks/v1/scripts/browserstack-app-cache.sh new file mode 100755 index 000000000..2e1bfb21a --- /dev/null +++ b/benchmarks/v1/scripts/browserstack-app-cache.sh @@ -0,0 +1,179 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 4 ]]; then + echo "usage: $0 " >&2 + exit 2 +fi + +action="$1" +platform="$2" +manifest="$3" +app="$4" + +case "${action}" in + id | lookup | upload) ;; + *) + echo "error: action must be id, lookup, or upload" >&2 + exit 1 + ;; +esac + +case "${platform}" in + ios) + endpoint="xcuitest/v2" + ;; + android) + endpoint="espresso/v2" + ;; + *) + echo "error: platform must be ios or android" >&2 + exit 1 + ;; +esac + +for command in curl jq stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ ! -f "${manifest}" || ! -f "${app}" ]]; then + echo "error: fixture manifest and app package must be regular files" >&2 + exit 1 +fi + +if command -v sha256sum >/dev/null 2>&1; then + hash_stdin() { + sha256sum | awk '{print $1}' + } + app_sha256="$(sha256sum "${app}" | awk '{print $1}')" +elif command -v shasum >/dev/null 2>&1; then + hash_stdin() { + shasum -a 256 | awk '{print $1}' + } + app_sha256="$(shasum -a 256 "${app}" | awk '{print $1}')" +else + echo "error: sha256sum or shasum is required" >&2 + exit 1 +fi +if stat -f '%z' "${app}" >/dev/null 2>&1; then + app_bytes="$(stat -f '%z' "${app}")" +else + app_bytes="$(stat -c '%s' "${app}")" +fi + +campaign_hash="$(jq -er '.campaign_hash | select(test("^[0-9a-f]{64}$"))' "${manifest}")" +cache_slug="$(jq -er '.cache_slug | select(test("^[a-z0-9-]+$"))' "${manifest}")" +actual_campaign_hash="$( + jq 'del(.campaign_hash, .browserstack_fixture_id_prefixes)' "${manifest}" | + jq -S -c . | + hash_stdin +)" +if [[ "${actual_campaign_hash}" != "${campaign_hash}" ]]; then + echo "error: fixture manifest campaign hash mismatch" >&2 + exit 1 +fi +custom_id="pkv1-g16-${platform}-${cache_slug}-${campaign_hash:0:12}-${app_sha256:0:12}" + +if [[ "${action}" == "id" ]]; then + jq -n \ + --arg platform "${platform}" \ + --arg custom_id "${custom_id}" \ + --arg campaign_hash "${campaign_hash}" \ + --arg app_sha256 "${app_sha256}" \ + --argjson app_bytes "${app_bytes}" \ + '{ + platform: $platform, + custom_id: $custom_id, + campaign_hash: $campaign_hash, + app_sha256: $app_sha256, + app_bytes: $app_bytes + }' + exit 0 +fi + +if [[ -z "${BROWSERSTACK_USERNAME:-}" || -z "${BROWSERSTACK_ACCESS_KEY:-}" ]]; then + echo "error: BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY are required" >&2 + exit 1 +fi + +api="https://api-cloud.browserstack.com/app-automate/${endpoint}" +lookup="$( + curl -fsS \ + -u "${BROWSERSTACK_USERNAME}:${BROWSERSTACK_ACCESS_KEY}" \ + "${api}/apps?custom_id=${custom_id}" +)" +cached="$( + jq -c ' + ( + if type == "array" then . + elif (.apps | type) == "array" then .apps + else [] + end + ) + | sort_by(.uploaded_at // .uploaded_at_ms // .id // "") + | last // empty + ' <<<"${lookup}" +)" + +if [[ -n "${cached}" ]]; then + jq -n \ + --arg status "hit" \ + --arg custom_id "${custom_id}" \ + --arg campaign_hash "${campaign_hash}" \ + --arg app_sha256 "${app_sha256}" \ + --argjson app_bytes "${app_bytes}" \ + --argjson browserstack "${cached}" \ + '{ + status: $status, + custom_id: $custom_id, + campaign_hash: $campaign_hash, + app_sha256: $app_sha256, + app_bytes: $app_bytes, + browserstack: $browserstack + }' + exit 0 +fi + +if [[ "${action}" == "lookup" ]]; then + jq -n \ + --arg status "miss" \ + --arg custom_id "${custom_id}" \ + --arg campaign_hash "${campaign_hash}" \ + --arg app_sha256 "${app_sha256}" \ + --argjson app_bytes "${app_bytes}" \ + '{ + status: $status, + custom_id: $custom_id, + campaign_hash: $campaign_hash, + app_sha256: $app_sha256, + app_bytes: $app_bytes + }' + exit 3 +fi + +uploaded="$( + curl -fsS \ + -u "${BROWSERSTACK_USERNAME}:${BROWSERSTACK_ACCESS_KEY}" \ + -X POST "${api}/app" \ + -F "file=@${app}" \ + -F "custom_id=${custom_id}" +)" +jq -n \ + --arg status "uploaded" \ + --arg custom_id "${custom_id}" \ + --arg campaign_hash "${campaign_hash}" \ + --arg app_sha256 "${app_sha256}" \ + --argjson app_bytes "${app_bytes}" \ + --argjson browserstack "${uploaded}" \ + '{ + status: $status, + custom_id: $custom_id, + campaign_hash: $campaign_hash, + app_sha256: $app_sha256, + app_bytes: $app_bytes, + browserstack: $browserstack + }' diff --git a/benchmarks/v1/scripts/build-e15-provekit-diagnostic.sh b/benchmarks/v1/scripts/build-e15-provekit-diagnostic.sh new file mode 100755 index 000000000..3a717a93f --- /dev/null +++ b/benchmarks/v1/scripts/build-e15-provekit-diagnostic.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source "${script_dir}/android-env.sh" + +output="${1:-${repo_root}/target/v1-benchmarks/e15-diagnostic-build}" +worker_process_suffix="${V1_E15_WORKER_PROCESS_SUFFIX:-:mobench_worker}" +[[ "${worker_process_suffix}" =~ ^:[A-Za-z0-9_]+$ ]] || { + echo "error: V1_E15_WORKER_PROCESS_SUFFIX must match :[A-Za-z0-9_]+" >&2 + exit 2 +} +mobench="${repo_root}/target/v1-benchmarks/toolchains/mobench/bin/cargo-mobench" +[[ -x "${mobench}" ]] || { + echo "error: missing locked cargo-mobench; run bootstrap-mobench.sh" >&2 + exit 1 +} + +JAVA_HOME="${JAVA_HOME}" ANDROID_HOME="${ANDROID_HOME}" \ + ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT}" ANDROID_NDK_HOME="${ANDROID_NDK_HOME}" \ + "${mobench}" build --target android --release --yes --non-interactive \ + --output-dir "${output}" + +android="${output}/android" +if [[ "${worker_process_suffix}" != ":mobench_worker" ]]; then + escaped_suffix="${worker_process_suffix//\//\\/}" + perl -pi -e \ + "s/:mobench_worker/${escaped_suffix}/g" \ + "${android}/app/src/main/AndroidManifest.xml" \ + "${android}/app/src/main/java/dev/world/benchmobile/MainActivity.kt" +fi +( + cd "${android}" + JAVA_HOME="${JAVA_HOME}" ANDROID_HOME="${ANDROID_HOME}" \ + ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT}" ./gradlew \ + assembleDebug assembleDebugAndroidTest --no-daemon +) + +app="${android}/app/build/outputs/apk/debug/app-debug.apk" +test_app="${android}/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk" +shasum -a 256 "${app}" "${test_app}" diff --git a/benchmarks/v1/scripts/build-mopro-noir-mobile.sh b/benchmarks/v1/scripts/build-mopro-noir-mobile.sh new file mode 100755 index 000000000..004ff79c7 --- /dev/null +++ b/benchmarks/v1/scripts/build-mopro-noir-mobile.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "usage: $0 ios" >&2 +} + +[[ $# -eq 1 && "$1" == "ios" ]] || { + usage + exit 2 +} + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +project="${repo_root}/target/v1-benchmarks/mopro/provekit-v1-mobile-adapters" +output="${repo_root}/target/v1-benchmarks/mopro-noir-ios" +srs="$("${script_dir}/prepare-noir-beta19-srs.sh")" + +for command in bun cargo-mobench cp xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +"${script_dir}/prepare-mopro-native-adapters.sh" +function_list="$(cargo-mobench list --crate-path "${project}")" +for function in \ + bench_webauthn_barretenberg_prove \ + bench_webauthn_barretenberg_verify \ + bench_webauthn_barretenberg_proof_verify \ + bench_passport_barretenberg_prove \ + bench_passport_barretenberg_verify \ + bench_passport_barretenberg_proof_verify \ + bench_oprf_barretenberg_prove \ + bench_oprf_barretenberg_verify \ + bench_oprf_barretenberg_proof_verify; do + grep -F "provekit_v1_mobile_adapters::${function}" \ + <<<"${function_list}" >/dev/null +done + +cargo-mobench build \ + --target ios \ + --release \ + --ios-deployment-target 15.0 \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive \ + --progress + +ios_project="${output}/ios/BenchRunner" +resources="${ios_project}/BenchRunner/Resources" +mkdir -p "${resources}" +bun "${script_dir}/patch-ios-runner-json.ts" \ + "${ios_project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null +cp -c "${srs}" "${resources}/noir_beta19_campaign.dat" 2>/dev/null || + cp "${srs}" "${resources}/noir_beta19_campaign.dat" +( + cd "${ios_project}" + xcodegen generate +) +cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive +"${script_dir}/preflight-ios15-charconv.sh" \ + "${output}/ios/BenchRunner.ipa" +cargo-mobench package-xcuitest \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive +"${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" + +unzip -l "${output}/ios/BenchRunner.ipa" | + grep -F "Payload/BenchRunner.app/noir_beta19_campaign.dat" >/dev/null +shasum -a 256 \ + "${output}/ios/BenchRunner.ipa" \ + "${output}/ios/BenchRunnerUITests.zip" diff --git a/benchmarks/v1/scripts/build-mopro-webauthn-mobile.sh b/benchmarks/v1/scripts/build-mopro-webauthn-mobile.sh new file mode 100755 index 000000000..dabc1c912 --- /dev/null +++ b/benchmarks/v1/scripts/build-mopro-webauthn-mobile.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "usage: $0 " >&2 +} + +[[ $# -eq 1 ]] || { + usage + exit 2 +} +platform="$1" +[[ "${platform}" == "ios" || "${platform}" == "android" ]] || { + usage + exit 2 +} + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +project="${repo_root}/target/v1-benchmarks/mopro/provekit-v1-mobile-adapters" +manifest="${repo_root}/target/v1-benchmarks/circom/webauthn/manifest.json" +zkey="${repo_root}/target/v1-benchmarks/groth16/webauthn/webauthn_default_benchmark.zkey" +output="${repo_root}/target/v1-benchmarks/mopro-webauthn-arkworks-${platform}" + +for command in cargo-mobench jq openssl; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +"${script_dir}/prepare-mopro-native-adapters.sh" +expected_sha="$( + jq -er \ + '.artifacts[] | select(.path | endswith("webauthn_default_benchmark.zkey")) | .sha256' \ + "${manifest}" +)" +actual_sha="$(openssl dgst -sha256 "${zkey}" | awk '{print tolower($NF)}')" +[[ "${actual_sha}" == "${expected_sha}" ]] || { + echo "error: WebAuthn zkey hash mismatch" >&2 + exit 1 +} + +function_list="$(cargo-mobench list --crate-path "${project}")" +grep -F 'provekit_v1_mobile_adapters::bench_webauthn_arkworks_prove' \ + <<<"${function_list}" >/dev/null + +if [[ "${platform}" == "ios" ]]; then + for command in bun cp xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } + done + cargo-mobench build \ + --target ios \ + --release \ + --ios-deployment-target 15.0 \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --progress + + ios_project="${output}/ios/BenchRunner" + resources="${ios_project}/BenchRunner/Resources" + mkdir -p "${resources}" + if [[ -n "${V1_WEBAUTHN_REMOTE_ZKEY_MANIFEST:-}" ]]; then + [[ -f "${V1_WEBAUTHN_REMOTE_ZKEY_MANIFEST}" ]] || { + echo "error: V1_WEBAUTHN_REMOTE_ZKEY_MANIFEST does not exist" >&2 + exit 1 + } + bun "${script_dir}/patch-ios-remote-proving-key.ts" \ + "${ios_project}/BenchRunner/BenchRunnerFFI.swift" + cp -c \ + "${V1_WEBAUTHN_REMOTE_ZKEY_MANIFEST}" \ + "${resources}/proving_key_remote.json" 2>/dev/null || + cp \ + "${V1_WEBAUTHN_REMOTE_ZKEY_MANIFEST}" \ + "${resources}/proving_key_remote.json" + else + cp -c "${zkey}" "${resources}/webauthn_default_benchmark.zkey" 2>/dev/null || + cp "${zkey}" "${resources}/webauthn_default_benchmark.zkey" + fi + jq -n \ + --arg function \ + "provekit_v1_mobile_adapters::bench_webauthn_arkworks_prove" \ + '{function: $function, iterations: 5, warmup: 1}' \ + >"${resources}/bench_spec.json" + ( + cd "${ios_project}" + xcodegen generate + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive + cargo-mobench package-xcuitest \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" + shasum -a 256 \ + "${output}/ios/BenchRunner.ipa" \ + "${output}/ios/BenchRunnerUITests.zip" +else + if [[ -z "${JAVA_HOME:-}" && + -x "/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java" ]]; then + export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" + fi + if [[ -z "${ANDROID_HOME:-}" && -d "${HOME}/Library/Android/sdk" ]]; then + export ANDROID_HOME="${HOME}/Library/Android/sdk" + fi + [[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]] || { + echo "error: set JAVA_HOME to a Java 17+ runtime" >&2 + exit 1 + } + [[ -n "${ANDROID_HOME:-}" && -d "${ANDROID_HOME}" ]] || { + echo "error: set ANDROID_HOME to the Android SDK" >&2 + exit 1 + } + + cargo-mobench build \ + --target android \ + --release \ + --crate-path "${project}" \ + --output-dir "${output}" \ + --progress + android_project="${output}/android" + jni_libs_root="${android_project}/app/src/main/jniLibs" + gradle_file="${android_project}/app/build.gradle" + perl -0pi -e \ + 's/jniLibs \{\n/jniLibs {\n useLegacyPackaging true\n/' \ + "${gradle_file}" + for abi in arm64-v8a armeabi-v7a; do + jni_libs="${jni_libs_root}/${abi}" + [[ -d "${jni_libs}" ]] || continue + cp -c "${zkey}" "${jni_libs}/libmobench_webauthn_zkey.so" 2>/dev/null || + cp "${zkey}" "${jni_libs}/libmobench_webauthn_zkey.so" + done + ( + cd "${android_project}" + ./gradlew assembleRelease assembleReleaseAndroidTest \ + -PmobenchTestBuildType=release + ) + app="${android_project}/app/build/outputs/apk/release/app-release-unsigned.apk" + test_apk="${android_project}/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk" + apk_entries="$(unzip -l "${app}")" + for abi in arm64-v8a armeabi-v7a; do + grep -F "lib/${abi}/libmobench_webauthn_zkey.so" \ + <<<"${apk_entries}" >/dev/null + done + shasum -a 256 "${app}" "${test_apk}" +fi diff --git a/benchmarks/v1/scripts/build-provekit-v1-wasm.sh b/benchmarks/v1/scripts/build-provekit-v1-wasm.sh new file mode 100755 index 000000000..9b571e89b --- /dev/null +++ b/benchmarks/v1/scripts/build-provekit-v1-wasm.sh @@ -0,0 +1,210 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/toolchains.lock.json" +tool_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}" +source_root="${V1_PROVEKIT_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/provekit-v1-source}" +target_dir_override="${V1_PROVEKIT_WASM_TARGET_DIR:-}" +package_dir_override="${PROVEKIT_V1_WASM_PACKAGE_DIR:-}" +wasm_thread_request="${MOBENCH_WASM_THREADS:-16}" +wasm_variant="${PROVEKIT_V1_WASM_VARIANT:-}" +case "${wasm_thread_request}" in + single|auto|threaded) ;; + *) + if [[ ! "${wasm_thread_request}" =~ ^[0-9]+$ ]] || + (( wasm_thread_request < 2 || wasm_thread_request > 32 )); then + echo "error: MOBENCH_WASM_THREADS must be single, auto, threaded, or an integer from 2 to 32" >&2 + exit 2 + fi + ;; +esac +if [[ -z "${wasm_variant}" ]]; then + case "${wasm_thread_request}" in + single) wasm_variant="single" ;; + auto|threaded|[0-9]*) wasm_variant="threaded" ;; + esac +fi +case "${wasm_variant}" in + single|threaded) ;; + *) + echo "error: PROVEKIT_V1_WASM_VARIANT must be single or threaded" >&2 + exit 2 + ;; +esac +# The pinned V1 crate always emits wasm-bindgen-rayon hooks. The variant is a +# recorded campaign policy, not a scalar replacement of the proving artifact. +wasm_threads_available=true +if [[ -n "${target_dir_override}" ]]; then + target_dir="${target_dir_override}" +elif [[ "${wasm_variant}" == "threaded" ]]; then + target_dir="${repo_root}/target/v1-benchmarks/provekit-v1-wasm-target-threaded" +else + target_dir="${repo_root}/target/v1-benchmarks/provekit-v1-wasm-target" +fi +if [[ -n "${package_dir_override}" ]]; then + package_dir="${package_dir_override}" +elif [[ "${wasm_variant}" == "threaded" ]]; then + package_dir="${benchmark_root}/wasm/v1-wasm-pkg-threaded" +else + package_dir="${benchmark_root}/wasm/v1-wasm-pkg" +fi +artifact_dir="${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts" +input_dir="${repo_root}/target/v1-benchmarks/provekit-v1-inputs" +passport_p1_beta11="${repo_root}/target/v1-benchmarks/passport-p1-beta11" +oprf_o2_beta11="${repo_root}/target/v1-benchmarks/oprf-o2-beta11" + +for command in cargo git jq; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +bash "${script_dir}/prepare-passport-p1-beta11.sh" >/dev/null +bash "${script_dir}/prepare-oprf-o2-beta11.sh" >/dev/null + +core_commit="$(jq -er '.provekit_v1.core_commit' "${lock_file}")" +if ! git -C "${repo_root}" cat-file -e "${core_commit}^{commit}"; then + echo "error: ProveKit V1 core commit ${core_commit} is not present" >&2 + exit 1 +fi +if [[ -e "${source_root}" ]]; then + git -C "${source_root}" rev-parse --verify HEAD >/dev/null 2>&1 || { + echo "error: ${source_root} exists but is not a Git worktree" >&2 + exit 1 + } + actual_commit="$(git -C "${source_root}" rev-parse HEAD)" + [[ "${actual_commit}" == "${core_commit}" ]] || { + echo "error: ${source_root} is ${actual_commit}, expected ${core_commit}" >&2 + exit 1 + } +else + git -C "${repo_root}" worktree add --detach "${source_root}" "${core_commit}" +fi + +for required in \ + "${artifact_dir}/complete_age_check.json" \ + "${artifact_dir}/webauthn_assertion.json" \ + "${passport_p1_beta11}/target/passport_p1.json" \ + "${oprf_o2_beta11}/oprf/target/oprf.json"; do + [[ -s "${required}" ]] || { + echo "error: missing frozen beta.11 artifact ${required}; run prepare-provekit-beta11-artifacts.sh" >&2 + exit 1 + } +done + +mkdir -p "${input_dir}" + +wasm_bindgen_bin="${tool_root}/wasm-bindgen-cli-$(jq -er '.wasm_bindgen_cli.version' "${lock_file}")/bin/wasm-bindgen" +if [[ ! -x "${wasm_bindgen_bin}" ]]; then + wasm_bindgen_bin="$(${script_dir}/bootstrap-wasm-bindgen.sh)" +fi +mkdir -p "${target_dir}" +echo "Building ProveKit V1 WASM from ${core_commit}" +( + cd "${source_root}" + mkdir -p \ + noir-examples/noir-passport-monolithic/complete_age_check/target \ + noir-examples/oprf/target \ + benchmarks/v1/noir/webauthn_assertion/target \ + benchmarks/v1/noir/passport_p1/target \ + target/v1-benchmarks + rm -rf target/v1-benchmarks/noir-beta19-compat + ln -s "${repo_root}/target/v1-benchmarks/noir-beta19-compat" \ + target/v1-benchmarks/noir-beta19-compat + cp "${benchmark_root}/noir/webauthn_assertion/Nargo.toml" \ + benchmarks/v1/noir/webauthn_assertion/Nargo.toml + rm -rf benchmarks/v1/noir/webauthn_assertion/src + cp -R "${benchmark_root}/noir/webauthn_assertion/src" \ + benchmarks/v1/noir/webauthn_assertion/src + cp "${benchmark_root}/noir/webauthn_assertion/Prover.toml" \ + benchmarks/v1/noir/webauthn_assertion/Prover.toml + cp "${benchmark_root}/noir/webauthn_assertion/inputs.json" \ + benchmarks/v1/noir/webauthn_assertion/inputs.json + cp "${artifact_dir}/complete_age_check.json" \ + noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json + rm -rf benchmarks/v1/noir/oprf_o2_beta11 + cp -R "${oprf_o2_beta11}" benchmarks/v1/noir/oprf_o2_beta11 + cp "${artifact_dir}/webauthn_assertion.json" \ + benchmarks/v1/noir/webauthn_assertion/target/webauthn_assertion.json + cp "${passport_p1_beta11}/Nargo.toml" benchmarks/v1/noir/passport_p1/Nargo.toml + cp -R "${passport_p1_beta11}/src" benchmarks/v1/noir/passport_p1/ + cp -R "${passport_p1_beta11}/utils" benchmarks/v1/noir/passport_p1/ + cp "${passport_p1_beta11}/target/passport_p1.json" \ + benchmarks/v1/noir/passport_p1/target/passport_p1.json + cp "${artifact_dir}/complete_age_check.Prover.toml" \ + "${input_dir}/passport_complete_age_check.Prover.toml" + cp "${oprf_o2_beta11}/oprf/Prover.toml" "${input_dir}/oprf_taceo.Prover.toml" + cp benchmarks/v1/noir/webauthn_assertion/Prover.toml \ + "${input_dir}/webauthn_assertion.Prover.toml" + cp benchmarks/v1/noir/webauthn_assertion/inputs.json \ + "${input_dir}/webauthn_assertion.inputs.json" + cp "${passport_p1_beta11}/Prover.toml" "${input_dir}/passport_p1.Prover.toml" + cargo build --locked --release -p provekit-cli + CARGO_TARGET_DIR="${target_dir}" \ + CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS="-C target-feature=+atomics,+bulk-memory,+mutable-globals,+simd128,+relaxed-simd,-reference-types -C link-arg=--shared-memory -C link-arg=--import-memory -C link-arg=--max-memory=4294967296 -C link-arg=--export=__wasm_init_tls -C link-arg=--export=__tls_size -C link-arg=--export=__tls_align -C link-arg=--export=__tls_base" \ + cargo build -Z build-std=panic_abort,std --locked --release \ + --target wasm32-unknown-unknown -p provekit-wasm --no-default-features +) + +cli="${source_root}/target/release/provekit-cli" +[[ -x "${cli}" ]] || { echo "error: missing ${cli}" >&2; exit 1; } +for spec in \ + "passport_complete_age_check|noir-examples/noir-passport-monolithic/complete_age_check|complete_age_check|passport_complete_age_check.Prover.toml" \ + "oprf_taceo|benchmarks/v1/noir/oprf_o2_beta11/oprf|oprf|oprf_taceo.Prover.toml" \ + "webauthn_assertion|benchmarks/v1/noir/webauthn_assertion|webauthn_assertion|webauthn_assertion.Prover.toml" \ + "passport_p1|benchmarks/v1/noir/passport_p1|passport_p1|passport_p1.Prover.toml"; do + IFS='|' read -r workload circuit_dir program input_name <<<"${spec}" + out_dir="${repo_root}/target/v1-benchmarks/artifacts/${workload}" + mkdir -p "${out_dir}" + "${cli}" prepare \ + --target-dir "${source_root}/${circuit_dir}/target" \ + --skip-brillig-constraints-check --force \ + --pkp "${out_dir}/${workload}.pkp" \ + --pkv "${out_dir}/${workload}.pkv" \ + "${source_root}/${circuit_dir}" + "${cli}" prove \ + --prover "${out_dir}/${workload}.pkp" \ + --input "${input_dir}/${input_name}" \ + --out "${out_dir}/${workload}.np" + "${cli}" verify \ + --verifier "${out_dir}/${workload}.pkv" \ + --proof "${out_dir}/${workload}.np" +done + +rm -rf "${package_dir}" +mkdir -p "${package_dir}" +"${wasm_bindgen_bin}" \ + --target web \ + --out-dir "${package_dir}" \ + "${target_dir}/wasm32-unknown-unknown/release/provekit_wasm.wasm" +printf '%s\n' \ + '{' \ + ' "name": "provekit-v1-wasm-local",' \ + ' "private": true,' \ + ' "type": "module",' \ + ' "module": "provekit_wasm.js",' \ + ' "main": "provekit_wasm.js",' \ + ' "sideEffects": true' \ + '}' >"${package_dir}/package.json" + +wasm_sha256="$(shasum -a 256 "${package_dir}/provekit_wasm_bg.wasm" | awk '{print $1}')" +jq -n \ + --arg core_commit "${core_commit}" \ + --arg wasm_bindgen_version "$("${wasm_bindgen_bin}" --version | awk '{print $2}')" \ + --arg wasm_sha256 "${wasm_sha256}" \ + --arg wasm_variant "${wasm_variant}" \ + --arg wasm_thread_request "${wasm_thread_request}" \ + --argjson wasm_threads_available "${wasm_threads_available}" \ + '{schema_version:1,backend:("provekit_v1_wasm_" + $wasm_variant),core_commit:$core_commit, + wasm_bindgen_version:$wasm_bindgen_version,wasm_sha256:$wasm_sha256, + wasm_variant:$wasm_variant,wasm_thread_request:$wasm_thread_request, + wasm_thread_mode:$wasm_variant, + wasm_threads_available:$wasm_threads_available,shared_memory_build:true}' \ + >"${package_dir}/manifest.json" + +echo "Prepared ${package_dir}" diff --git a/benchmarks/v1/scripts/build-provekit-webauthn.sh b/benchmarks/v1/scripts/build-provekit-webauthn.sh new file mode 100755 index 000000000..d79a3b3f9 --- /dev/null +++ b/benchmarks/v1/scripts/build-provekit-webauthn.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +exec "${script_dir}/build-provekit-workload.sh" webauthn_assertion diff --git a/benchmarks/v1/scripts/build-provekit-workload.sh b/benchmarks/v1/scripts/build-provekit-workload.sh new file mode 100755 index 000000000..8b76afbd5 --- /dev/null +++ b/benchmarks/v1/scripts/build-provekit-workload.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 1 ]]; then + echo "usage: $0 " >&2 + exit 2 +fi + +workload="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" + +case "${workload}" in + webauthn_assertion) + circuit_dir="${benchmark_root}/noir/webauthn_assertion" + input="${circuit_dir}/Prover.toml" + ;; + passport_complete_age_check) + circuit_dir="${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check" + input="${circuit_dir}/Prover.toml" + ;; + oprf_taceo) + circuit_dir="${repo_root}/target/v1-benchmarks/sources/oprf-nr-v2/oprf_example" + input="${circuit_dir}/Prover.toml" + ;; + oprf_world_id_nullifier) + circuit_dir="${repo_root}/noir-examples/oprf" + input="${circuit_dir}/Prover.toml" + ;; + *) + echo "error: unsupported ProveKit workload ${workload}" >&2 + exit 2 + ;; +esac + +artifact_dir="${repo_root}/target/v1-benchmarks/artifacts/${workload}" +compile_dir="${repo_root}/target/v1-benchmarks/noir/${workload}" +manifest_output="${artifact_dir}/manifest.json" + +for command in cargo jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ "${V1_BENCHMARK_SKIP_NOIR_COMPILE:-0}" != "1" ]]; then + "${script_dir}/compile-noir-workloads.sh" +fi +mkdir -p "${artifact_dir}" "${compile_dir}" +cargo build --release -p provekit-cli + +cli="${repo_root}/target/release/provekit-cli" +pkp="${artifact_dir}/${workload}.pkp" +pkv="${artifact_dir}/${workload}.pkv" +proof="${artifact_dir}/${workload}.np" + +if [[ "${V1_BENCHMARK_REUSE_ARTIFACTS:-0}" == "1" ]]; then + for artifact in "${pkp}" "${pkv}" "${proof}"; do + if [[ ! -f "${artifact}" ]]; then + echo "error: cannot reuse missing artifact ${artifact}" >&2 + exit 1 + fi + done +else +"${cli}" prepare \ + --target-dir "${compile_dir}" \ + --skip-brillig-constraints-check \ + --force \ + --pkp "${pkp}" \ + --pkv "${pkv}" \ + "${circuit_dir}" +"${cli}" prove --prover "${pkp}" --input "${input}" --out "${proof}" +fi +"${cli}" verify --verifier "${pkv}" --proof "${proof}" + +manifest="$(mktemp "${TMPDIR:-/tmp}/provekit-v1-${workload}.XXXXXX.tsv")" +cleanup() { + rm -f "${manifest}" +} +trap cleanup EXIT +{ + printf '# scope\tkind\tpath\n' + printf 'prover-download\tprovekit-pkp\t%s\n' "${pkp}" + printf 'verifier-download\tprovekit-pkv\t%s\n' "${pkv}" + printf 'result\tprovekit-proof\t%s\n' "${proof}" +} >"${manifest}" + +( + cd "${repo_root}" + "${script_dir}/measure-bundle.sh" "${manifest}" "${manifest_output}" +) + +jq -e ' + .totals["prover-download"] > 0 + and .totals["verifier-download"] > 0 + and .totals.result > 0 +' "${manifest_output}" >/dev/null + +echo "Prepared and verified ProveKit ${workload} artifacts under ${artifact_dir}" diff --git a/benchmarks/v1/scripts/build-rapidsnark-android-libs.sh b/benchmarks/v1/scripts/build-rapidsnark-android-libs.sh new file mode 100755 index 000000000..0b8ce1c63 --- /dev/null +++ b/benchmarks/v1/scripts/build-rapidsnark-android-libs.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +source="${source_root}/rapidsnark" +output="${V1_RAPIDSNARK_ANDROID_LIB_DIR:-${repo_root}/target/v1-benchmarks/native-libs/rapidsnark/aarch64-linux-android}" +build_root="${V1_RAPIDSNARK_ANDROID_BUILD_ROOT:-${source}/build_prover_android}" +android_ndk="${ANDROID_NDK:-${ANDROID_NDK_HOME:-${HOME}/Library/Android/sdk/ndk/26.1.10909125}}" + +for command in cmake git jq make shasum; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done +[[ -d "${android_ndk}/toolchains/llvm" ]] || { + echo "error: Android NDK not found at ${android_ndk}" >&2 + exit 1 +} + +"${script_dir}/bootstrap-sources.sh" >/dev/null +expected_revision="$( + jq -er '.sources[] | select(.name == "rapidsnark") | .revision' \ + "${benchmark_root}/sources.lock.json" +)" +[[ "$(git -C "${source}" rev-parse HEAD)" == "${expected_revision}" ]] || { + echo "error: Rapidsnark checkout does not match sources.lock.json" >&2 + exit 1 +} + +export ANDROID_NDK="${android_ndk}" +if [[ ! -f "${source}/depends/gmp/package_android_arm64/lib/libgmp.a" ]]; then + ( + cd "${source}" + ./build_gmp.sh android + ) +fi + +cmake \ + -S "${source}" \ + -B "${build_root}" \ + -DTARGET_PLATFORM=ANDROID \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${source}/package_android" \ + -DBUILD_TESTS=OFF \ + -DUSE_OPENMP=OFF +cmake --build "${build_root}" --target rapidsnarkStatic --parallel 8 + +mkdir -p "${output}" +for library in librapidsnark.a libfr.a libfq.a; do + cp "${build_root}/src/${library}" "${output}/${library}" +done +cp "${source}/depends/gmp/package_android_arm64/lib/libgmp.a" "${output}/libgmp.a" +( + cd "${output}" + shasum -a 256 librapidsnark.a libfr.a libfq.a libgmp.a >SHA256SUMS +) + +echo "${output}" diff --git a/benchmarks/v1/scripts/build-rapidsnark-host.sh b/benchmarks/v1/scripts/build-rapidsnark-host.sh new file mode 100755 index 000000000..f6c222e63 --- /dev/null +++ b/benchmarks/v1/scripts/build-rapidsnark-host.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +rapidsnark="${repo_root}/target/v1-benchmarks/sources/rapidsnark" + +"${script_dir}/bootstrap-sources.sh" + +case "$(uname -m)-$(uname -s)" in + arm64-Darwin) + gmp_target="macos_arm64" + gmp_package="package_macos_arm64" + make_target="macos_arm64" + prover_package="package_macos_arm64" + ;; + x86_64-Darwin | x86_64-Linux) + gmp_target="host" + gmp_package="package" + make_target="host" + prover_package="package" + ;; + aarch64-Linux | arm64-Linux) + gmp_target="aarch64" + gmp_package="package_aarch64" + make_target="host_arm64" + prover_package="package_arm64" + ;; + *) + echo "error: unsupported Rapidsnark host $(uname -m)-$(uname -s)" >&2 + exit 1 + ;; +esac + +for command in cmake make m4 nasm pkg-config; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +for library in gmp libsodium; do + if ! pkg-config --exists "${library}"; then + echo "error: pkg-config could not find ${library}" >&2 + exit 1 + fi +done + +prover="${rapidsnark}/${prover_package}/bin/prover" +if [[ -x "${prover}" ]]; then + echo "Pinned Rapidsnark host prover is ready at ${prover}" + exit 0 +fi + +( + cd "${rapidsnark}" + if [[ ! -d "depends/gmp/${gmp_package}" ]]; then + ./build_gmp.sh "${gmp_target}" + fi + make "${make_target}" +) + +echo "Built pinned Rapidsnark host prover at ${prover}" diff --git a/benchmarks/v1/scripts/build-rapidsnark-ios-libs.sh b/benchmarks/v1/scripts/build-rapidsnark-ios-libs.sh new file mode 100755 index 000000000..9d1a9a87d --- /dev/null +++ b/benchmarks/v1/scripts/build-rapidsnark-ios-libs.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +source="${source_root}/rapidsnark" +output="${V1_RAPIDSNARK_IOS_LIB_DIR:-${repo_root}/target/v1-benchmarks/native-libs/rapidsnark/aarch64-apple-ios}" +sim_output="${V1_RAPIDSNARK_IOS_SIM_LIB_DIR:-${repo_root}/target/v1-benchmarks/native-libs/rapidsnark/aarch64-apple-ios-sim}" +build_root="${V1_RAPIDSNARK_IOS_BUILD_ROOT:-${repo_root}/target/v1-benchmarks/native-build/rapidsnark-ios15}" +build_simulator="${V1_RAPIDSNARK_BUILD_IOS_SIMULATOR:-0}" + +case "${build_simulator}" in + 0 | 1) ;; + *) + echo "error: V1_RAPIDSNARK_BUILD_IOS_SIMULATOR must be 0 or 1" >&2 + exit 2 + ;; +esac + +for command in cmake git lipo make shasum xcodebuild; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +"${script_dir}/bootstrap-sources.sh" >/dev/null +expected_revision="$( + jq -er '.sources[] | select(.name == "rapidsnark") | .revision' \ + "${benchmark_root}/sources.lock.json" +)" +[[ "$(git -C "${source}" rev-parse HEAD)" == "${expected_revision}" ]] || { + echo "error: Rapidsnark checkout does not match sources.lock.json" >&2 + exit 1 +} + +single_thread_patch="${benchmark_root}/rapidsnark/rapidsnark-ios-single-thread.patch" +[[ -f "${single_thread_patch}" ]] || { + echo "error: missing iOS single-thread patch ${single_thread_patch}" >&2 + exit 1 +} +if git -C "${source}/depends/ffiasm" apply --check "${single_thread_patch}" 2>/dev/null; then + git -C "${source}/depends/ffiasm" apply "${single_thread_patch}" +elif ! git -C "${source}/depends/ffiasm" apply --reverse --check \ + "${single_thread_patch}" 2>/dev/null; then + echo "error: iOS single-thread patch does not apply cleanly" >&2 + exit 1 +fi + +low_memory_patch="${benchmark_root}/rapidsnark/rapidsnark-ios-low-memory.patch" +[[ -f "${low_memory_patch}" ]] || { + echo "error: missing iOS low-memory patch ${low_memory_patch}" >&2 + exit 1 +} +if git -C "${source}" apply --check "${low_memory_patch}" 2>/dev/null; then + git -C "${source}" apply "${low_memory_patch}" +elif ! git -C "${source}" apply --reverse --check \ + "${low_memory_patch}" 2>/dev/null; then + echo "error: iOS low-memory patch does not apply cleanly" >&2 + exit 1 +fi + +if [[ ! -f "${source}/depends/gmp/package_ios_arm64/lib/libgmp.a" ]]; then + ( + cd "${source}" + ./build_gmp.sh ios + ) +fi +if [[ "${build_simulator}" == "1" && + ! -f "${source}/depends/gmp/package_iphone_simulator_arm64/lib/libgmp.a" ]]; then + ( + cd "${source}" + ./build_gmp.sh ios_simulator + ) +fi + +cmake \ + -S "${source}" \ + -B "${build_root}" \ + -G Xcode \ + -DTARGET_PLATFORM=IOS \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \ + -DUSE_OPENMP=OFF \ + -DBUILD_TESTS=OFF +xcodebuild \ + -destination 'generic/platform=iOS' \ + -scheme rapidsnarkStatic \ + -project "${build_root}/rapidsnark.xcodeproj" \ + -configuration Release \ + CODE_SIGNING_ALLOWED=NO + +mkdir -p "${output}" +for library in librapidsnark.a libfr.a libfq.a; do + cp "${build_root}/src/Release-iphoneos/${library}" "${output}/${library}" +done +lipo \ + "${source}/depends/gmp/package_ios_arm64/lib/libgmp.a" \ + -thin arm64 \ + -output "${output}/libgmp.a" + +( + cd "${output}" + shasum -a 256 librapidsnark.a libfr.a libfq.a libgmp.a >SHA256SUMS +) + +echo "${output}" + +if [[ "${build_simulator}" != "1" ]]; then + exit 0 +fi + +( + cd "${source}" + make ios_simulator +) +sim_build="${source}/build_prover_ios_simulator/src/Debug-iphonesimulator" +mkdir -p "${sim_output}" +for library in librapidsnark.a libgmp.a; do + lipo "${sim_build}/${library}" -thin arm64 -output "${sim_output}/${library}" +done +for library in libfr.a libfq.a; do + cp "${sim_build}/${library}" "${sim_output}/${library}" +done +( + cd "${sim_output}" + shasum -a 256 librapidsnark.a libfr.a libfq.a libgmp.a >SHA256SUMS +) + +echo "${sim_output}" diff --git a/benchmarks/v1/scripts/build-rapidsnark-mobile-android.sh b/benchmarks/v1/scripts/build-rapidsnark-mobile-android.sh new file mode 100755 index 000000000..351d2ccb5 --- /dev/null +++ b/benchmarks/v1/scripts/build-rapidsnark-mobile-android.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "usage: $0 " >&2 +} + +[[ $# -eq 1 ]] || { + usage + exit 2 +} + +workload="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" + +case "${workload}" in + passport-disclose) + crate="${benchmark_root}/rapidsnark/rapidsnark-mobile" + fixture="${repo_root}/target/v1-benchmarks/mobile-fixtures/groth16/vc_and_disclose" + output="${repo_root}/target/v1-benchmarks/rapidsnark-disclose-android" + ;; + passport-register) + crate="${benchmark_root}/rapidsnark/rapidsnark-mobile-register" + fixture="${repo_root}/target/v1-benchmarks/mobile-fixtures/groth16/register_sha256_sha256_sha256_rsa_65537_4096" + output="${repo_root}/target/v1-benchmarks/rapidsnark-register-android" + ;; + *) + usage + exit 2 + ;; +esac + +for command in cargo-mobench cp; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done +if [[ -z "${JAVA_HOME:-}" && + -x "/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java" ]]; then + export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" +fi +[[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]] || { + echo "error: set JAVA_HOME to a Java 17+ runtime" >&2 + exit 1 +} +if [[ -z "${ANDROID_HOME:-}" && -d "${HOME}/Library/Android/sdk" ]]; then + export ANDROID_HOME="${HOME}/Library/Android/sdk" +fi +[[ -n "${ANDROID_HOME:-}" && -d "${ANDROID_HOME}" ]] || { + echo "error: set ANDROID_HOME to the Android SDK" >&2 + exit 1 +} +for resource in proving_key.zkey reference.wtns verification_key.json; do + [[ -f "${fixture}/resources/${resource}" ]] || { + echo "error: missing ${fixture}/resources/${resource}" >&2 + exit 1 + } +done + +"${script_dir}/build-rapidsnark-android-libs.sh" >/dev/null +cargo-mobench build \ + --target android \ + --release \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --progress + +project="${output}/android" +jni_libs="${project}/app/src/main/jniLibs/arm64-v8a" +gradle_file="${project}/app/build.gradle" +perl -0pi -e \ + 's/jniLibs \{\n/jniLibs {\n useLegacyPackaging true\n/' \ + "${gradle_file}" +mkdir -p "${jni_libs}" +cp -c "${fixture}/resources/proving_key.zkey" "${jni_libs}/libmobench_proving_key.so" 2>/dev/null || + cp "${fixture}/resources/proving_key.zkey" "${jni_libs}/libmobench_proving_key.so" +cp -c "${fixture}/resources/reference.wtns" "${jni_libs}/libmobench_reference_wtns.so" 2>/dev/null || + cp "${fixture}/resources/reference.wtns" "${jni_libs}/libmobench_reference_wtns.so" +cp -c "${fixture}/resources/verification_key.json" "${jni_libs}/libmobench_verification_key.so" 2>/dev/null || + cp "${fixture}/resources/verification_key.json" "${jni_libs}/libmobench_verification_key.so" + +( + cd "${project}" + ./gradlew assembleRelease assembleReleaseAndroidTest -PmobenchTestBuildType=release +) + +app="${project}/app/build/outputs/apk/release/app-release-unsigned.apk" +test_apk="${project}/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk" +[[ -f "${app}" && -f "${test_apk}" ]] || { + echo "error: Android package did not produce the expected APKs" >&2 + exit 1 +} +unzip -l "${app}" | + grep -F 'lib/arm64-v8a/libmobench_proving_key.so' >/dev/null +shasum -a 256 "${app}" "${test_apk}" diff --git a/benchmarks/v1/scripts/build-rapidsnark-mobile-ios.sh b/benchmarks/v1/scripts/build-rapidsnark-mobile-ios.sh new file mode 100755 index 000000000..c27bc86de --- /dev/null +++ b/benchmarks/v1/scripts/build-rapidsnark-mobile-ios.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "usage: $0 " >&2 +} + +[[ $# -eq 1 ]] || { + usage + exit 2 +} + +workload="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" + +case "${workload}" in + passport-disclose) + crate="${benchmark_root}/rapidsnark/rapidsnark-mobile" + fixture="${repo_root}/target/v1-benchmarks/mobile-fixtures/groth16/vc_and_disclose" + output="${repo_root}/target/v1-benchmarks/rapidsnark-disclose-ios" + ;; + passport-register) + crate="${benchmark_root}/rapidsnark/rapidsnark-mobile-register" + fixture="${repo_root}/target/v1-benchmarks/mobile-fixtures/groth16/register_sha256_sha256_sha256_rsa_65537_4096" + output="${repo_root}/target/v1-benchmarks/rapidsnark-register-ios" + ;; + *) + usage + exit 2 + ;; +esac + +for command in cargo-mobench cp xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +for resource in proving_key.zkey reference.wtns verification_key.json; do + [[ -f "${fixture}/resources/${resource}" ]] || { + echo "error: missing ${fixture}/resources/${resource}" >&2 + exit 1 + } +done + +"${script_dir}/build-rapidsnark-ios-libs.sh" >/dev/null + +expected_crate="$( + sed -n 's/^name = "\(.*\)"/\1/p' "${crate}/Cargo.toml" | + head -1 | + tr - _ +)" +expected_function="${expected_crate}::bench_passport_rapidsnark_prove" +function_list="$(cargo-mobench list --crate-path "${crate}")" +grep -F "${expected_function}" <<<"${function_list}" >/dev/null || { + echo "error: Mobench did not discover ${expected_function}" >&2 + exit 1 + } + +cargo-mobench build \ + --target ios \ + --release \ + --ios-deployment-target 15.0 \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --progress + +project="${output}/ios/BenchRunner" +resources="${project}/BenchRunner/Resources" +case "${resources}" in + "${repo_root}"/target/v1-benchmarks/*/ios/BenchRunner/BenchRunner/Resources) + rm -rf "${resources}" + ;; + *) + echo "error: refusing to clean unexpected resource path: ${resources}" >&2 + exit 1 + ;; +esac +mkdir -p "${resources}" +for resource in proving_key.zkey reference.wtns verification_key.json; do + # APFS clone copies keep staging fast while presenting ordinary files to + # Xcode. Fall back to a regular copy on filesystems without clone support. + cp -c "${fixture}/resources/${resource}" "${resources}/${resource}" 2>/dev/null || + cp "${fixture}/resources/${resource}" "${resources}/${resource}" +done + +( + cd "${project}" + xcodegen generate +) + +cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive +cargo-mobench package-xcuitest \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive + +ipa="${output}/ios/BenchRunner.ipa" +test_bundle="${output}/ios/BenchRunnerUITests.zip" +[[ -f "${ipa}" ]] || { + echo "error: package did not produce ${ipa}" >&2 + exit 1 +} +[[ -f "${test_bundle}" ]] || { + echo "error: package did not produce ${test_bundle}" >&2 + exit 1 +} + +"${script_dir}/patch-ios15-xcuitest-suite.sh" "${test_bundle}" +shasum -a 256 "${ipa}" "${test_bundle}" diff --git a/benchmarks/v1/scripts/build-rapidsnark-webauthn-mobile.sh b/benchmarks/v1/scripts/build-rapidsnark-webauthn-mobile.sh new file mode 100755 index 000000000..73e5c8490 --- /dev/null +++ b/benchmarks/v1/scripts/build-rapidsnark-webauthn-mobile.sh @@ -0,0 +1,157 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "usage: $0 " >&2 +} + +[[ $# -eq 1 ]] || { + usage + exit 2 +} +platform="$1" +[[ "${platform}" == "ios" || "${platform}" == "android" ]] || { + usage + exit 2 +} + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +crate="${benchmark_root}/rapidsnark/rapidsnark-mobile-webauthn" +fixture="${repo_root}/target/v1-benchmarks/mobile-fixtures/groth16/webauthn" +output="${repo_root}/target/v1-benchmarks/rapidsnark-webauthn-${platform}" +manifest="${repo_root}/target/v1-benchmarks/circom/webauthn/manifest.json" +zkey="${repo_root}/target/v1-benchmarks/groth16/webauthn/webauthn_default_benchmark.zkey" +wtns="${repo_root}/target/v1-benchmarks/circom/webauthn/fixture.wtns" +verification_key="${repo_root}/target/v1-benchmarks/groth16/webauthn/verification_key.json" + +for command in cargo-mobench cp jq openssl; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +"${script_dir}/prepare-webauthn-circom.sh" +for source in "${zkey}" "${wtns}" "${verification_key}"; do + [[ -f "${source}" ]] || { + echo "error: missing ${source}; run prepare-webauthn-circom.sh --setup" >&2 + exit 1 + } + expected_sha="$( + jq -er \ + --arg path "${source#"${repo_root}/"}" \ + '.artifacts[] | select(.path == $path) | .sha256' \ + "${manifest}" + )" + actual_sha="$(openssl dgst -sha256 "${source}" | awk '{print tolower($NF)}')" + [[ "${actual_sha}" == "${expected_sha}" ]] || { + echo "error: fixture hash mismatch for ${source}" >&2 + exit 1 + } +done + +mkdir -p "${fixture}" +cp -c "${zkey}" "${fixture}/proving_key.zkey" 2>/dev/null || + cp "${zkey}" "${fixture}/proving_key.zkey" +cp -c "${wtns}" "${fixture}/reference.wtns" 2>/dev/null || + cp "${wtns}" "${fixture}/reference.wtns" +cp "${verification_key}" "${fixture}/verification_key.json" + +for resource in proving_key.zkey reference.wtns verification_key.json; do + [[ -f "${fixture}/${resource}" ]] || { + echo "error: missing ${fixture}/${resource}" >&2 + exit 1 + } +done + +if [[ "${platform}" == "ios" ]]; then + command -v xcodegen >/dev/null 2>&1 || { + echo "error: xcodegen is required" >&2 + exit 1 + } + "${script_dir}/build-rapidsnark-ios-libs.sh" >/dev/null + cargo-mobench build \ + --target ios \ + --release \ + --ios-deployment-target 15.0 \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --progress + project="${output}/ios/BenchRunner" + resources="${project}/BenchRunner/Resources" + mkdir -p "${resources}" + for resource in proving_key.zkey reference.wtns verification_key.json; do + cp -c "${fixture}/${resource}" "${resources}/${resource}" 2>/dev/null || + cp "${fixture}/${resource}" "${resources}/${resource}" + done + ( + cd "${project}" + xcodegen generate + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive + cargo-mobench package-xcuitest \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" + shasum -a 256 \ + "${output}/ios/BenchRunner.ipa" \ + "${output}/ios/BenchRunnerUITests.zip" +else + if [[ -z "${JAVA_HOME:-}" && + -x "/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java" ]]; then + export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" + fi + if [[ -z "${ANDROID_HOME:-}" && -d "${HOME}/Library/Android/sdk" ]]; then + export ANDROID_HOME="${HOME}/Library/Android/sdk" + fi + [[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]] || { + echo "error: set JAVA_HOME to a Java 17+ runtime" >&2 + exit 1 + } + [[ -n "${ANDROID_HOME:-}" && -d "${ANDROID_HOME}" ]] || { + echo "error: set ANDROID_HOME to the Android SDK" >&2 + exit 1 + } + + "${script_dir}/build-rapidsnark-android-libs.sh" >/dev/null + cargo-mobench build \ + --target android \ + --release \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --progress + project="${output}/android" + jni_libs="${project}/app/src/main/jniLibs/arm64-v8a" + gradle_file="${project}/app/build.gradle" + perl -0pi -e \ + 's/jniLibs \{\n/jniLibs {\n useLegacyPackaging true\n/' \ + "${gradle_file}" + mkdir -p "${jni_libs}" + cp -c "${fixture}/proving_key.zkey" "${jni_libs}/libmobench_proving_key.so" 2>/dev/null || + cp "${fixture}/proving_key.zkey" "${jni_libs}/libmobench_proving_key.so" + cp -c "${fixture}/reference.wtns" "${jni_libs}/libmobench_reference_wtns.so" 2>/dev/null || + cp "${fixture}/reference.wtns" "${jni_libs}/libmobench_reference_wtns.so" + cp -c "${fixture}/verification_key.json" "${jni_libs}/libmobench_verification_key.so" 2>/dev/null || + cp "${fixture}/verification_key.json" "${jni_libs}/libmobench_verification_key.so" + ( + cd "${project}" + ./gradlew assembleRelease assembleReleaseAndroidTest \ + -PmobenchTestBuildType=release + ) + app="${project}/app/build/outputs/apk/release/app-release-unsigned.apk" + test_apk="${project}/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk" + unzip -l "${app}" | + grep -F 'lib/arm64-v8a/libmobench_proving_key.so' >/dev/null + shasum -a 256 "${app}" "${test_apk}" +fi diff --git a/benchmarks/v1/scripts/build-self-witness-graph.sh b/benchmarks/v1/scripts/build-self-witness-graph.sh new file mode 100755 index 000000000..b160eef5c --- /dev/null +++ b/benchmarks/v1/scripts/build-self-witness-graph.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 1 ]]; then + echo "usage: $0 " >&2 + exit 1 +fi + +name="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +self_root="${source_root}/self" +witness_source="${source_root}/circom-witness-rs" +build_root="${repo_root}/target/v1-benchmarks/circom-witness-builds/${name}" +crate_root="${build_root}/circom-witness-rs" +include_root="${build_root}/circom-include" +graph_root="${V1_BENCHMARK_WITNESS_GRAPH_ROOT:-${repo_root}/target/v1-benchmarks/circom-witness-graphs}/self" +circom_bin="$("${script_dir}/bootstrap-circom.sh")" +lock_file="${benchmark_root}/circom/circom-witness-rs.Cargo.lock" + +case "${name}" in + register_sha256_sha256_sha256_rsa_65537_4096) + circuit="${self_root}/circuits/circuits/register/instances/${name}.circom" + fixture="${benchmark_root}/circom/fixtures/self/${name}.json" + witness="${repo_root}/target/v1-benchmarks/circom-witnesses/self/${name}/wasm.wtns" + ;; + vc_and_disclose) + circuit="${self_root}/circuits/circuits/disclose/${name}.circom" + fixture="${benchmark_root}/circom/fixtures/self/${name}.json" + witness="${repo_root}/target/v1-benchmarks/circom-witnesses/self/${name}/wasm.wtns" + ;; + *) + echo "error: unsupported Self circuit ${name}" >&2 + exit 1 + ;; +esac + +for command in cargo jq perl rsync; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ ! -f "${witness}" ]] || + [[ ! -f "$(dirname "${witness}")/result.json" ]] || + ! jq -e '.byte_identical == true and .constraints_checked == true' \ + "$(dirname "${witness}")/result.json" >/dev/null; then + "${script_dir}/generate-self-passport-witnesses.sh" +fi + +mkdir -p "${crate_root}" "${graph_root}" +rsync -a --delete \ + --exclude target \ + "${witness_source}/" \ + "${crate_root}/" +cp "${benchmark_root}/circom/circom-witness-graph-main.rs" "${crate_root}/src/main.rs" +cp "${lock_file}" "${crate_root}/Cargo.lock" +perl -0777 -pi -e '$_ .= "\n[workspace]\n"' "${crate_root}/Cargo.toml" + +# Upstream graph generation hard-codes O2. Self's distributed circuit build is +# O1, so keep the graph's witness-to-signal mapping aligned with the R1CS. +perl -pi -e 's/\.arg\("--O2"\)/.arg("--O1")/' "${crate_root}/build.rs" +if grep -q 'arg("--O2")' "${crate_root}/build.rs"; then + echo "error: failed to align circom-witness-rs graph generation with Self O1" >&2 + exit 1 +fi + +mkdir -p "${include_root}" +find "${include_root}" -mindepth 1 -maxdepth 1 -delete +link_include_directory() { + find "$1" -mindepth 1 -maxdepth 1 -print0 | + while IFS= read -r -d '' path; do + destination="${include_root}/$(basename "${path}")" + if [[ ! -e "${destination}" ]]; then + ln -s "${path}" "${destination}" + fi + done +} +link_include_directory "${self_root}/circuits/node_modules" +link_include_directory "${self_root}/circuits/node_modules/circomlib/circuits" +link_include_directory "${self_root}/circuits/node_modules/@openpassport/zk-email-circuits" +link_include_directory \ + "${self_root}/circuits/node_modules/@zk-kit/binary-merkle-root.circom/src" + +( + cd "${crate_root}" + PATH="$(dirname "${circom_bin}"):${PATH}" \ + CXXFLAGS="-O0 -g0" \ + WITNESS_CPP="${circuit}" \ + CIRCOM_LIBRARY_PATH="${include_root}" \ + cargo run --locked --release --features build-witness -- generate + + cargo run --locked --release --features build-witness -- \ + check \ + "${crate_root}/graph.bin" \ + "${fixture}" \ + "${witness}" +) + +cp "${crate_root}/graph.bin" "${graph_root}/${name}.bin" +echo "Built and reference-checked ${graph_root}/${name}.bin" diff --git a/benchmarks/v1/scripts/compile-noir-workloads.sh b/benchmarks/v1/scripts/compile-noir-workloads.sh new file mode 100755 index 000000000..fd3efde81 --- /dev/null +++ b/benchmarks/v1/scripts/compile-noir-workloads.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +nargo_bin="$("${script_dir}/bootstrap-nargo.sh")" + +"${script_dir}/bootstrap-sources.sh" +"${script_dir}/prepare-noir-beta19-compat.sh" + +( + cd "${benchmark_root}/noir/webauthn_assertion" + bun install --frozen-lockfile + bun run fixture + "${nargo_bin}" compile --skip-brillig-constraints-check --force +) + +( + cd "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check" + bun run "${script_dir}/upgrade-passport-barrett-parameters.ts" Prover.toml + "${nargo_bin}" compile --skip-brillig-constraints-check --force +) + +( + cd "${repo_root}/target/v1-benchmarks/sources/oprf-nr/oprf_example" + "${nargo_bin}" compile --skip-brillig-constraints-check --force +) + +echo "Compiled WebAuthn, passport, and Taceo OPRF with pinned Noir" diff --git a/benchmarks/v1/scripts/configure-mopro-native.ts b/benchmarks/v1/scripts/configure-mopro-native.ts new file mode 100644 index 000000000..2d7d228c9 --- /dev/null +++ b/benchmarks/v1/scripts/configure-mopro-native.ts @@ -0,0 +1,342 @@ +import { copyFileSync, existsSync, readFileSync, writeFileSync } from "node:fs"; +import { join, resolve } from "node:path"; + +const [projectArg, artifactArg] = process.argv.slice(2); +if (!projectArg || !artifactArg) { + throw new Error( + "usage: bun run configure-mopro-native.ts ", + ); +} + +const project = resolve(projectArg); +const artifacts = resolve(artifactArg); +const cargoPath = join(project, "Cargo.toml"); +const buildPath = join(project, "build.rs"); +const libPath = join(project, "src/lib.rs"); +const vectorRoot = join(project, "test-vectors/circom"); +const benchmarkModuleSource = join( + import.meta.dir, + "../mopro/webauthn_mobench.rs", +); +const benchmarkModuleDestination = join(project, "src/webauthn_mobench.rs"); +const noirBenchmarkModuleSource = join( + import.meta.dir, + "../mopro/noir_mobench.rs", +); +const noirBenchmarkModuleDestination = join(project, "src/noir_mobench.rs"); +const hostRunnerSource = join(import.meta.dir, "../mopro/mobench_host.rs"); +const hostRunnerDestination = join(project, "src/bin/mobench-host.rs"); +const noirSrsHostSource = join(import.meta.dir, "../mopro/noir_srs_host.rs"); +const noirSrsHostDestination = join(project, "src/bin/noir-srs-host.rs"); +const ios15CharconvShimSource = join( + import.meta.dir, + "../mopro/ios15_charconv_shim.cpp", +); +const ios15CharconvShimDestination = join(project, "ios15_charconv_shim.cpp"); +const datSource = join( + artifacts, + "webauthn_default_cpp/webauthn_default.dat", +); +const wasmSource = join( + artifacts, + "webauthn_default_js/webauthn_default.wasm", +); +const inputSource = join( + artifacts, + "../../sources/webauth-circom/scripts/input_webauthn_default.json", +); + +for (const path of [ + cargoPath, + buildPath, + libPath, + datSource, + wasmSource, + inputSource, + benchmarkModuleSource, + noirBenchmarkModuleSource, + hostRunnerSource, + noirSrsHostSource, + ios15CharconvShimSource, +]) { + if (!existsSync(path)) { + throw new Error(`required path does not exist: ${path}`); + } +} + +function replaceRequired( + content: string, + before: string, + after: string, + label: string, +): string { + if (content.includes(after)) return content; + if (!content.includes(before)) { + throw new Error(`cannot configure ${label}: expected template text missing`); + } + return content.replace(before, after); +} + +let cargo = readFileSync(cargoPath, "utf8"); +const mobenchDependency = + 'mobench-sdk = { git = "https://github.com/worldcoin/mobile-bench-rs.git", rev = "e992596a786cc18047102a318d40131c953e57b8" }'; +cargo = cargo.replace(/^mobench-sdk = .*$/m, mobenchDependency); +if (cargo.includes('mopro-ffi = { version = "=0.3.7", features = ["witnesscalc"] }')) { + cargo = cargo.replace( + 'mopro-ffi = { version = "=0.3.7", features = ["witnesscalc"] }', + 'mopro-ffi = { version = "=0.3.7" }', + ); +} +cargo = replaceRequired( + cargo, + 'circom-prover = "0.1"\nrust-witness = "0.1"', + 'circom-prover = "=0.1.4"\nrust-witness = "0.1"', + "Circom prover dependencies", +); +cargo = cargo.replace( + 'circom-prover = { version = "=0.1.4", features = ["witnesscalc"] }\nwitnesscalc-adapter = "0.1"', + 'circom-prover = "=0.1.4"\nrust-witness = "0.1"', +); +if (!cargo.includes(mobenchDependency)) { + cargo = cargo.replace( + 'anyhow = "1.0.99"', + `anyhow = "1.0.99"\ninventory = "0.3"\n${mobenchDependency}`, + ); +} +if (!cargo.includes('inventory = "0.3"')) { + cargo = cargo.replace( + mobenchDependency, + `inventory = "0.3"\n${mobenchDependency}`, + ); +} +if (!cargo.includes('noirc_abi = { git = "https://github.com/noir-lang/noir.git", rev = "v1.0.0-beta.19" }')) { + cargo = cargo.replace( + 'serde_json = "1.0.94"', + 'serde_json = "1.0.94"\nnoirc_abi = { git = "https://github.com/noir-lang/noir.git", rev = "v1.0.0-beta.19" }', + ); +} +if (!cargo.includes("\n[workspace]\n")) cargo += "\n[workspace]\n"; +if (!cargo.includes('\ncc = "1"\n')) { + cargo = cargo.replace( + "# CIRCOM_BUILD_DEPENDENCIES", + '# CIRCOM_BUILD_DEPENDENCIES\ncc = "1"', + ); +} +writeFileSync(cargoPath, cargo); + +let build = readFileSync(buildPath, "utf8"); +build = replaceRequired( + build, + 'witnesscalc_adapter::build_and_link("./test-vectors/circom");', + 'rust_witness::transpile::transpile_wasm("./test-vectors/circom".to_string());', + "rust-witness build hook", +); +if (!build.includes("ios15_charconv_shim.cpp")) { + build = build.replace( + "fn main() {", + `fn main() { + let target = std::env::var("TARGET").expect("TARGET"); + if target.contains("apple-ios") { + cc::Build::new() + .cpp(true) + .file("ios15_charconv_shim.cpp") + .flag("-std=c++17") + .cargo_metadata(false) + .compile("ios15-charconv-shim"); + let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR"); + println!("cargo:rustc-link-search=native={out_dir}"); + println!("cargo:rustc-link-lib=static:+bundle=ios15-charconv-shim"); + }`, + ); +} +if (!build.includes("static:+bundle=ios15-charconv-shim")) { + build = replaceRequired( + build, + ` .flag("-std=c++17") + .compile("ios15-charconv-shim");`, + ` .flag("-std=c++17") + .cargo_metadata(false) + .compile("ios15-charconv-shim"); + let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR"); + println!("cargo:rustc-link-search=native={out_dir}"); + println!("cargo:rustc-link-lib=static:+bundle=ios15-charconv-shim");`, + "bundled iOS 15 charconv shim", + ); +} +writeFileSync(buildPath, build); +copyFileSync(ios15CharconvShimSource, ios15CharconvShimDestination); + +let lib = readFileSync(libPath, "utf8"); +lib = replaceRequired( + lib, + `mod witness { + rust_witness::witness!(multiplier2); +} + +crate::set_circom_circuits! { + ("multiplier2_final.zkey", circom_prover::witness::WitnessFn::RustWitness(witness::multiplier2_witness)), +}`, + `mod witness { + rust_witness::witness!(webauthndefault); +} + +crate::set_circom_circuits! { + ("webauthn_default_benchmark.zkey", circom_prover::witness::WitnessFn::RustWitness(witness::webauthndefault_witness)), +}`, + "Circom WebAuthn registration", +); +lib = lib.replace( + `witnesscalc_adapter::witness!(webauthndefault); + +crate::set_circom_circuits! { + ("webauthn_default_benchmark.zkey", circom_prover::witness::WitnessFn::WitnessCalc(webauthndefault_witness)), +}`, + `mod witness { + rust_witness::witness!(webauthndefault); +} + +crate::set_circom_circuits! { + ("webauthn_default_benchmark.zkey", circom_prover::witness::WitnessFn::RustWitness(witness::webauthndefault_witness)), +}`, +); +if ( + !lib.includes("requires the cached WebAuthn benchmark zkey") && + !lib.includes("fn test_webauthn_default()") +) { + lib = replaceRequired( + lib, + " #[test]\n fn test_multiplier2() {", + ' #[test]\n #[ignore = "requires the cached WebAuthn benchmark zkey"]\n fn test_multiplier2() {', + "sample Circom test guard", + ); +} +const mobenchMarker = "// MOBENCH_WEBAUTHN_DECLARATIONS"; +if (lib.includes(mobenchMarker)) { + lib = lib.slice(0, lib.indexOf(mobenchMarker)).trimEnd() + "\n"; +} else { + lib = lib.replace( + "\nmod webauthn_mobench;\nmobench_sdk::export_native_c_abi!();\n", + "\n", + ); +} +lib += ` +// MOBENCH_WEBAUTHN_DECLARATIONS +mod webauthn_mobench; +mod noir_mobench; +use mobench_sdk::benchmark; +use webauthn_mobench::{ + setup_inputs as setup_webauthn_arkworks_inputs, + setup_prove as setup_webauthn_arkworks_prove, + setup_verify as setup_webauthn_arkworks_verify, +}; +use noir_mobench::{ + setup_oprf_input_to_proof, + setup_oprf_prove as setup_oprf_barretenberg_prove, + setup_oprf_verify as setup_oprf_barretenberg_verify, + setup_passport_input_to_proof, + setup_passport_p1_input_to_proof, + setup_passport_prove as setup_passport_barretenberg_prove, + setup_passport_verify as setup_passport_barretenberg_verify, + setup_webauthn_input_to_proof, + setup_webauthn_prove as setup_webauthn_barretenberg_prove, + setup_webauthn_verify as setup_webauthn_barretenberg_verify, +}; + +#[benchmark(setup = setup_webauthn_input_to_proof, per_iteration)] +pub fn bench_webauthn_barretenberg_input_to_proof(prepared: noir_mobench::PreparedInputToProof) { + noir_mobench::bench_input_to_proof_impl(prepared); +} + +#[benchmark(setup = setup_passport_input_to_proof, per_iteration)] +pub fn bench_passport_barretenberg_input_to_proof(prepared: noir_mobench::PreparedInputToProof) { + noir_mobench::bench_input_to_proof_impl(prepared); +} + +#[benchmark(setup = setup_passport_p1_input_to_proof, per_iteration)] +pub fn bench_passport_p1_barretenberg_input_to_proof(prepared: noir_mobench::PreparedInputToProof) { + noir_mobench::bench_input_to_proof_impl(prepared); +} + +#[benchmark(setup = setup_oprf_input_to_proof, per_iteration)] +pub fn bench_oprf_barretenberg_input_to_proof(prepared: noir_mobench::PreparedInputToProof) { + noir_mobench::bench_input_to_proof_impl(prepared); +} + +#[benchmark(setup = setup_webauthn_arkworks_inputs, per_iteration)] +pub fn bench_webauthn_arkworks_witness(inputs: String) { + webauthn_mobench::bench_webauthn_arkworks_witness_impl(inputs); +} + +#[benchmark(setup = setup_webauthn_arkworks_prove, per_iteration)] +pub fn bench_webauthn_arkworks_prove(prepared: webauthn_mobench::PreparedProve) { + webauthn_mobench::bench_webauthn_arkworks_prove_impl(prepared); +} + +#[benchmark(setup = setup_webauthn_arkworks_verify)] +pub fn bench_webauthn_arkworks_verify(prepared: &webauthn_mobench::PreparedVerify) { + webauthn_mobench::bench_webauthn_arkworks_verify_impl(prepared); +} + +#[benchmark(setup = setup_webauthn_arkworks_inputs, per_iteration)] +pub fn bench_webauthn_arkworks_e2e(inputs: String) { + webauthn_mobench::bench_webauthn_arkworks_e2e_impl(inputs); +} + +#[benchmark(setup = setup_webauthn_barretenberg_prove, per_iteration)] +pub fn bench_webauthn_barretenberg_prove(prepared: noir_mobench::PreparedProve) { + noir_mobench::bench_prove_impl(prepared); +} + +#[benchmark(setup = setup_webauthn_barretenberg_verify)] +pub fn bench_webauthn_barretenberg_verify(prepared: &noir_mobench::PreparedVerify) { + noir_mobench::bench_verify_impl(prepared); +} + +#[benchmark(setup = setup_webauthn_barretenberg_prove, per_iteration)] +pub fn bench_webauthn_barretenberg_proof_verify(prepared: noir_mobench::PreparedProve) { + noir_mobench::bench_proof_verify_impl(prepared); +} + +#[benchmark(setup = setup_oprf_barretenberg_prove, per_iteration)] +pub fn bench_oprf_barretenberg_prove(prepared: noir_mobench::PreparedProve) { + noir_mobench::bench_prove_impl(prepared); +} + +#[benchmark(setup = setup_oprf_barretenberg_verify)] +pub fn bench_oprf_barretenberg_verify(prepared: &noir_mobench::PreparedVerify) { + noir_mobench::bench_verify_impl(prepared); +} + +#[benchmark(setup = setup_oprf_barretenberg_prove, per_iteration)] +pub fn bench_oprf_barretenberg_proof_verify(prepared: noir_mobench::PreparedProve) { + noir_mobench::bench_proof_verify_impl(prepared); +} + +#[benchmark(setup = setup_passport_barretenberg_prove, per_iteration)] +pub fn bench_passport_barretenberg_prove(prepared: noir_mobench::PreparedProve) { + noir_mobench::bench_prove_impl(prepared); +} + +#[benchmark(setup = setup_passport_barretenberg_verify)] +pub fn bench_passport_barretenberg_verify(prepared: &noir_mobench::PreparedVerify) { + noir_mobench::bench_verify_impl(prepared); +} + +#[benchmark(setup = setup_passport_barretenberg_prove, per_iteration)] +pub fn bench_passport_barretenberg_proof_verify(prepared: noir_mobench::PreparedProve) { + noir_mobench::bench_proof_verify_impl(prepared); +} + +mobench_sdk::export_native_c_abi!(); +`; +writeFileSync(libPath, lib); + +copyFileSync(datSource, join(vectorRoot, "webauthndefault.dat")); +copyFileSync(wasmSource, join(vectorRoot, "webauthndefault.wasm")); +copyFileSync(inputSource, join(vectorRoot, "input_webauthn_default.json")); +copyFileSync(benchmarkModuleSource, benchmarkModuleDestination); +copyFileSync(noirBenchmarkModuleSource, noirBenchmarkModuleDestination); +copyFileSync(hostRunnerSource, hostRunnerDestination); +copyFileSync(noirSrsHostSource, noirSrsHostDestination); + +console.log(`Configured Mopro native adapters at ${project}`); diff --git a/benchmarks/v1/scripts/generate-passport-p1-witness.sh b/benchmarks/v1/scripts/generate-passport-p1-witness.sh new file mode 100755 index 000000000..f43b85c33 --- /dev/null +++ b/benchmarks/v1/scripts/generate-passport-p1-witness.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +circom_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/passport_p1" +witness_root="${V1_BENCHMARK_WITNESS_ROOT:-${repo_root}/target/v1-benchmarks/circom-witnesses}/passport_p1" +self_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}/self" +fixture="${benchmark_root}/circom/fixtures/passport_p1/input.json" +snarkjs="${self_root}/node_modules/snarkjs/build/cli.cjs" + +for command in bun cmp jq node stat; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +hash_file() { + shasum -a 256 "$1" | awk '{print $1}' +} +stat_size() { + if [[ "$(uname -s)" == Darwin ]]; then stat -f '%z' "$1"; else stat -c '%s' "$1"; fi +} + +"${script_dir}/prepare-passport-p1-circom.sh" +mkdir -p "${witness_root}" +wasm_witness="${witness_root}/wasm.wtns" +native_witness="${witness_root}/native.wtns" +node "${circom_root}/passport_p1_js/generate_witness.js" \ + "${circom_root}/passport_p1_js/passport_p1.wasm" "${fixture}" "${wasm_witness}" +"${circom_root}/passport_p1_cpp/passport_p1" "${fixture}" "${native_witness}" +cmp -s "${wasm_witness}" "${native_witness}" || { + echo "error: P1 WASM and portable C++ WTNS files differ" >&2 + exit 1 +} +node "${snarkjs}" wtns check "${circom_root}/passport_p1.r1cs" "${wasm_witness}" + +jq -n \ + --arg workload passport_p1 \ + --arg sha256 "$(hash_file "${wasm_witness}")" \ + --argjson size "$(stat_size "${wasm_witness}")" \ + '{schema_version: 1, workload: $workload, witness_format: "WTNS v2", generators: ["Circom WASM", "Circom portable C++"], byte_identical: true, constraints_checked: true, size: $size, sha256: $sha256}' \ + >"${witness_root}/result.json" +echo "verified P1 witness: $(stat_size "${wasm_witness}") bytes, $(hash_file "${wasm_witness}")" diff --git a/benchmarks/v1/scripts/generate-self-passport-witnesses.sh b/benchmarks/v1/scripts/generate-self-passport-witnesses.sh new file mode 100755 index 000000000..83327e176 --- /dev/null +++ b/benchmarks/v1/scripts/generate-self-passport-witnesses.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +circom_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/self" +witness_root="${V1_BENCHMARK_WITNESS_ROOT:-${repo_root}/target/v1-benchmarks/circom-witnesses}/self" +snarkjs="${repo_root}/target/v1-benchmarks/sources/self/node_modules/snarkjs/build/cli.cjs" + +for command in bun cmp jq stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if command -v sha256sum >/dev/null 2>&1; then + hash_file() { + sha256sum "$1" | awk '{print $1}' + } +elif command -v shasum >/dev/null 2>&1; then + hash_file() { + shasum -a 256 "$1" | awk '{print $1}' + } +else + echo "error: sha256sum or shasum is required" >&2 + exit 1 +fi + +stat_size() { + if [[ "$(uname -s)" == "Darwin" ]]; then + stat -f '%z' "$1" + else + stat -c '%s' "$1" + fi +} + +"${script_dir}/prepare-self-passport.sh" + +generate_witnesses() { + local name="$1" + local fixture="$2" + local circuit_dir="${circom_root}/${name}" + local output_dir="${witness_root}/${name}" + local wasm_witness="${output_dir}/wasm.wtns" + local native_witness="${output_dir}/native.wtns" + local wasm_generator="${circuit_dir}/${name}_js/generate_witness.js" + local wasm="${circuit_dir}/${name}_js/${name}.wasm" + local native_generator="${circuit_dir}/${name}_cpp/${name}" + local r1cs="${circuit_dir}/${name}.r1cs" + + mkdir -p "${output_dir}" + bun run "${wasm_generator}" "${wasm}" "${fixture}" "${wasm_witness}" + "${native_generator}" "${fixture}" "${native_witness}" + + if ! cmp -s "${wasm_witness}" "${native_witness}"; then + echo "error: ${name} WASM and native WTNS files differ" >&2 + exit 1 + fi + + # SnarkJS 0.7.5's web-worker shim is not compatible with Bun's EventTarget. + # Keep this validation-only exception pinned to Self's required Node 22. + node "${snarkjs}" wtns check "${r1cs}" "${wasm_witness}" + + jq -n \ + --arg workload "${name}" \ + --arg sha256 "$(hash_file "${wasm_witness}")" \ + --argjson size "$(stat_size "${wasm_witness}")" \ + '{ + schema_version: 1, + workload: $workload, + witness_format: "WTNS v2", + generators: ["Circom WASM", "Circom portable C++"], + byte_identical: true, + size: $size, + sha256: $sha256, + constraints_checked: true + }' >"${output_dir}/result.json" + + echo "verified ${name}: $(stat_size "${wasm_witness}") bytes, $(hash_file "${wasm_witness}")" +} + +generate_witnesses \ + "register_sha256_sha256_sha256_rsa_65537_4096" \ + "${benchmark_root}/circom/fixtures/self/register_sha256_sha256_sha256_rsa_65537_4096.json" +generate_witnesses \ + "vc_and_disclose" \ + "${benchmark_root}/circom/fixtures/self/vc_and_disclose.json" + +echo "Self passport WASM and portable C++ witness generators agree." diff --git a/benchmarks/v1/scripts/import-frozen-circom-browser-fixtures.sh b/benchmarks/v1/scripts/import-frozen-circom-browser-fixtures.sh new file mode 100755 index 000000000..d3acb9ed3 --- /dev/null +++ b/benchmarks/v1/scripts/import-frozen-circom-browser-fixtures.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash + +set -euo pipefail + +repo_root="$(git rev-parse --show-toplevel)" +source_root="${CIRCOM_FROZEN_SOURCE_ROOT:-}" +destination="${CIRCOM_BROWSER_FIXTURE_ROOT:-${repo_root}/target/v1-benchmarks/circom-browser}" + +if [[ -z "${source_root}" ]]; then + echo "error: set CIRCOM_FROZEN_SOURCE_ROOT to a verified prior target/v1-benchmarks directory" >&2 + exit 1 +fi + +source_root="$(cd "${source_root}" && pwd)" +mkdir -p "${destination}"/{passport,webauthn} + +link_verified() { + local expected_sha="$1" + local source_file="$2" + local destination_file="$3" + local actual_sha + + if [[ ! -f "${source_file}" ]]; then + echo "error: missing frozen artifact ${source_file}" >&2 + exit 1 + fi + actual_sha="$(shasum -a 256 "${source_file}" | awk '{print $1}')" + if [[ "${actual_sha}" != "${expected_sha}" ]]; then + echo "error: hash drift for ${source_file}" >&2 + echo "expected ${expected_sha}" >&2 + echo "actual ${actual_sha}" >&2 + exit 1 + fi + ln -f "${source_file}" "${destination_file}" +} + +self_register="register_sha256_sha256_sha256_rsa_65537_4096" +link_verified \ + b59b4c36d213a68cff17049353c7c000bd0fb929ce614ae5ff44e12281a19a14 \ + "${source_root}/circom/self/${self_register}/${self_register}_js/${self_register}.wasm" \ + "${destination}/passport/${self_register}.wasm" +link_verified \ + 761a903ee3218cd0f986b7c8b9c46aac4cd5c2107e7cd0c2daf3b80f9c336d31 \ + "${source_root}/mobile-fixtures/groth16/${self_register}/resources/proving_key.zkey" \ + "${destination}/passport/${self_register}.zkey" +link_verified \ + 2ef5733c2634cf753b969640bb23e4e590b935fcd5cedfac1241184885fece3e \ + "${source_root}/mobile-fixtures/groth16/${self_register}/resources/verification_key.json" \ + "${destination}/passport/${self_register}.vkey.json" +link_verified \ + 2d9ccff0b1a94c500d722cea20fbeb68ff9c6c48f21391b7f5b441752dfa5030 \ + "${source_root}/mobile-fixtures/groth16/${self_register}/resources/input.json" \ + "${destination}/passport/${self_register}.input.json" + +link_verified \ + cb300197503318ab2635499d4b44f46f932e311930faabf6be960d6d81110f13 \ + "${source_root}/circom/self/vc_and_disclose/vc_and_disclose_js/vc_and_disclose.wasm" \ + "${destination}/passport/vc_and_disclose.wasm" +link_verified \ + 4ef28839cb7d9081cd0d747abd5a443d1a9962432c8469076d3c49107b59c964 \ + "${source_root}/mobile-fixtures/groth16/vc_and_disclose/resources/proving_key.zkey" \ + "${destination}/passport/vc_and_disclose.zkey" +link_verified \ + b5c877411b38a5f1257280a9f7edc586234c5cea6b1f58a5e29fc31c025addd0 \ + "${source_root}/mobile-fixtures/groth16/vc_and_disclose/resources/verification_key.json" \ + "${destination}/passport/vc_and_disclose.vkey.json" +link_verified \ + f88d57881fdf0569ab5896a7bbbb96c6fb463962bafa58c20f11b1b44061a011 \ + "${source_root}/mobile-fixtures/groth16/vc_and_disclose/resources/input.json" \ + "${destination}/passport/vc_and_disclose.input.json" + +link_verified \ + b24b95ec8d9eca43e6d14d0f0d1a9d426ce2dded1855b13a765d6ceb281e2088 \ + "${source_root}/circom/webauthn/webauthn_default_js/webauthn_default.wasm" \ + "${destination}/webauthn/webauthn_default.wasm" +link_verified \ + a5828d55680b65b55a1bb5be0a26f151342e37551537a71d257fe07d9677e94b \ + "${source_root}/groth16/webauthn/webauthn_default_benchmark.zkey" \ + "${destination}/webauthn/webauthn_default.zkey" +link_verified \ + 4c83de54945e7987e3072d496d363e2256e767905f99106f84da66330ed42802 \ + "${source_root}/groth16/webauthn/verification_key.json" \ + "${destination}/webauthn/webauthn_default.vkey.json" +link_verified \ + b635e9511a747bb0bea0278d423e3e859b24d386368186c72a8e46e4e0644657 \ + "${source_root}/sources/webauth-circom/scripts/input_webauthn_default.json" \ + "${destination}/webauthn/webauthn_default.input.json" + +jq -n '{ + schema_version: 1, + fixtures: { + passport: [ + { + circuit: "register_sha256_sha256_sha256_rsa_65537_4096", + variant: "self_passport_registration", + wasm: "passport/register_sha256_sha256_sha256_rsa_65537_4096.wasm", + zkey: "passport/register_sha256_sha256_sha256_rsa_65537_4096.zkey", + verification_key: "passport/register_sha256_sha256_sha256_rsa_65537_4096.vkey.json", + input: "passport/register_sha256_sha256_sha256_rsa_65537_4096.input.json", + circuit_commit: "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e", + semantic_equivalence: "closest-analogue-not-equivalent" + }, + { + circuit: "vc_and_disclose", + variant: "self_passport_disclosure", + wasm: "passport/vc_and_disclose.wasm", + zkey: "passport/vc_and_disclose.zkey", + verification_key: "passport/vc_and_disclose.vkey.json", + input: "passport/vc_and_disclose.input.json", + circuit_commit: "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e", + semantic_equivalence: "closest-analogue-not-equivalent" + } + ], + webauthn: [ + { + circuit: "webauthn_default", + variant: "privacy_ethereum_webauth_circom", + wasm: "webauthn/webauthn_default.wasm", + zkey: "webauthn/webauthn_default.zkey", + verification_key: "webauthn/webauthn_default.vkey.json", + input: "webauthn/webauthn_default.input.json", + circuit_commit: "0fb5b4aa1398281c2fd3dbe14db147e05b61f201", + semantic_equivalence: "closest-analogue-not-equivalent" + } + ], + oprf: [] + } +}' >"${destination}/manifest.json" + +echo "Imported hash-verified Circom browser fixtures into ${destination}" diff --git a/benchmarks/v1/scripts/measure-bundle.sh b/benchmarks/v1/scripts/measure-bundle.sh new file mode 100755 index 000000000..ed2243052 --- /dev/null +++ b/benchmarks/v1/scripts/measure-bundle.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 2 ]]; then + echo "usage: $0 " >&2 + exit 2 +fi + +manifest="$1" +output="$2" + +for command in jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ ! -f "${manifest}" ]]; then + echo "error: manifest not found: ${manifest}" >&2 + exit 1 +fi + +if command -v sha256sum >/dev/null 2>&1; then + hash_file() { + sha256sum "$1" | awk '{print $1}' + } +elif command -v shasum >/dev/null 2>&1; then + hash_file() { + shasum -a 256 "$1" | awk '{print $1}' + } +else + echo "error: sha256sum or shasum is required" >&2 + exit 1 +fi + +size_file() { + if stat -f '%z' "$1" >/dev/null 2>&1; then + stat -f '%z' "$1" + else + stat -c '%s' "$1" + fi +} + +rows_file="$(mktemp "${TMPDIR:-/tmp}/provekit-v1-bundle.XXXXXX")" +cleanup() { + rm -f "${rows_file}" +} +trap cleanup EXIT + +line_number=0 +while IFS=$'\t' read -r scope kind path mime_type extra; do + line_number=$((line_number + 1)) + + if [[ -z "${scope}" || "${scope}" == \#* ]]; then + continue + fi + + if [[ -n "${extra:-}" || -z "${kind}" || -z "${path}" ]]; then + echo "error: ${manifest}:${line_number}: expected 3 or 4 tab-separated fields" >&2 + exit 1 + fi + + if [[ ! -f "${path}" ]]; then + echo "error: ${manifest}:${line_number}: artifact is not a regular file: ${path}" >&2 + exit 1 + fi + + bytes="$(size_file "${path}")" + sha256="$(hash_file "${path}")" + + jq -cn \ + --arg scope "${scope}" \ + --arg kind "${kind}" \ + --arg path "${path}" \ + --arg mime_type "${mime_type:-}" \ + --arg sha256 "${sha256}" \ + --argjson bytes "${bytes}" \ + '{ + scope: $scope, + kind: $kind, + path: $path, + bytes: $bytes, + sha256: $sha256 + } + if $mime_type == "" then {} else {mime_type: $mime_type} end' \ + >>"${rows_file}" +done <"${manifest}" + +mkdir -p "$(dirname "${output}")" + +jq -s \ + '{ + schema_version: 1, + artifacts: ., + totals: ( + group_by(.scope) + | map({ + key: .[0].scope, + value: (map(.bytes) | add) + }) + | from_entries + ) + }' \ + "${rows_file}" >"${output}" + +echo "Wrote ${output}" diff --git a/benchmarks/v1/scripts/merge-ios-prebuilt-manifests.sh b/benchmarks/v1/scripts/merge-ios-prebuilt-manifests.sh new file mode 100755 index 000000000..7b1781315 --- /dev/null +++ b/benchmarks/v1/scripts/merge-ios-prebuilt-manifests.sh @@ -0,0 +1,197 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -lt 3 ]]; then + echo "usage: $0 OUTPUT_ROOT MANIFEST MANIFEST [MANIFEST ...]" >&2 + exit 2 +fi + +output_root="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" +shift +manifests=("$@") + +for command in cp jq shasum stat; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +case "${output_root}" in + */target/v1-benchmarks/*-ios-prebuilt) + ;; + *) + echo "error: output must be a target/v1-benchmarks/*-ios-prebuilt directory" >&2 + exit 2 + ;; +esac + +parent="$(dirname "${output_root}")" +work_root="$(mktemp -d "${parent}/merged-ios-prebuilt.XXXXXX")" +cleanup() { + case "${work_root}" in + "${parent}"/merged-ios-prebuilt.*) + rm -rf "${work_root}" + ;; + *) + echo "error: refusing to clean unexpected merge path: ${work_root}" >&2 + ;; + esac +} +trap cleanup EXIT + +entries_file="${work_root}/entries.jsonl" +provenance_file="${work_root}/provenance.jsonl" +: >"${entries_file}" +: >"${provenance_file}" +entry_index=0 + +copy_artifact() { + local source="$1" + local destination="$2" + cp -c "${source}" "${destination}" 2>/dev/null || + cp "${source}" "${destination}" +} + +for manifest in "${manifests[@]}"; do + manifest="$(cd "$(dirname "${manifest}")" && pwd)/$(basename "${manifest}")" + jq -e ' + .schema == "mobench.prebuilt.v1" and + .platform == "ios" and + (.source_sha | test("^[0-9a-f]{40}$")) and + (.entries | length > 0) + ' "${manifest}" >/dev/null + + manifest_root="$(dirname "${manifest}")" + jq -cn \ + --arg manifest "${manifest}" \ + --arg source_sha "$(jq -er '.source_sha' "${manifest}")" \ + --arg sha256 "$(shasum -a 256 "${manifest}" | awk '{print $1}')" \ + '{ + manifest: $manifest, + source_sha: $source_sha, + manifest_sha256: $sha256 + }' >>"${provenance_file}" + + entry_count="$(jq -r '.entries | length' "${manifest}")" + for ((source_index = 0; source_index < entry_count; source_index++)); do + entry="$(printf '%04d' "${entry_index}")" + destination="${work_root}/entries/${entry}" + mkdir -p "${destination}" + + function="$(jq -er ".entries[${source_index}].function" "${manifest}")" + iterations="$(jq -er ".entries[${source_index}].iterations" "${manifest}")" + warmup="$(jq -er ".entries[${source_index}].warmup" "${manifest}")" + timeout="$( + jq -er \ + ".entries[${source_index}].completion_timeout_secs // 7200" \ + "${manifest}" + )" + + artifacts_file="${work_root}/artifacts-${entry}.jsonl" + : >"${artifacts_file}" + artifact_count="$( + jq -r ".entries[${source_index}].artifacts | length" "${manifest}" + )" + for ((artifact_index = 0; artifact_index < artifact_count; artifact_index++)); do + kind="$( + jq -er \ + ".entries[${source_index}].artifacts[${artifact_index}].kind" \ + "${manifest}" + )" + relative_path="$( + jq -er \ + ".entries[${source_index}].artifacts[${artifact_index}].path" \ + "${manifest}" + )" + expected_size="$( + jq -er \ + ".entries[${source_index}].artifacts[${artifact_index}].size" \ + "${manifest}" + )" + expected_hash="$( + jq -er \ + ".entries[${source_index}].artifacts[${artifact_index}].sha256" \ + "${manifest}" + )" + source="${manifest_root}/${relative_path}" + [[ -f "${source}" ]] || { + echo "error: missing prebuilt artifact ${source}" >&2 + exit 1 + } + [[ "$(stat -f '%z' "${source}")" == "${expected_size}" ]] || { + echo "error: size mismatch for ${source}" >&2 + exit 1 + } + [[ "$(shasum -a 256 "${source}" | awk '{print $1}')" == "${expected_hash}" ]] || { + echo "error: hash mismatch for ${source}" >&2 + exit 1 + } + + filename="$(basename "${relative_path}")" + copied="${destination}/${filename}" + copy_artifact "${source}" "${copied}" + copied_path="entries/${entry}/${filename}" + jq -cn \ + --arg kind "${kind}" \ + --arg path "${copied_path}" \ + --arg sha256 "${expected_hash}" \ + --argjson size "${expected_size}" \ + '{kind: $kind, path: $path, size: $size, sha256: $sha256}' \ + >>"${artifacts_file}" + done + + jq -s \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + --argjson timeout "${timeout}" \ + '{ + function: $function, + iterations: $iterations, + warmup: $warmup, + completion_timeout_secs: $timeout, + artifacts: . + }' "${artifacts_file}" >>"${entries_file}" + entry_index=$((entry_index + 1)) + done +done + +source_sha="$( + jq -sc '.' "${provenance_file}" | + shasum | + awk '{print $1}' +)" +jq -s \ + --arg source_sha "${source_sha}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_sha, + platform: "ios", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-xcuitest-v2" + }, + entries: . + }' "${entries_file}" >"${work_root}/manifest.json" +jq -s \ + --arg source_sha "${source_sha}" \ + '{ + schema: "provekit.merged-ios-prebuilt-provenance.v1", + source_sha: $source_sha, + inputs: . + }' "${provenance_file}" >"${work_root}/provenance.json" + +rm -f "${entries_file}" "${provenance_file}" +find "${work_root}" -maxdepth 1 -type f -name 'artifacts-*.jsonl' -delete + +if [[ -e "${output_root}" ]]; then + rm -rf "${output_root}" +fi +mv "${work_root}" "${output_root}" +mv "${output_root}/provenance.json" "${output_root}.provenance.json" +trap - EXIT +echo "${output_root}/manifest.json" diff --git a/benchmarks/v1/scripts/patch-ios-cold-launches.ts b/benchmarks/v1/scripts/patch-ios-cold-launches.ts new file mode 100644 index 000000000..2b0e7846f --- /dev/null +++ b/benchmarks/v1/scripts/patch-ios-cold-launches.ts @@ -0,0 +1,74 @@ +import { resolve } from "node:path"; + +const [sourceArgument, countArgument] = process.argv.slice(2); +if (!sourceArgument || !countArgument) { + throw new Error("usage: bun patch-ios-cold-launches.ts BenchRunnerUITests.swift COUNT"); +} + +const sourcePath = resolve(sourceArgument); +const count = Number(countArgument); +if (!Number.isInteger(count) || count < 2) throw new Error("COUNT must be an integer greater than one"); + +const source = await Bun.file(sourcePath).text(); +const startMarker = " func testLaunchAndCaptureBenchmarkReport() {"; +const endMarker = "\n // Keep the old test name for backward compatibility"; +const start = source.indexOf(startMarker); +const end = source.indexOf(endMarker, start); +if (start < 0 || end < 0) throw new Error(`${sourcePath}: Mobench XCTest function markers not found`); + +const replacement = ` func testLaunchAndCaptureBenchmarkReport() { + var reports: [Any] = [] + + for invocation in 0..<${count} { + let app = XCUIApplication() + if app.state != .notRunning { + app.terminate() + } + app.launch() + + let completedIndicator = app.staticTexts["benchmarkCompleted"] + let completed = waitForBenchmarkCompletion(completedIndicator, app: app) + XCTAssertTrue( + completed, + "Cold invocation \\(invocation) should complete within \\(benchmarkTimeout) seconds" + ) + + Thread.sleep(forTimeInterval: 5.0) + let reportElement = app.staticTexts["benchmarkReportJSON"] + XCTAssertTrue( + reportElement.exists, + "Cold invocation \\(invocation) report JSON should exist" + ) + let reportValue = reportElement.value as? String + let jsonString = firstValidJSON([reportValue, reportElement.label]) ?? "" + XCTAssertFalse(jsonString.isEmpty, "Cold invocation \\(invocation) report should not be empty") + XCTAssertFalse( + jsonString.contains("\\\"error\\\""), + "Cold invocation \\(invocation) should not return an error payload: \\(jsonString)" + ) + guard let data = jsonString.data(using: .utf8), + let report = try? JSONSerialization.jsonObject(with: data) else { + XCTFail("Cold invocation \\(invocation) report should be valid JSON") + return + } + reports.append(report) + app.terminate() + } + + guard let aggregateData = try? JSONSerialization.data(withJSONObject: reports), + let aggregate = String(data: aggregateData, encoding: .utf8) else { + XCTFail("Cold benchmark reports should serialize as JSON") + return + } + NSLog("BENCH_REPORT_JSON_START") + NSLog("%@", aggregate) + NSLog("BENCH_REPORT_JSON_END") + print("BENCH_REPORT_JSON_START") + print(aggregate) + print("BENCH_REPORT_JSON_END") + XCTAssertEqual(reports.count, ${count}, "Every cold app launch should produce one report") + } +`; + +await Bun.write(sourcePath, source.slice(0, start) + replacement + source.slice(end)); +console.log(`${sourcePath}: patched for ${count} fresh app launches`); diff --git a/benchmarks/v1/scripts/patch-ios-remote-proving-key.ts b/benchmarks/v1/scripts/patch-ios-remote-proving-key.ts new file mode 100644 index 000000000..becebe622 --- /dev/null +++ b/benchmarks/v1/scripts/patch-ios-remote-proving-key.ts @@ -0,0 +1,171 @@ +#!/usr/bin/env bun + +const [swiftPath] = Bun.argv.slice(2); +if (!swiftPath) { + throw new Error("usage: patch-ios-remote-proving-key.ts "); +} + +const marker = "private enum RemoteProvingKey"; +let swift = await Bun.file(swiftPath).text(); +if (swift.includes(marker)) { + console.log(`Remote proving-key bootstrap already present in ${swiftPath}`); + process.exit(0); +} + +swift = swift.replace("import Foundation\nimport Darwin\n", `import Foundation +import Darwin +import CryptoKit + +${marker} { + private struct Manifest: Decodable { + let url: String + let bytes: UInt64 + let sha256: String + } + + static func prepareIfConfigured() throws { + guard let manifestURL = Bundle.main.url( + forResource: "proving_key_remote", + withExtension: "json" + ) else { + return + } + let manifest = try JSONDecoder().decode( + Manifest.self, + from: Data(contentsOf: manifestURL) + ) + guard let remoteURL = URL(string: manifest.url), + remoteURL.scheme == "https" else { + throw failure("remote proving-key URL must use HTTPS") + } + + let manager = FileManager.default + let root = try manager.url( + for: .cachesDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ).appendingPathComponent("mobench-groth16", isDirectory: true) + try manager.createDirectory(at: root, withIntermediateDirectories: true) + let provingKey = root.appendingPathComponent("proving_key.zkey") + + var reusable = false + if let attributes = try? manager.attributesOfItem(atPath: provingKey.path), + let size = attributes[.size] as? NSNumber, + size.uint64Value == manifest.bytes { + reusable = try sha256(provingKey) == manifest.sha256.lowercased() + } + if !reusable { + NSLog("MOBENCH_REMOTE_ZKEY_DOWNLOAD_START %@", remoteURL.absoluteString) + let semaphore = DispatchSemaphore(value: 0) + var downloaded: URL? + var downloadError: Error? + URLSession.shared.downloadTask(with: remoteURL) { url, _, error in + downloaded = url + downloadError = error + semaphore.signal() + }.resume() + semaphore.wait() + if let downloadError { + throw downloadError + } + guard let downloaded else { + throw failure("remote proving-key download returned no file") + } + let size = try manager.attributesOfItem(atPath: downloaded.path)[.size] as? NSNumber + guard size?.uint64Value == manifest.bytes else { + throw failure("remote proving-key byte length mismatch") + } + guard try sha256(downloaded) == manifest.sha256.lowercased() else { + throw failure("remote proving-key SHA-256 mismatch") + } + if manager.fileExists(atPath: provingKey.path) { + try manager.removeItem(at: provingKey) + } + try manager.moveItem(at: downloaded, to: provingKey) + NSLog("MOBENCH_REMOTE_ZKEY_DOWNLOAD_COMPLETE %llu", manifest.bytes) + } + + for name in ["reference.wtns", "verification_key.json"] { + let source = Bundle.main.url( + forResource: (name as NSString).deletingPathExtension, + withExtension: (name as NSString).pathExtension + ) + guard let source else { + continue + } + let destination = root.appendingPathComponent(name) + if manager.fileExists(atPath: destination.path) { + try manager.removeItem(at: destination) + } + try manager.copyItem(at: source, to: destination) + } + root.path.withCString { + _ = setenv("MOBENCH_GROTH16_FIXTURE_ROOT", $0, 1) + } + provingKey.path.withCString { + _ = setenv("MOBENCH_WEBAUTHN_ZKEY", $0, 1) + } + } + + private static func sha256(_ url: URL) throws -> String { + let handle = try FileHandle(forReadingFrom: url) + defer { try? handle.close() } + guard fcntl(handle.fileDescriptor, F_NOCACHE, 1) != -1 else { + throw NSError( + domain: NSPOSIXErrorDomain, + code: Int(errno), + userInfo: [ + NSLocalizedDescriptionKey: + "failed to disable proving-key file caching" + ] + ) + } + var hasher = SHA256() + while try autoreleasepool(invoking: { + guard let data = try handle.read(upToCount: 8 * 1024 * 1024), + !data.isEmpty else { + return false + } + hasher.update(data: data) + return true + }) {} + return hasher.finalize().map { String(format: "%02x", $0) }.joined() + } + + private static func failure(_ message: String) -> NSError { + NSError( + domain: "dev.world.provekit.remote-proving-key", + code: 1, + userInfo: [NSLocalizedDescriptionKey: message] + ) + } +} +`); + +swift = swift.replace( + ` static func runCurrentBenchmark() -> BenchmarkResult { + let params = BenchParams.resolved() + return run(params: params) + }`, + ` static func runCurrentBenchmark() -> BenchmarkResult { + do { + try RemoteProvingKey.prepareIfConfigured() + } catch { + let message = "Remote proving-key preparation failed: \\(error.localizedDescription)" + print("[BenchRunner] ERROR: \\(message)") + return BenchmarkResult( + displayText: message, + jsonReport: serializeJSON(["error": true, "message": message]) + ) + } + let params = BenchParams.resolved() + return run(params: params) + }`, +); + +if (!swift.includes(marker) || !swift.includes("RemoteProvingKey.prepareIfConfigured()")) { + throw new Error(`failed to patch ${swiftPath}`); +} +await Bun.write(swiftPath, swift); +console.log(`Added hash-checked remote proving-key bootstrap to ${swiftPath}`); diff --git a/benchmarks/v1/scripts/patch-ios-runner-json.ts b/benchmarks/v1/scripts/patch-ios-runner-json.ts new file mode 100755 index 000000000..d6ae8a9a9 --- /dev/null +++ b/benchmarks/v1/scripts/patch-ios-runner-json.ts @@ -0,0 +1,35 @@ +#!/usr/bin/env bun + +import { readFile, writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; + +const [runnerArg] = process.argv.slice(2); +if (!runnerArg) { + throw new Error( + "usage: bun patch-ios-runner-json.ts ", + ); +} + +const runner = resolve(runnerArg); +const unsafe = + 'jsonReport: "{\\"error\\": true, \\"message\\": \\"\\(escapeJSON(message))\\"}"'; +const safe = + 'jsonReport: serializeJSON(["error": true, "message": message])'; +const source = await readFile(runner, "utf8"); +const occurrences = source.split(unsafe).length - 1; + +if (source.includes(safe)) { + if (occurrences !== 0) { + throw new Error(`runner contains both JSON error paths: ${runner}`); + } + console.log(`Validated JSON-safe error reporting in ${runner}`); + process.exit(0); +} +if (occurrences !== 1) { + throw new Error( + `expected exactly one generated JSON error path in ${runner}, found ${occurrences}`, + ); +} + +await writeFile(runner, source.replace(unsafe, safe)); +console.log(`Patched JSON-safe error reporting in ${runner}`); diff --git a/benchmarks/v1/scripts/patch-ios15-xcuitest-suite.sh b/benchmarks/v1/scripts/patch-ios15-xcuitest-suite.sh new file mode 100755 index 000000000..6998c679e --- /dev/null +++ b/benchmarks/v1/scripts/patch-ios15-xcuitest-suite.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +set -euo pipefail + +suite="${1:?usage: patch-ios15-xcuitest-suite.sh }" +testing_interop="$( + xcrun --sdk iphoneos --show-sdk-platform-path +)/Developer/usr/lib/lib_TestingInterop.dylib" +testing_foundation="$( + xcrun --sdk iphoneos --show-sdk-platform-path +)/Developer/Library/Frameworks/_Testing_Foundation.framework" + +for command in codesign ditto find xcrun; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +[[ -f "${suite}" ]] || { + echo "error: XCUITest suite not found: ${suite}" >&2 + exit 1 +} +[[ -f "${testing_interop}" ]] || { + echo "error: Xcode Testing interop library not found: ${testing_interop}" >&2 + exit 1 +} +[[ -d "${testing_foundation}" ]] || { + echo "error: Xcode Testing Foundation framework not found: ${testing_foundation}" >&2 + exit 1 +} + +work="$(mktemp -d "${TMPDIR:-/tmp}/provekit-xcuitest.XXXXXX")" +cleanup() { + rm -rf "${work}" +} +trap cleanup EXIT + +ditto -x -k "${suite}" "${work}/unpacked" +runner="$(find "${work}/unpacked" -maxdepth 1 -type d -name '*UITests-Runner.app' -print -quit)" +[[ -n "${runner}" ]] || { + echo "error: XCUITest runner app not found in ${suite}" >&2 + exit 1 +} + +frameworks="${runner}/Frameworks" +mkdir -p "${frameworks}" +cp "${testing_interop}" "${frameworks}/lib_TestingInterop.dylib" +codesign --force --sign - "${frameworks}/lib_TestingInterop.dylib" +cp -R "${testing_foundation}" "${frameworks}/_Testing_Foundation.framework" +codesign --force --deep --sign - "${frameworks}/_Testing_Foundation.framework" + +next="${work}/BenchRunnerUITests.zip" +ditto -c -k --sequesterRsrc --keepParent "${runner}" "${next}" +mv "${next}" "${suite}" +echo "Patched ${suite} for Xcode 26 runners on iOS 15" diff --git a/benchmarks/v1/scripts/patch-xcuitest-testing-interop.sh b/benchmarks/v1/scripts/patch-xcuitest-testing-interop.sh new file mode 100755 index 000000000..7ee82a19a --- /dev/null +++ b/benchmarks/v1/scripts/patch-xcuitest-testing-interop.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +set -euo pipefail + +prebuilt_root="${1:?usage: patch-xcuitest-testing-interop.sh }" +testing_interop="$( + xcrun --sdk iphoneos --show-sdk-platform-path +)/Developer/usr/lib/lib_TestingInterop.dylib" +testing_foundation="$( + xcrun --sdk iphoneos --show-sdk-platform-path +)/Developer/Library/Frameworks/_Testing_Foundation.framework" + +for command in codesign ditto jq shasum stat xcrun; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +[[ -f "${testing_interop}" ]] || { + echo "error: Xcode Testing interop library not found at ${testing_interop}" >&2 + exit 1 +} +[[ -d "${testing_foundation}" ]] || { + echo "error: Xcode Testing Foundation framework not found at ${testing_foundation}" >&2 + exit 1 +} + +while IFS= read -r manifest; do + manifest_root="$(dirname "${manifest}")" + relative_suite="$( + jq -er '.entries[].artifacts[] | select(.kind == "ios-test-suite") | .path' "${manifest}" + )" + suite="${manifest_root}/${relative_suite}" + work="$(mktemp -d)" + trap 'rm -rf "${work}"' EXIT + ditto -x -k "${suite}" "${work}/unpacked" + runner="$(find "${work}/unpacked" -maxdepth 1 -type d -name '*UITests-Runner.app' -print -quit)" + [[ -n "${runner}" ]] || { + echo "error: XCUITest runner app not found in ${suite}" >&2 + exit 1 + } + frameworks="${runner}/Frameworks" + mkdir -p "${frameworks}" + cp "${testing_interop}" "${frameworks}/lib_TestingInterop.dylib" + codesign --force --sign - "${frameworks}/lib_TestingInterop.dylib" + cp -R "${testing_foundation}" "${frameworks}/_Testing_Foundation.framework" + codesign --force --deep --sign - "${frameworks}/_Testing_Foundation.framework" + ditto -c -k --sequesterRsrc --keepParent "${runner}" "${work}/test-suite.zip" + + suite_bytes="$(stat -f '%z' "${work}/test-suite.zip")" + suite_sha256="$(shasum -a 256 "${work}/test-suite.zip" | awk '{print $1}')" + manifest_next="$(mktemp "${manifest}.next.XXXXXX")" + jq \ + --arg artifact_path "${relative_suite}" \ + --argjson artifact_size "${suite_bytes}" \ + --arg artifact_sha256 "${suite_sha256}" \ + '(.entries[].artifacts[] | select(.path == $artifact_path)) |= + (.size = $artifact_size | .sha256 = $artifact_sha256)' \ + "${manifest}" >"${manifest_next}" + + mv "${work}/test-suite.zip" "${suite}" + mv "${manifest_next}" "${manifest}" + rm -rf "${work}" + trap - EXIT + echo "Patched ${suite}" +done < <(find "${prebuilt_root}" -name manifest.json -type f -print | sort) diff --git a/benchmarks/v1/scripts/preflight-browserstack-products.sh b/benchmarks/v1/scripts/preflight-browserstack-products.sh new file mode 100755 index 000000000..d7f657a17 --- /dev/null +++ b/benchmarks/v1/scripts/preflight-browserstack-products.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +set -euo pipefail + +for command in curl jq; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ -z "${BROWSERSTACK_USERNAME:-}" || -z "${BROWSERSTACK_ACCESS_KEY:-}" ]]; then + echo "error: BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY are required" >&2 + exit 1 +fi + +check_plan() { + local product="$1" + local url="$2" + local destination="$3" + local status + + status="$( + curl \ + --silent \ + --show-error \ + --user "${BROWSERSTACK_USERNAME}:${BROWSERSTACK_ACCESS_KEY}" \ + --output "${destination}" \ + --write-out '%{http_code}' \ + "${url}" + )" + if [[ "${status}" != "200" ]] || ! jq -e 'type == "object"' "${destination}" >/dev/null; then + echo "error: BrowserStack ${product} plan check failed with HTTP ${status}" >&2 + return 1 + fi + if jq -e 'has("message") and (.message | test("auth|access|subscription|upgrade"; "i"))' \ + "${destination}" >/dev/null; then + echo "error: BrowserStack ${product} is not available to this account" >&2 + return 1 + fi + echo "BrowserStack ${product}: authenticated plan endpoint available" +} + +work_dir="$(mktemp -d "${TMPDIR:-/tmp}/provekit-browserstack-plan.XXXXXX")" +cleanup() { + rm -f "${work_dir}/automate.json" "${work_dir}/app-automate.json" + rmdir "${work_dir}" 2>/dev/null || true +} +trap cleanup EXIT + +check_plan \ + "Automate" \ + "https://api.browserstack.com/automate/plan.json" \ + "${work_dir}/automate.json" +check_plan \ + "App Automate" \ + "https://api-cloud.browserstack.com/app-automate/plan.json" \ + "${work_dir}/app-automate.json" + +echo "Both BrowserStack products required by this benchmark are available." diff --git a/benchmarks/v1/scripts/preflight-ios15-charconv.sh b/benchmarks/v1/scripts/preflight-ios15-charconv.sh new file mode 100755 index 000000000..9be312d97 --- /dev/null +++ b/benchmarks/v1/scripts/preflight-ios15-charconv.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +set -euo pipefail + +ipa="${1:?usage: preflight-ios15-charconv.sh }" +for command in find nm unzip; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done +[[ -f "${ipa}" ]] || { + echo "error: IPA not found: ${ipa}" >&2 + exit 1 +} + +work="$(mktemp -d "${TMPDIR:-/tmp}/provekit-charconv-preflight.XXXXXX")" +cleanup() { + case "${work}" in + "${TMPDIR:-/tmp}"/provekit-charconv-preflight.*) rm -rf "${work}" ;; + *) echo "error: refusing to clean unexpected preflight path: ${work}" >&2 ;; + esac +} +trap cleanup EXIT + +unzip -q "${ipa}" -d "${work}" +app="$(find "${work}/Payload" -maxdepth 1 -type d -name '*.app' -print -quit)" +[[ -n "${app}" ]] || { + echo "error: packaged app not found in ${ipa}" >&2 + exit 1 +} +executable="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleExecutable' "${app}/Info.plist")" +binary="${app}/${executable}" +[[ -f "${binary}" ]] || { + echo "error: packaged executable not found: ${binary}" >&2 + exit 1 +} + +if nm -u "${binary}" | + grep -Eq '__ZNSt3__18to_charsEPcS0_[fde]($|NS_12chars_formatE(i)?$)'; then + echo "error: ${ipa} still imports iOS 15-incompatible floating to_chars" >&2 + exit 1 +fi + +echo "Validated iOS 15 charconv compatibility in ${ipa}" diff --git a/benchmarks/v1/scripts/prepare-circom-native-witnesses.sh b/benchmarks/v1/scripts/prepare-circom-native-witnesses.sh new file mode 100755 index 000000000..6e844df8f --- /dev/null +++ b/benchmarks/v1/scripts/prepare-circom-native-witnesses.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +asset_root="${benchmark_root}/circom/web/dist/assets" +snarkjs="${benchmark_root}/circom/web/node_modules/snarkjs/build/cli.cjs" +lock_file="${benchmark_root}/toolchains.lock.json" +output_root="${repo_root}/target/v1-benchmarks/circom" + +for command in jq node shasum; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done +[[ -f "${snarkjs}" ]] || { + echo "error: install the locked Circom browser dependencies first" >&2 + exit 1 +} + +prepare_witness() { + local group="$1" + local name="$2" + local output_name="$3" + local assets="${asset_root}/${group}" + local output="${output_root}/${group}/${output_name}.wtns" + local proof="${output_root}/${group}/${output_name}.proof.json" + local public="${output_root}/${group}/${output_name}.public.json" + local expected + expected="$( + jq -er \ + --arg name "${output_name}" \ + '.circom_native_frozen_witnesses[$name].sha256' \ + "${lock_file}" + )" + + mkdir -p "$(dirname "${output}")" + if [[ ! -f "${output}" ]]; then + NODE_OPTIONS=--max-old-space-size=32768 \ + node "${snarkjs}" wtns calculate \ + "${assets}/${name}.wasm" \ + "${assets}/${name}.input.json" \ + "${output}" + fi + actual="$(shasum -a 256 "${output}" | awk '{print $1}')" + [[ "${actual}" == "${expected}" ]] || { + echo "error: frozen witness drift for ${output_name}" >&2 + echo "expected ${expected}, got ${actual}" >&2 + exit 1 + } + + NODE_OPTIONS=--max-old-space-size=32768 \ + node "${snarkjs}" groth16 prove \ + "${assets}/${name}.zkey" \ + "${output}" \ + "${proof}" \ + "${public}" + node "${snarkjs}" groth16 verify \ + "${assets}/${name}.vkey.json" \ + "${public}" \ + "${proof}" +} + +prepare_witness oprf oprf_query oprf_query +prepare_witness oprf oprf_nullifier oprf_nullifier +prepare_witness passport vc_and_disclose vc_and_disclose +prepare_witness \ + passport \ + register_sha256_sha256_sha256_rsa_65537_4096 \ + register_sha256_sha256_sha256_rsa_65537_4096 +prepare_witness webauthn webauthn_default fixture diff --git a/benchmarks/v1/scripts/prepare-e15-circom-input-to-proof-apk.sh b/benchmarks/v1/scripts/prepare-e15-circom-input-to-proof-apk.sh new file mode 100755 index 000000000..12732b5c5 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-e15-circom-input-to-proof-apk.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +set -euo pipefail + +[[ $# -eq 1 ]] || { + echo "usage: $0 " >&2 + exit 2 +} + +workload="$1" +[[ "${workload}" != "nullifier" ]] || workload="oprf" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_root="$(cd "${script_dir}/../../.." && pwd)" +template="${repo_root}/target/v1-benchmarks/e15-noir-barretenberg-armv7-build/android" +library_root="${repo_root}/target/v1-benchmarks/input-to-proof/e15/circom-armv7-libs" +output="${repo_root}/target/v1-benchmarks/e15-circom-${workload}-input-to-proof-build/android" + +case "${workload}" in + oprf) + library="${library_root}/oprf-nullifier.so" + zkey="${repo_root}/benchmarks/v1/circom/web/dist/assets/oprf/oprf_nullifier.zkey" + witness="${repo_root}/target/v1-benchmarks/circom/oprf/oprf_nullifier.wtns" + vkey="${repo_root}/target/v1-benchmarks/rapidsnark-oprf-nullifier-ios/ios/BenchRunner/BenchRunner/Resources/verification_key.json" + package_suffix="rapidsnarkoprfinputtoproof" + ;; + webauthn) + library="${library_root}/webauthn.so" + zkey="${repo_root}/target/v1-benchmarks/groth16/webauthn/webauthn_default_benchmark.zkey" + witness="${repo_root}/target/v1-benchmarks/circom/webauthn/fixture.wtns" + vkey="${repo_root}/target/v1-benchmarks/groth16/webauthn/verification_key.json" + package_suffix="rapidsnarkwebauthninputtoproof" + ;; + passport-p1) + library="${library_root}/passport-p1.so" + zkey="${repo_root}/target/v1-benchmarks/groth16/passport_p1/passport_p1_final.zkey" + witness="${repo_root}/target/v1-benchmarks/circom-witnesses/passport_p1/native.wtns" + vkey="${repo_root}/target/v1-benchmarks/groth16/passport_p1/verification_key.json" + package_suffix="rapidsnarkpassportp1inputtoproof" + ;; + passport-disclose) + library="${library_root}/passport-disclose.so" + zkey="${repo_root}/benchmarks/v1/circom/web/dist/assets/passport/vc_and_disclose.zkey" + witness="${repo_root}/target/v1-benchmarks/circom/passport/vc_and_disclose.wtns" + vkey="${repo_root}/target/v1-benchmarks/groth16/passport-disclose-verification-key.json" + package_suffix="rapidsnarkpassportdiscloseinputtoproof" + ;; + passport-register) + library="${library_root}/passport-register.so" + zkey="${repo_root}/benchmarks/v1/circom/web/dist/assets/passport/register_sha256_sha256_sha256_rsa_65537_4096.zkey" + witness="${repo_root}/target/v1-benchmarks/circom/passport/register_sha256_sha256_sha256_rsa_65537_4096.wtns" + vkey="${repo_root}/target/v1-benchmarks/groth16/passport-register-verification-key.json" + package_suffix="rapidsnarkpassportregisterinputtoproof" + ;; + *) + echo "unknown workload: ${workload}" >&2 + exit 2 + ;; +esac + +for file in "${library}" "${zkey}" "${witness}"; do + [[ -f "${file}" ]] || { + echo "missing fixture: ${file}" >&2 + exit 1 + } +done + +helper="" +if [[ "${workload}" == "webauthn" ]]; then + helper="${library_root}/webauthn-witness.so" + [[ -f "${helper}" ]] || { + echo "missing WebAuthn witness helper: ${helper}" >&2 + exit 1 + } +fi + +if [[ ! -f "${vkey}" ]]; then + mkdir -p "$(dirname "${vkey}")" + "${repo_root}/benchmarks/v1/circom/web/node_modules/.bin/snarkjs" zkey export verificationkey \ + "${zkey}" "${vkey}" +fi + +rsync -a --delete \ + --exclude app/build \ + --exclude .gradle \ + --exclude app/src/main/jniLibs \ + "${template}/" "${output}/" + +jni="${output}/app/src/main/jniLibs/armeabi-v7a" +mkdir -p "${jni}" +copy_fixture() { + cp -c "$1" "$2" 2>/dev/null || cp "$1" "$2" +} +copy_fixture "${library}" "${jni}/libprovekit_v1_mobile_adapters.so" +copy_fixture "${template}/app/src/main/jniLibs/armeabi-v7a/libc++_shared.so" "${jni}/libc++_shared.so" +copy_fixture "${zkey}" "${jni}/libmobench_proving_key.so" +copy_fixture "${witness}" "${jni}/libmobench_reference_wtns.so" +copy_fixture "${vkey}" "${jni}/libmobench_verification_key.so" +if [[ -n "${helper}" ]]; then + copy_fixture "${helper}" "${jni}/libmobench_witness.so" +fi + +gradle="${output}/app/build.gradle" +perl -0pi -e \ + 's/applicationId "[^"]+"/applicationId "dev.world.provekitv1mobileadapters.'"${package_suffix}"'"/' \ + "${gradle}" +perl -0pi -e \ + 's#"\*\*/libmobench_witness\.so",#"**/libmobench_witness.so",\n "**/libmobench_reference_wtns.so",\n "**/libmobench_verification_key.so",#' \ + "${gradle}" + +export JAVA_HOME="${JAVA_HOME:-${HOME}/.local/share/mise/installs/java/temurin-21.0.11+10.0.LTS}" +(cd "${output}" && ./gradlew assembleDebug) + +app="${output}/app/build/outputs/apk/debug/app-debug.apk" +[[ -f "${app}" ]] || { + echo "missing built APK: ${app}" >&2 + exit 1 +} +shasum -a 256 "${app}" diff --git a/benchmarks/v1/scripts/prepare-groth16-mobile-fixture.sh b/benchmarks/v1/scripts/prepare-groth16-mobile-fixture.sh new file mode 100755 index 000000000..42ad6516a --- /dev/null +++ b/benchmarks/v1/scripts/prepare-groth16-mobile-fixture.sh @@ -0,0 +1,201 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 1 ]]; then + echo "usage: $0 " >&2 + exit 2 +fi + +name="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +groth16_root="${V1_BENCHMARK_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16}/self/${name}" +witness_root="${V1_BENCHMARK_WITNESS_ROOT:-${repo_root}/target/v1-benchmarks/circom-witnesses}/self/${name}" +output_root="${V1_BENCHMARK_MOBILE_FIXTURE_ROOT:-${repo_root}/target/v1-benchmarks/mobile-fixtures/groth16}/${name}" + +case "${name}" in + register_sha256_sha256_sha256_rsa_65537_4096) + cache_slug="passport-register" + ;; + vc_and_disclose) + cache_slug="passport-disclose" + ;; + *) + echo "error: unsupported Self circuit ${name}" >&2 + exit 1 + ;; +esac + +for command in jq stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if command -v sha256sum >/dev/null 2>&1; then + hash_file() { + sha256sum "$1" | awk '{print $1}' + } +elif command -v shasum >/dev/null 2>&1; then + hash_file() { + shasum -a 256 "$1" | awk '{print $1}' + } +else + echo "error: sha256sum or shasum is required" >&2 + exit 1 +fi + +size_file() { + if stat -f '%z' "$1" >/dev/null 2>&1; then + stat -f '%z' "$1" + else + stat -c '%s' "$1" + fi +} + +zkey="${groth16_root}/${name}_0000.zkey" +verification_key="${groth16_root}/verification_key.json" +witness="${witness_root}/wasm.wtns" +input="${benchmark_root}/circom/fixtures/self/${name}.json" + +if [[ "${V1_BENCHMARK_PREPARE_MISSING:-0}" == "1" ]]; then + if [[ ! -f "${witness}" ]]; then + "${script_dir}/generate-self-passport-witnesses.sh" + fi + if [[ ! -f "${zkey}" || ! -f "${verification_key}" ]]; then + "${script_dir}/prepare-self-groth16.sh" "${name}" + fi +fi + +for required in "${zkey}" "${verification_key}" "${witness}" "${input}"; do + if [[ ! -f "${required}" ]]; then + echo "error: missing prepared artifact ${required}" >&2 + echo "rerun with V1_BENCHMARK_PREPARE_MISSING=1 to prepare missing artifacts" >&2 + exit 1 + fi +done + +resources="${output_root}/resources" +mkdir -p "${resources}" + +stage_file() { + local source="$1" + local destination="$2" + local source_hash + + source_hash="$(hash_file "${source}")" + if [[ -f "${destination}" ]] \ + && ! [[ "${source}" -ef "${destination}" ]] \ + && [[ "$(hash_file "${destination}")" == "${source_hash}" ]]; then + return + fi + + rm -f "${destination}" + if cp -c "${source}" "${destination}" 2>/dev/null; then + return + fi + if cp --reflink=auto "${source}" "${destination}" 2>/dev/null; then + return + fi + rm -f "${destination}" + cp "${source}" "${destination}" +} + +stage_file "${zkey}" "${resources}/proving_key.zkey" +stage_file "${verification_key}" "${resources}/verification_key.json" +stage_file "${witness}" "${resources}/reference.wtns" +stage_file "${input}" "${resources}/input.json" + +rows_file="$(mktemp "${TMPDIR:-/tmp}/provekit-v1-groth16-rows.XXXXXX")" +base_file="$(mktemp "${TMPDIR:-/tmp}/provekit-v1-groth16-base.XXXXXX")" +cleanup() { + rm -f "${rows_file}" "${base_file}" +} +trap cleanup EXIT + +add_artifact() { + local logical_name="$1" + local role="$2" + local path="$3" + local circuit_download="$4" + local measured_phase="$5" + + jq -cn \ + --arg logical_name "${logical_name}" \ + --arg role "${role}" \ + --argjson bytes "$(size_file "${path}")" \ + --arg sha256 "$(hash_file "${path}")" \ + --argjson circuit_download "${circuit_download}" \ + --arg measured_phase "${measured_phase}" \ + '{ + logical_name: $logical_name, + role: $role, + bytes: $bytes, + sha256: $sha256, + circuit_download: $circuit_download, + measured_phase: $measured_phase + }' >>"${rows_file}" +} + +add_artifact "proving_key.zkey" "groth16-proving-key" \ + "${resources}/proving_key.zkey" true "loaded-before-measurement" +add_artifact "verification_key.json" "groth16-verification-key" \ + "${resources}/verification_key.json" true "loaded-before-measurement" +add_artifact "reference.wtns" "proof-only-reference-witness" \ + "${resources}/reference.wtns" false "harness-input-not-timed" +add_artifact "input.json" "witness-generation-input" \ + "${resources}/input.json" false "harness-input-not-timed" + +jq -S -n \ + --arg workload "${name}" \ + --arg cache_slug "${cache_slug}" \ + --slurpfile artifacts "${rows_file}" \ + '{ + schema_version: 1, + backend: "circom-rapidsnark-groth16", + workload: $workload, + cache_slug: $cache_slug, + preparation: { + policy: "prepare-once-per-campaign", + proving_key_is_campaign_specific: true + }, + packaging: { + one_workload_per_app: true, + ios: { + resource: "uncompressed installed app bundle file", + access: "mmap Bundle.main resource directly; never copy to Documents or tmp" + }, + android: { + resource: "APK asset with zkey and wtns in androidResources.noCompress", + access: "AssetManager.openFd plus mmap using the asset offset and length" + } + }, + timing_boundary: { + integrity_check: "before measured iterations", + resource_open_and_mmap: "setup phase", + witness_generation: "separate benchmark function", + proof_generation: "measured with prepared reference witness", + verification: "separate benchmark function" + }, + artifacts: $artifacts + }' >"${base_file}" + +campaign_hash="$(jq -S -c . "${base_file}" | hash_file /dev/stdin)" +manifest="${output_root}/fixture-manifest.json" +jq -S \ + --arg campaign_hash "${campaign_hash}" \ + --arg ios_custom_id "pkv1-g16-ios-${cache_slug}-${campaign_hash:0:16}" \ + --arg android_custom_id "pkv1-g16-android-${cache_slug}-${campaign_hash:0:16}" \ + '. + { + campaign_hash: $campaign_hash, + browserstack_fixture_id_prefixes: { + ios: $ios_custom_id, + android: $android_custom_id + } + }' "${base_file}" >"${manifest}" + +echo "Prepared ${manifest}" +echo "Campaign hash: ${campaign_hash}" diff --git a/benchmarks/v1/scripts/prepare-mopro-native-adapters.sh b/benchmarks/v1/scripts/prepare-mopro-native-adapters.sh new file mode 100755 index 000000000..dee34b403 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-mopro-native-adapters.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash + +set -euo pipefail + +build_ios=false +build_android=false +while [[ "$#" -gt 0 ]]; do + case "$1" in + --build-ios) + build_ios=true + ;; + --build-android) + build_android=true + ;; + -h | --help) + echo "usage: prepare-mopro-native-adapters.sh [--build-ios] [--build-android]" + exit 0 + ;; + *) + echo "error: unknown argument $1" >&2 + exit 1 + ;; + esac + shift +done + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +project_root="${V1_MOPRO_PROJECT_ROOT:-${repo_root}/target/v1-benchmarks/mopro/provekit-v1-mobile-adapters}" +artifact_root="${V1_WEBAUTHN_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom/webauthn}" + +for command in bun cargo cp mkdir; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +"${script_dir}/prepare-webauthn-circom.sh" +"${script_dir}/compile-noir-workloads.sh" +"${script_dir}/prepare-noir-beta19-srs.sh" >/dev/null +mopro="$("${script_dir}/bootstrap-mopro.sh")" +w2c2="$("${script_dir}/bootstrap-w2c2.sh")" +nargo="$("${script_dir}/bootstrap-nargo.sh")" + +if [[ ! -d "${project_root}" ]]; then + mkdir -p "$(dirname "${project_root}")" + ( + cd "$(dirname "${project_root}")" + "${mopro}" init \ + --adapter circom,noir \ + --project-name "$(basename "${project_root}")" + ) +fi + +noir_vectors="${project_root}/test-vectors/noir/campaign" +mkdir -p \ + "${noir_vectors}/webauthn" \ + "${noir_vectors}/passport" \ + "${noir_vectors}/passport_p1" \ + "${noir_vectors}/oprf" +( + cd "${benchmark_root}/noir/webauthn_assertion" + "${nargo}" execute campaign_webauthn --skip-brillig-constraints-check +) +( + cd "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check" + "${nargo}" execute campaign_passport --skip-brillig-constraints-check +) +( + cd "${benchmark_root}/noir/passport_p1" + "${nargo}" execute campaign_passport_p1 --skip-brillig-constraints-check +) +( + cd "${repo_root}/noir-examples/oprf" + "${nargo}" execute campaign_oprf --skip-brillig-constraints-check +) +cp \ + "${benchmark_root}/noir/webauthn_assertion/target/webauthn_assertion.json" \ + "${noir_vectors}/webauthn/circuit.json" +cp \ + "${benchmark_root}/noir/webauthn_assertion/target/campaign_webauthn.gz" \ + "${noir_vectors}/webauthn/witness.gz" +cp "${benchmark_root}/noir/webauthn_assertion/Prover.toml" \ + "${noir_vectors}/webauthn/Prover.toml" +cp \ + "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json" \ + "${noir_vectors}/passport/circuit.json" +cp \ + "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check/target/campaign_passport.gz" \ + "${noir_vectors}/passport/witness.gz" +cp "${repo_root}/noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml" \ + "${noir_vectors}/passport/Prover.toml" +cp \ + "${benchmark_root}/noir/passport_p1/target/passport_p1.json" \ + "${noir_vectors}/passport_p1/circuit.json" +cp \ + "${benchmark_root}/noir/passport_p1/target/campaign_passport_p1.gz" \ + "${noir_vectors}/passport_p1/witness.gz" +cp "${benchmark_root}/noir/passport_p1/Prover.toml" \ + "${noir_vectors}/passport_p1/Prover.toml" +cp \ + "${repo_root}/noir-examples/oprf/target/oprf.json" \ + "${noir_vectors}/oprf/circuit.json" +cp \ + "${repo_root}/noir-examples/oprf/target/campaign_oprf.gz" \ + "${noir_vectors}/oprf/witness.gz" +cp "${repo_root}/noir-examples/oprf/Prover.toml" \ + "${noir_vectors}/oprf/Prover.toml" + +bun run "${script_dir}/configure-mopro-native.ts" "${project_root}" "${artifact_root}" +( + cd "${project_root}" + cargo generate-lockfile + PATH="$(dirname "${w2c2}"):${PATH}" cargo check --release + if [[ "${build_ios}" == "true" ]]; then + PATH="$(dirname "${w2c2}"):${PATH}" "${mopro}" build \ + --mode release \ + --platforms ios \ + --architectures aarch64-apple-ios \ + --no-auto-update + if [[ ! -d "${project_root}/MoproiOSBindings/MoproBindings.xcframework" ]]; then + echo "error: Mopro did not create the expected iOS XCFramework" >&2 + exit 1 + fi + fi + if [[ "${build_android}" == "true" ]]; then + android_sdk="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-${HOME}/Library/Android/sdk}}" + android_ndk="${ANDROID_NDK_HOME:-}" + if [[ -z "${android_ndk}" && -d "${android_sdk}/ndk" ]]; then + android_ndk="$( + find "${android_sdk}/ndk" -mindepth 1 -maxdepth 1 -type d | + sort -V | + tail -n 1 + )" + fi + if [[ -z "${android_ndk}" || ! -d "${android_ndk}" ]]; then + echo "error: Android NDK not found; set ANDROID_NDK_HOME" >&2 + exit 1 + fi + ANDROID_NDK_HOME="${android_ndk}" \ + PATH="$(dirname "${w2c2}"):${PATH}" "${mopro}" build \ + --mode release \ + --platforms android \ + --architectures aarch64-linux-android \ + --no-auto-update + if [[ ! -d "${project_root}/MoproAndroidBindings" ]]; then + echo "error: Mopro did not create the expected Android bindings" >&2 + exit 1 + fi + fi +) + +echo "Mopro Circom/Arkworks and Noir/Barretenberg native adapters are ready at ${project_root}" diff --git a/benchmarks/v1/scripts/prepare-mopro-noir-ios-prebuilt.sh b/benchmarks/v1/scripts/prepare-mopro-noir-ios-prebuilt.sh new file mode 100755 index 000000000..1975c18e2 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-mopro-noir-ios-prebuilt.sh @@ -0,0 +1,231 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +crate="${repo_root}/target/v1-benchmarks/mopro/provekit-v1-mobile-adapters" +output="${repo_root}/target/v1-benchmarks/mopro-noir-ios" +prebuilt_root="${V1_MOPRO_NOIR_IOS_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/mopro-noir-ios-prebuilt}" +project="${output}/ios/BenchRunner" +resources="${project}/BenchRunner/Resources" +iterations="${V1_IOS_ITERATIONS:-5}" +warmup="${V1_IOS_WARMUP:-1}" +cold_launches="${V1_IOS_COLD_LAUNCHES:-1}" + +for command in bun cargo-mobench cp jq shasum stat xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +[[ -d "${project}" && + -f "${output}/ios/provekit_v1_mobile_adapters.xcframework/Info.plist" ]] || { + echo "error: build the arm64 Mopro Noir iOS runner first" >&2 + exit 1 +} +mkdir -p "${resources}" "${prebuilt_root}/entries" +bun "${script_dir}/patch-ios-runner-json.ts" \ + "${project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null +if ((cold_launches > 1)); then + bun "${script_dir}/patch-ios-cold-launches.ts" \ + "${project}/BenchRunnerUITests/BenchRunnerUITests.swift" \ + "${cold_launches}" >/dev/null +fi +cp -c \ + "${repo_root}/target/v1-benchmarks/noir-srs/noir_beta19_campaign.dat" \ + "${resources}/noir_beta19_campaign.dat" 2>/dev/null || + cp \ + "${repo_root}/target/v1-benchmarks/noir-srs/noir_beta19_campaign.dat" \ + "${resources}/noir_beta19_campaign.dat" + +content_digest() { + local files=( + "${benchmark_root}/mopro/noir_mobench.rs" + "${benchmark_root}/mopro/noir_srs_host.rs" + "${benchmark_root}/mopro/ios15_charconv_shim.cpp" + "${benchmark_root}/scripts/configure-mopro-native.ts" + "${benchmark_root}/scripts/prepare-mopro-native-adapters.sh" + "${benchmark_root}/scripts/prepare-noir-beta19-srs.sh" + "${BASH_SOURCE[0]}" + "${script_dir}/patch-ios-runner-json.ts" + "${script_dir}/patch-ios-cold-launches.ts" + "${script_dir}/preflight-ios15-charconv.sh" + "${script_dir}/patch-ios15-xcuitest-suite.sh" + "${benchmark_root}/toolchains.lock.json" + "${crate}/Cargo.lock" + "${output}/ios/provekit_v1_mobile_adapters.xcframework/ios-arm64/libprovekit_v1_mobile_adapters.a" + "${crate}/test-vectors/noir/campaign/webauthn/circuit.json" + "${crate}/test-vectors/noir/campaign/webauthn/witness.gz" + "${crate}/test-vectors/noir/campaign/webauthn/Prover.toml" + "${crate}/test-vectors/noir/campaign/passport/circuit.json" + "${crate}/test-vectors/noir/campaign/passport/witness.gz" + "${crate}/test-vectors/noir/campaign/passport/Prover.toml" + "${crate}/test-vectors/noir/campaign/passport_p1/circuit.json" + "${crate}/test-vectors/noir/campaign/passport_p1/witness.gz" + "${crate}/test-vectors/noir/campaign/passport_p1/Prover.toml" + "${crate}/test-vectors/noir/campaign/oprf/circuit.json" + "${crate}/test-vectors/noir/campaign/oprf/witness.gz" + "${crate}/test-vectors/noir/campaign/oprf/Prover.toml" + "${repo_root}/target/v1-benchmarks/noir-srs/noir_beta19_campaign.dat" + ) + local file + for file in "${files[@]}"; do + [[ -f "${file}" ]] || { + echo "error: digest input missing: ${file}" >&2 + return 1 + } + shasum -a 256 "${file}" | awk '{print $1}' + done | shasum -a 256 | awk '{print $1}' +} + +source_sha="$(git -C "${repo_root}" rev-parse HEAD)" +content_sha256="$(printf '%s\n%s\n%s\n%s\n' "$(content_digest)" "${iterations}" "${warmup}" "${cold_launches}" | shasum -a 256 | awk '{print $1}')" +manifest="${prebuilt_root}/manifest.json" +content_manifest="${prebuilt_root}.content.json" +recorded_content_sha256="" +recorded_manifest_sha256="" +actual_manifest_sha256="" +if [[ -f "${manifest}" && -f "${content_manifest}" ]]; then + recorded_content_sha256="$(jq -er '.content_sha256' "${content_manifest}")" + recorded_manifest_sha256="$( + jq -er '.prebuilt_manifest_sha256' "${content_manifest}" + )" + actual_manifest_sha256="$( + shasum -a 256 "${manifest}" | awk '{print $1}' + )" +fi +if [[ -f "${manifest}" && -f "${content_manifest}" ]] && + [[ "${recorded_content_sha256}" == "${content_sha256}" ]] && + [[ "${recorded_manifest_sha256}" == "${actual_manifest_sha256}" ]]; then + existing_source_sha="$(jq -er '.source_sha' "${manifest}")" + existing_functions="$(jq -c '[.entries[].function]' "${manifest}")" + cargo-mobench ci run-prebuilt \ + --dry-run \ + --manifest "${manifest}" \ + --expected-source-sha "${existing_source_sha}" \ + --expected-platform ios \ + --expected-functions "${existing_functions}" \ + --expected-iterations "${iterations}" \ + --expected-warmup "${warmup}" \ + --devices "iPhone SE 2022-15" \ + --max-completion-timeout-secs 7200 >/dev/null + echo "Reusing frozen ${manifest}" + exit 0 +fi + +entries_file="$(mktemp "${TMPDIR:-/tmp}/mopro-noir-ios-entries.XXXXXX")" +cleanup() { + rm -f "${entries_file}" +} +trap cleanup EXIT +: >"${entries_file}" + +functions=( + provekit_v1_mobile_adapters::bench_webauthn_barretenberg_input_to_proof + provekit_v1_mobile_adapters::bench_passport_barretenberg_input_to_proof + provekit_v1_mobile_adapters::bench_passport_p1_barretenberg_input_to_proof + provekit_v1_mobile_adapters::bench_oprf_barretenberg_input_to_proof +) +for index in "${!functions[@]}"; do + function="${functions[$index]}" + entry="$(printf '%04d' "${index}")" + destination="${prebuilt_root}/entries/${entry}" + mkdir -p "${destination}" + + jq -n --argjson iterations "${iterations}" --argjson warmup "${warmup}" \ + --arg function "${function}" \ + '{function: $function, iterations: $iterations, warmup: $warmup}' \ + >"${resources}/bench_spec.json" + ( + cd "${project}" + xcodegen generate >/dev/null + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + "${script_dir}/preflight-ios15-charconv.sh" \ + "${output}/ios/BenchRunner.ipa" >/dev/null + cargo-mobench package-xcuitest \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" >/dev/null + + app="${destination}/app.ipa" + suite="${destination}/test-suite.zip" + cp -c "${output}/ios/BenchRunner.ipa" "${app}" 2>/dev/null || + cp "${output}/ios/BenchRunner.ipa" "${app}" + cp -c "${output}/ios/BenchRunnerUITests.zip" "${suite}" 2>/dev/null || + cp "${output}/ios/BenchRunnerUITests.zip" "${suite}" + + app_size="$(stat -f '%z' "${app}")" + suite_size="$(stat -f '%z' "${suite}")" + app_hash="$(shasum -a 256 "${app}" | awk '{print $1}')" + suite_hash="$(shasum -a 256 "${suite}" | awk '{print $1}')" + jq -cn \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + --arg app_path "entries/${entry}/app.ipa" \ + --arg suite_path "entries/${entry}/test-suite.zip" \ + --arg app_hash "${app_hash}" \ + --arg suite_hash "${suite_hash}" \ + --argjson app_size "${app_size}" \ + --argjson suite_size "${suite_size}" \ + '{ + function: $function, + iterations: $iterations, + warmup: $warmup, + completion_timeout_secs: 7200, + artifacts: [ + { + kind: "ios-app", + path: $app_path, + size: $app_size, + sha256: $app_hash + }, + { + kind: "ios-test-suite", + path: $suite_path, + size: $suite_size, + sha256: $suite_hash + } + ] + }' >>"${entries_file}" +done + +jq -s \ + --arg source_sha "${source_sha}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_sha, + platform: "ios", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-xcuitest-v2" + }, + entries: . + }' "${entries_file}" >"${manifest}" + +jq -n \ + --arg source_sha "${source_sha}" \ + --arg content_sha256 "${content_sha256}" \ + --arg manifest_sha256 "$(shasum -a 256 "${manifest}" | awk '{print $1}')" \ + '{ + schema: "provekit.mopro-noir-content.v1", + source_sha: $source_sha, + content_sha256: $content_sha256, + prebuilt_manifest_sha256: $manifest_sha256 + }' >"${content_manifest}" + +echo "${manifest}" diff --git a/benchmarks/v1/scripts/prepare-noir-beta19-compat.sh b/benchmarks/v1/scripts/prepare-noir-beta19-compat.sh new file mode 100755 index 000000000..2b0a843ee --- /dev/null +++ b/benchmarks/v1/scripts/prepare-noir-beta19-compat.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +compat_root="${V1_NOIR_BETA19_COMPAT_ROOT:-${repo_root}/target/v1-benchmarks/noir-beta19-compat}" +world_vendor="${source_root}/world-id-protocol/crates/proof/noir/passkey-ownership-proof/vendor" +poseidon_source="${source_root}/noir-poseidon" +passport_poseidon_source="${source_root}/noir-poseidon-v0.3.0" +passport_bignum_source="${source_root}/noir-bignum-v0.10.0" +passport_rsa_source="${source_root}/noir-rsa-v0.11.0" + +"${script_dir}/bootstrap-sources.sh" >/dev/null + +for required in \ + "${world_vendor}/webauthn/Nargo.toml" \ + "${poseidon_source}/Nargo.toml" \ + "${passport_poseidon_source}/Nargo.toml" \ + "${passport_bignum_source}/Nargo.toml" \ + "${passport_rsa_source}/Nargo.toml"; do + [[ -f "${required}" ]] || { + echo "error: missing pinned compatibility input ${required}" >&2 + exit 1 + } +done + +case "${compat_root}" in + "${repo_root}"/target/v1-benchmarks/noir-beta19-compat) + rm -rf "${compat_root}" + ;; + *) + echo "error: refusing to replace unexpected compatibility path ${compat_root}" >&2 + exit 1 + ;; +esac +mkdir -p "${compat_root}" +cp -R "${world_vendor}" "${compat_root}/vendor" +cp -R "${poseidon_source}" "${compat_root}/poseidon" +mkdir -p "${compat_root}/passport" +cp -R "${passport_poseidon_source}" "${compat_root}/passport/poseidon" +cp -R "${passport_bignum_source}" "${compat_root}/passport/noir-bignum" +cp -R "${passport_rsa_source}" "${compat_root}/passport/noir-rsa" +rm -rf "${compat_root}/poseidon/.git" + +for package in noir-bignum-mavros noir_bigcurve-mavros; do + manifest="${compat_root}/vendor/${package}/Nargo.toml" + grep -F 'poseidon = { git = "https://github.com/noir-lang/poseidon", tag = "v0.2.6" }' \ + "${manifest}" >/dev/null || { + echo "error: expected ${package} Poseidon pin is missing" >&2 + exit 1 + } + perl -0pi -e \ + 's#poseidon = \{ git = "https://github\.com/noir-lang/poseidon", tag = "v0\.2\.6" \}#poseidon = { path = "../../poseidon" }#g' \ + "${manifest}" +done + +offset_file="${compat_root}/vendor/noir_bigcurve-mavros/src/utils/derive_offset_generators.nr" +grep -F 'let cofactor_bits: [u1; 128] = cofactor.to_be_bits();' \ + "${offset_file}" >/dev/null || { + echo "error: expected cofactor bit declaration is missing" >&2 + exit 1 +} +grep -F 'crate::poseidon2_permutation(state, 4)' \ + "${compat_root}/poseidon/src/poseidon2.nr" >/dev/null || { + echo "error: pinned Poseidon source is not Noir beta.19 compatible" >&2 + exit 1 +} + +passport_poseidon="${compat_root}/passport/poseidon/src/poseidon2.nr" +perl -0pi -e \ + 's/crate::poseidon2_permutation\(self\.state\)/crate::poseidon2_permutation(self.state, 4)/g; s/crate::poseidon2_permutation\(state\)/crate::poseidon2_permutation(state, 4)/g' \ + "${passport_poseidon}" +grep -F 'crate::poseidon2_permutation(state, 4)' "${passport_poseidon}" >/dev/null || { + echo "error: failed to prepare Passport Poseidon beta.19 compatibility source" >&2 + exit 1 +} + +perl -0pi -e \ + 's#poseidon = \{ git = "https://github\.com/noir-lang/poseidon", tag = "v0\.3\.0" \}#poseidon = { path = "../poseidon" }#g' \ + "${compat_root}/passport/noir-bignum/Nargo.toml" +perl -0pi -e \ + 's#bignum = \{tag = "v0\.10\.0", git = "https://github\.com/noir-lang/noir-bignum"\}#bignum = { path = "../noir-bignum" }#g' \ + "${compat_root}/passport/noir-rsa/Nargo.toml" +grep -F 'poseidon = { path = "../poseidon" }' \ + "${compat_root}/passport/noir-bignum/Nargo.toml" >/dev/null +grep -F 'bignum = { path = "../noir-bignum" }' \ + "${compat_root}/passport/noir-rsa/Nargo.toml" >/dev/null + +find "${compat_root}" -name .git -type d -prune -exec rm -rf {} + +echo "Prepared deterministic Noir beta.19 WebAuthn overlay at ${compat_root}" diff --git a/benchmarks/v1/scripts/prepare-noir-beta19-srs.sh b/benchmarks/v1/scripts/prepare-noir-beta19-srs.sh new file mode 100755 index 000000000..9c136448e --- /dev/null +++ b/benchmarks/v1/scripts/prepare-noir-beta19-srs.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/toolchains.lock.json" +output="${V1_NOIR_SRS_PATH:-${repo_root}/target/v1-benchmarks/noir-srs/noir_beta19_campaign.dat}" + +for command in curl jq openssl stat; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +url="$(jq -er '.native_noir.srs.url' "${lock_file}")" +bytes="$(jq -er '.native_noir.srs.bytes' "${lock_file}")" +sha256="$(jq -er '.native_noir.srs.sha256' "${lock_file}")" +range_end="$((bytes - 1))" + +mkdir -p "$(dirname "${output}")" +if [[ -f "${output}" ]]; then + actual_bytes="$(stat -f '%z' "${output}")" + actual_sha="$(openssl dgst -sha256 "${output}" | awk '{print tolower($NF)}')" + if [[ "${actual_bytes}" == "${bytes}" && "${actual_sha}" == "${sha256}" ]]; then + echo "${output}" + exit 0 + fi + echo "error: existing Noir SRS does not match the locked size/hash: ${output}" >&2 + exit 1 +fi + +partial="${output}.partial" +curl \ + --fail \ + --location \ + --retry 3 \ + --retry-all-errors \ + --connect-timeout 20 \ + --max-time 1200 \ + --range "0-${range_end}" \ + --output "${partial}" \ + "${url}" + +actual_bytes="$(stat -f '%z' "${partial}")" +actual_sha="$(openssl dgst -sha256 "${partial}" | awk '{print tolower($NF)}')" +[[ "${actual_bytes}" == "${bytes}" ]] || { + echo "error: Noir SRS size mismatch: expected ${bytes}, got ${actual_bytes}" >&2 + exit 1 +} +[[ "${actual_sha}" == "${sha256}" ]] || { + echo "error: Noir SRS hash mismatch: expected ${sha256}, got ${actual_sha}" >&2 + exit 1 +} +mv "${partial}" "${output}" +echo "${output}" diff --git a/benchmarks/v1/scripts/prepare-oprf-o2-beta11.sh b/benchmarks/v1/scripts/prepare-oprf-o2-beta11.sh new file mode 100755 index 000000000..533fa1a34 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-oprf-o2-beta11.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_checkout="${V1_OPRF_COMPAT_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/oprf-nr-beta19}" +output="${repo_root}/target/v1-benchmarks/oprf-o2-beta11" +nargo_home="${V1_BENCHMARK_NARGO_HOME:-${repo_root}/target/v1-benchmarks/nargo-home}" +nargo_bin="$(V1_NARGO_LOCK_KEY=noir_provekit "${script_dir}/bootstrap-nargo.sh")" +expected_revision="7831dca615db55147c60f49415af6e86730df090" + +actual_revision="$(git -C "${source_checkout}" rev-parse HEAD)" +[[ "${actual_revision}" == "${expected_revision}" ]] || { + echo "error: OPRF compatibility source is ${actual_revision}, expected ${expected_revision}" >&2 + exit 1 +} +[[ -z "$(git -C "${source_checkout}" status --short)" ]] || { + echo "error: OPRF compatibility source checkout is dirty" >&2 + exit 1 +} + +rm -rf "${output}" +mkdir -p "${output}/oprf/src" "${output}/babyjubjub" "${output}/eddsa_poseidon2" +cp -R "${repo_root}/noir-examples/oprf/src/." "${output}/oprf/src/" +cp "${repo_root}/noir-examples/oprf/Prover.toml" "${output}/oprf/Prover.toml" +cp -R "${source_checkout}/babyjubjub/src" "${output}/babyjubjub/" +cp -R "${repo_root}/noir-examples/eddsa_poseidon2/src" "${output}/eddsa_poseidon2/" + +printf '%s\n' \ + '[package]' \ + 'name = "babyjubjub"' \ + 'type = "lib"' \ + 'authors = [""]' \ + '' \ + '[dependencies]' \ + 'poseidon2 = { tag = "v0.6.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" }' \ + >"${output}/babyjubjub/Nargo.toml" + +printf '%s\n' \ + '[package]' \ + 'name = "eddsa_poseidon2"' \ + 'type = "lib"' \ + 'authors = [""]' \ + '' \ + '[dependencies]' \ + 'poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" }' \ + 'babyjubjub = { path = "../babyjubjub" }' \ + >"${output}/eddsa_poseidon2/Nargo.toml" + +printf '%s\n' \ + '[package]' \ + 'name = "oprf"' \ + 'type = "bin"' \ + 'authors = [""]' \ + '' \ + '[dependencies]' \ + 'poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" }' \ + 'babyjubjub = { path = "../babyjubjub" }' \ + 'eddsa_poseidon2 = { path = "../eddsa_poseidon2" }' \ + 'binary_merkle_root = { git = "https://github.com/privacy-scaling-explorations/zk-kit.noir", tag = "binary-merkle-root-v0.0.1", directory = "packages/binary-merkle-root" }' \ + >"${output}/oprf/Nargo.toml" + +( + cd "${output}/oprf" + NARGO_HOME="${nargo_home}" "${nargo_bin}" compile --force --skip-brillig-constraints-check + NARGO_HOME="${nargo_home}" "${nargo_bin}" execute witness --force --skip-brillig-constraints-check +) + +jq -e '.noir_version | startswith("1.0.0-beta.11+")' \ + "${output}/oprf/target/oprf.json" >/dev/null +echo "${output}" diff --git a/benchmarks/v1/scripts/prepare-passport-p1-beta11.sh b/benchmarks/v1/scripts/prepare-passport-p1-beta11.sh new file mode 100755 index 000000000..af2986af6 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-passport-p1-beta11.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +output="${repo_root}/target/v1-benchmarks/passport-p1-beta11" +nargo_home="${V1_BENCHMARK_NARGO_HOME:-${repo_root}/target/v1-benchmarks/nargo-home}" + +rm -rf "${output}" +mkdir -p "${output}/src" +cp "${benchmark_root}/noir/passport_p1/src/main.nr" "${output}/src/main.nr" +cp "${benchmark_root}/noir/passport_p1/Prover.toml" "${output}/Prover.toml" +bun "${script_dir}/set-passport-p1-barrett.ts" "${output}/Prover.toml" 4 +mkdir -p "${output}/utils/src" +cp -R "${repo_root}/noir-examples/noir-passport-monolithic/utils/utils/src/." \ + "${output}/utils/src/" +printf '%s\n' \ + '[package]' \ + 'name = "utils"' \ + 'type = "lib"' \ + 'compiler_version = ">=1.0.0"' \ + '' \ + '[dependencies]' \ + 'poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" }' \ + >"${output}/utils/Nargo.toml" + +printf '%s\n' \ + '[package]' \ + 'name = "passport_p1"' \ + 'type = "bin"' \ + 'compiler_version = ">=1.0.0"' \ + '' \ + '[dependencies]' \ + 'poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" }' \ + 'bignum = { tag = "v0.8.0", git = "https://github.com/noir-lang/noir-bignum" }' \ + 'rsa = { tag = "v0.9.2", git = "https://github.com/zkpassport/noir_rsa" }' \ + 'utils = { path = "utils" }' \ + 'sha256 = { tag = "v0.3.0", git = "https://github.com/noir-lang/sha256" }' \ + >"${output}/Nargo.toml" + +( + cd "${output}" + NARGO_HOME="${nargo_home}" nargo compile --force --skip-brillig-constraints-check + NARGO_HOME="${nargo_home}" nargo execute witness --force --skip-brillig-constraints-check +) + +jq -e '.noir_version | startswith("1.0.0-beta.11+")' \ + "${output}/target/passport_p1.json" >/dev/null +echo "${output}" diff --git a/benchmarks/v1/scripts/prepare-passport-p1-circom-browser.sh b/benchmarks/v1/scripts/prepare-passport-p1-circom-browser.sh new file mode 100755 index 000000000..d4773a4b6 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-passport-p1-circom-browser.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +web_root="${benchmark_root}/circom/web" +circom_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/passport_p1" +groth16_root="${V1_BENCHMARK_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16}/passport_p1" +output_root="${P1_CIRCOM_BROWSER_ROOT:-${repo_root}/target/v1-benchmarks/circom-browser-p1}" +fixture_root="${output_root}/fixtures" +dist="${output_root}/dist" + +for command in cp jq shasum; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +"${script_dir}/prepare-passport-p1-groth16.sh" + +for source in \ + "${circom_root}/passport_p1_js/passport_p1.wasm" \ + "${groth16_root}/passport_p1_final.zkey" \ + "${groth16_root}/verification_key.json" \ + "${benchmark_root}/circom/fixtures/passport_p1/input.json" \ + "${groth16_root}/ceremony.json"; do + [[ -f "${source}" ]] || { + echo "error: missing P1 browser artifact ${source}" >&2 + exit 1 + } +done + +mkdir -p "${fixture_root}" +cp -c "${circom_root}/passport_p1_js/passport_p1.wasm" "${fixture_root}/passport_p1.wasm" 2>/dev/null || + cp "${circom_root}/passport_p1_js/passport_p1.wasm" "${fixture_root}/passport_p1.wasm" +cp -c "${groth16_root}/passport_p1_final.zkey" "${fixture_root}/passport_p1_final.zkey" 2>/dev/null || + cp "${groth16_root}/passport_p1_final.zkey" "${fixture_root}/passport_p1_final.zkey" +cp "${groth16_root}/verification_key.json" "${fixture_root}/passport_p1.vkey.json" +cp "${benchmark_root}/circom/fixtures/passport_p1/input.json" "${fixture_root}/passport_p1.input.json" + +wasm_sha="$(shasum -a 256 "${fixture_root}/passport_p1.wasm" | awk '{print $1}')" +zkey_sha="$(shasum -a 256 "${fixture_root}/passport_p1_final.zkey" | awk '{print $1}')" +vkey_sha="$(shasum -a 256 "${fixture_root}/passport_p1.vkey.json" | awk '{print $1}')" +input_sha="$(shasum -a 256 "${fixture_root}/passport_p1.input.json" | awk '{print $1}')" +source_commit="$(git -C "${repo_root}" rev-parse HEAD)" + +jq -n \ + --arg source_commit "${source_commit}" \ + --arg wasm_sha "${wasm_sha}" \ + --arg zkey_sha "${zkey_sha}" \ + --arg vkey_sha "${vkey_sha}" \ + --arg input_sha "${input_sha}" \ + '{schema_version: 1, fixtures: {passport: [{circuit: "passport_p1", variant: "p1_matched_monolithic_rsa4096", profile: "P1", wasm: "passport_p1.wasm", zkey: "passport_p1_final.zkey", verification_key: "passport_p1.vkey.json", input: "passport_p1.input.json", circuit_commit: $source_commit, semantic_equivalence: "p1-matched-monolithic", ceremony: {production_safe: false, final_zkey_sha256: $zkey_sha}, artifact_hashes: {wasm: $wasm_sha, final_zkey: $zkey_sha, verification_key: $vkey_sha, input: $input_sha}}], webauthn: [], oprf: []}}' \ + >"${fixture_root}/manifest.json" + +CIRCOM_BROWSER_FIXTURE_ROOT="${fixture_root}" \ +CIRCOM_BROWSER_DIST="${dist}" \ +CIRCOM_BROWSER_PROFILE=p1 \ + bash "${web_root}/build.sh" + +echo "prepared P1 browser bundle at ${dist}" diff --git a/benchmarks/v1/scripts/prepare-passport-p1-circom.sh b/benchmarks/v1/scripts/prepare-passport-p1-circom.sh new file mode 100755 index 000000000..bf5864103 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-passport-p1-circom.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +self_root="${source_root}/self" +output_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/passport_p1" +source="${benchmark_root}/circom/passport_p1/passport_p1.circom" + +for command in bun jq make node pkg-config; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +if [[ "$(node --version)" != v22.* ]]; then + echo "error: Self pins Node >=22 <23, found $(node --version)" >&2 + exit 1 +fi +for library in gmp nlohmann_json; do + pkg-config --exists "${library}" || { + echo "error: pkg-config could not find ${library}" >&2 + exit 1 + } +done + +"${script_dir}/bootstrap-sources.sh" >/dev/null +circom_bin="$("${script_dir}/bootstrap-circom.sh")" + +if [[ ! -f "${self_root}/node_modules/.pnpm/lock.yaml" ]]; then + command -v corepack >/dev/null 2>&1 || { + echo "error: corepack is required to install Self's pinned pnpm graph" >&2 + exit 1 + } + ( + cd "${self_root}" + corepack pnpm install --frozen-lockfile + ) +fi +( + cd "${self_root}" + bun run circuits/scripts/link-circom-deps.cjs +) + +P1_FIXTURE_MODE="${P1_FIXTURE_MODE:-check}" \ + bun run "${benchmark_root}/circom/passport_p1/generate-fixture.ts" + +include_paths=( + "${self_root}/circuits/node_modules" + "${self_root}/circuits/node_modules/circomlib/circuits" + "${self_root}/circuits/node_modules/@openpassport/zk-email-circuits" + "${self_root}/circuits/node_modules/@zk-kit/binary-merkle-root.circom/src" +) +include_args=() +for path in "${include_paths[@]}"; do + include_args+=(-l "${path}") +done + +r1cs="${output_root}/passport_p1.r1cs" +wasm="${output_root}/passport_p1_js/passport_p1.wasm" +cpp="${output_root}/passport_p1_cpp/passport_p1" +if [[ "${V1_BENCHMARK_REBUILD_CIRCOM:-0}" == "1" || ! -f "${r1cs}" || ! -f "${wasm}" ]]; then + mkdir -p "${output_root}" + "${circom_bin}" "${source}" \ + --O1 --r1cs --wasm --c --no_asm --sym \ + "${include_args[@]}" \ + -o "${output_root}" +fi + +if [[ "$(uname -s)-$(uname -m)" == "Darwin-arm64" ]] && + grep -q 'uint64_t' "${output_root}/passport_p1_cpp/fr.hpp"; then + perl -pi -e 's/\buint64_t\b/mp_limb_t/g' \ + "${output_root}/passport_p1_cpp/fr.cpp" \ + "${output_root}/passport_p1_cpp/fr.hpp" + find "${output_root}/passport_p1_cpp" -maxdepth 1 -name '*.o' -type f -delete +fi + +if [[ ! -x "${cpp}" ]]; then + make -C "${output_root}/passport_p1_cpp" \ + CC="g++ $(pkg-config --libs-only-L gmp)" \ + CFLAGS="-std=c++11 -O3 -I. $(pkg-config --cflags gmp nlohmann_json)" +fi + +echo "ready P1 Circom artifacts at ${output_root}" diff --git a/benchmarks/v1/scripts/prepare-passport-p1-groth16.sh b/benchmarks/v1/scripts/prepare-passport-p1-groth16.sh new file mode 100755 index 000000000..11f3a50e5 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-passport-p1-groth16.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +circom_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/passport_p1" +output_root="${V1_BENCHMARK_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16}/passport_p1" +self_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}/self" +snarkjs="${self_root}/node_modules/snarkjs/build/cli.cjs" +r1cs="${circom_root}/passport_p1.r1cs" +phase0_zkey="${output_root}/passport_p1_0000.zkey" +zkey="${output_root}/passport_p1_final.zkey" +verification_key="${output_root}/verification_key.json" +ceremony="${output_root}/ceremony.json" + +for command in node awk; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +"${script_dir}/prepare-passport-p1-circom.sh" +ptau="$("${script_dir}/bootstrap-ptau.sh" 20)" +constraints="$(node "${snarkjs}" r1cs info "${r1cs}" | awk '/Constraints:/ {print $NF}')" +[[ -n "${constraints}" && "${constraints}" -le 1048576 ]] || { + echo "error: P1 has ${constraints:-unknown} constraints, exceeding power-20 PTAU capacity" >&2 + exit 1 +} + +mkdir -p "${output_root}" +if [[ ! -f "${phase0_zkey}" ]]; then + NODE_OPTIONS=--max-old-space-size=32768 \ + node "${snarkjs}" groth16 setup "${r1cs}" "${ptau}" "${phase0_zkey}" +fi +if [[ ! -f "${zkey}" ]]; then + # This public deterministic beacon is reproducible benchmark entropy, not a + # production ceremony contribution. The final key is deliberately marked as + # such. zkey beacon avoids the interactive entropy prompt in SnarkJS 0.7.6. + NODE_OPTIONS=--max-old-space-size=32768 \ + node "${snarkjs}" zkey beacon \ + "${phase0_zkey}" "${zkey}" \ + "8e39a496f744a6bfb75cbe3e9745a128382ed94421efc0dd1d4db6bdad52c5f9" \ + 10 +fi +node "${snarkjs}" zkey export verificationkey "${zkey}" "${verification_key}" +node "${snarkjs}" zkey verify "${r1cs}" "${ptau}" "${zkey}" +jq -n \ + --arg phase0_sha256 "$(shasum -a 256 "${phase0_zkey}" | awk '{print $1}')" \ + --arg final_sha256 "$(shasum -a 256 "${zkey}" | awk '{print $1}')" \ + --argjson constraints "${constraints}" \ + '{schema_version: 1, ceremony: "deterministic-benchmark-only", production_safe: false, phase2_contribution: true, entropy: "public deterministic benchmark beacon; not suitable for production", constraints: $constraints, phase0_zkey_sha256: $phase0_sha256, final_zkey_sha256: $final_sha256}' \ + >"${ceremony}" +echo "prepared non-production P1 Groth16 final zkey with ${constraints} constraints" diff --git a/benchmarks/v1/scripts/prepare-provekit-beta11-artifacts.sh b/benchmarks/v1/scripts/prepare-provekit-beta11-artifacts.sh new file mode 100755 index 000000000..23d1473cf --- /dev/null +++ b/benchmarks/v1/scripts/prepare-provekit-beta11-artifacts.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_revision="${V1_PROVEKIT_FIXTURE_SOURCE_REVISION:-$(jq -er '.provekit_v1.beta11_fixture_harness_commit' "${benchmark_root}/toolchains.lock.json")}" +snapshot_root="${repo_root}/target/v1-benchmarks/provekit-beta11-source" +artifact_root="${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +nargo_home="${V1_BENCHMARK_NARGO_HOME:-${repo_root}/target/v1-benchmarks/nargo-home}" +tool_root="${V1_BENCHMARK_TOOL_ROOT:-${repo_root}/target/v1-benchmarks/tools}" + +for command in git jq shasum; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +cleanup() { + if git -C "${repo_root}" worktree list --porcelain | + grep -Fqx "worktree ${snapshot_root}"; then + git -C "${repo_root}" worktree remove --force "${snapshot_root}" + fi +} +trap cleanup EXIT + +if [[ -e "${snapshot_root}" ]]; then + if git -C "${repo_root}" worktree list --porcelain | + grep -Fqx "worktree ${snapshot_root}"; then + git -C "${repo_root}" worktree remove --force "${snapshot_root}" + else + echo "error: refusing to replace unregistered path ${snapshot_root}" >&2 + exit 1 + fi +fi + +git -C "${repo_root}" worktree add --detach "${snapshot_root}" "${source_revision}" +mkdir -p "${snapshot_root}/target/v1-benchmarks" +ln -s "${source_root}" "${snapshot_root}/target/v1-benchmarks/sources" +( + cd "${snapshot_root}" + MOBENCH_CI_PREPARE=1 \ + PROVEKIT_REUSE_WEBAUTHN_FIXTURE=0 \ + V1_BENCHMARK_SOURCE_ROOT="${source_root}" \ + V1_BENCHMARK_NARGO_HOME="${nargo_home}" \ + V1_BENCHMARK_TOOL_ROOT="${tool_root}" \ + bench-mobile/scripts/generate-fixtures.sh +) + +mkdir -p "${artifact_root}" +cp \ + "${snapshot_root}/noir-examples/noir-passport-monolithic/complete_age_check/target/complete_age_check.json" \ + "${artifact_root}/complete_age_check.json" +cp \ + "${snapshot_root}/noir-examples/noir-passport-monolithic/complete_age_check/Prover.toml" \ + "${artifact_root}/complete_age_check.Prover.toml" +cp \ + "${snapshot_root}/noir-examples/noir-passport/merkle_age_check/target/"{t_add_dsc_720.json,t_add_id_data_720.json,t_add_integrity_commit.json,t_attest.json} \ + "${artifact_root}/" +"${script_dir}/prepare-oprf-o2-beta11.sh" >/dev/null +cp \ + "${repo_root}/target/v1-benchmarks/oprf-o2-beta11/oprf/target/oprf.json" \ + "${artifact_root}/oprf.json" +cp \ + "${repo_root}/target/v1-benchmarks/oprf-o2-beta11/oprf/Prover.toml" \ + "${artifact_root}/oprf.Prover.toml" +"${script_dir}/prepare-passport-p1-beta11.sh" >/dev/null +cp \ + "${repo_root}/target/v1-benchmarks/passport-p1-beta11/target/passport_p1.json" \ + "${artifact_root}/passport_p1.json" +cp \ + "${repo_root}/target/v1-benchmarks/passport-p1-beta11/Prover.toml" \ + "${artifact_root}/passport_p1.Prover.toml" +cp "${snapshot_root}/noir-examples/p256_bigcurve/target/p256.json" "${artifact_root}/p256.json" +cp \ + "${snapshot_root}/benchmarks/v1/noir/webauthn_assertion/target/webauthn_assertion.json" \ + "${artifact_root}/webauthn_assertion.json" + +for artifact in "${artifact_root}"/*.json; do + [[ "$(basename "${artifact}")" != "manifest.json" ]] || continue + version="$(jq -r '.noir_version' "${artifact}")" + case "${version}" in + 1.0.0-beta.11+*) ;; + *) + echo "error: ${artifact} was compiled by incompatible Noir ${version}" >&2 + exit 1 + ;; + esac +done + +hashes="$( + for artifact in "${artifact_root}"/*.json "${artifact_root}"/*.toml; do + [[ "$(basename "${artifact}")" != "manifest.json" ]] || continue + printf '%s %s\n' \ + "$(shasum -a 256 "${artifact}" | awk '{print $1}')" \ + "$(basename "${artifact}")" + done +)" +jq -n \ + --arg source_revision "${source_revision}" \ + --arg noir_version "1.0.0-beta.11" \ + --arg hashes "${hashes}" \ + '{ + schema: "provekit.beta11-mobile-artifacts.v1", + source_revision: $source_revision, + noir_version: $noir_version, + artifacts: ( + $hashes + | split("\n") + | map(select(length > 0) | split(" ")) + | map({key: .[1], value: .[0]}) + | from_entries + ) + }' >"${artifact_root}/manifest.json" + +echo "${artifact_root}/manifest.json" diff --git a/benchmarks/v1/scripts/prepare-provekit-ios-prebuilt.sh b/benchmarks/v1/scripts/prepare-provekit-ios-prebuilt.sh new file mode 100755 index 000000000..1c0c5efa0 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-provekit-ios-prebuilt.sh @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +crate="${repo_root}/bench-mobile" +output="${repo_root}/target/v1-benchmarks/provekit-ios" +prebuilt_root="${V1_PROVEKIT_IOS_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/provekit-ios-prebuilt}" +project="${output}/ios/BenchRunner" +resources="${project}/BenchRunner/Resources" +iterations="${V1_IOS_ITERATIONS:-5}" +warmup="${V1_IOS_WARMUP:-1}" +cold_launches="${V1_IOS_COLD_LAUNCHES:-1}" + +for command in bun cargo-mobench cp git jq shasum stat xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +[[ -d "${project}" && -f "${output}/ios/bench_mobile.xcframework/Info.plist" ]] || { + echo "error: build the iOS runner with cargo-mobench before preparing prebuilts" >&2 + exit 1 +} +mkdir -p "${resources}" +bun "${script_dir}/patch-ios-runner-json.ts" \ + "${project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null +if ((cold_launches > 1)); then + bun "${script_dir}/patch-ios-cold-launches.ts" \ + "${project}/BenchRunnerUITests/BenchRunnerUITests.swift" \ + "${cold_launches}" >/dev/null +fi + +content_digest() { + local files=( + "${crate}/Cargo.toml" + "${crate}/build.rs" + "${crate}/src/lib.rs" + "${crate}/src/in_process.rs" + "${crate}/src/examples.rs" + "${crate}/src/passport.rs" + "${repo_root}/Cargo.lock" + "${repo_root}/mobench.toml" + "${output}/ios/bench_mobile.xcframework/ios-arm64/bench_mobile.framework/bench_mobile" + "${BASH_SOURCE[0]}" + "${script_dir}/patch-ios-runner-json.ts" + "${script_dir}/patch-ios-cold-launches.ts" + "${script_dir}/patch-ios15-xcuitest-suite.sh" + "${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts/passport_p1.json" + "${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts/passport_p1.Prover.toml" + "${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts/oprf.json" + "${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts/oprf.Prover.toml" + ) + local hashes=() + local file + for file in "${files[@]}"; do + [[ -f "${file}" ]] || { + echo "error: digest input missing: ${file}" >&2 + return 1 + } + hashes+=("$(shasum -a 256 "${file}" | awk '{print $1}')") + done + printf '%s\n' "${hashes[@]}" | shasum | awk '{print $1}' +} + +source_digest="$(printf '%s\n%s\n%s\n%s\n' "$(content_digest)" "${iterations}" "${warmup}" "${cold_launches}" | shasum -a 256 | awk '{print $1}')" +source_sha="$(git -C "${repo_root}" rev-parse HEAD)" +manifest="${prebuilt_root}/manifest.json" +content_manifest="${prebuilt_root}.content.json" +recorded_content_sha256="" +recorded_manifest_sha256="" +actual_manifest_sha256="" +if [[ -f "${manifest}" && -f "${content_manifest}" ]]; then + recorded_content_sha256="$(jq -er '.content_sha256' "${content_manifest}")" + recorded_manifest_sha256="$( + jq -er '.prebuilt_manifest_sha256' "${content_manifest}" + )" + actual_manifest_sha256="$( + shasum -a 256 "${manifest}" | awk '{print $1}' + )" +fi +if [[ -f "${manifest}" && -f "${content_manifest}" ]] && + [[ "${recorded_content_sha256}" == "${source_digest}" ]] && + [[ "${recorded_manifest_sha256}" == "${actual_manifest_sha256}" ]]; then + existing_source_sha="$(jq -er '.source_sha' "${manifest}")" + existing_functions="$(jq -c '[.entries[].function]' "${manifest}")" + cargo-mobench ci run-prebuilt \ + --dry-run \ + --manifest "${manifest}" \ + --expected-source-sha "${existing_source_sha}" \ + --expected-platform ios \ + --expected-functions "${existing_functions}" \ + --expected-iterations "${iterations}" \ + --expected-warmup "${warmup}" \ + --devices "iPhone SE 2022-15" \ + --max-completion-timeout-secs 7200 >/dev/null + echo "Reusing frozen ${manifest}" + exit 0 +fi + +entries_file="$(mktemp "${TMPDIR:-/tmp}/provekit-ios-entries.XXXXXX")" +cleanup() { + rm -f "${entries_file}" +} +trap cleanup EXIT + +mkdir -p "${prebuilt_root}/entries" +: >"${entries_file}" + +workloads=(passport_complete_age_check passport_p1 webauthn_assertion oprf) +phases=(input_to_proof) +entry_index=0 +for workload in "${workloads[@]}"; do + for phase in "${phases[@]}"; do + function="bench_mobile::bench_${workload}_${phase}" + entry="$(printf '%04d' "${entry_index}")" + destination="${prebuilt_root}/entries/${entry}" + mkdir -p "${destination}" + + jq -n --argjson iterations "${iterations}" --argjson warmup "${warmup}" \ + --arg function "${function}" \ + '{function: $function, iterations: $iterations, warmup: $warmup}' \ + >"${resources}/bench_spec.json" + ( + cd "${project}" + xcodegen generate >/dev/null + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + cargo-mobench package-xcuitest \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" + + app="${destination}/app.ipa" + suite="${destination}/test-suite.zip" + cp -c "${output}/ios/BenchRunner.ipa" "${app}" 2>/dev/null || + cp "${output}/ios/BenchRunner.ipa" "${app}" + cp -c "${output}/ios/BenchRunnerUITests.zip" "${suite}" 2>/dev/null || + cp "${output}/ios/BenchRunnerUITests.zip" "${suite}" + + app_size="$(stat -f '%z' "${app}")" + suite_size="$(stat -f '%z' "${suite}")" + app_hash="$(shasum -a 256 "${app}" | awk '{print $1}')" + suite_hash="$(shasum -a 256 "${suite}" | awk '{print $1}')" + jq -cn \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + --arg app_path "entries/${entry}/app.ipa" \ + --arg suite_path "entries/${entry}/test-suite.zip" \ + --arg app_hash "${app_hash}" \ + --arg suite_hash "${suite_hash}" \ + --argjson app_size "${app_size}" \ + --argjson suite_size "${suite_size}" \ + '{ + function: $function, + iterations: $iterations, + warmup: $warmup, + completion_timeout_secs: 7200, + artifacts: [ + { + kind: "ios-app", + path: $app_path, + size: $app_size, + sha256: $app_hash + }, + { + kind: "ios-test-suite", + path: $suite_path, + size: $suite_size, + sha256: $suite_hash + } + ] + }' >>"${entries_file}" + entry_index=$((entry_index + 1)) + done +done + +jq -s \ + --arg source_sha "${source_sha}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_sha, + platform: "ios", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-xcuitest-v2" + }, + entries: . + }' "${entries_file}" >"${manifest}" + +jq -n \ + --arg source_sha "${source_sha}" \ + --arg content_sha256 "${source_digest}" \ + --arg manifest_sha256 "$(shasum -a 256 "${manifest}" | awk '{print $1}')" \ + '{ + schema: "provekit.provekit-ios-content.v1", + source_sha: $source_sha, + content_sha256: $content_sha256, + prebuilt_manifest_sha256: $manifest_sha256 + }' >"${content_manifest}" + +echo "${manifest}" diff --git a/benchmarks/v1/scripts/prepare-rapidsnark-android-prebuilt.sh b/benchmarks/v1/scripts/prepare-rapidsnark-android-prebuilt.sh new file mode 100755 index 000000000..a6a8cf8c9 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-rapidsnark-android-prebuilt.sh @@ -0,0 +1,156 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +prebuilt_root="${V1_RAPIDSNARK_ANDROID_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/rapidsnark-android-prebuilt}" + +for command in cp jq shasum stat unzip; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done +if [[ -z "${JAVA_HOME:-}" && + -x "/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java" ]]; then + export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" +fi +if [[ -z "${ANDROID_HOME:-}" && -d "${HOME}/Library/Android/sdk" ]]; then + export ANDROID_HOME="${HOME}/Library/Android/sdk" +fi +[[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]] || { + echo "error: set JAVA_HOME to a Java 17+ runtime" >&2 + exit 1 +} +[[ -n "${ANDROID_HOME:-}" && -d "${ANDROID_HOME}" ]] || { + echo "error: set ANDROID_HOME to the Android SDK" >&2 + exit 1 +} + +content_digest() { + local files=( + "${benchmark_root}/rapidsnark/rapidsnark-mobile/Cargo.lock" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/Cargo.toml" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/build.rs" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/lib.rs" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs" + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register/Cargo.toml" + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register/src/lib.rs" + "${repo_root}/target/v1-benchmarks/native-libs/rapidsnark/aarch64-linux-android/SHA256SUMS" + ) + local hashes=() + local file + for file in "${files[@]}"; do + [[ -f "${file}" ]] || { + echo "error: digest input missing: ${file}" >&2 + return 1 + } + hashes+=("$(shasum -a 256 "${file}" | awk '{print $1}')") + done + printf '%s\n' "${hashes[@]}" | shasum | awk '{print $1}' +} + +source_digest="$(content_digest)" + +prepare_workload() { + local workload="$1" + local crate="$2" + local output="$3" + local crate_name + crate_name="$( + sed -n 's/^name = "\(.*\)"/\1/p' "${crate}/Cargo.toml" | + head -1 | + tr - _ + )" + + local project="${output}/android" + local assets="${project}/app/src/main/assets" + local built_app="${project}/app/build/outputs/apk/release/app-release-unsigned.apk" + local built_test="${project}/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk" + [[ -d "${project}" && -f "${built_app}" && -f "${built_test}" ]] || { + echo "error: build ${workload} first with build-rapidsnark-mobile-android.sh" >&2 + return 1 + } + mkdir -p "${assets}" + + local phase function destination app test_copy app_size app_hash test_size test_hash + for phase in prove verify proof_verify; do + function="${crate_name}::bench_passport_rapidsnark_${phase}" + destination="${prebuilt_root}/${workload}-${phase}" + mkdir -p "${destination}/entries/0000" + + jq -n \ + --arg function "${function}" \ + '{function: $function, iterations: 5, warmup: 1}' \ + >"${assets}/bench_spec.json" + ( + cd "${project}" + ./gradlew assembleRelease assembleReleaseAndroidTest -PmobenchTestBuildType=release >/dev/null + ) + + app="${destination}/entries/0000/app.apk" + test_copy="${destination}/entries/0000/test.apk" + cp -c "${built_app}" "${app}" 2>/dev/null || cp "${built_app}" "${app}" + cp -c "${built_test}" "${test_copy}" 2>/dev/null || cp "${built_test}" "${test_copy}" + + app_size="$(stat -f '%z' "${app}")" + app_hash="$(shasum -a 256 "${app}" | awk '{print $1}')" + test_size="$(stat -f '%z' "${test_copy}")" + test_hash="$(shasum -a 256 "${test_copy}" | awk '{print $1}')" + + jq -n \ + --arg source_digest "${source_digest}" \ + --arg function "${function}" \ + --arg app_hash "${app_hash}" \ + --arg test_hash "${test_hash}" \ + --argjson app_size "${app_size}" \ + --argjson test_size "${test_size}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_digest, + platform: "android", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-espresso-v2" + }, + entries: [{ + function: $function, + iterations: 5, + warmup: 1, + completion_timeout_secs: 7200, + artifacts: [ + { + kind: "android-app", + path: "entries/0000/app.apk", + size: $app_size, + sha256: $app_hash + }, + { + kind: "android-test-suite", + path: "entries/0000/test.apk", + size: $test_size, + sha256: $test_hash + } + ] + }] + }' >"${destination}/manifest.json" + + unzip -p "${app}" assets/bench_spec.json | + jq -e --arg function "${function}" \ + '.function == $function and .iterations == 5 and .warmup == 1' >/dev/null + echo "${destination}/manifest.json" + done +} + +prepare_workload \ + passport-disclose \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile" \ + "${repo_root}/target/v1-benchmarks/rapidsnark-disclose-android" +prepare_workload \ + passport-register \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register" \ + "${repo_root}/target/v1-benchmarks/rapidsnark-register-android" diff --git a/benchmarks/v1/scripts/prepare-rapidsnark-ios-prebuilt.sh b/benchmarks/v1/scripts/prepare-rapidsnark-ios-prebuilt.sh new file mode 100755 index 000000000..db380e457 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-rapidsnark-ios-prebuilt.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +prebuilt_root="${V1_RAPIDSNARK_IOS_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/rapidsnark-ios-prebuilt}" + +for command in cargo-mobench cp jq shasum stat xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +content_digest() { + local files=( + "${benchmark_root}/rapidsnark/rapidsnark-mobile/Cargo.lock" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/Cargo.toml" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/build.rs" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/lib.rs" + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs" + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register/Cargo.toml" + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register/src/lib.rs" + "${repo_root}/target/v1-benchmarks/native-libs/rapidsnark/aarch64-apple-ios/SHA256SUMS" + ) + local hashes=() + local file + for file in "${files[@]}"; do + [[ -f "${file}" ]] || { + echo "error: digest input missing: ${file}" >&2 + return 1 + } + hashes+=("$(shasum -a 256 "${file}" | awk '{print $1}')") + done + # Mobench's prebuilt contract requires a full 40-hex source identifier. + # This is a deterministic SHA-1 over SHA-256 content digests, rather than a + # claim that the dirty benchmark adapter already has a Git commit. + printf '%s\n' "${hashes[@]}" | shasum | awk '{print $1}' +} + +source_digest="$(content_digest)" + +prepare_workload() { + local workload="$1" + local crate="$2" + local output="$3" + local crate_name + crate_name="$( + sed -n 's/^name = "\(.*\)"/\1/p' "${crate}/Cargo.toml" | + head -1 | + tr - _ + )" + + local project="${output}/ios/BenchRunner" + local resources="${project}/BenchRunner/Resources" + local suite="${output}/ios/BenchRunnerUITests.zip" + [[ -d "${resources}" && -f "${suite}" ]] || { + echo "error: build ${workload} first with build-rapidsnark-mobile-ios.sh" >&2 + return 1 + } + + local phase function destination app test_copy app_size app_hash test_size test_hash + for phase in prove verify proof_verify; do + function="${crate_name}::bench_passport_rapidsnark_${phase}" + destination="${prebuilt_root}/${workload}-${phase}" + mkdir -p "${destination}/entries/0000" + + jq -n \ + --arg function "${function}" \ + '{function: $function, iterations: 5, warmup: 1}' \ + >"${resources}/bench_spec.json" + ( + cd "${project}" + xcodegen generate >/dev/null + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + + app="${destination}/entries/0000/app.ipa" + test_copy="${destination}/entries/0000/test-suite.zip" + cp -c "${output}/ios/BenchRunner.ipa" "${app}" 2>/dev/null || + cp "${output}/ios/BenchRunner.ipa" "${app}" + cp -c "${suite}" "${test_copy}" 2>/dev/null || cp "${suite}" "${test_copy}" + + app_size="$(stat -f '%z' "${app}")" + app_hash="$(shasum -a 256 "${app}" | awk '{print $1}')" + test_size="$(stat -f '%z' "${test_copy}")" + test_hash="$(shasum -a 256 "${test_copy}" | awk '{print $1}')" + + jq -n \ + --arg source_digest "${source_digest}" \ + --arg function "${function}" \ + --arg app_hash "${app_hash}" \ + --arg test_hash "${test_hash}" \ + --argjson app_size "${app_size}" \ + --argjson test_size "${test_size}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_digest, + platform: "ios", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-xcuitest-v2" + }, + entries: [{ + function: $function, + iterations: 5, + warmup: 1, + completion_timeout_secs: 7200, + artifacts: [ + { + kind: "ios-app", + path: "entries/0000/app.ipa", + size: $app_size, + sha256: $app_hash + }, + { + kind: "ios-test-suite", + path: "entries/0000/test-suite.zip", + size: $test_size, + sha256: $test_hash + } + ] + }] + }' >"${destination}/manifest.json" + + unzip -p "${app}" 'Payload/*.app/bench_spec.json' | + jq -e --arg function "${function}" \ + '.function == $function and .iterations == 5 and .warmup == 1' >/dev/null + echo "${destination}/manifest.json" + done +} + +prepare_workload \ + passport-disclose \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile" \ + "${repo_root}/target/v1-benchmarks/rapidsnark-disclose-ios" +prepare_workload \ + passport-register \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register" \ + "${repo_root}/target/v1-benchmarks/rapidsnark-register-ios" diff --git a/benchmarks/v1/scripts/prepare-rapidsnark-oprf-ios-prebuilt.sh b/benchmarks/v1/scripts/prepare-rapidsnark-oprf-ios-prebuilt.sh new file mode 100755 index 000000000..d02fcad07 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-rapidsnark-oprf-ios-prebuilt.sh @@ -0,0 +1,287 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +crate="${benchmark_root}/rapidsnark/rapidsnark-mobile-oprf" +scaffold_crate="${benchmark_root}/rapidsnark/mobench-ios-scaffold" +prebuilt_root="${V1_RAPIDSNARK_OPRF_IOS_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/rapidsnark-oprf-ios-prebuilt}" +build_parent="${repo_root}/target/v1-benchmarks" +library_name="provekit_v1_rapidsnark_mobile_oprf" +asset_root="${benchmark_root}/circom/web/dist/assets/oprf" +witness_root="${repo_root}/target/v1-benchmarks/circom/oprf" +iterations="${V1_IOS_ITERATIONS:-5}" +warmup="${V1_IOS_WARMUP:-1}" +cold_launches="${V1_IOS_COLD_LAUNCHES:-1}" + +for command in bun cargo cargo-mobench cp jq shasum stat unzip xcodebuild xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +compute_content_sha256() { + shasum -a 256 \ + "${crate}/Cargo.toml" \ + "${crate}/src/lib.rs" \ + "${crate}/src/wasmi_witness.rs" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile/build.rs" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs" \ + "${scaffold_crate}/Cargo.toml" \ + "${scaffold_crate}/src/main.rs" \ + "${BASH_SOURCE[0]}" \ + "${script_dir}/build-rapidsnark-ios-libs.sh" \ + "${script_dir}/patch-ios-runner-json.ts" \ + "${script_dir}/patch-ios-cold-launches.ts" \ + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${asset_root}/oprf_nullifier.zkey" \ + "${witness_root}/oprf_nullifier.wtns" \ + "${asset_root}/oprf_nullifier.vkey.json" \ + "${asset_root}/oprf_nullifier.wasm" \ + "${asset_root}/oprf_nullifier.input.json" | \ + awk '{print $1}' | + shasum -a 256 | + awk '{print $1}' +} + +content_manifest="${prebuilt_root}.content.json" +content_sha256="$(printf '%s\n%s\n%s\n%s\n' "$(compute_content_sha256)" "${iterations}" "${warmup}" "${cold_launches}" | shasum -a 256 | awk '{print $1}')" +recorded_content_sha256="" +recorded_manifest_sha256="" +actual_manifest_sha256="" +if [[ -f "${prebuilt_root}/manifest.json" && -f "${content_manifest}" ]]; then + recorded_content_sha256="$(jq -er '.content_sha256' "${content_manifest}")" + recorded_manifest_sha256="$( + jq -er '.prebuilt_manifest_sha256' "${content_manifest}" + )" + actual_manifest_sha256="$( + shasum -a 256 "${prebuilt_root}/manifest.json" | awk '{print $1}' + )" +fi +if [[ -f "${prebuilt_root}/manifest.json" && -f "${content_manifest}" ]] && + [[ "${recorded_content_sha256}" == "${content_sha256}" ]] && + [[ "${recorded_manifest_sha256}" == "${actual_manifest_sha256}" ]]; then + existing_source_sha="$(jq -er '.source_sha' "${prebuilt_root}/manifest.json")" + existing_functions="$( + jq -c '[.entries[].function]' "${prebuilt_root}/manifest.json" + )" + cargo-mobench ci run-prebuilt \ + --dry-run \ + --manifest "${prebuilt_root}/manifest.json" \ + --expected-source-sha "${existing_source_sha}" \ + --expected-platform ios \ + --expected-functions "${existing_functions}" \ + --expected-iterations "${iterations}" \ + --expected-warmup "${warmup}" \ + --devices "iPhone SE 2022-15" \ + --max-completion-timeout-secs 7200 >/dev/null + echo "Reusing frozen ${prebuilt_root}/manifest.json" + exit 0 +fi + +case "${prebuilt_root}" in + "${repo_root}/target/v1-benchmarks/"*) + rm -rf "${prebuilt_root}/entries" + ;; + *) + echo "error: refusing to clear unexpected prebuilt root: ${prebuilt_root}" >&2 + exit 1 + ;; +esac + +"${script_dir}/build-rapidsnark-ios-libs.sh" >/dev/null + +work_root="$(mktemp -d "${build_parent}/rapidsnark-oprf-ios-package.XXXXXX")" +cleanup() { + case "${work_root}" in + "${build_parent}"/rapidsnark-oprf-ios-package.*) + rm -rf "${work_root}" + ;; + *) + echo "error: refusing to clean unexpected package path: ${work_root}" >&2 + ;; + esac +} +trap cleanup EXIT + +entries_file="${work_root}/entries.jsonl" +: >"${entries_file}" +entry_index=0 + +copy_fixture() { + local source="$1" + local destination="$2" + cp -c "${source}" "${destination}" 2>/dev/null || + cp "${source}" "${destination}" +} + +prepare_variant() { + local variant="$1" + local feature="$2" + local zkey="$3" + local witness="$4" + local verification_key="$5" + local output="${work_root}/${variant}" + local cargo_target="${repo_root}/target/v1-benchmarks/rapidsnark-oprf-${variant}-cargo" + local project="${output}/ios/BenchRunner" + local resources="${project}/BenchRunner/Resources" + local header_dir="${project}/BenchRunner/Generated" + local static_library="${cargo_target}/aarch64-apple-ios/release/lib${library_name}.a" + local xcframework="${output}/ios/${library_name}.xcframework" + + cargo build \ + --manifest-path "${crate}/Cargo.toml" \ + --target aarch64-apple-ios \ + --release \ + --no-default-features \ + --features "${feature}" \ + --target-dir "${cargo_target}" + + cargo run \ + --quiet \ + --manifest-path "${scaffold_crate}/Cargo.toml" \ + -- \ + "${output}" \ + "${library_name}" \ + "${library_name}::bench_oprf_${variant}_rapidsnark_proof_verify" + + bun "${script_dir}/patch-ios-runner-json.ts" \ + "${project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null + if ((cold_launches > 1)); then + bun "${script_dir}/patch-ios-cold-launches.ts" \ + "${project}/BenchRunnerUITests/BenchRunnerUITests.swift" \ + "${cold_launches}" >/dev/null + fi + + xcodebuild -create-xcframework \ + -library "${static_library}" \ + -headers "${header_dir}" \ + -output "${xcframework}" >/dev/null + + mkdir -p "${resources}" + copy_fixture "${zkey}" "${resources}/proving_key.zkey" + copy_fixture "${witness}" "${resources}/reference.wtns" + copy_fixture "${verification_key}" "${resources}/verification_key.json" + + local phase function entry destination app suite + local app_size suite_size app_hash suite_hash + for phase in input_to_proof; do + function="${library_name}::bench_oprf_${variant}_rapidsnark_${phase}" + entry="$(printf '%04d' "${entry_index}")" + destination="${prebuilt_root}/entries/${entry}" + mkdir -p "${destination}" + + jq -n --argjson iterations "${iterations}" --argjson warmup "${warmup}" \ + --arg function "${function}" \ + '{function: $function, iterations: $iterations, warmup: $warmup}' \ + >"${resources}/bench_spec.json" + ( + cd "${project}" + xcodegen generate >/dev/null + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + cargo-mobench package-xcuitest \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" >/dev/null + + app="${destination}/app.ipa" + suite="${destination}/test-suite.zip" + copy_fixture "${output}/ios/BenchRunner.ipa" "${app}" + copy_fixture "${output}/ios/BenchRunnerUITests.zip" "${suite}" + + unzip -p "${app}" 'Payload/*.app/bench_spec.json' | + jq -e \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + '.function == $function and .iterations == $iterations and .warmup == $warmup' \ + >/dev/null + + app_size="$(stat -f '%z' "${app}")" + suite_size="$(stat -f '%z' "${suite}")" + app_hash="$(shasum -a 256 "${app}" | awk '{print $1}')" + suite_hash="$(shasum -a 256 "${suite}" | awk '{print $1}')" + jq -cn \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + --arg app_path "entries/${entry}/app.ipa" \ + --arg suite_path "entries/${entry}/test-suite.zip" \ + --arg app_hash "${app_hash}" \ + --arg suite_hash "${suite_hash}" \ + --argjson app_size "${app_size}" \ + --argjson suite_size "${suite_size}" \ + '{ + function: $function, + iterations: $iterations, + warmup: $warmup, + completion_timeout_secs: 7200, + artifacts: [ + { + kind: "ios-app", + path: $app_path, + size: $app_size, + sha256: $app_hash + }, + { + kind: "ios-test-suite", + path: $suite_path, + size: $suite_size, + sha256: $suite_hash + } + ] + }' >>"${entries_file}" + entry_index=$((entry_index + 1)) + done +} + +prepare_variant \ + nullifier \ + oprf-nullifier \ + "${asset_root}/oprf_nullifier.zkey" \ + "${witness_root}/oprf_nullifier.wtns" \ + "${asset_root}/oprf_nullifier.vkey.json" + +mkdir -p "${prebuilt_root}" +source_sha="$(git -C "${repo_root}" rev-parse HEAD)" +manifest="${prebuilt_root}/manifest.json" +jq -s \ + --arg source_sha "${source_sha}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_sha, + platform: "ios", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-xcuitest-v2" + }, + entries: . + }' "${entries_file}" >"${manifest}" + +jq -n \ + --arg source_sha "${source_sha}" \ + --arg content_sha256 "${content_sha256}" \ + --arg manifest_sha256 "$(shasum -a 256 "${manifest}" | awk '{print $1}')" \ + '{ + schema: "provekit.rapidsnark-oprf-content.v1", + source_sha: $source_sha, + content_sha256: $content_sha256, + prebuilt_manifest_sha256: $manifest_sha256 + }' >"${content_manifest}" + +jq -e '.entries | length == 1' "${manifest}" >/dev/null +echo "${manifest}" diff --git a/benchmarks/v1/scripts/prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh b/benchmarks/v1/scripts/prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh new file mode 100755 index 000000000..f308a3978 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh @@ -0,0 +1,415 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +scaffold_crate="${benchmark_root}/rapidsnark/mobench-ios-scaffold" +prebuilt_root="${V1_RAPIDSNARK_CORE_IOS_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/rapidsnark-core-ios-prebuilt}" +build_parent="${repo_root}/target/v1-benchmarks" +passport_assets="${benchmark_root}/circom/web/dist/assets/passport" +passport_witnesses="${repo_root}/target/v1-benchmarks/circom/passport" +webauthn_assets="${benchmark_root}/circom/web/dist/assets/webauthn" +remote_webauthn_zkey_url="${MOBENCH_WEBAUTHN_ZKEY_URL:-}" +remote_passport_p1_zkey_url="${MOBENCH_PASSPORT_P1_ZKEY_URL:-}" +passport_p1_zkey="${repo_root}/target/v1-benchmarks/groth16/passport_p1/passport_p1_final.zkey" +passport_p1_witness="${repo_root}/target/v1-benchmarks/circom-witnesses/passport_p1/native.wtns" +passport_p1_vkey="${repo_root}/target/v1-benchmarks/groth16/passport_p1/verification_key.json" +selected_workloads="${V1_RAPIDSNARK_CORE_IOS_WORKLOADS:-passport-disclose,passport-register,passport-p1,webauthn}" +iterations="${V1_IOS_ITERATIONS:-5}" +warmup="${V1_IOS_WARMUP:-1}" +cold_launches="${V1_IOS_COLD_LAUNCHES:-1}" + +workload_selected() { + case ",${selected_workloads}," in + *",$1,"*) return 0 ;; + *) return 1 ;; + esac +} + +for workload in ${selected_workloads//,/ }; do + case "${workload}" in + passport-disclose | passport-register | passport-p1 | webauthn) ;; + *) + echo "error: unsupported V1_RAPIDSNARK_CORE_IOS_WORKLOADS entry: ${workload}" >&2 + exit 2 + ;; + esac +done + +for command in bun cargo cargo-mobench cp jq shasum stat unzip xcodebuild xcodegen; do + command -v "${command}" >/dev/null 2>&1 || { + echo "error: ${command} is required" >&2 + exit 1 + } +done + +compute_content_sha256() { + shasum -a 256 \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile/Cargo.toml" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/lib.rs" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/rapidsnark.rs" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile/src/live_witness.rs" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register/Cargo.toml" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-webauthn/Cargo.toml" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-webauthn/Cargo.lock" \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-webauthn/src/lib.rs" \ + "${scaffold_crate}/Cargo.toml" \ + "${scaffold_crate}/src/main.rs" \ + "${BASH_SOURCE[0]}" \ + "${benchmark_root}/rapidsnark/rapidsnark-ios-single-thread.patch" \ + "${benchmark_root}/rapidsnark/rapidsnark-ios-low-memory.patch" \ + "${script_dir}/build-rapidsnark-ios-libs.sh" \ + "${script_dir}/patch-ios-remote-proving-key.ts" \ + "${script_dir}/patch-ios-runner-json.ts" \ + "${script_dir}/patch-ios-cold-launches.ts" \ + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${passport_assets}/vc_and_disclose.zkey" \ + "${passport_witnesses}/vc_and_disclose.wtns" \ + "${passport_assets}/vc_and_disclose.vkey.json" \ + "${passport_assets}/vc_and_disclose.wasm" \ + "${passport_assets}/vc_and_disclose.input.json" \ + "${passport_assets}/register_sha256_sha256_sha256_rsa_65537_4096.zkey" \ + "${passport_witnesses}/register_sha256_sha256_sha256_rsa_65537_4096.wtns" \ + "${passport_assets}/register_sha256_sha256_sha256_rsa_65537_4096.vkey.json" \ + "${passport_assets}/register_sha256_sha256_sha256_rsa_65537_4096.wasm" \ + "${passport_assets}/register_sha256_sha256_sha256_rsa_65537_4096.input.json" \ + "${passport_p1_zkey}" \ + "${passport_p1_witness}" \ + "${passport_p1_vkey}" \ + "${repo_root}/target/v1-benchmarks/circom/passport_p1/passport_p1_js/passport_p1.wasm" \ + "${benchmark_root}/circom/fixtures/passport_p1/input.json" \ + "${webauthn_assets}/webauthn_default.zkey" \ + "${repo_root}/target/v1-benchmarks/circom/webauthn/fixture.wtns" \ + "${webauthn_assets}/webauthn_default.vkey.json" \ + "${webauthn_assets}/webauthn_default.wasm" \ + "${webauthn_assets}/webauthn_default.input.json" | + awk '{print $1}' | + { + cat + printf '%s\n' "${remote_webauthn_zkey_url}" + printf '%s\n' "${remote_passport_p1_zkey_url}" + printf '%s\n' "${selected_workloads}" + } | + shasum -a 256 | + awk '{print $1}' +} + +content_manifest="${prebuilt_root}.content.json" +content_sha256="$(printf '%s\n%s\n%s\n%s\n' "$(compute_content_sha256)" "${iterations}" "${warmup}" "${cold_launches}" | shasum -a 256 | awk '{print $1}')" +recorded_content_sha256="" +recorded_manifest_sha256="" +actual_manifest_sha256="" +if [[ -f "${prebuilt_root}/manifest.json" && -f "${content_manifest}" ]]; then + recorded_content_sha256="$(jq -er '.content_sha256' "${content_manifest}")" + recorded_manifest_sha256="$( + jq -er '.prebuilt_manifest_sha256' "${content_manifest}" + )" + actual_manifest_sha256="$( + shasum -a 256 "${prebuilt_root}/manifest.json" | awk '{print $1}' + )" +fi +if [[ -f "${prebuilt_root}/manifest.json" && -f "${content_manifest}" ]] && + [[ "${recorded_content_sha256}" == "${content_sha256}" ]] && + [[ "${recorded_manifest_sha256}" == "${actual_manifest_sha256}" ]]; then + existing_source_sha="$(jq -er '.source_sha' "${prebuilt_root}/manifest.json")" + existing_functions="$( + jq -c '[.entries[].function]' "${prebuilt_root}/manifest.json" + )" + cargo-mobench ci run-prebuilt \ + --dry-run \ + --manifest "${prebuilt_root}/manifest.json" \ + --expected-source-sha "${existing_source_sha}" \ + --expected-platform ios \ + --expected-functions "${existing_functions}" \ + --expected-iterations "${iterations}" \ + --expected-warmup "${warmup}" \ + --devices "iPhone SE 2022-15" \ + --max-completion-timeout-secs 7200 >/dev/null + echo "Reusing frozen ${prebuilt_root}/manifest.json" + exit 0 +fi + +case "${prebuilt_root}" in + "${repo_root}/target/v1-benchmarks/"*) + rm -rf "${prebuilt_root}/entries" + ;; + *) + echo "error: refusing to clear unexpected prebuilt root: ${prebuilt_root}" >&2 + exit 1 + ;; +esac + +"${script_dir}/build-rapidsnark-ios-libs.sh" >/dev/null + +work_root="$(mktemp -d "${build_parent}/rapidsnark-core-ios-package.XXXXXX")" +cleanup() { + case "${work_root}" in + "${build_parent}"/rapidsnark-core-ios-package.*) + rm -rf "${work_root}" + ;; + *) + echo "error: refusing to clean unexpected package path: ${work_root}" >&2 + ;; + esac +} +trap cleanup EXIT + +entries_file="${work_root}/entries.jsonl" +: >"${entries_file}" +entry_index=0 + +copy_fixture() { + local source="$1" + local destination="$2" + cp -c "${source}" "${destination}" 2>/dev/null || + cp "${source}" "${destination}" +} + +prepare_workload() { + local workload="$1" + local crate="$2" + local library_name="$3" + local function_prefix="$4" + local zkey="$5" + local witness="$6" + local verification_key="$7" + shift 7 + local phases=("$@") + local output="${work_root}/${workload}" + local cargo_target="${repo_root}/target/v1-benchmarks/rapidsnark-${workload}-cargo" + local project="${output}/ios/BenchRunner" + local resources="${project}/BenchRunner/Resources" + local header_dir="${project}/BenchRunner/Generated" + local static_library="${cargo_target}/aarch64-apple-ios/release/lib${library_name}.a" + local xcframework="${output}/ios/${library_name}.xcframework" + + for required in "${zkey}" "${witness}" "${verification_key}"; do + [[ -f "${required}" ]] || { + echo "error: missing frozen ${workload} fixture ${required}" >&2 + exit 1 + } + done + + if [[ "${workload}" == "passport-p1" ]]; then + cargo build \ + --manifest-path "${crate}/Cargo.toml" \ + --target aarch64-apple-ios \ + --release \ + --target-dir "${cargo_target}" \ + --no-default-features \ + --features passport-p1 + else + cargo build \ + --manifest-path "${crate}/Cargo.toml" \ + --target aarch64-apple-ios \ + --release \ + --target-dir "${cargo_target}" + fi + + cargo run \ + --quiet \ + --manifest-path "${scaffold_crate}/Cargo.toml" \ + -- \ + "${output}" \ + "${library_name}" \ + "${library_name}::${function_prefix}_proof_verify" + + bun "${script_dir}/patch-ios-runner-json.ts" \ + "${project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null + if ((cold_launches > 1)); then + bun "${script_dir}/patch-ios-cold-launches.ts" \ + "${project}/BenchRunnerUITests/BenchRunnerUITests.swift" \ + "${cold_launches}" >/dev/null + fi + local remote_zkey_url="" + case "${workload}" in + webauthn) remote_zkey_url="${remote_webauthn_zkey_url}" ;; + passport-p1) remote_zkey_url="${remote_passport_p1_zkey_url}" ;; + esac + if [[ -n "${remote_zkey_url}" ]]; then + bun "${script_dir}/patch-ios-remote-proving-key.ts" \ + "${project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null + fi + + xcodebuild -create-xcframework \ + -library "${static_library}" \ + -headers "${header_dir}" \ + -output "${xcframework}" >/dev/null + + mkdir -p "${resources}" + if [[ -n "${remote_zkey_url}" ]]; then + jq -n \ + --arg url "${remote_zkey_url}" \ + --arg sha256 "$(shasum -a 256 "${zkey}" | awk '{print $1}')" \ + --argjson bytes "$(stat -f '%z' "${zkey}")" \ + '{url:$url,bytes:$bytes,sha256:$sha256}' \ + >"${resources}/proving_key_remote.json" + else + copy_fixture "${zkey}" "${resources}/proving_key.zkey" + fi + copy_fixture "${witness}" "${resources}/reference.wtns" + copy_fixture "${verification_key}" "${resources}/verification_key.json" + + local phase function entry destination app suite + local app_size suite_size app_hash suite_hash + for phase in "${phases[@]}"; do + function="${library_name}::${function_prefix}_${phase}" + entry="$(printf '%04d' "${entry_index}")" + destination="${prebuilt_root}/entries/${entry}" + mkdir -p "${destination}" + + jq -n --argjson iterations "${iterations}" --argjson warmup "${warmup}" \ + --arg function "${function}" \ + '{function: $function, iterations: $iterations, warmup: $warmup}' \ + >"${resources}/bench_spec.json" + ( + cd "${project}" + xcodegen generate >/dev/null + ) + cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + cargo-mobench package-xcuitest \ + --crate-path "${crate}" \ + --output-dir "${output}" \ + --yes \ + --non-interactive >/dev/null + "${script_dir}/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" >/dev/null + + app="${destination}/app.ipa" + suite="${destination}/test-suite.zip" + copy_fixture "${output}/ios/BenchRunner.ipa" "${app}" + copy_fixture "${output}/ios/BenchRunnerUITests.zip" "${suite}" + unzip -p "${app}" 'Payload/*.app/bench_spec.json' | + jq -e \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + '.function == $function and .iterations == $iterations and .warmup == $warmup' \ + >/dev/null + + app_size="$(stat -f '%z' "${app}")" + suite_size="$(stat -f '%z' "${suite}")" + app_hash="$(shasum -a 256 "${app}" | awk '{print $1}')" + suite_hash="$(shasum -a 256 "${suite}" | awk '{print $1}')" + jq -cn \ + --arg function "${function}" \ + --argjson iterations "${iterations}" \ + --argjson warmup "${warmup}" \ + --arg app_path "entries/${entry}/app.ipa" \ + --arg suite_path "entries/${entry}/test-suite.zip" \ + --arg app_hash "${app_hash}" \ + --arg suite_hash "${suite_hash}" \ + --argjson app_size "${app_size}" \ + --argjson suite_size "${suite_size}" \ + '{ + function: $function, + iterations: $iterations, + warmup: $warmup, + completion_timeout_secs: 7200, + artifacts: [ + { + kind: "ios-app", + path: $app_path, + size: $app_size, + sha256: $app_hash + }, + { + kind: "ios-test-suite", + path: $suite_path, + size: $suite_size, + sha256: $suite_hash + } + ] + }' >>"${entries_file}" + entry_index=$((entry_index + 1)) + done +} + +if workload_selected passport-disclose; then + prepare_workload \ + passport-disclose \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile" \ + provekit_v1_rapidsnark_mobile \ + bench_passport_rapidsnark \ + "${passport_assets}/vc_and_disclose.zkey" \ + "${passport_witnesses}/vc_and_disclose.wtns" \ + "${passport_assets}/vc_and_disclose.vkey.json" \ + input_to_proof +fi +if workload_selected passport-register; then + prepare_workload \ + passport-register \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-register" \ + provekit_v1_rapidsnark_mobile_register \ + bench_passport_rapidsnark \ + "${passport_assets}/register_sha256_sha256_sha256_rsa_65537_4096.zkey" \ + "${passport_witnesses}/register_sha256_sha256_sha256_rsa_65537_4096.wtns" \ + "${passport_assets}/register_sha256_sha256_sha256_rsa_65537_4096.vkey.json" \ + input_to_proof +fi +if workload_selected passport-p1; then + [[ -n "${remote_passport_p1_zkey_url}" ]] || { + echo "error: MOBENCH_PASSPORT_P1_ZKEY_URL is required for passport-p1" >&2 + exit 2 + } + prepare_workload \ + passport-p1 \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile" \ + provekit_v1_rapidsnark_mobile \ + bench_passport_p1_rapidsnark \ + "${passport_p1_zkey}" \ + "${passport_p1_witness}" \ + "${passport_p1_vkey}" \ + input_to_proof +fi +if workload_selected webauthn; then + prepare_workload \ + webauthn \ + "${benchmark_root}/rapidsnark/rapidsnark-mobile-webauthn" \ + provekit_v1_rapidsnark_mobile_webauthn \ + bench_webauthn_rapidsnark \ + "${webauthn_assets}/webauthn_default.zkey" \ + "${repo_root}/target/v1-benchmarks/circom/webauthn/fixture.wtns" \ + "${webauthn_assets}/webauthn_default.vkey.json" \ + input_to_proof +fi + +mkdir -p "${prebuilt_root}" +source_sha="$(git -C "${repo_root}" rev-parse HEAD)" +manifest="${prebuilt_root}/manifest.json" +jq -s \ + --arg source_sha "${source_sha}" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_sha, + platform: "ios", + build_profile: "release", + mobench_version: "0.1.48", + abi: { + benchmark: "mobench-bench-spec-v1", + runner: "browserstack-xcuitest-v2" + }, + entries: . + }' "${entries_file}" >"${manifest}" + +jq -n \ + --arg source_sha "${source_sha}" \ + --arg content_sha256 "${content_sha256}" \ + --arg manifest_sha256 "$(shasum -a 256 "${manifest}" | awk '{print $1}')" \ + '{ + schema: "provekit.rapidsnark-core-content.v1", + source_sha: $source_sha, + content_sha256: $content_sha256, + prebuilt_manifest_sha256: $manifest_sha256 + }' >"${content_manifest}" + +jq -e --argjson expected "${entry_index}" \ + '.entries | length == $expected' "${manifest}" >/dev/null +echo "${manifest}" diff --git a/benchmarks/v1/scripts/prepare-self-groth16.sh b/benchmarks/v1/scripts/prepare-self-groth16.sh new file mode 100755 index 000000000..8e90dd4f1 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-self-groth16.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 1 ]]; then + echo "usage: $0 " >&2 + exit 1 +fi + +name="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +circom_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/self" +output_root="${V1_BENCHMARK_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16}/self/${name}" +snarkjs="${repo_root}/target/v1-benchmarks/sources/self/node_modules/snarkjs/build/cli.cjs" +r1cs="${circom_root}/${name}/${name}.r1cs" +zkey="${output_root}/${name}_0000.zkey" +verification_key="${output_root}/verification_key.json" + +case "${name}" in + register_sha256_sha256_sha256_rsa_65537_4096 | vc_and_disclose) ;; + *) + echo "error: unsupported Self circuit ${name}" >&2 + exit 1 + ;; +esac + +for command in node; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +"${script_dir}/prepare-self-passport.sh" +ptau="$("${script_dir}/bootstrap-ptau.sh")" +mkdir -p "${output_root}" + +if [[ ! -f "${zkey}" ]]; then + node "${snarkjs}" groth16 setup "${r1cs}" "${ptau}" "${zkey}" +fi +node "${snarkjs}" zkey export verificationkey "${zkey}" "${verification_key}" +node "${snarkjs}" zkey verify "${r1cs}" "${ptau}" "${zkey}" + +echo "Prepared and verified ${zkey}" diff --git a/benchmarks/v1/scripts/prepare-self-passport.sh b/benchmarks/v1/scripts/prepare-self-passport.sh new file mode 100755 index 000000000..d9e0121cb --- /dev/null +++ b/benchmarks/v1/scripts/prepare-self-passport.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +self_root="${source_root}/self" +output_root="${V1_BENCHMARK_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom}/self" +fixture_root="${benchmark_root}/circom/fixtures/self" +source_revision="$(jq -r '.sources[] | select(.name == "self") | .revision' "${benchmark_root}/sources.lock.json")" + +for command in bun jq make node pkg-config; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if [[ "$(node --version)" != v22.* ]]; then + echo "error: Self pins Node >=22 <23, found $(node --version)" >&2 + exit 1 +fi + +for library in gmp nlohmann_json; do + if ! pkg-config --exists "${library}"; then + echo "error: pkg-config could not find ${library}" >&2 + exit 1 + fi +done + +"${script_dir}/bootstrap-sources.sh" >/dev/null +circom_bin="$("${script_dir}/bootstrap-circom.sh")" + +if [[ ! -f "${self_root}/node_modules/.pnpm/lock.yaml" ]]; then + if ! command -v corepack >/dev/null 2>&1; then + echo "error: corepack is required to install Self's pinned pnpm graph" >&2 + exit 1 + fi + ( + cd "${self_root}" + corepack pnpm install --frozen-lockfile + ) +fi + +( + cd "${self_root}" + bun run circuits/scripts/link-circom-deps.cjs +) + +SELF_SOURCE_ROOT="${self_root}" \ +SELF_SOURCE_REVISION="${source_revision}" \ +SELF_FIXTURE_OUTPUT_ROOT="${fixture_root}" \ +SELF_FIXTURE_MODE="${SELF_FIXTURE_MODE:-check}" \ + bun run "${benchmark_root}/circom/generate-self-passport-fixtures.ts" + +include_paths=( + "${self_root}/circuits/node_modules" + "${self_root}/circuits/node_modules/circomlib/circuits" + "${self_root}/circuits/node_modules/@openpassport/zk-email-circuits" + "${self_root}/circuits/node_modules/@zk-kit/binary-merkle-root.circom/src" +) + +compile_circuit() { + local name="$1" + local source="$2" + local destination="${output_root}/${name}" + local r1cs="${destination}/${name}.r1cs" + local wasm="${destination}/${name}_js/${name}.wasm" + local cpp="${destination}/${name}_cpp/${name}" + local cpp_makefile="${destination}/${name}_cpp/Makefile" + local compile_all=0 + + if [[ "${V1_BENCHMARK_REBUILD_CIRCOM:-0}" == "1" || ! -f "${r1cs}" || ! -f "${wasm}" ]]; then + compile_all=1 + mkdir -p "${destination}" + include_args=() + for path in "${include_paths[@]}"; do + include_args+=(-l "${path}") + done + "${circom_bin}" "${source}" \ + --O1 \ + --r1cs \ + --wasm \ + --c \ + --no_asm \ + --sym \ + "${include_args[@]}" \ + -o "${destination}" + fi + + if [[ "${compile_all}" == "0" ]] && grep -q 'fr_asm' "${cpp_makefile}"; then + find "${destination}/${name}_cpp" -maxdepth 1 \ + \( -name '*.o' -o -name "${name}" \) \ + -type f \ + -delete + include_args=() + for path in "${include_paths[@]}"; do + include_args+=(-l "${path}") + done + "${circom_bin}" "${source}" \ + --O1 \ + --c \ + --no_asm \ + "${include_args[@]}" \ + -o "${destination}" + fi + + if [[ "$(uname -s)-$(uname -m)" == "Darwin-arm64" ]] && + grep -q 'uint64_t' "${destination}/${name}_cpp/fr.hpp"; then + if ! command -v perl >/dev/null 2>&1; then + echo "error: perl is required for Circom's Apple Silicon GMP compatibility rewrite" >&2 + exit 1 + fi + perl -pi -e 's/\buint64_t\b/mp_limb_t/g' \ + "${destination}/${name}_cpp/fr.cpp" \ + "${destination}/${name}_cpp/fr.hpp" + find "${destination}/${name}_cpp" -maxdepth 1 -name '*.o' -type f -delete + fi + + if [[ ! -x "${cpp}" ]]; then + make -C "${destination}/${name}_cpp" \ + CC="g++ $(pkg-config --libs-only-L gmp)" \ + CFLAGS="-std=c++11 -O3 -I. $(pkg-config --cflags gmp nlohmann_json)" + fi + + echo "ready ${name}" +} + +compile_circuit \ + "register_sha256_sha256_sha256_rsa_65537_4096" \ + "${self_root}/circuits/circuits/register/instances/register_sha256_sha256_sha256_rsa_65537_4096.circom" +compile_circuit \ + "vc_and_disclose" \ + "${self_root}/circuits/circuits/disclose/vc_and_disclose.circom" + +echo "Self passport circuits and deterministic fixtures are ready." diff --git a/benchmarks/v1/scripts/prepare-taceo-oprf-ios-prebuilt.sh b/benchmarks/v1/scripts/prepare-taceo-oprf-ios-prebuilt.sh new file mode 100755 index 000000000..8d755b957 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-taceo-oprf-ios-prebuilt.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "usage: $0 " >&2 +} + +[[ $# -eq 1 ]] || { usage; exit 2; } +mode="$1" +[[ "$mode" == warm || "$mode" == cold ]] || { usage; exit 2; } + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +crate="${benchmark_root}/circom/taceo-mobile" +source_prep="${benchmark_root}/circom/taceo-oprf/prepare-source.sh" +output="${repo_root}/target/v1-benchmarks/taceo-oprf-ios-build-${mode}" +prebuilt_root="${V1_TACEO_OPRF_IOS_PREBUILT_ROOT:-${repo_root}/target/v1-benchmarks/taceo-oprf-ios-prebuilt-${mode}}" +iterations="${V1_IOS_ITERATIONS:-5}" +warmup="${V1_IOS_WARMUP:-1}" +function="zk_mobile_bench::bench_taceo_oprf_input_to_proof" +cold_launches="${V1_IOS_COLD_LAUNCHES:-6}" +run_id="taceo-v021-oprf-ios-${mode}" +nonce="taceo-v021-oprf-ios-${mode}-nonce" +logical_session_id="taceo-v021-oprf-ios-${mode}" + +if [[ "$mode" == cold ]]; then + iterations=1 + warmup=0 + function="zk_mobile_bench::bench_taceo_oprf_input_to_proof_cold" +fi + +for command in cargo-mobench cp jq shasum stat unzip xcodegen; do + command -v "$command" >/dev/null 2>&1 || { + echo "error: $command is required" >&2 + exit 1 + } +done + +"$source_prep" >/dev/null +cargo-mobench build \ + --target ios \ + --release \ + --ios-deployment-target 15.0 \ + --crate-path "$crate" \ + --output-dir "$output" \ + --yes \ + --non-interactive \ + --progress + +project="${output}/ios/BenchRunner" +resources="${project}/BenchRunner/Resources" +mkdir -p "$resources" "${prebuilt_root}/entries/0000" + +"$script_dir/patch-ios-runner-json.ts" \ + "${project}/BenchRunner/BenchRunnerFFI.swift" >/dev/null +jq -n \ + --arg function "$function" \ + --arg run_id "$run_id" \ + --arg nonce "$nonce" \ + --arg logical_session_id "$logical_session_id" \ + --argjson iterations "$iterations" \ + --argjson warmup "$warmup" \ + '{schema_version: "mobench.run/v2", run_id: $run_id, nonce: $nonce, + logical_session_id: $logical_session_id, function_id: $function, + producer: "ios-runner", function: $function, iterations: $iterations, + warmup: $warmup}' \ + >"${resources}/bench_spec.json" +( + cd "$project" + xcodegen generate >/dev/null +) +cargo-mobench package-ipa \ + --method adhoc \ + --crate-path "$crate" \ + --output-dir "$output" \ + --yes \ + --non-interactive >/dev/null +if [[ "$mode" == cold ]]; then + bun "$script_dir/patch-ios-cold-launches.ts" \ + "${project}/BenchRunnerUITests/BenchRunnerUITests.swift" \ + "$cold_launches" >/dev/null + ( + cd "$project" + xcodegen generate >/dev/null + ) +fi +cargo-mobench package-xcuitest \ + --crate-path "$crate" \ + --output-dir "$output" \ + --yes \ + --non-interactive >/dev/null +"$script_dir/patch-ios15-xcuitest-suite.sh" \ + "${output}/ios/BenchRunnerUITests.zip" >/dev/null + +app="${prebuilt_root}/entries/0000/app.ipa" +suite="${prebuilt_root}/entries/0000/test-suite.zip" +cp -c "${output}/ios/BenchRunner.ipa" "$app" 2>/dev/null || cp "${output}/ios/BenchRunner.ipa" "$app" +cp -c "${output}/ios/BenchRunnerUITests.zip" "$suite" 2>/dev/null || cp "${output}/ios/BenchRunnerUITests.zip" "$suite" + +unzip -p "$app" 'Payload/*.app/bench_spec.json' | + jq -e --arg function "$function" --argjson iterations "$iterations" --argjson warmup "$warmup" \ + '.function == $function and .iterations == $iterations and .warmup == $warmup' >/dev/null + +app_size="$(stat -f '%z' "$app")" +suite_size="$(stat -f '%z' "$suite")" +app_hash="$(shasum -a 256 "$app" | awk '{print $1}')" +suite_hash="$(shasum -a 256 "$suite" | awk '{print $1}')" +source_sha="$(git -C "$repo_root" rev-parse HEAD)" +jq -n \ + --arg source_sha "$source_sha" \ + --arg function "$function" \ + --arg mode "$mode" \ + --argjson iterations "$iterations" \ + --argjson warmup "$warmup" \ + --arg app_hash "$app_hash" \ + --arg suite_hash "$suite_hash" \ + --argjson app_size "$app_size" \ + --argjson suite_size "$suite_size" \ + --argjson cold_launches "$cold_launches" \ + '{ + schema: "mobench.prebuilt.v1", + source_sha: $source_sha, + platform: "ios", + build_profile: "release", + mobench_version: "0.2.0", + abi: { benchmark: "mobench-bench-spec-v1", runner: "browserstack-xcuitest-v2" }, + entries: [{ + function: $function, + iterations: $iterations, + warmup: $warmup, + completion_timeout_secs: 7200, + artifacts: [ + { kind: "ios-app", path: "entries/0000/app.ipa", size: $app_size, sha256: $app_hash }, + { kind: "ios-test-suite", path: "entries/0000/test-suite.zip", size: $suite_size, sha256: $suite_hash } + ] + }] + }' >"${prebuilt_root}/manifest.json" + +jq -n \ + --arg mode "$mode" \ + --argjson cold_launches "$cold_launches" \ + '{ + schema: "provekit.taceo-oprf-source.v1", + helpers_main: "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + circom_witness_rs_branch: "codex/remove-cxx-bridge-and-grep", + circom_witness_rs: "e11206a9f453145dcd6b814523cbfba4f60cf5c6", + circom: "2.2.2", + mode: $mode, + cold_launches: $cold_launches + }' >"${prebuilt_root}.taceo-source.json" + +shasum -a 256 "$app" "$suite" "${prebuilt_root}/manifest.json" "${prebuilt_root}.taceo-source.json" +echo "${prebuilt_root}/manifest.json" diff --git a/benchmarks/v1/scripts/prepare-webauthn-circom.sh b/benchmarks/v1/scripts/prepare-webauthn-circom.sh new file mode 100755 index 000000000..a6a1bdb09 --- /dev/null +++ b/benchmarks/v1/scripts/prepare-webauthn-circom.sh @@ -0,0 +1,186 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + cat >&2 <<'EOF' +usage: prepare-webauthn-circom.sh [--witness] [--setup] + +Compiles the pinned privacy-ethereum/webauth-circom assertion circuit and +builds its native witness generator. --witness also generates and checks the +fixture WTNS. --setup additionally creates and verifies a benchmark-only +Groth16 zkey; set V1_WEBAUTHN_PTAU to a power-22-or-larger PTAU first. +EOF +} + +build_witness=false +build_setup=false +while [[ "$#" -gt 0 ]]; do + case "$1" in + --witness) + build_witness=true + ;; + --setup) + build_witness=true + build_setup=true + ;; + -h | --help) + usage + exit 0 + ;; + *) + usage + exit 1 + ;; + esac + shift +done + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +lock_file="${benchmark_root}/sources.lock.json" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +source_dir="${source_root}/webauth-circom" +output_root="${V1_WEBAUTHN_CIRCOM_ROOT:-${repo_root}/target/v1-benchmarks/circom/webauthn}" +groth16_root="${V1_WEBAUTHN_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16/webauthn}" +expected_revision="$( + jq -er '.sources[] | select(.name == "webauth-circom") | .revision' "${lock_file}" +)" + +for command in bun git jq node openssl stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +snarkjs_node_options="${V1_SNARKJS_NODE_OPTIONS:---max-old-space-size=32768}" +run_snarkjs() { + NODE_OPTIONS="${snarkjs_node_options}" \ + node "${source_dir}/node_modules/snarkjs/build/cli.cjs" "$@" +} + +"${script_dir}/bootstrap-sources.sh" >/dev/null +actual_revision="$(git -C "${source_dir}" rev-parse HEAD)" +if [[ "${actual_revision}" != "${expected_revision}" ]]; then + echo "error: webauth-circom is at ${actual_revision}, expected ${expected_revision}" >&2 + exit 1 +fi + +if [[ ! -d "${source_dir}/node_modules/circomlib" ]]; then + ( + cd "${source_dir}" + bun install --frozen-lockfile + ) +fi + +circom="$("${script_dir}/bootstrap-circom.sh")" +circuit="${source_dir}/scripts/webauthn_default.circom" +fixture="${source_dir}/scripts/input_webauthn_default.json" +r1cs="${output_root}/webauthn_default.r1cs" +sym="${output_root}/webauthn_default.sym" +wasm="${output_root}/webauthn_default_js/webauthn_default.wasm" +cpp_dir="${output_root}/webauthn_default_cpp" +dat="${cpp_dir}/webauthn_default.dat" +wtns="${output_root}/fixture.wtns" +compile_log="${output_root}/compile.log" +manifest="${output_root}/manifest.json" + +mkdir -p "${output_root}" +if [[ ! -f "${r1cs}" || ! -f "${sym}" || ! -f "${wasm}" || ! -f "${dat}" ]]; then + "${circom}" "${circuit}" \ + --r1cs \ + --wasm \ + --sym \ + --c \ + -l "${source_dir}/node_modules" \ + -o "${output_root}" 2>&1 | tee "${compile_log}" +fi + +if [[ "${build_witness}" == "true" ]]; then + node "${output_root}/webauthn_default_js/generate_witness.js" \ + "${wasm}" \ + "${fixture}" \ + "${wtns}" + run_snarkjs wtns check "${r1cs}" "${wtns}" +fi + +zkey="${groth16_root}/webauthn_default_benchmark.zkey" +verification_key="${groth16_root}/verification_key.json" +if [[ "${build_setup}" == "true" ]]; then + ptau="${V1_WEBAUTHN_PTAU:-$("${script_dir}/bootstrap-ptau.sh" 22)}" + if [[ ! -f "${ptau}" ]]; then + echo "error: V1_WEBAUTHN_PTAU does not exist: ${ptau}" >&2 + exit 1 + fi + + mkdir -p "${groth16_root}" + if [[ ! -f "${zkey}" ]]; then + partial_zkey="${zkey}.partial.$$" + trap 'rm -f "${partial_zkey:-}"' EXIT + run_snarkjs groth16 setup "${r1cs}" "${ptau}" "${partial_zkey}" + mv "${partial_zkey}" "${zkey}" + trap - EXIT + fi + run_snarkjs zkey verify "${r1cs}" "${ptau}" "${zkey}" + run_snarkjs zkey export verificationkey "${zkey}" "${verification_key}" +fi + +stat_size() { + if [[ "$(uname -s)" == "Darwin" ]]; then + stat -f '%z' "$1" + else + stat -c '%s' "$1" + fi +} + +artifact_json() { + local path="$1" + jq -n \ + --arg path "${path#"${repo_root}/"}" \ + --arg sha256 "$(openssl dgst -sha256 "${path}" | awk '{print tolower($NF)}')" \ + --argjson size "$(stat_size "${path}")" \ + '{path: $path, size_bytes: $size, sha256: $sha256}' +} + +artifacts="$( + artifact_json "${r1cs}" + artifact_json "${sym}" + artifact_json "${wasm}" + artifact_json "${dat}" + if [[ -f "${wtns}" ]]; then artifact_json "${wtns}"; fi + if [[ -f "${zkey}" && -f "${verification_key}" ]]; then + artifact_json "${zkey}" + artifact_json "${verification_key}" + fi +)" + +jq -s \ + --arg source_revision "${actual_revision}" \ + --arg circuit "${circuit#"${repo_root}/"}" \ + --arg fixture "${fixture#"${repo_root}/"}" \ + --arg circom_version "$("${circom}" --version | tr -d '\r')" \ + '{ + schema_version: 1, + workload: "webauthn_assertion", + statement: { + validates: [ + "webauthn.get type", + "challenge inclusion in clientDataJSON", + "authenticatorData plus clientDataJSON hash construction", + "P-256 signature" + ], + does_not_constrain: ["RP ID hash", "origin", "UP flag", "UV flag"], + comparable_to_world_id_noir_ownership: false + }, + source_revision: $source_revision, + circuit: $circuit, + fixture: $fixture, + circom_version: $circom_version, + expected_non_linear_constraints: 2812892, + artifacts: . + }' <<<"${artifacts}" >"${manifest}" + +echo "Prepared Circom WebAuthn artifacts under ${output_root}" +echo "Manifest: ${manifest}" diff --git a/benchmarks/v1/scripts/run-e15-provekit.test.ts b/benchmarks/v1/scripts/run-e15-provekit.test.ts new file mode 100644 index 000000000..0ae36ee6a --- /dev/null +++ b/benchmarks/v1/scripts/run-e15-provekit.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, test } from "bun:test"; +import { + orchestrationFailure, + parseBenchJson, + parseFailureJson, +} from "./run-e15-provekit"; + +describe("E15 logcat parsing", () => { + test("reassembles chunked Mobench JSON in order", () => { + const log = [ + "1 I BenchRunner: BENCH_JSON_START", + '2 I BenchRunner: BENCH_JSON_CHUNK {"spec":{"name":"oprf"},', + '3 I BenchRunner: BENCH_JSON_CHUNK "samples":[{"duration_ns":42}]}', + "4 I BenchRunner: BENCH_JSON_END", + ].join("\n"); + expect(parseBenchJson(log)).toEqual({ + spec: { name: "oprf" }, + samples: [{ duration_ns: 42 }], + }); + }); + + test("uses the last complete report when Android launches the activity twice", () => { + const log = [ + "1 I BenchRunner: BENCH_JSON_START", + '2 I BenchRunner: BENCH_JSON_CHUNK {"samples":[{"duration_ns":41}]}', + "3 I BenchRunner: BENCH_JSON_END", + "4 I BenchRunner: BENCH_JSON_START", + '5 I BenchRunner: BENCH_JSON_CHUNK {"samples":[{"duration_ns":42}]}', + "6 I BenchRunner: BENCH_JSON_END", + ].join("\n"); + expect(parseBenchJson(log)).toEqual({ samples: [{ duration_ns: 42 }] }); + }); + + test("extracts the last structured failure", () => { + const log = [ + '1 I BenchRunner: BENCH_FAILURE_JSON {"kind":"old"}', + '2 I BenchRunner: BENCH_FAILURE_JSON {"kind":"benchmark_error","message":"panic detail"}', + ].join("\n"); + expect(parseFailureJson(log)).toEqual({ + kind: "benchmark_error", + message: "panic detail", + }); + }); + + test("retains a device reboot failure as a structured unmeasured result", () => { + expect( + orchestrationFailure( + "webauthn", + "bench_mobile::bench_webauthn_assertion_e2e", + new Error("device did not return"), + "/evidence/webauthn.orchestration-failure.json", + ), + ).toMatchObject({ + workload: "webauthn", + status: "not_run", + failure: { + kind: "device_orchestration_failed", + message: "device did not return", + }, + }); + }); +}); diff --git a/benchmarks/v1/scripts/run-e15-provekit.ts b/benchmarks/v1/scripts/run-e15-provekit.ts new file mode 100755 index 000000000..4fabf9023 --- /dev/null +++ b/benchmarks/v1/scripts/run-e15-provekit.ts @@ -0,0 +1,457 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +interface Options { + output: string; + campaign: string; + apk: string; + packageId: string; + activityClass: string; + warmup: number; + samples: number; + timeoutSeconds: number; + workloads: string[]; + rebootBeforeEach: boolean; + passportSingleThread: boolean; + workerProcessSuffix: string; +} + +const workloads = [ + ["oprf", "bench_mobile::bench_oprf_prove"], + ["webauthn", "bench_mobile::bench_webauthn_assertion_prove"], + ["passport", "bench_mobile::bench_passport_complete_age_check_prove"], + ["oprf_input_to_proof", "bench_mobile::bench_oprf_input_to_proof"], + ["webauthn_input_to_proof", "bench_mobile::bench_webauthn_assertion_input_to_proof"], + ["passport_input_to_proof", "bench_mobile::bench_passport_complete_age_check_input_to_proof"], + ["passport_p1_input_to_proof", "bench_mobile::bench_passport_p1_input_to_proof"], + ["bb_oprf_input_to_proof", "provekit_v1_mobile_adapters::bench_oprf_barretenberg_input_to_proof"], + ["bb_webauthn_input_to_proof", "provekit_v1_mobile_adapters::bench_webauthn_barretenberg_input_to_proof"], + ["bb_passport_input_to_proof", "provekit_v1_mobile_adapters::bench_passport_barretenberg_input_to_proof"], + ["bb_passport_p1_input_to_proof", "provekit_v1_mobile_adapters::bench_passport_p1_barretenberg_input_to_proof"], + ["circom_oprf_input_to_proof", "provekit_v1_rapidsnark_mobile_oprf::bench_oprf_nullifier_rapidsnark_input_to_proof"], + ["circom_webauthn_input_to_proof", "provekit_v1_rapidsnark_mobile_webauthn::bench_webauthn_rapidsnark_input_to_proof"], + ["circom_passport_p1_input_to_proof", "provekit_v1_rapidsnark_mobile::bench_passport_p1_rapidsnark_input_to_proof"], + ["circom_passport_disclose_input_to_proof", "provekit_v1_rapidsnark_mobile::bench_passport_rapidsnark_input_to_proof"], + ["circom_passport_register_input_to_proof", "provekit_v1_rapidsnark_mobile_register::bench_passport_rapidsnark_input_to_proof"], +] as const; + +export function parseBenchJson(log: string): unknown { + const lines = log.split(/\r?\n/); + const end = lines.findLastIndex((line) => line.includes("BENCH_JSON_END")); + const start = lines.findLastIndex( + (line, index) => index < end && line.includes("BENCH_JSON_START"), + ); + if (start < 0 || end < 0) throw new Error("logcat contains no complete BENCH_JSON record"); + const chunks = lines + .slice(start + 1, end) + .filter((line) => line.includes("BENCH_JSON_CHUNK ")) + .map((line) => line.slice(line.indexOf("BENCH_JSON_CHUNK ") + "BENCH_JSON_CHUNK ".length)); + if (chunks.length === 0) throw new Error("logcat contains no BENCH_JSON_CHUNK records"); + return JSON.parse(chunks.join("")); +} + +export function parseFailureJson(log: string): unknown | null { + const line = log + .split(/\r?\n/) + .findLast((candidate) => candidate.includes("BENCH_FAILURE_JSON ")); + if (!line) return null; + return JSON.parse( + line.slice(line.indexOf("BENCH_FAILURE_JSON ") + "BENCH_FAILURE_JSON ".length), + ); +} + +export function orchestrationFailure( + workload: string, + functionName: string, + error: unknown, + evidencePath: string, +) { + return { + workload, + function: functionName, + status: "not_run", + failure: { + schema_version: 1, + kind: "device_orchestration_failed", + message: error instanceof Error ? error.message : String(error), + }, + evidence_path: evidencePath, + }; +} + +function positiveInteger(value: string, flag: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed <= 0) throw new Error(`${flag} must be positive`); + return parsed; +} + +function nonNegativeInteger(value: string, flag: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 0) throw new Error(`${flag} must be non-negative`); + return parsed; +} + +function parseArgs(args: string[]): Options { + const repoRoot = resolve(import.meta.dir, "../../.."); + const options: Options = { + output: resolve(repoRoot, "target/v1-benchmarks/reproduction/e15-provekit"), + campaign: "provekit-v1-cross-device", + apk: resolve( + repoRoot, + "target/v1-benchmarks/e15-diagnostic-build/android/app/build/outputs/apk/debug/app-debug.apk", + ), + packageId: "dev.world.benchmobile", + activityClass: ".MainActivity", + warmup: 1, + samples: 5, + timeoutSeconds: 7200, + workloads: workloads.map(([name]) => name), + rebootBeforeEach: false, + passportSingleThread: false, + workerProcessSuffix: ":input_to_proof", + }; + for (let index = 0; index < args.length; index++) { + const flag = args[index]!; + if (flag === "--sequential") continue; + if (flag === "--reboot-before-each") { + options.rebootBeforeEach = true; + continue; + } + if (flag === "--passport-single-thread") { + options.passportSingleThread = true; + continue; + } + const value = args[++index]; + if (!value) throw new Error(`missing value for ${flag}`); + if (flag === "--output") options.output = resolve(value); + else if (flag === "--campaign") options.campaign = value; + else if (flag === "--apk") options.apk = resolve(value); + else if (flag === "--package-id") options.packageId = value; + else if (flag === "--activity-class") options.activityClass = value; + else if (flag === "--warmup") options.warmup = nonNegativeInteger(value, flag); + else if (flag === "--samples") options.samples = positiveInteger(value, flag); + else if (flag === "--timeout-seconds") { + options.timeoutSeconds = positiveInteger(value, flag); + } else if (flag === "--workloads") { + const selected = value.split(",").filter(Boolean); + const known = new Set(workloads.map(([name]) => name)); + const unknown = selected.filter((name) => !known.has(name)); + if (selected.length === 0 || unknown.length > 0) { + throw new Error( + `${flag} must be a comma-separated subset of ${[...known].join(",")}`, + ); + } + options.workloads = selected; + } else if (flag === "--worker-process-suffix") { + if (!/^:[A-Za-z0-9_]+$/.test(value)) { + throw new Error(`${flag} must match :[A-Za-z0-9_]+`); + } + options.workerProcessSuffix = value; + } else { + throw new Error(`unknown argument: ${flag}`); + } + } + return options; +} + +function adbCommand(): string[] { + const adb = + process.env.ADB ?? + resolve( + process.env.ANDROID_HOME ?? + process.env.ANDROID_SDK_ROOT ?? + resolve(process.env.HOME!, "Library/Android/sdk"), + "platform-tools/adb", + ); + const command = [adb]; + if (process.env.ANDROID_SERIAL) command.push("-s", process.env.ANDROID_SERIAL); + return command; +} + +async function command( + args: string[], + allowFailure = false, + timeoutMs?: number, +): Promise { + const child = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + let timedOut = false; + const timer = + timeoutMs === undefined + ? undefined + : setTimeout(() => { + timedOut = true; + child.kill(); + }, timeoutMs); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + if (timer !== undefined) clearTimeout(timer); + if (timedOut) { + throw new Error(`${args.join(" ")} timed out after ${timeoutMs} ms`); + } + if (exitCode !== 0 && !allowFailure) { + throw new Error(`${args.join(" ")} failed (${exitCode})\n${stderr}\n${stdout}`); + } + return `${stdout}${stderr}`; +} + +async function logcat(adb: string[]): Promise { + return command( + [ + ...adb, + "logcat", + "-d", + "-v", + "epoch", + "BenchRunner:I", + "lowmemorykiller:I", + "ActivityManager:I", + "AndroidRuntime:E", + "libc:E", + "DEBUG:I", + "*:S", + ], + false, + 120_000, + ); +} + +async function workerPid( + adb: string[], + packageId: string, + workerProcessSuffix: string, +): Promise { + return ( + await command( + [...adb, "shell", "pidof", `${packageId}${workerProcessSuffix}`], + true, + ) + ).trim(); +} + +async function waitForPackageRemoval(adb: string[], packageId: string): Promise { + for (let attempt = 0; attempt < 60; attempt++) { + const path = await command( + [...adb, "shell", "pm", "path", packageId], + true, + ); + if (path.trim() === "") return; + await Bun.sleep(500); + } + throw new Error(`timed out waiting for ${packageId} removal`); +} + +async function rebootDevice(adb: string[]): Promise { + await command([...adb, "reboot"]); + await command([...adb, "wait-for-device"]); + for (let attempt = 0; attempt < 180; attempt++) { + const completed = await command( + [...adb, "shell", "getprop", "sys.boot_completed"], + true, + ); + if (completed.trim() === "1") { + await command([...adb, "shell", "input", "keyevent", "82"], true); + await Bun.sleep(3000); + return; + } + await Bun.sleep(1000); + } + throw new Error("timed out waiting for the E15 to finish rebooting"); +} + +async function runWorkload( + adb: string[], + options: Options, + workload: string, + functionName: string, +) { + // Android marks a process as bad after a native crash and may refuse to + // launch the worker for later workloads even after `am force-stop` or an + // in-place reinstall. A fresh package install clears that quarantine and is + // outside every measured benchmark interval. + await command([...adb, "uninstall", options.packageId], true); + await command([...adb, "uninstall", `${options.packageId}.test`], true); + await waitForPackageRemoval(adb, options.packageId); + await command([...adb, "install", "-r", "-t", options.apk]); + const startCommand = [ + ...adb, + "shell", + "am", + "start", + "-W", + "-n", + `${options.packageId}/${options.activityClass}`, + "--es", + "bench_function", + functionName, + "--ei", + "bench_iterations", + String(options.samples), + "--ei", + "bench_warmup", + String(options.warmup), + "--el", + "bench_timeout_secs", + String(options.timeoutSeconds), + "--el", + "bench_heartbeat_interval_secs", + "10", + ]; + let log = ""; + let workerDied = false; + for (let launchAttempt = 0; launchAttempt < 2; launchAttempt++) { + await command([...adb, "logcat", "-c"]); + await command([...adb, "shell", "am", "force-stop", options.packageId]); + await command(startCommand); + const deadline = Date.now() + options.timeoutSeconds * 1000; + let observedWorker = false; + while (Date.now() < deadline) { + log = await logcat(adb); + if (log.includes("BENCH_JSON_END") || log.includes("BENCH_FAILURE_JSON ")) break; + const pid = await workerPid(adb, options.packageId, options.workerProcessSuffix); + if (pid !== "") { + observedWorker = true; + } else if (observedWorker) { + await Bun.sleep(2000); + log = await logcat(adb); + if (!log.includes("BENCH_JSON_END") && !log.includes("BENCH_FAILURE_JSON ")) { + workerDied = true; + } + break; + } + await Bun.sleep(2000); + } + const failure = parseFailureJson(log) as { message?: string } | null; + if ( + launchAttempt === 0 && + failure?.message?.includes("process is bad") + ) { + // ActivityManager's bad-process quarantine is keyed by process name and + // can survive reinstall/reboot briefly. Its backoff expires after about + // one minute; retrying the same installed APK preserves artifact identity. + await Bun.sleep(65_000); + workerDied = false; + continue; + } + break; + } + const logPath = resolve(options.output, `${workload}.logcat.txt`); + await Bun.write(logPath, log); + if (log.includes("BENCH_JSON_END")) { + return { + workload, + function: functionName, + status: "ok", + report: parseBenchJson(log), + evidence_path: logPath, + }; + } + const failure = parseFailureJson(log); + return { + workload, + function: functionName, + status: failure ? "runtime_failed" : workerDied ? "crashed" : "timed_out", + failure: + failure ?? + (workerDied + ? { + schema_version: 1, + kind: "worker_died", + message: + "isolated benchmark worker exited before emitting a result; inspect retained logcat for LMK or crash evidence", + } + : null), + evidence_path: logPath, + }; +} + +if (import.meta.main) { + const options = parseArgs(process.argv.slice(2)); + if (!(await Bun.file(options.apk).exists())) throw new Error(`missing APK: ${options.apk}`); + await mkdir(options.output, { recursive: true }); + const adb = adbCommand(); + const devices = await command([...adb, "devices", "-l"]); + const selectedSerial = process.env.ANDROID_SERIAL; + const connected = devices + .split(/\r?\n/) + .filter( + (line) => + /\sdevice(?:\s|$)/.test(line) && + (!selectedSerial || line.startsWith(`${selectedSerial}\t`) || line.startsWith(`${selectedSerial} `)), + ); + if (connected.length !== 1) { + throw new Error( + `expected exactly one authorized E15${selectedSerial ? ` matching ${selectedSerial}` : ""}, found ${connected.length}\n${devices}`, + ); + } + const identity = Object.fromEntries( + await Promise.all( + [ + ["manufacturer", "ro.product.manufacturer"], + ["model", "ro.product.model"], + ["os", "ro.build.version.release"], + ["abi", "ro.product.cpu.abi"], + ["abilist", "ro.product.cpu.abilist"], + ["abilist64", "ro.product.cpu.abilist64"], + ["zygote", "ro.zygote"], + ].map(async ([key, property]) => [ + key, + (await command([...adb, "shell", "getprop", property])).trim(), + ]), + ), + ); + await Bun.write( + resolve(options.output, "device.json"), + `${JSON.stringify({ captured_at_utc: new Date().toISOString(), ...identity }, null, 2)}\n`, + ); + const results = []; + for (const [workload, functionName] of workloads.filter(([name]) => + options.workloads.includes(name) + )) { + const selectedFunction = + options.passportSingleThread && workload === "passport" + ? "bench_mobile::bench_passport_complete_age_check_prove_single_thread" + : options.passportSingleThread && workload === "passport_input_to_proof" + ? "bench_mobile::bench_passport_complete_age_check_input_to_proof_single_thread" + : functionName; + try { + if (options.rebootBeforeEach) await rebootDevice(adb); + results.push(await runWorkload(adb, options, workload, selectedFunction)); + } catch (error) { + const evidencePath = resolve(options.output, `${workload}.orchestration-failure.json`); + const failure = orchestrationFailure( + workload, + selectedFunction, + error, + evidencePath, + ); + await Bun.write(evidencePath, `${JSON.stringify(failure, null, 2)}\n`); + results.push(failure); + } + } + const output = { + schema_version: 1, + campaign_id: options.campaign, + generated_at_utc: new Date().toISOString(), + sampling: { warmup: options.warmup, measured: options.samples, sequential: true }, + device: identity, + apk: { + path: options.apk, + sha256: new Bun.CryptoHasher("sha256").update(await Bun.file(options.apk).bytes()).digest("hex"), + bytes: Bun.file(options.apk).size, + }, + android_package: { + id: options.packageId, + activity: options.activityClass, + worker_process_suffix: options.workerProcessSuffix, + }, + results, + }; + const outputPath = resolve(options.output, "results.json"); + await Bun.write(outputPath, `${JSON.stringify(output, null, 2)}\n`); + console.log(outputPath); +} diff --git a/benchmarks/v1/scripts/run-e15-taceo-oprf.ts b/benchmarks/v1/scripts/run-e15-taceo-oprf.ts new file mode 100644 index 000000000..47ae606ec --- /dev/null +++ b/benchmarks/v1/scripts/run-e15-taceo-oprf.ts @@ -0,0 +1,185 @@ +#!/usr/bin/env bun + +import { mkdir } from "node:fs/promises"; +import { resolve } from "node:path"; + +const repoRoot = resolve(import.meta.dir, "../../.."); +const adb = process.env.ADB ?? resolve(process.env.HOME!, "Library/Android/sdk/platform-tools/adb"); +const serial = process.env.ANDROID_SERIAL ?? "ZY32M6782K"; +const packageId = process.env.TACEO_ANDROID_PACKAGE ?? "dev.world.zkmobilebench"; +const activityClass = process.env.TACEO_ANDROID_ACTIVITY ?? "dev.world.zkmobilebench.MainActivity"; +const only = process.env.TACEO_ONLY?.split(",").filter(Boolean); +const apk = resolve( + process.env.TACEO_ANDROID_APK ?? + resolve(repoRoot, "target/v1-benchmarks/taceo-oprf-android-v2/android/app/build/outputs/apk/debug/app-debug.apk"), +); +const outputRoot = resolve( + process.env.TACEO_E15_OUTPUT ?? + resolve(repoRoot, "target/v1-benchmarks/taceo-v021/evidence/e15-taceo-oprf"), +); +const timeoutSeconds = Number(process.env.TACEO_TIMEOUT_SECONDS ?? "7200"); +const samples = Number(process.env.TACEO_SAMPLES ?? "5"); +const requestedCircuit = process.env.TACEO_CIRCUIT; + +const allFunctions = [ + ["oprf_query", "warm", "zk_mobile_bench::bench_taceo_oprf_query_input_to_proof", 1], + ["oprf_query", "cold", "zk_mobile_bench::bench_taceo_oprf_query_input_to_proof_cold", 0], + ["oprf_nullifier", "warm", "zk_mobile_bench::bench_taceo_oprf_input_to_proof", 1], + ["oprf_nullifier", "cold", "zk_mobile_bench::bench_taceo_oprf_input_to_proof_cold", 0], +] as const; +if (requestedCircuit && requestedCircuit !== "oprf_query" && requestedCircuit !== "oprf_nullifier") { + throw new Error("TACEO_CIRCUIT must be oprf_query or oprf_nullifier"); +} +const functions = requestedCircuit ? allFunctions.filter(([circuit]) => circuit === requestedCircuit) : allFunctions; + +async function command(args: string[], allowFailure = false): Promise { + const child = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + if (exitCode !== 0 && !allowFailure) { + throw new Error(`${args.join(" ")} failed (${exitCode})\n${stderr}\n${stdout}`); + } + return `${stdout}${stderr}`; +} + +function parseBenchJson(log: string): unknown { + const lines = log.split(/\r?\n/); + const singleLine = lines.findLast((line) => line.includes("BENCH_JSON ")); + if (singleLine && !singleLine.includes("BENCH_JSON_START")) { + return JSON.parse(singleLine.slice(singleLine.indexOf("BENCH_JSON ") + "BENCH_JSON ".length)); + } + const end = lines.findLastIndex((line) => line.includes("BENCH_JSON_END")); + const start = lines.findLastIndex((line, index) => index < end && line.includes("BENCH_JSON_START")); + if (start < 0 || end < 0) throw new Error("logcat has no complete BENCH_JSON record"); + const chunks = lines + .slice(start + 1, end) + .filter((line) => line.includes("BENCH_JSON_CHUNK ")) + .map((line) => line.slice(line.indexOf("BENCH_JSON_CHUNK ") + "BENCH_JSON_CHUNK ".length)); + if (chunks.length === 0) throw new Error("logcat has no BENCH_JSON_CHUNK records"); + return JSON.parse(chunks.join("")); +} + +function parseFailureJson(log: string): unknown | null { + const line = log.split(/\r?\n/).findLast((candidate) => candidate.includes("BENCH_FAILURE_JSON ")); + return line ? JSON.parse(line.slice(line.indexOf("BENCH_FAILURE_JSON ") + "BENCH_FAILURE_JSON ".length)) : null; +} + +async function hash(path: string) { + const bytes = new Uint8Array(await Bun.file(path).arrayBuffer()); + return { + path, + size_bytes: bytes.byteLength, + sha256: new Bun.CryptoHasher("sha256").update(bytes).digest("hex"), + }; +} + +async function logcat() { + return command([ + adb, "-s", serial, "logcat", "-d", "-v", "epoch", + "BenchRunner:I", "lowmemorykiller:I", "ActivityManager:I", "AndroidRuntime:E", "libc:E", "*:S", + ]); +} + +async function waitForReport(functionName: string) { + const started = Date.now(); + let log = ""; + while (Date.now() - started < timeoutSeconds * 1000) { + log = await logcat(); + if (log.includes("BENCH_JSON_END") || log.includes("BENCH_JSON ") || log.includes("BENCH_FAILURE_JSON ")) return { log, functionName }; + await Bun.sleep(2000); + } + return { log, functionName }; +} + +async function deviceIdentity() { + const properties = [ + ["manufacturer", "ro.product.manufacturer"], + ["model", "ro.product.model"], + ["os_version", "ro.build.version.release"], + ["abi", "ro.product.cpu.abi"], + ["abilist", "ro.product.cpu.abilist"], + ["abilist64", "ro.product.cpu.abilist64"], + ["zygote", "ro.zygote"], + ] as const; + return Object.fromEntries(await Promise.all(properties.map(async ([key, property]) => [ + key, (await command([adb, "-s", serial, "shell", "getprop", property])).trim(), + ]))); +} + +async function main() { + if (!Number.isInteger(samples) || samples <= 0) throw new Error("TACEO_SAMPLES must be positive"); + await mkdir(outputRoot, { recursive: true }); + const identity = await deviceIdentity(); + const apkMeta = await hash(apk); + const libraryPaths = [ + resolve(repoRoot, "benchmarks/v1/circom/taceo-mobile/target/armv7-linux-androideabi/release/libzk_mobile_bench.so"), + resolve(repoRoot, "benchmarks/v1/circom/taceo-mobile/target/aarch64-linux-android/release/libzk_mobile_bench.so"), + ]; + const libraryMeta = []; + for (const path of libraryPaths) { + if (await Bun.file(path).exists()) libraryMeta.push(await hash(path)); + } + await Bun.write(resolve(outputRoot, "device.json"), `${JSON.stringify({ captured_at_utc: new Date().toISOString(), serial, ...identity }, null, 2)}\n`); + + for (const [circuit, mode, functionName, warmup] of functions.filter(([circuit, mode]) => + !only || only.includes(`${circuit}__${mode}`), + )) { + const id = `${circuit}__${mode}`; + const dir = resolve(outputRoot, id); + await mkdir(dir, { recursive: true }); + await command([adb, "-s", serial, "uninstall", packageId], true); + await command([adb, "-s", serial, "install", "-r", "-t", apk]); + await command([adb, "-s", serial, "logcat", "-c"]); + await command([adb, "-s", serial, "shell", "am", "force-stop", packageId], true); + await command([ + adb, "-s", serial, "shell", "am", "start", "-W", "-n", `${packageId}/${activityClass}`, + "--es", "bench_function", functionName, + "--ei", "bench_iterations", String(samples), + "--ei", "bench_warmup", String(warmup), + "--el", "bench_timeout_secs", String(timeoutSeconds), + "--el", "bench_heartbeat_interval_secs", "10", + ]); + const result = await waitForReport(functionName); + await Bun.write(resolve(dir, "raw-logcat.txt"), result.log); + const parsed = result.log.includes("BENCH_JSON_END") || result.log.includes("BENCH_JSON ") + ? parseBenchJson(result.log) + : null; + const failure = parsed === null ? parseFailureJson(result.log) : null; + const payload = { + schema_version: "provekit.taceo-oprf-e15.v1", + created_at_utc: new Date().toISOString(), + target: "motorola_e15", + serial, + circuit, + mode, + function: functionName, + contract: { warmup, measured_samples: samples }, + source: { + circom_helpers_main: "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + circom_witness_rs_branch: "codex/remove-cxx-bridge-and-grep", + circom_witness_rs_commit: "e11206a9f453145dcd6b814523cbfba4f60cf5c6", + circom: "2.2.2", + taceo_groth16: "0.2.1", + taceo_groth16_material: "0.4.2", + }, + device: identity, + artifacts: { apk: apkMeta, native_libraries: libraryMeta }, + status: parsed ? "ok" : failure ? "runtime_failed" : "timed_out", + report: parsed, + failure, + raw_logcat: "raw-logcat.txt", + }; + await Bun.write(resolve(dir, "evidence.json"), `${JSON.stringify(payload, null, 2)}\n`); + if (!parsed) throw new Error(`${id} did not produce a valid report; see ${dir}/raw-logcat.txt`); + const report = parsed as { samples?: Array> }; + if (!Array.isArray(report.samples) || report.samples.length !== samples) { + throw new Error(`${id} produced ${report.samples?.length ?? 0} measured samples, expected ${samples}`); + } + console.log(`${id}: ${resolve(dir, "evidence.json")}`); + } +} + +await main(); diff --git a/benchmarks/v1/scripts/run-mac-input-to-proof.ts b/benchmarks/v1/scripts/run-mac-input-to-proof.ts new file mode 100644 index 000000000..50a5ba6eb --- /dev/null +++ b/benchmarks/v1/scripts/run-mac-input-to-proof.ts @@ -0,0 +1,153 @@ +import { mkdir } from "node:fs/promises"; +import { dirname, resolve } from "node:path"; +import { + PROFILES, STACKS, TIMING_MODES, seriesId, + type Profile, type Stack, type TimingMode, +} from "../input-to-proof-data/schema"; + +const benchmarkRoot = resolve(import.meta.dir, ".."); +const executionPolicy = process.env.INPUT_TO_PROOF_EXECUTION_POLICY === "singlethread" + ? "singlethread" + : "multithread"; +const outputRoot = resolve( + process.env.INPUT_TO_PROOF_OUTPUT_ROOT ?? + resolve(benchmarkRoot, executionPolicy === "multithread" + ? "../../target/v1-benchmarks/input-to-proof/mac-chrome-multithread" + : "../../target/v1-benchmarks/input-to-proof/mac-chrome"), +); +const campaignId = process.env.INPUT_TO_PROOF_CAMPAIGN_ID ?? + (executionPolicy === "multithread" + ? "input-to-proof-v1-mac-multithread-16-20260812" + : "input-to-proof-v1-20260807"); +const force = process.argv.includes("--force"); +const only = process.env.INPUT_TO_PROOF_SERIES; + +async function checked(args: string[]) { + const child = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), new Response(child.stderr).text(), child.exited, + ]); + if (exitCode !== 0) throw new Error(`${args.join(" ")} failed: ${stderr}`); + return stdout.trim(); +} + +const chrome = process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; +const hostEnvironment = { + device_model: "MacBook Pro (Apple M4 Max)", + os_version: `${await checked(["sw_vers", "-productVersion"])} (${await checked(["sw_vers", "-buildVersion"])})`, + abi: await checked(["uname", "-m"]), + browser: await checked([chrome, "--version"]), +}; + +const workload: Record> = { + passport_complete_age_check: { + provekit_v1: "passport_complete_age_check", + noir_barretenberg: "passport_complete_age_check", + circom_groth16: "passport", + }, + passport_p1: { + provekit_v1: "passport_p1", + noir_barretenberg: "passport_p1", + circom_groth16: "passport", + }, + oprf_o2: { + provekit_v1: "oprf_taceo", + noir_barretenberg: "oprf_world_id_nullifier", + circom_groth16: "oprf", + }, + webauthn_closest_analogue: { + provekit_v1: "webauthn_assertion", + noir_barretenberg: "webauthn_assertion", + circom_groth16: "webauthn", + }, +}; + +function command(stack: Stack): { cwd: string; args: string[] } { + if (stack === "provekit_v1") { + return { cwd: resolve(benchmarkRoot, "wasm"), args: ["bun", "run", "scripts/smoke.ts"] }; + } + if (stack === "noir_barretenberg") { + return { cwd: resolve(benchmarkRoot, "barretenberg"), args: ["bun", "run", "web/smoke.ts"] }; + } + return { cwd: resolve(benchmarkRoot, "circom/web"), args: ["bun", "run", "smoke.ts"] }; +} + +async function runOnce(profile: Profile, stack: Stack, mode: TimingMode) { + const spec = command(stack); + const env: Record = { + ...Object.fromEntries(Object.entries(process.env).filter((e): e is [string, string] => e[1] !== undefined)), + MOBENCH_WORKLOAD: workload[profile][stack], + MOBENCH_WARMUP: mode === "warm_reuse" ? "1" : "0", + MOBENCH_ITERATIONS: mode === "warm_reuse" ? "5" : "1", + MOBENCH_TIMING_MODE: mode, + MOBENCH_SNARKJS_SINGLE_THREAD: executionPolicy === "singlethread" ? "1" : "0", + // The canonical campaign is fixed at 16 workers. An explicit single-thread + // policy remains available for historical diagnostics only. + MOBENCH_SNARKJS_THREADS: process.env.MOBENCH_SNARKJS_THREADS ?? (executionPolicy === "multithread" ? "16" : "1"), + MOBENCH_WASM_THREAD_MODE: executionPolicy, + MOBENCH_WASM_THREADS: process.env.MOBENCH_WASM_THREADS ?? (executionPolicy === "multithread" ? "16" : "single"), + MOBENCH_BARRETENBERG_THREAD_MODE: executionPolicy, + MOBENCH_BB_THREADS: executionPolicy === "multithread" ? "32" : "1", + MOBENCH_TIMEOUT_MS: "3600000", + }; + if (stack === "circom_groth16" && profile === "passport_p1") { + env.CIRCOM_WEB_DIST = resolve( + benchmarkRoot, + "../../target/v1-benchmarks/circom-browser-p1/dist", + ); + } + const child = Bun.spawn(spec.args, { cwd: spec.cwd, env, stdout: "pipe", stderr: "pipe" }); + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + if (exitCode !== 0) throw new Error(`${spec.args.join(" ")} failed (${exitCode})\n${stderr}\n${stdout}`); + return { report: JSON.parse(stdout), stderr }; +} + +await mkdir(outputRoot, { recursive: true }); +for (const profile of PROFILES) { + for (const stack of STACKS) { + for (const mode of TIMING_MODES) { + const id = seriesId(profile, "mac_chrome", stack, mode); + if (only && id !== only) continue; + const output = resolve(outputRoot, `${id}.json`); + if (!force && await Bun.file(output).exists()) { + const existing = await Bun.file(output).json().catch(() => null) as { campaign_id?: string; execution_policy?: string } | null; + if (existing?.campaign_id === campaignId && existing.execution_policy === executionPolicy) { + console.error(`[skip] ${id}`); + continue; + } + console.error(`[rerun] ${id}: existing evidence has a different campaign/policy`); + } + console.error(`[run] ${id}`); + const attempts = []; + const count = mode === "cold_local" ? 6 : 1; + for (let index = 0; index < count; index += 1) { + console.error(` attempt ${index + 1}/${count}`); + const result = await runOnce(profile, stack, mode); + attempts.push({ + attempt_index: index, + warmup: mode === "cold_local" ? index === 0 : null, + ...result, + }); + } + const series = { + schema_version: 1, + campaign_id: campaignId, + series_id: id, + semantic_profile: profile, + target: "mac_chrome", + stack, + timing_mode: mode, + execution_policy: executionPolicy, + environment: hostEnvironment, + created_at: new Date().toISOString(), + attempts, + }; + await mkdir(dirname(output), { recursive: true }); + await Bun.write(output, `${JSON.stringify(series, null, 2)}\n`); + } + } +} diff --git a/benchmarks/v1/scripts/run-reproducibility.sh b/benchmarks/v1/scripts/run-reproducibility.sh new file mode 100755 index 000000000..a4aa2bb28 --- /dev/null +++ b/benchmarks/v1/scripts/run-reproducibility.sh @@ -0,0 +1,422 @@ +#!/usr/bin/env bash + +set -euo pipefail + +readonly WARMUP=1 +readonly SAMPLES=5 + +usage() { + cat <<'EOF' +usage: run-reproducibility.sh [--stage] STAGE [options] + +Stages: + bootstrap Verify locks, fetch pinned sources, and install pinned tools. + prepare Build circuits/adapters and freeze an artifact hash manifest. + smoke Require valid-proof acceptance and tampered-proof rejection. + measure Run Mac Chrome, physical E15, and BrowserStack iPhone lanes. + export Export raw evidence to the canonical sample-level CSV. + all Run bootstrap, prepare, smoke, measure, then export. + +Options: + --campaign ID Stable output directory name. + --dry-run Print/log the complete non-secret command plan. + --confirm-paid-browserstack Explicitly authorize paid iPhone sessions. + -h, --help Show this help. + +Required environment for real device stages: + V1_E15_MEASURE_SCRIPT Optional physical-E15 ProveKit adapter override. + V1_IOS_PREBUILT_MANIFEST Immutable iPhone Mobench manifest. + V1_E15_NATIVE_BACKEND_MANIFEST + Successful E15 Noir/Circom raw-evidence manifest. + V1_E15_NATIVE_BACKEND_ATTEMPTS_JSON + Normalized successful E15 Noir/Circom rows. + V1_E15_GAPS_JSON E15 Noir/Circom gaps (defaults to campaign e15-native-gaps.json). + V1_IOS_DEVICE Mobench device label (defaults to iPhone SE 2022-15). + V1_IOS_OS_VERSION Exact measured iOS version (defaults to iOS 15.4). + V1_E15_CIRCOM_EVIDENCE Retained E15 Arkworks build/qualification evidence. + V1_E15_NOIR_EVIDENCE Retained beta.19 Passport witness-failure evidence. + ANDROID_SERIAL Optional adb serial (required if >1 device). + +The publication export reads the committed, hash-locked input-to-proof evidence +for the selected campaign targets and does not accept browser or native timings +from another campaign implicitly. + +BrowserStack credentials must be exported as BROWSERSTACK_USERNAME and +BROWSERSTACK_ACCESS_KEY. They are never accepted as arguments or written to +the command log. +EOF +} + +stage="" +campaign="" +dry_run=0 +confirm_paid=0 +while (($#)); do + case "$1" in + --stage) stage="${2:?missing --stage value}"; shift 2 ;; + bootstrap | prepare | smoke | measure | export | all) + [[ -z "${stage}" ]] || { echo "error: stage specified twice" >&2; exit 2; } + stage="$1"; shift ;; + --campaign) campaign="${2:?missing --campaign value}"; shift 2 ;; + --dry-run) dry_run=1; shift ;; + --confirm-paid-browserstack) confirm_paid=1; shift ;; + -h | --help) usage; exit 0 ;; + *) echo "error: unknown argument: $1" >&2; usage >&2; exit 2 ;; + esac +done +case "${stage}" in + bootstrap | prepare | smoke | measure | export | all) ;; + *) echo "error: choose bootstrap, prepare, smoke, measure, export, or all" >&2; exit 2 ;; +esac +campaign="${campaign:-$(date -u '+%Y%m%dT%H%M%SZ')}" +[[ "${campaign}" =~ ^[A-Za-z0-9._-]+$ ]] || { + echo "error: campaign may contain only letters, digits, dot, underscore, and dash" >&2 + exit 2 +} + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +export PATH="${repo_root}/target/v1-benchmarks/toolchains/mobench/bin:${PATH}" +campaign_root="${V1_CAMPAIGN_ROOT:-${repo_root}/target/v1-benchmarks/reproduction/${campaign}}" +command_log="${campaign_root}/commands.log" +mkdir -p "${campaign_root}" +if [[ ! -e "${command_log}" ]]; then + { + printf '# ProveKit V1 reproducibility command log\n' + printf '# campaign=%s\n' "${campaign}" + printf '# source_sha=%s\n' "$(git -C "${repo_root}" rev-parse HEAD)" + printf '# sampling=warmup:%s,measured:%s,sequential:true\n' "${WARMUP}" "${SAMPLES}" + } >"${command_log}" +fi + +log_command() { + local cwd="$1" + shift + { + printf 'cd %q &&' "${cwd}" + printf ' %q' "$@" + printf '\n' + } | tee -a "${command_log}" +} + +run_command() { + local cwd="$1" + shift + log_command "${cwd}" "$@" + ((dry_run)) || (cd "${cwd}" && "$@") +} + +require_file() { + local path="$1" + [[ -f "${path}" ]] || { echo "error: missing ${path}" >&2; exit 1; } +} + +verify_locks() { + local locks=( + "${benchmark_root}/toolchains.lock.json" + "${benchmark_root}/sources.lock.json" + "${benchmark_root}/circom/artifacts.lock.json" + "${benchmark_root}/circom/trusted-setup.lock.json" + ) + run_command "${repo_root}" jq -e 'type == "object"' "${locks[@]}" + run_command "${repo_root}" git diff --check -- "${locks[@]}" + run_command "${repo_root}" "${script_dir}/verify-circom-artifacts.sh" +} + +run_bootstrap() { + verify_locks + local bootstrap + for bootstrap in \ + bootstrap-sources.sh bootstrap-nargo.sh bootstrap-circom.sh \ + bootstrap-wasm-bindgen.sh bootstrap-mopro.sh bootstrap-w2c2.sh \ + bootstrap-barretenberg.sh bootstrap-mobench.sh bootstrap-android-java.sh; do + run_command "${repo_root}" "${script_dir}/${bootstrap}" + done + run_command "${benchmark_root}/barretenberg" bun install --frozen-lockfile + run_command "${benchmark_root}/wasm" bun install --frozen-lockfile + run_command "${benchmark_root}/circom/web" bun install --frozen-lockfile +} + +write_artifact_manifest() { + local output="${campaign_root}/artifact-sha256.txt" + local roots=( + "${repo_root}/target/v1-benchmarks" + "${benchmark_root}/circom/fixtures" + ) + if ((dry_run)); then + log_command "${repo_root}" find "${roots[@]}" -type f -exec shasum -a 256 '{}' + + printf '# artifact hashes -> %s (sorted, paths relative to repository)\n' "${output}" | + tee -a "${command_log}" + return + fi + local temporary="${output}.tmp" + ( + cd "${repo_root}" + find "${roots[@]}" \ + -path "${repo_root}/target/v1-benchmarks/reproduction" -prune -o \ + -type f -exec shasum -a 256 '{}' + | + sed "s# ${repo_root}/# #" | + LC_ALL=C sort + ) >"${temporary}" + if [[ -e "${output}" ]]; then + if ! cmp -s "${output}" "${temporary}"; then + echo "error: prepared artifact hashes drifted from ${output}" >&2 + echo " inspect ${temporary} before intentionally starting a new campaign" >&2 + exit 1 + fi + unlink "${temporary}" + else + mv "${temporary}" "${output}" + fi +} + +run_prepare() { + verify_locks + ((dry_run)) || source "${script_dir}/android-env.sh" + run_command "${repo_root}" "${script_dir}/compile-noir-workloads.sh" + run_command "${repo_root}" "${script_dir}/prepare-passport-p1-circom-browser.sh" + run_command "${repo_root}" "${script_dir}/prepare-provekit-beta11-artifacts.sh" + run_command "${repo_root}" env \ + "INPUT_TO_PROOF_EXECUTION_POLICY=multithread" \ + "MOBENCH_WASM_THREADS=16" \ + "MOBENCH_SNARKJS_THREADS=16" \ + "${script_dir}/build-provekit-v1-wasm.sh" + local workload + for workload in webauthn_assertion passport_complete_age_check oprf_taceo; do + run_command "${repo_root}" "${script_dir}/build-provekit-workload.sh" "${workload}" + done + run_command "${benchmark_root}/barretenberg" bun run build:web + run_command "${repo_root}" "${script_dir}/prepare-webauthn-circom.sh" --witness + run_command "${repo_root}" "${script_dir}/prepare-mopro-native-adapters.sh" --build-ios + run_command "${repo_root}" "${script_dir}/prepare-self-passport.sh" + run_command "${repo_root}" "${script_dir}/generate-self-passport-witnesses.sh" + local circuit + for circuit in register_sha256_sha256_sha256_rsa_65537_4096 vc_and_disclose; do + run_command "${repo_root}" "${script_dir}/prepare-self-groth16.sh" "${circuit}" + run_command "${repo_root}" "${script_dir}/prepare-groth16-mobile-fixture.sh" "${circuit}" + done + run_command "${benchmark_root}/wasm" bun run build + run_command "${benchmark_root}/circom/web" bun run build + run_command "${repo_root}" "${script_dir}/prepare-circom-native-witnesses.sh" + run_command "${repo_root}" env \ + "MOBENCH_CI_PREPARE=1" \ + "PROVEKIT_MOBILE_BENCH_ARTIFACT_DIR=${repo_root}/target/v1-benchmarks/provekit-beta11-artifacts" \ + cargo-mobench build --target ios --release --yes --non-interactive \ + --crate-path "${repo_root}/bench-mobile" \ + --output-dir "${repo_root}/target/v1-benchmarks/provekit-ios" + run_command "${repo_root}" "${script_dir}/prepare-provekit-ios-prebuilt.sh" + run_command "${repo_root}" cargo-mobench build --target ios --release --yes --non-interactive \ + --crate-path "${repo_root}/target/v1-benchmarks/mopro/provekit-v1-mobile-adapters" \ + --output-dir "${repo_root}/target/v1-benchmarks/mopro-noir-ios" + run_command "${repo_root}" "${script_dir}/prepare-mopro-noir-ios-prebuilt.sh" + run_command "${repo_root}" "${script_dir}/prepare-rapidsnark-oprf-ios-prebuilt.sh" + run_command "${repo_root}" \ + "${script_dir}/prepare-rapidsnark-passport-webauthn-ios-prebuilt.sh" + write_artifact_manifest +} + +run_smoke() { + # Each called smoke is responsible for accepting a valid proof and rejecting + # a tampered proof. A non-zero result prevents measurement. + local workload + for workload in webauthn_assertion passport_complete_age_check passport_p1 oprf_world_id_nullifier; do + run_command "${benchmark_root}/barretenberg" env \ + "MOBENCH_WORKLOAD=${workload}" "MOBENCH_WARMUP=0" "MOBENCH_ITERATIONS=1" \ + bun run web/smoke.ts + done + run_command "${benchmark_root}/wasm" bun run smoke + local browser_workload + for browser_workload in passport webauthn oprf; do + run_command "${benchmark_root}/circom/web" env "MOBENCH_WORKLOAD=${browser_workload}" \ + bun run smoke + done + run_command "${repo_root}" "${script_dir}/smoke-arkworks-oprf.sh" + local circuit + for circuit in register_sha256_sha256_sha256_rsa_65537_4096 vc_and_disclose; do + run_command "${repo_root}" "${script_dir}/smoke-self-rapidsnark.sh" "${circuit}" + done +} + +capture_e15_identity() { + local output="${campaign_root}/e15-adb-identity.json" + local adb_command=(adb) + [[ -z "${ANDROID_SERIAL:-}" ]] || adb_command+=(-s "${ANDROID_SERIAL}") + if ((dry_run)); then + run_command "${repo_root}" "${adb_command[@]}" get-state + for prop in ro.product.manufacturer ro.product.model ro.build.version.release \ + ro.product.cpu.abilist ro.product.cpu.abi ro.product.cpu.abilist32 \ + ro.product.cpu.abilist64 ro.zygote; do + run_command "${repo_root}" "${adb_command[@]}" shell getprop "${prop}" + done + printf '# E15 identity JSON -> %s\n' "${output}" | tee -a "${command_log}" + return + fi + "${adb_command[@]}" get-state >/dev/null + local manufacturer model os abilist abi abilist32 abilist64 zygote + manufacturer="$("${adb_command[@]}" shell getprop ro.product.manufacturer | tr -d '\r')" + model="$("${adb_command[@]}" shell getprop ro.product.model | tr -d '\r')" + os="$("${adb_command[@]}" shell getprop ro.build.version.release | tr -d '\r')" + abilist="$("${adb_command[@]}" shell getprop ro.product.cpu.abilist | tr -d '\r')" + abi="$("${adb_command[@]}" shell getprop ro.product.cpu.abi | tr -d '\r')" + abilist32="$("${adb_command[@]}" shell getprop ro.product.cpu.abilist32 | tr -d '\r')" + abilist64="$("${adb_command[@]}" shell getprop ro.product.cpu.abilist64 | tr -d '\r')" + zygote="$("${adb_command[@]}" shell getprop ro.zygote | tr -d '\r')" + jq -n --arg manufacturer "${manufacturer}" --arg model "${model}" --arg os "${os}" \ + --arg abilist "${abilist}" --arg abi "${abi}" --arg abilist32 "${abilist32}" \ + --arg abilist64 "${abilist64}" --arg zygote "${zygote}" \ + '{manufacturer:$manufacturer,model:$model,os:$os,abi:$abi,abilist:$abilist, + abilist32:$abilist32,abilist64:$abilist64,zygote:$zygote}' >"${output}.tmp" + mv "${output}.tmp" "${output}" +} + +run_mac_chrome() { + run_command "${repo_root}" env \ + "INPUT_TO_PROOF_EXECUTION_POLICY=multithread" \ + "MOBENCH_WASM_THREADS=16" \ + "MOBENCH_SNARKJS_THREADS=16" \ + "INPUT_TO_PROOF_CAMPAIGN_ID=input-to-proof-v1-mac-multithread-16-20260812" \ + "INPUT_TO_PROOF_OUTPUT_ROOT=${campaign_root}/mac-chrome" \ + bun run "${script_dir}/run-mac-input-to-proof.ts" +} + +run_e15() { + ((dry_run)) || source "${script_dir}/android-env.sh" + capture_e15_identity + local measure_script="${V1_E15_MEASURE_SCRIPT:-${script_dir}/run-e15-provekit.ts}" + local normalizer="${benchmark_root}/input-to-proof-data/native/normalize-e15-provekit.ts" + local native_normalizer="${benchmark_root}/input-to-proof-data/native/normalize-e15-native-backend.ts" + local gap_generator="${benchmark_root}/input-to-proof-data/native/generate-e15-native-gaps.ts" + local output="${campaign_root}/e15" + require_file "${measure_script}" + require_file "${normalizer}" + require_file "${gap_generator}" + run_command "${repo_root}" "${measure_script}" \ + --campaign "${campaign}" --output "${output}" \ + --warmup "${WARMUP}" --samples "${SAMPLES}" --sequential + run_command "${repo_root}" bun "${normalizer}" \ + "${output}/results.json" "${output}/attempts.json" + local native_manifest="${V1_E15_NATIVE_BACKEND_MANIFEST:-}" + if [[ -n "${native_manifest}" ]]; then + require_file "${native_normalizer}" + require_file "${native_manifest}" + run_command "${repo_root}" bun "${native_normalizer}" \ + "${native_manifest}" "${campaign_root}/e15-native-backends.json" + else + local circom_evidence="${V1_E15_CIRCOM_EVIDENCE:-${campaign_root}/e15-circom-arkworks-armv7-build.log}" + local noir_evidence="${V1_E15_NOIR_EVIDENCE:-${repo_root}/target/v1-benchmarks/reproduction/mac-chrome-20260729/raw/barretenberg-passport-build.log}" + run_command "${repo_root}" env "CAMPAIGN_ID=${campaign}" bun "${gap_generator}" \ + "${campaign_root}/e15-adb-identity.json" "${campaign_root}/e15-native-gaps.json" \ + "$(git -C "${repo_root}" rev-parse HEAD)" "${circom_evidence}" "${noir_evidence}" + fi +} + +require_paid_access() { + ((dry_run)) && return + ((confirm_paid)) || { + echo "error: iPhone measurement requires --confirm-paid-browserstack" >&2 + exit 1 + } + [[ -n "${BROWSERSTACK_USERNAME:-}" && -n "${BROWSERSTACK_ACCESS_KEY:-}" ]] || { + echo "error: export BrowserStack credentials locally" >&2 + exit 1 + } + run_command "${repo_root}" "${script_dir}/preflight-browserstack-products.sh" +} + +run_iphone_manifest() { + local manifest="$1" + local iterations="$2" + local warmup="$3" + local fetch_output="$4" + local result_output="$5" + require_file "${manifest}" + local source_sha function_list + source_sha="$(jq -er '.source_sha' "${manifest}")" + function_list="$(jq -c '[.entries[].function]' "${manifest}")" + jq -e --argjson warmup "${warmup}" --argjson iterations "${iterations}" \ + 'all(.entries[]; .warmup == $warmup and .iterations == $iterations)' "${manifest}" >/dev/null + run_command "${repo_root}" cargo-mobench ci run-prebuilt \ + --manifest "${manifest}" --expected-source-sha "${source_sha}" \ + --expected-platform ios --expected-functions "${function_list}" \ + --expected-iterations "${iterations}" --expected-warmup "${warmup}" \ + --devices "iPhone SE 2022-15" --fetch \ + --fetch-output-dir "${fetch_output}" \ + --output-dir "${result_output}" \ + --max-completion-timeout-secs 7200 +} + +run_iphone() { + require_paid_access + local warm_manifest="${V1_IOS_WARM_PREBUILT_MANIFEST:-}" + local cold_manifest="${V1_IOS_COLD_PREBUILT_MANIFEST:-}" + if [[ -n "${warm_manifest}" || -n "${cold_manifest}" ]]; then + [[ -n "${warm_manifest}" && -n "${cold_manifest}" ]] || { + echo "error: set both V1_IOS_WARM_PREBUILT_MANIFEST and V1_IOS_COLD_PREBUILT_MANIFEST" >&2 + exit 1 + } + run_iphone_manifest "${warm_manifest}" 5 1 \ + "${campaign_root}/iphone/warm/browserstack" \ + "${campaign_root}/iphone/warm/results" + local invocation + for invocation in 0 1 2 3 4 5; do + run_iphone_manifest "${cold_manifest}" 1 0 \ + "${campaign_root}/iphone/cold/run-${invocation}/browserstack" \ + "${campaign_root}/iphone/cold/run-${invocation}/results" + done + return + fi + + local manifest="${V1_IOS_PREBUILT_MANIFEST:-}" + if [[ -z "${manifest}" ]]; then + ((dry_run)) && { + printf '# required: V1_IOS_PREBUILT_MANIFEST=/absolute/path/to/manifest.json\n' | + tee -a "${command_log}" + return + } + echo "error: set V1_IOS_PREBUILT_MANIFEST" >&2 + exit 1 + fi + run_iphone_manifest "${manifest}" "${SAMPLES}" "${WARMUP}" \ + "${campaign_root}/browserstack-ios" "${campaign_root}/native-ios" +} + +run_measure() { + run_mac_chrome + run_e15 + run_iphone +} + +run_export() { + local exporter="${benchmark_root}/input-to-proof-data/export.ts" + require_file "${exporter}" + run_command "${repo_root}" env \ + "INPUT_TO_PROOF_EXECUTION_POLICY=multithread" \ + "INPUT_TO_PROOF_MAC_CAMPAIGN_ID=input-to-proof-v1-mac-multithread-16-20260812" \ + "INPUT_TO_PROOF_RAW_ROOT=${campaign_root}/mac-chrome" \ + "INPUT_TO_PROOF_IPHONE_RAW_ROOT=${campaign_root}/iphone/publication" \ + "INPUT_TO_PROOF_E15_RAW_ROOT=${campaign_root}/e15" \ + "INPUT_TO_PROOF_EXPORT_TARGETS=${V1_EXPORT_TARGETS:-mac_chrome,iphone_se_2022,motorola_e15}" \ + bun "${exporter}" +} + +run_stage() { + case "$1" in + bootstrap) run_bootstrap ;; + prepare) run_prepare ;; + smoke) run_smoke ;; + measure) run_measure ;; + export) run_export ;; + esac +} + +if [[ "${stage}" == all ]]; then + for selected in bootstrap prepare smoke measure export; do + run_stage "${selected}" + done +else + run_stage "${stage}" +fi + +printf '# finished_at=%s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" >>"${command_log}" +echo "Command log: ${command_log}" diff --git a/benchmarks/v1/scripts/run-reproducibility.test.sh b/benchmarks/v1/scripts/run-reproducibility.test.sh new file mode 100755 index 000000000..67123048d --- /dev/null +++ b/benchmarks/v1/scripts/run-reproducibility.test.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +runner="${script_dir}/run-reproducibility.sh" +temporary="$(mktemp -d)" +trap 'rm -rf "${temporary}"' EXIT + +bash -n "${runner}" + +for stage in bootstrap prepare smoke measure export all; do + output="${temporary}/${stage}.out" + V1_CAMPAIGN_ROOT="${temporary}/${stage}" \ + "${runner}" "${stage}" --campaign test --dry-run >"${output}" + grep -q 'Command log:' "${output}" + test -s "${temporary}/${stage}/commands.log" +done + +measure_log="${temporary}/measure/commands.log" +grep -q 'run-mac-input-to-proof.ts' "${measure_log}" +grep -q 'INPUT_TO_PROOF_EXECUTION_POLICY=multithread' "${measure_log}" +grep -q 'MOBENCH_WASM_THREADS=16' "${measure_log}" +grep -q 'MOBENCH_SNARKJS_THREADS=16' "${measure_log}" +grep -q 'adb.*ro.product.cpu.abilist' "${measure_log}" +grep -q 'run-e15-provekit.ts' "${measure_log}" +grep -q 'normalize-e15-provekit.ts' "${measure_log}" +grep -q 'V1_IOS_PREBUILT_MANIFEST' "${measure_log}" +if grep -q 'BROWSERSTACK_ACCESS_KEY' "${measure_log}"; then + echo "error: credential name leaked to command log" >&2 + exit 1 +fi + +grep -q 'input-to-proof-data/export.ts' "${temporary}/export/commands.log" +grep -q 'INPUT_TO_PROOF_EXPORT_TARGETS=mac_chrome\\,iphone_se_2022\\,motorola_e15' "${temporary}/export/commands.log" +grep -q 'INPUT_TO_PROOF_E15_RAW_ROOT=' "${temporary}/export/commands.log" +if grep -q 'BROWSERSTACK_ACCESS_KEY' "${temporary}/export/commands.log"; then + echo "error: credential name leaked to export command log" >&2 + exit 1 +fi + +if V1_CAMPAIGN_ROOT="${temporary}/bad" \ + "${runner}" obsolete --campaign test --dry-run >/dev/null 2>&1; then + echo "error: obsolete stage unexpectedly accepted" >&2 + exit 1 +fi + +echo "run-reproducibility tests passed" diff --git a/benchmarks/v1/scripts/serve-webauthn-zkey.ts b/benchmarks/v1/scripts/serve-webauthn-zkey.ts new file mode 100644 index 000000000..8b3b4b936 --- /dev/null +++ b/benchmarks/v1/scripts/serve-webauthn-zkey.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env bun + +import { resolve } from "node:path"; + +const repoRoot = resolve(import.meta.dir, "../../.."); +const path = resolve( + process.env.V1_WEBAUTHN_ZKEY ?? + resolve( + repoRoot, + "target/v1-benchmarks/groth16/webauthn/webauthn_default_benchmark.zkey", + ), +); +const artifact = Bun.file(path); +if (!(await artifact.exists())) throw new Error(`missing WebAuthn zkey: ${path}`); +const port = Number.parseInt(process.env.PORT ?? "18080", 10); + +Bun.serve({ + port, + fetch(request) { + return new Response(request.method === "HEAD" ? null : artifact, { + headers: { + "content-type": "application/octet-stream", + "content-length": String(artifact.size), + "cache-control": "public, max-age=3600", + }, + }); + }, +}); + +console.log(`Serving ${artifact.size} bytes on http://127.0.0.1:${port}`); +await new Promise(() => {}); diff --git a/benchmarks/v1/scripts/set-passport-p1-barrett.ts b/benchmarks/v1/scripts/set-passport-p1-barrett.ts new file mode 100644 index 000000000..68064fc1a --- /dev/null +++ b/benchmarks/v1/scripts/set-passport-p1-barrett.ts @@ -0,0 +1,45 @@ +#!/usr/bin/env bun + +function readArray(toml: string, name: string): number[] { + const match = toml.match(new RegExp(`^${name} = (\\[[^\\n]+\\])$`, "m")); + if (!match) throw new Error(`missing ${name}`); + return JSON.parse(match[1]) as number[]; +} + +function bytesToBigInt(bytes: number[]) { + return bytes.reduce((value, byte) => (value << 8n) | BigInt(byte), 0n); +} + +function bigIntToBytes(value: bigint, length: number) { + const bytes = Array(length).fill(0); + let remaining = value; + for (let index = length - 1; index >= 0; index -= 1) { + bytes[index] = Number(remaining & 0xffn); + remaining >>= 8n; + } + if (remaining !== 0n) throw new Error("Barrett parameter does not fit"); + return bytes; +} + +export function setPassportP1Barrett(toml: string, overflowBits: bigint) { + const rawDsc = readArray(toml, "raw_dsc"); + const offsetMatch = toml.match(/^dsc_pubkey_offset = (\d+)$/m); + if (!offsetMatch) throw new Error("missing dsc_pubkey_offset"); + const modulusBytes = rawDsc.slice(Number(offsetMatch[1]), Number(offsetMatch[1]) + 512); + if (modulusBytes.length !== 512) throw new Error("invalid DSC modulus slice"); + const modulus = bytesToBigInt(modulusBytes); + const modulusBits = BigInt(modulus.toString(2).length); + const parameter = (1n << (2n * modulusBits + overflowBits)) / modulus; + return toml.replace( + /^dsc_barrett_mu = \[[^\n]+\]$/m, + `dsc_barrett_mu = ${JSON.stringify(bigIntToBytes(parameter, modulusBytes.length + 1))}`, + ); +} + +if (import.meta.main) { + const path = Bun.argv[2]; + const bits = BigInt(Bun.argv[3] ?? "4"); + if (!path) throw new Error("usage: set-passport-p1-barrett.ts [overflow-bits]"); + const result = setPassportP1Barrett(await Bun.file(path).text(), bits); + await Bun.write(path, result); +} diff --git a/benchmarks/v1/scripts/slice-ios-prebuilt-manifest.ts b/benchmarks/v1/scripts/slice-ios-prebuilt-manifest.ts new file mode 100755 index 000000000..767d7f215 --- /dev/null +++ b/benchmarks/v1/scripts/slice-ios-prebuilt-manifest.ts @@ -0,0 +1,91 @@ +#!/usr/bin/env bun + +import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises"; +import { basename, dirname, isAbsolute, join, resolve } from "node:path"; + +type Artifact = { + kind: string; + path: string; + size: number; + sha256: string; +}; + +type Entry = { + function: string; + iterations: number; + warmup: number; + completion_timeout_secs: number; + artifacts: Artifact[]; +}; + +type Manifest = { + schema: string; + source_sha: string; + platform: string; + build_profile: string; + mobench_version: string; + abi: unknown; + entries: Entry[]; +}; + +const [sourceArg, outputArg, indicesArg] = process.argv.slice(2); +if (!sourceArg || !outputArg || !indicesArg) { + throw new Error( + "usage: bun slice-ios-prebuilt-manifest.ts ", + ); +} + +const sourceManifest = resolve(sourceArg); +const sourceRoot = dirname(sourceManifest); +const outputRoot = resolve(outputArg); +const indices = indicesArg.split(",").map((value) => { + const index = Number(value); + if (!Number.isInteger(index) || index < 0) { + throw new Error(`invalid manifest index: ${value}`); + } + return index; +}); +if (new Set(indices).size !== indices.length) { + throw new Error("manifest indices must be unique"); +} + +const manifest = JSON.parse( + await readFile(sourceManifest, "utf8"), +) as Manifest; +if (manifest.schema !== "mobench.prebuilt.v1" || manifest.platform !== "ios") { + throw new Error("source must be a mobench.prebuilt.v1 iOS manifest"); +} + +const selections = indices.map((index) => { + const entry = manifest.entries[index]; + if (!entry) throw new Error(`manifest has no entry at index ${index}`); + return { entry, sourceIndex: index }; +}); + +await mkdir(outputRoot, { recursive: true }); +const entries = []; +for (const [outputIndex, selection] of selections.entries()) { + const artifacts = []; + for (const artifact of selection.entry.artifacts) { + if (isAbsolute(artifact.path) || artifact.path.split("/").includes("..")) { + throw new Error(`unsafe artifact path: ${artifact.path}`); + } + const source = join(sourceRoot, artifact.path); + const outputPath = join( + "entries", + String(outputIndex).padStart(4, "0"), + basename(artifact.path), + ); + const destination = join(outputRoot, outputPath); + await mkdir(dirname(destination), { recursive: true }); + await copyFile(source, destination); + artifacts.push({ ...artifact, path: outputPath }); + } + entries.push({ ...selection.entry, artifacts }); +} + +await writeFile( + join(outputRoot, "manifest.json"), + `${JSON.stringify({ ...manifest, entries }, null, 2)}\n`, +); +console.log(join(outputRoot, "manifest.json")); diff --git a/benchmarks/v1/scripts/slice-ios-prebuilt.ts b/benchmarks/v1/scripts/slice-ios-prebuilt.ts new file mode 100644 index 000000000..3427f88ca --- /dev/null +++ b/benchmarks/v1/scripts/slice-ios-prebuilt.ts @@ -0,0 +1,41 @@ +import { constants, copyFile, mkdir } from "node:fs/promises"; +import { basename, dirname, resolve } from "node:path"; + +const [inputArgument, startArgument, outputArgument] = process.argv.slice(2); +if (!inputArgument || !startArgument || !outputArgument) { + throw new Error("usage: bun slice-ios-prebuilt.ts INPUT_MANIFEST START_INDEX OUTPUT_ROOT"); +} + +const inputManifest = resolve(inputArgument); +const inputRoot = dirname(inputManifest); +const outputRoot = resolve(outputArgument); +const startIndex = Number(startArgument); +if (!Number.isInteger(startIndex) || startIndex < 0) throw new Error("START_INDEX must be a non-negative integer"); +if (!outputRoot.includes("/target/v1-benchmarks/") || !outputRoot.endsWith("-ios-prebuilt")) { + throw new Error("OUTPUT_ROOT must be a target/v1-benchmarks/*-ios-prebuilt directory"); +} +if (await Bun.file(resolve(outputRoot, "manifest.json")).exists()) { + throw new Error(`refusing to replace existing sliced manifest at ${outputRoot}`); +} + +const manifest = await Bun.file(inputManifest).json(); +if (manifest.schema !== "mobench.prebuilt.v1" || manifest.platform !== "ios") { + throw new Error(`${inputManifest} is not an iOS Mobench prebuilt manifest`); +} +const selected = manifest.entries.slice(startIndex); +if (!selected.length) throw new Error(`slice starting at ${startIndex} is empty`); + +for (let index = 0; index < selected.length; index++) { + const entry = selected[index]; + const destination = resolve(outputRoot, "entries", String(index).padStart(4, "0")); + await mkdir(destination, { recursive: true }); + for (const artifact of entry.artifacts) { + const source = resolve(inputRoot, artifact.path); + const filename = basename(artifact.path); + await copyFile(source, resolve(destination, filename), constants.COPYFILE_FICLONE); + artifact.path = `entries/${String(index).padStart(4, "0")}/${filename}`; + } +} +manifest.entries = selected; +await Bun.write(resolve(outputRoot, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`); +console.log(`${outputRoot}/manifest.json: ${selected.length} entries from index ${startIndex}`); diff --git a/benchmarks/v1/scripts/smoke-arkworks-oprf.sh b/benchmarks/v1/scripts/smoke-arkworks-oprf.sh new file mode 100755 index 000000000..b8845f09a --- /dev/null +++ b/benchmarks/v1/scripts/smoke-arkworks-oprf.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +world_id="${repo_root}/target/v1-benchmarks/sources/world-id-protocol" + +"${script_dir}/bootstrap-sources.sh" +"${script_dir}/verify-circom-artifacts.sh" + +( + cd "${world_id}" + cargo check -p zk-mobile-bench + cargo test -p zk-mobile-bench \ + tests::test_query_proof_benchmark \ + -- \ + --ignored \ + --exact \ + --nocapture +) + +echo "Arkworks World ID OPRF query proof smoke passed" diff --git a/benchmarks/v1/scripts/smoke-passport-p1-groth16.sh b/benchmarks/v1/scripts/smoke-passport-p1-groth16.sh new file mode 100755 index 000000000..78df359e3 --- /dev/null +++ b/benchmarks/v1/scripts/smoke-passport-p1-groth16.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +groth16_root="${V1_BENCHMARK_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16}/passport_p1" +witness_root="${V1_BENCHMARK_WITNESS_ROOT:-${repo_root}/target/v1-benchmarks/circom-witnesses}/passport_p1" +self_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}/self" +snarkjs="${self_root}/node_modules/snarkjs/build/cli.cjs" + +"${script_dir}/generate-passport-p1-witness.sh" +"${script_dir}/prepare-passport-p1-groth16.sh" + +proof="${groth16_root}/proof.json" +public="${groth16_root}/public.json" +corrupted="${groth16_root}/proof.corrupted.json" +start="$(perl -MTime::HiRes=time -e 'print time')" +NODE_OPTIONS=--max-old-space-size=32768 \ + node "${snarkjs}" groth16 prove "${groth16_root}/passport_p1_final.zkey" \ + "${witness_root}/wasm.wtns" "${proof}" "${public}" +prove_seconds="$(perl -MTime::HiRes=time -e 'printf "%.6f", time - $ARGV[0]' "${start}")" +node "${snarkjs}" groth16 verify "${groth16_root}/verification_key.json" "${public}" "${proof}" +jq '.pi_a[0] = "1"' "${proof}" >"${corrupted}" +if node "${snarkjs}" groth16 verify "${groth16_root}/verification_key.json" "${public}" "${corrupted}" >/dev/null 2>&1; then + echo "error: corrupted P1 proof was accepted" >&2 + exit 1 +fi +jq -n --argjson prove_seconds "${prove_seconds}" \ + --arg proof_sha256 "$(shasum -a 256 "${proof}" | awk '{print $1}')" \ + --arg public_sha256 "$(shasum -a 256 "${public}" | awk '{print $1}')" \ + '{schema_version: 1, verified: true, corrupted_proof_rejected: true, prove_seconds: $prove_seconds, proof_sha256: $proof_sha256, public_sha256: $public_sha256}' \ + >"${groth16_root}/smoke.json" +cat "${groth16_root}/smoke.json" diff --git a/benchmarks/v1/scripts/smoke-self-rapidsnark.sh b/benchmarks/v1/scripts/smoke-self-rapidsnark.sh new file mode 100755 index 000000000..13e5b100a --- /dev/null +++ b/benchmarks/v1/scripts/smoke-self-rapidsnark.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ "$#" -ne 1 ]]; then + echo "usage: $0 " >&2 + exit 1 +fi + +name="$1" +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +rapidsnark="${repo_root}/target/v1-benchmarks/sources/rapidsnark" +groth16_root="${V1_BENCHMARK_GROTH16_ROOT:-${repo_root}/target/v1-benchmarks/groth16}/self/${name}" +witness="${repo_root}/target/v1-benchmarks/circom-witnesses/self/${name}/wasm.wtns" +zkey="${groth16_root}/${name}_0000.zkey" +verification_key="${groth16_root}/verification_key.json" +proof="${groth16_root}/proof.json" +public_inputs="${groth16_root}/public.json" +corrupted_proof="${groth16_root}/proof.corrupted.json" +result="${groth16_root}/rapidsnark-smoke.json" + +case "$(uname -m)-$(uname -s)" in + arm64-Darwin) + prover_package="package_macos_arm64" + ;; + x86_64-Darwin | x86_64-Linux) + prover_package="package" + ;; + aarch64-Linux | arm64-Linux) + prover_package="package_arm64" + ;; + *) + echo "error: unsupported Rapidsnark host $(uname -m)-$(uname -s)" >&2 + exit 1 + ;; +esac + +prover="${rapidsnark}/${prover_package}/bin/prover" +verifier="${rapidsnark}/${prover_package}/bin/verifier" + +for command in jq perl stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +stat_size() { + if [[ "$(uname -s)" == "Darwin" ]]; then + stat -f '%z' "$1" + else + stat -c '%s' "$1" + fi +} + +"${script_dir}/build-rapidsnark-host.sh" +if [[ ! -f "${witness}" ]]; then + "${script_dir}/generate-self-passport-witnesses.sh" +fi +"${script_dir}/prepare-self-groth16.sh" "${name}" + +prover_time="${groth16_root}/prover.time" +verify_time="${groth16_root}/verifier.time" +start="$(perl -MTime::HiRes=time -e 'print time')" +/usr/bin/time -l "${prover}" \ + "${zkey}" \ + "${witness}" \ + "${proof}" \ + "${public_inputs}" \ + 2>"${prover_time}" +prove_seconds="$( + perl -MTime::HiRes=time -e \ + 'printf "%.6f", time - $ARGV[0]' \ + "${start}" +)" + +start="$(perl -MTime::HiRes=time -e 'print time')" +/usr/bin/time -l "${verifier}" \ + "${verification_key}" \ + "${public_inputs}" \ + "${proof}" \ + 2>"${verify_time}" +verify_seconds="$( + perl -MTime::HiRes=time -e \ + 'printf "%.6f", time - $ARGV[0]' \ + "${start}" +)" + +jq '.pi_a[0] = "1"' "${proof}" >"${corrupted_proof}" +if "${verifier}" \ + "${verification_key}" \ + "${public_inputs}" \ + "${corrupted_proof}" >/dev/null 2>&1; then + echo "error: Rapidsnark accepted a corrupted ${name} proof" >&2 + exit 1 +fi + +if [[ "$(uname -s)" == "Darwin" ]]; then + prove_max_rss="$(awk '/maximum resident set size/ { print $1 }' "${prover_time}")" + verify_max_rss="$(awk '/maximum resident set size/ { print $1 }' "${verify_time}")" +else + prove_max_rss=0 + verify_max_rss=0 +fi + +jq -n \ + --arg workload "${name}" \ + --argjson proof_size "$(stat_size "${proof}")" \ + --argjson public_input_size "$(stat_size "${public_inputs}")" \ + --argjson prove_seconds "${prove_seconds}" \ + --argjson verify_seconds "${verify_seconds}" \ + --argjson prove_max_rss_bytes "${prove_max_rss:-0}" \ + --argjson verify_max_rss_bytes "${verify_max_rss:-0}" \ + '{ + schema_version: 1, + workload: $workload, + backend: "rapidsnark-groth16", + proof_size: $proof_size, + public_input_size: $public_input_size, + prove_seconds: $prove_seconds, + verify_seconds: $verify_seconds, + prove_max_rss_bytes: $prove_max_rss_bytes, + verify_max_rss_bytes: $verify_max_rss_bytes, + verified: true, + corrupted_proof_rejected: true + }' >"${result}" + +cat "${result}" diff --git a/benchmarks/v1/scripts/upgrade-passport-barrett-parameters.test.ts b/benchmarks/v1/scripts/upgrade-passport-barrett-parameters.test.ts new file mode 100644 index 000000000..76d16fbaf --- /dev/null +++ b/benchmarks/v1/scripts/upgrade-passport-barrett-parameters.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, test } from "bun:test"; + +import { + barrettParameter, + bytesToBigInt, + upgradePassportBarrettParameters, +} from "./upgrade-passport-barrett-parameters"; + +describe("Passport Barrett parameter migration", () => { + test("uses the six overflow bits required by noir-bignum v0.10.0", () => { + const modulus = [0x80, 0x01]; + const parameter = barrettParameter(modulus); + const expected = (1n << (2n * 16n + 6n)) / bytesToBigInt(modulus); + expect(bytesToBigInt(parameter)).toBe(expected); + expect(parameter).toHaveLength(modulus.length + 1); + }); + + test("upgrades both Passport RSA parameters idempotently", () => { + const source = [ + "dsc_pubkey = [128,1]", + "dsc_barrett_mu = [0,0,0]", + "csc_pubkey = [128,3,5]", + "csc_barrett_mu = [0,0,0,0]", + "", + ].join("\n"); + const upgraded = upgradePassportBarrettParameters(source); + expect(upgraded).not.toBe(source); + expect(upgradePassportBarrettParameters(upgraded)).toBe(upgraded); + }); +}); diff --git a/benchmarks/v1/scripts/upgrade-passport-barrett-parameters.ts b/benchmarks/v1/scripts/upgrade-passport-barrett-parameters.ts new file mode 100644 index 000000000..565d369c2 --- /dev/null +++ b/benchmarks/v1/scripts/upgrade-passport-barrett-parameters.ts @@ -0,0 +1,71 @@ +#!/usr/bin/env bun + +const OVERFLOW_BITS = 6n; + +export function bytesToBigInt(bytes: number[]): bigint { + return bytes.reduce((value, byte) => { + if (!Number.isInteger(byte) || byte < 0 || byte > 255) { + throw new Error(`invalid byte ${byte}`); + } + return (value << 8n) | BigInt(byte); + }, 0n); +} + +export function bigIntToBytes(value: bigint, length: number): number[] { + if (value < 0n) throw new Error("cannot encode a negative integer"); + const bytes = Array(length).fill(0); + let remaining = value; + for (let index = length - 1; index >= 0; index -= 1) { + bytes[index] = Number(remaining & 0xffn); + remaining >>= 8n; + } + if (remaining !== 0n) { + throw new Error(`integer does not fit in ${length} bytes`); + } + return bytes; +} + +export function barrettParameter(modulusBytes: number[]): number[] { + const modulus = bytesToBigInt(modulusBytes); + if (modulus === 0n) throw new Error("modulus must be non-zero"); + const modulusBits = BigInt(modulus.toString(2).length); + const parameter = (1n << (2n * modulusBits + OVERFLOW_BITS)) / modulus; + return bigIntToBytes(parameter, modulusBytes.length + 1); +} + +function readArray(toml: string, name: string): number[] { + const match = toml.match(new RegExp(`^${name} = (\\[[^\\n]+\\])$`, "m")); + if (!match) throw new Error(`missing ${name}`); + const value = JSON.parse(match[1]) as unknown; + if (!Array.isArray(value)) throw new Error(`${name} is not an array`); + return value as number[]; +} + +export function upgradePassportBarrettParameters(toml: string): string { + const pairs = [ + ["dsc_pubkey", "dsc_barrett_mu"], + ["csc_pubkey", "csc_barrett_mu"], + ] as const; + + let result = toml; + for (const [modulusName, parameterName] of pairs) { + const modulus = readArray(result, modulusName); + const parameter = barrettParameter(modulus); + const parameterLine = `${parameterName} = ${JSON.stringify(parameter)}`; + const pattern = new RegExp(`^${parameterName} = \\[[^\\n]+\\]$`, "m"); + if (!pattern.test(result)) throw new Error(`missing ${parameterName}`); + result = result.replace(pattern, parameterLine); + } + return result; +} + +if (import.meta.main) { + const input = Bun.argv[2]; + if (!input) { + throw new Error("usage: upgrade-passport-barrett-parameters.ts "); + } + const original = await Bun.file(input).text(); + const upgraded = upgradePassportBarrettParameters(original); + if (upgraded !== original) await Bun.write(input, upgraded); + console.log(`Validated six-overflow-bit Passport Barrett parameters in ${input}`); +} diff --git a/benchmarks/v1/scripts/verify-circom-artifacts.sh b/benchmarks/v1/scripts/verify-circom-artifacts.sh new file mode 100755 index 000000000..5b78e08c4 --- /dev/null +++ b/benchmarks/v1/scripts/verify-circom-artifacts.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +benchmark_root="$(cd "${script_dir}/.." && pwd)" +repo_root="$(cd "${benchmark_root}/../.." && pwd)" +source_root="${V1_BENCHMARK_SOURCE_ROOT:-${repo_root}/target/v1-benchmarks/sources}" +lock_file="${benchmark_root}/circom/artifacts.lock.json" + +for command in jq stat; do + if ! command -v "${command}" >/dev/null 2>&1; then + echo "error: ${command} is required" >&2 + exit 1 + fi +done + +if command -v sha256sum >/dev/null 2>&1; then + hash_file() { + sha256sum "$1" | awk '{print $1}' + } +elif command -v shasum >/dev/null 2>&1; then + hash_file() { + shasum -a 256 "$1" | awk '{print $1}' + } +else + echo "error: sha256sum or shasum is required" >&2 + exit 1 +fi + +jq -c '.artifacts[]' "${lock_file}" | while IFS= read -r artifact; do + relative_path="$(jq -r '.source' <<<"${artifact}")" + expected_size="$(jq -r '.size' <<<"${artifact}")" + expected_sha="$(jq -r '.sha256' <<<"${artifact}")" + # Upstream source snapshots live below target/v1-benchmarks/sources. The + # TACEO OPRF graph/input bundle is an immutable checked-in campaign asset, + # so its lock entry is rooted at the repository instead. + if [[ "${relative_path}" == benchmarks/v1/* ]]; then + path="${repo_root}/${relative_path}" + else + path="${source_root}/${relative_path}" + fi + + if [[ ! -f "${path}" ]]; then + echo "error: missing pinned Circom artifact ${path}" >&2 + exit 1 + fi + + if [[ "$(uname -s)" == "Darwin" ]]; then + actual_size="$(stat -f '%z' "${path}")" + else + actual_size="$(stat -c '%s' "${path}")" + fi + actual_sha="$(hash_file "${path}")" + + if [[ "${actual_size}" != "${expected_size}" ]]; then + echo "error: ${relative_path} is ${actual_size} bytes, expected ${expected_size}" >&2 + exit 1 + fi + if [[ "${actual_sha}" != "${expected_sha}" ]]; then + echo "error: ${relative_path} has SHA-256 ${actual_sha}, expected ${expected_sha}" >&2 + exit 1 + fi + + echo "verified ${relative_path}" +done diff --git a/benchmarks/v1/sources.lock.json b/benchmarks/v1/sources.lock.json new file mode 100644 index 000000000..c8e5eaffe --- /dev/null +++ b/benchmarks/v1/sources.lock.json @@ -0,0 +1,231 @@ +{ + "schema_version": 1, + "sources": [ + { + "name": "provekit-v1-core", + "url": "https://github.com/worldfnd/provekit.git", + "revision": "9b2a6f37c67691eab4b0cec6c35e35c520e93285", + "license": "MIT OR Apache-2.0", + "sparse_paths": ["provekit", "tooling/provekit-wasm", "tooling/cli"], + "purpose": "Exact ProveKit V1 proving/verifying and fixed-16-worker browser WASM implementation" + }, + { + "name": "self", + "url": "https://github.com/selfxyz/self.git", + "revision": "15b167e3543a9dff1dbb16fcf71a45fe4625cf9e", + "license": "MIT (circuits/LICENSE)", + "sparse_paths": [], + "purpose": "Circom passport registration and disclosure circuits" + }, + { + "name": "world-id-protocol", + "url": "https://github.com/worldcoin/world-id-protocol.git", + "revision": "85aeeef539961cae5a63de794997b507a5975717", + "license": "MIT", + "sparse_paths": [], + "purpose": "Pure WebAuthn Noir source and production OPRF Circom circuits" + }, + { + "name": "webauth-circom", + "url": "https://github.com/privacy-ethereum/webauth-circom.git", + "revision": "0fb5b4aa1398281c2fd3dbe14db147e05b61f201", + "license": "MIT (package.json)", + "sparse_paths": [], + "purpose": "Circom WebAuthn assertion benchmark for native Arkworks and Rapidsnark lanes" + }, + { + "name": "noir-base64", + "url": "https://github.com/noir-lang/noir_base64.git", + "revision": "4200d5ffb1d4416f336c392ed7f3f729facbc2ad", + "tag": "v0.5.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Transitive dependency of the vendored WebAuthn Noir library" + }, + { + "name": "noir-poseidon", + "url": "https://github.com/noir-lang/poseidon.git", + "revision": "00f879180a56720169cff92a56778d40678d8e26", + "tag": "v0.2.6", + "license": "MIT", + "sparse_paths": [], + "purpose": "Transitive dependency of the vendored WebAuthn Noir library" + }, + { + "name": "noir-poseidon-v0.3.0", + "url": "https://github.com/noir-lang/poseidon.git", + "revision": "0880c371e88e583d39515fd3f877538657ac41eb", + "tag": "v0.3.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Mechanical Noir beta.19 compatibility input for the Passport circuit" + }, + { + "name": "noir-bignum-v0.10.0", + "url": "https://github.com/noir-lang/noir-bignum.git", + "revision": "00d4360fbaaae71b1ee7f93f78dfad4eb7e11479", + "tag": "v0.10.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Pinned Passport RSA transitive dependency" + }, + { + "name": "noir-rsa-v0.11.0", + "url": "https://github.com/zkpassport/noir_rsa.git", + "revision": "4d153ca99deadc462da5f6d5d05d7f46f9210623", + "tag": "v0.11.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Pinned Passport RSA implementation" + }, + { + "name": "noir-sha512-v0.2.0", + "url": "https://github.com/zkpassport/sha512.git", + "revision": "e92ffb473f3264529a0793770f63a09946df50cc", + "tag": "v0.2.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Pinned Passport RSA transitive dependency" + }, + { + "name": "noir-sha1-v0.11", + "url": "https://github.com/zac-williamson/sha1.git", + "revision": "d510f33c8546488286946ed459b26b62f5a71f91", + "tag": "v0.11", + "license": "MIT", + "sparse_paths": [], + "purpose": "Pinned Passport RSA transitive dependency" + }, + { + "name": "noir-sha256", + "url": "https://github.com/noir-lang/sha256.git", + "revision": "9442e5b6856f98b2ec029882d7e90199ecff91ba", + "tag": "v0.3.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Transitive dependency of the vendored WebAuthn Noir library" + }, + { + "name": "oprf-nr", + "url": "https://github.com/TaceoLabs/oprf-nr.git", + "revision": "808f3c795b57963dd58ef282ccd61022ef39c285", + "tag": "v0.1.0-beta.1", + "license": "MIT", + "sparse_paths": [], + "purpose": "Noir beta.11-compatible OPRF example circuit source" + }, + { + "name": "oprf-nr-v2", + "url": "https://github.com/TaceoLabs/oprf-nr.git", + "revision": "fd37726215b59d3d4823ea7b1967b1da3525ed9d", + "tag": "v2.0.0", + "license": "MIT", + "sparse_paths": [], + "purpose": "Noir beta.20-compatible revision of the same TACEO OPRF core example used by @worldcoin/provekit 0.1.0" + }, + { + "name": "circom", + "url": "https://github.com/iden3/circom.git", + "revision": "6f782d7313793b3dc18cc3b38d2335eead9f5d50", + "license": "GPL-3.0", + "sparse_paths": [], + "purpose": "Circom 2.2.2-era compiler used to generate circom-witness-rs graphs" + }, + { + "name": "circom-witness-rs", + "url": "https://github.com/philsippl/circom-witness-rs.git", + "revision": "38553d2e71059c8635651a81a397603c75fb9d8a", + "license": "MIT", + "sparse_paths": [], + "purpose": "Generated native Rust Circom witness calculation" + }, + { + "name": "circom-helpers", + "url": "https://github.com/TaceoLabs/circom-helpers.git", + "revision": "8aacd73ed6ab0a2b9b2158e613acfa920860865a", + "branch": "main", + "license": "MIT OR Apache-2.0", + "packages": { + "taceo-groth16": "0.2.1", + "taceo-groth16-material": "0.4.2" + }, + "sparse_paths": [], + "purpose": "TACEO Groth16 material and prover used for the replacement Circom OPRF series" + }, + { + "name": "circom-witness-rs-taceo-oprf", + "url": "https://github.com/philsippl/circom-witness-rs.git", + "revision": "e11206a9f453145dcd6b814523cbfba4f60cf5c6", + "branch": "codex/remove-cxx-bridge-and-grep", + "license": "MIT", + "sparse_paths": [], + "purpose": "Witness generator patched into circom-helpers for the replacement Circom OPRF series" + }, + { + "name": "circom-compat", + "url": "https://github.com/arkworks-rs/circom-compat.git", + "revision": "d677f28b216fcc39ee8440d152cc9217850f5d4c", + "tag": "v0.6.0", + "license": "Apache-2.0", + "sparse_paths": [], + "purpose": "Arkworks Circom R1CS and witness compatibility" + }, + { + "name": "mopro", + "url": "https://github.com/zkmopro/mopro.git", + "revision": "10871f02e365c478cb4b61016e4034f7e74f076b", + "version": "0.3.7", + "license": "MIT OR Apache-2.0", + "sparse_paths": [], + "purpose": "Native iOS and Android integration layer for both Noir/Barretenberg and Circom/Groth16; it is retained, not being dropped" + }, + { + "name": "w2c2", + "url": "https://github.com/vivianjeng/w2c2.git", + "revision": "9de3c2be5a4ed8ef5fdbd536e445120594fb8530", + "license": "MIT", + "sparse_paths": [], + "submodules": true, + "purpose": "Pinned host WebAssembly-to-C transpiler required by rust-witness during native cross-compilation" + }, + { + "name": "rust-rapidsnark", + "url": "https://github.com/zkmopro/rust-rapidsnark.git", + "revision": "fcf92e7454600109e4eab4a0c907e8d59649fd9c", + "tag": "v0.1.4", + "version": "0.1.4", + "license": "MIT OR Apache-2.0", + "sparse_paths": [], + "purpose": "Preferred native Groth16 prover pilot through Mopro from frozen WTNS and standard SnarkJS zkeys" + }, + { + "name": "witnesscalc-adapter", + "url": "https://github.com/zkmopro/witnesscalc_adapter.git", + "revision": "e3a9b065547bbbbf69b8b0c8e25d61ec46602c94", + "tag": "v0.1.7", + "version": "0.1.7", + "license": "MIT OR Apache-2.0", + "sparse_paths": [], + "purpose": "Preferred arm64 native Circom witness generator paired with rust-rapidsnark" + }, + { + "name": "circom-witnesscalc", + "url": "https://github.com/iden3/circom-witnesscalc.git", + "revision": "d48eb7c97857d46b8a75c94ab96f769207263245", + "tag": "v0.3.0", + "version": "0.3.0", + "license": "GPL-3.0", + "sparse_paths": [], + "purpose": "Compatibility-only witness fallback; documented feature gaps make it unsuitable as the default for RSA-related passport circuits" + }, + { + "name": "rapidsnark", + "url": "https://github.com/iden3/rapidsnark.git", + "revision": "81eddf1a536d26497b237c0b8a04fe90baf7e439", + "license": "LGPL-3.0", + "sparse_paths": [], + "submodules": true, + "purpose": "Native Groth16 prover" + } + ] +} diff --git a/benchmarks/v1/toolchains.lock.json b/benchmarks/v1/toolchains.lock.json new file mode 100644 index 000000000..fbd82d9cd --- /dev/null +++ b/benchmarks/v1/toolchains.lock.json @@ -0,0 +1,188 @@ +{ + "schema_version": 2, + "policy": "Exact versions are immutable. Browser Noir/Barretenberg measurements are blocked until the candidate pair passes proof verification and tamper rejection for every workload in the selected campaign; freeze its integrity in this file before measuring.", + "noir": { + "version": "1.0.0-beta.19", + "base_url": "https://github.com/noir-lang/noir/releases/download/v1.0.0-beta.19", + "assets": { + "aarch64-apple-darwin": { + "name": "nargo-aarch64-apple-darwin.tar.gz", + "sha256": "3d02143efcc06a5c991f69bb6bb770e639230549d64f35ed13defb44420b7a75" + }, + "x86_64-apple-darwin": { + "name": "nargo-x86_64-apple-darwin.tar.gz", + "sha256": "4154278b865786bbf3c5064944a7b8450f49da69ad22a3c971826f6b336668eb" + }, + "aarch64-unknown-linux-gnu": { + "name": "nargo-aarch64-unknown-linux-gnu.tar.gz", + "sha256": "ddbaf70be2a953701962afef8ce18517b7f77d77685d070f08121733966a7bfb" + }, + "x86_64-unknown-linux-gnu": { + "name": "nargo-x86_64-unknown-linux-gnu.tar.gz", + "sha256": "b7749c74e756d8e8d02de5d7e4d9a441b4c1865674b48f6e83b6214fb3b80be5" + } + } + }, + "noir_provekit": { + "version": "1.0.0-beta.11", + "base_url": "https://github.com/noir-lang/noir/releases/download/v1.0.0-beta.11", + "assets": { + "aarch64-apple-darwin": { + "name": "nargo-aarch64-apple-darwin.tar.gz", + "sha256": "5c0613290be728fcb314a480578a60e0a11cd192d249d08ded44bee7c5eea142" + }, + "x86_64-apple-darwin": { + "name": "nargo-x86_64-apple-darwin.tar.gz", + "sha256": "abfa9dfa1a58b10a1006dd2eabfdb19eba5697df5ca26e1707eaa1b0adfa8ff7" + }, + "aarch64-unknown-linux-gnu": { + "name": "nargo-aarch64-unknown-linux-gnu.tar.gz", + "sha256": "bf6e44a9cd1da8c9c445d21c698b40678a3d6ef79d6b7b718c249d669d070966" + }, + "x86_64-unknown-linux-gnu": { + "name": "nargo-x86_64-unknown-linux-gnu.tar.gz", + "sha256": "89a014fd3058a059d1bfaf99cd9891eb948a093ec31314a9cf0473488f547795" + } + } + }, + "mopro": { + "version": "0.3.7", + "source_revision": "10871f02e365c478cb4b61016e4034f7e74f076b" + }, + "provekit_v1": { + "core_commit": "9b2a6f37c67691eab4b0cec6c35e35c520e93285", + "campaign_harness_commit": "7de99e9e001d06797c9770684afea20f096d1ac3", + "beta11_fixture_harness_commit": "13044531f0f38e02ed19fcbd9b26202b8ba5a962", + "noir_version": "1.0.0-beta.11", + "wasm_crate": "tooling/provekit-wasm", + "wasm_features": "no-default-features with rayon WASM threading enabled; canonical campaign requests 16 workers", + "canonical_wasm_threads": 16, + "canonical_snarkjs_threads": 16, + "wasm_bindgen_cli_version": "0.2.100", + "browser_frontend": "@noir-lang/noir_js@1.0.0-beta.11 plus @noir-lang/acvm_js@1.0.0-beta.11", + "browser_sdk_package": { + "name": "@worldcoin/provekit", + "version": "0.1.0", + "status": "not used for publication measurements; its beta.20/PKV 2.1 contract is incompatible with V1 PKV 1.2" + }, + "evidence": { + "mac": { + "passport": {"sha256": "46a2b3655f41a5b94e8565e39baa16adece1d904106db4436837d2ebf9239ecd", "payload_bytes": 2313739}, + "webauthn": {"sha256": "183f9f4b0176c1e03f1c63c8f800e01159aef9b6c1a7b8db60b03ae8d6f97dc2", "payload_bytes": 2286515}, + "oprf": {"sha256": "33bd92614f10ca8dd2c8033d74fda19ba0429d7dd5604e83896321f6268a7b14", "payload_bytes": 1644635} + }, + "iphone_summary_sha256": "942eb49b9faa546669836a28a96b0e85ab56e11479232ac09abe1ce0ca8d07fa", + "e15": { + "passport_sha256": "42024ba37ff2f339864b6b6390a11ee5a54f2dc9d2a5758ac3775f94699ea484", + "webauthn_sha256": "c09f8e98f64646e38e241caf41a95f7d5052d1082242fb80b138585bb901446f", + "oprf_sha256": "bcd52f8091121664d3538bfec853d421b49be1d0dd80e069c1a5f520780948d0" + } + } + }, + "mobench": { + "package_version": "0.1.48", + "repository": "https://github.com/worldcoin/mobile-bench-rs.git", + "branch": "codex/android-32bit-native-abi", + "source_revision": "e992596a786cc18047102a318d40131c953e57b8", + "artifact_sdk_source_revision": "e992596a786cc18047102a318d40131c953e57b8", + "draft_pr": "https://github.com/worldcoin/mobile-bench-rs/pull/45", + "reason": "Fix native C ABI size_t layout on 32-bit Android devices, preserve Rust panic diagnostics, remove the artifact-upload deadline, and force BrowserStack HTTP/1.1 for reliable large multipart uploads" + }, + "android": { + "java": { + "manager": "mise", + "distribution": "temurin", + "version": "21.0.11+10.0.LTS" + }, + "sdk_platform": "android-34", + "ndk_version": "26.1.10909125", + "canonical_e15_abi": "armeabi-v7a" + }, + "native_noir": { + "nargo_version": "1.0.0-beta.19", + "barretenberg_rs_version": "4.2.0-aztecnr-rc.2", + "adapter": "Mopro 0.3.7", + "srs": { + "url": "https://crs.aztec.network/g1.dat", + "bytes": 268435520, + "points": 4194305, + "sha256": "3ef417367184adaf0dcdebfccc440b5bb72f9a228b278f17d1411b1340f2daa5" + } + }, + "browser_provekit": { + "package": "@worldcoin/provekit", + "version": "0.1.0", + "integrity": "sha512-3Qbh2aHN6fkwQiVNbfN0GgSjXfaJ6gtbXASeYN5iP6ybAgP0AEIho9Glg7L+H/+eEJ7l5/XP3a/JKzNs1H18nQ==", + "node_engine": ">=20", + "embedded_noir_js_version": "1.0.0-beta.20" + }, + "browser_noir": { + "noir_js_package": "@noir-lang/noir_js", + "noir_js_version": "1.0.0-beta.19", + "noir_js_integrity": "sha512-KtuO37XuBn+7PHReLGCyLVxKGBk+hSvUQs0r/rtNFTYty/KmSq/NwEXkwiA7aQTNUykrzTJGFbIForQWjIJT4g==", + "bb_js_package": "@aztec/bb.js", + "bb_js_version": "4.2.0-aztecnr-rc.2", + "bb_js_integrity": "sha512-ksFWHrm8QYAXP059paItEKCM/UhpHg5Dwl/eSp2BI6EAtD9+JlonkOwJ+94TYai2y5Gz0qnrgd65dsvDwJelVQ==", + "status": "smoke-validated for the canonical Mac fixed-16 campaign" + }, + "browser_circom": { + "package": "snarkjs", + "version": "0.7.6", + "integrity": "sha512-4uH1xA5JzVU5jaaWS2fXej3+RC6L5Erhr6INTJtUA27du4Elbh4VXCeeRjB4QiwL6N6y7SNKePw5prTxyEf4Zg==" + }, + "native_circom": { + "preferred_witness_adapter": { + "package": "witnesscalc-adapter", + "version": "0.1.7", + "source_revision": "e3a9b065547bbbbf69b8b0c8e25d61ec46602c94" + }, + "preferred_prover": { + "package": "rust-rapidsnark", + "version": "0.1.4", + "source_revision": "fcf92e7454600109e4eab4a0c907e8d59649fd9c" + }, + "fallback_witness_adapter": { + "package": "circom-witnesscalc", + "owner": "iden3", + "version": "0.3.0", + "source_revision": "d48eb7c97857d46b8a75c94ab96f769207263245", + "status": "compatibility-fallback-only" + }, + "target_specific_fallback": { + "prover": "Mopro circom-prover (Arkworks)", + "witness": "rust-witness", + "condition": "Rapidsnark unsupported on confirmed Motorola E15 userspace ABI" + }, + "iphone_oprf_witness_runtime": { + "package": "wasmi", + "version": "0.46.0", + "scope": "World ID O2 OPRF input-to-proof lane only", + "reason": "Interprets the exact Circom witness Wasm on arm64 iOS after the rust-witness AOT artifact produced repeatable EXC_BAD_ACCESS crashes" + } + }, + "circom_native_frozen_witnesses": { + "oprf_query": { + "sha256": "89844b3d8e0b0a9a58075659b694f2e0f5582a198430da6d8101a48707f7446f" + }, + "oprf_nullifier": { + "sha256": "b5c2bf1c167f8fe77cf13bf96db143c21aa19f27f6b7cc9317b255c43d32f568" + }, + "vc_and_disclose": { + "sha256": "53a4ce55036d040275e3cb5548ad771f67789e018098eab92656beb0e218807f" + }, + "register_sha256_sha256_sha256_rsa_65537_4096": { + "sha256": "9a785c0e2a974ca751777bb6824ebd8e6d4be1b43224cc1a0cbe6cc02d663c6a" + }, + "fixture": { + "sha256": "294c8091d87c2dbec8bc8997d0e892b65e81d5f95a14320081dcaefea1a5e0d8" + } + }, + "circom_compiler": { + "version": "2.2.2", + "source_revision": "6f782d7313793b3dc18cc3b38d2335eead9f5d50" + }, + "wasm_bindgen_cli": { + "version": "0.2.100", + "reason": "Must match the ProveKit V1 workspace lock when rebuilding the package." + } +} diff --git a/benchmarks/v1/wasm/README.md b/benchmarks/v1/wasm/README.md new file mode 100644 index 000000000..3315da79a --- /dev/null +++ b/benchmarks/v1/wasm/README.md @@ -0,0 +1,25 @@ +# ProveKit V1 browser/WASM lane + +The canonical Mac browser measurements build ProveKit V1 from the immutable +core commit in `../sources.lock.json` and run Chrome with exactly 16 WASM +workers. The threaded package is kept in `v1-wasm-pkg-threaded/` and the build +manifest records the request and effective worker count. + +Build and smoke the fixed-16 package: + +```bash +cd benchmarks/v1/wasm +bun install --frozen-lockfile +MOBENCH_WASM_THREADS=16 INPUT_TO_PROOF_EXECUTION_POLICY=multithread bun run build +MOBENCH_WASM_THREADS=16 MOBENCH_SNARKJS_THREADS=16 bun run smoke +``` + +The smoke gate requires `crossOriginIsolated`, `SharedArrayBuffer`, an +initialized Rayon pool, valid-proof acceptance, and tampered-proof rejection. +The browser runner records process RSS, proof bytes, payload bytes, runtime +identity, and worker counts. Mac-native runs are diagnostic and are not merged +into the browser target. + +`MOBENCH_WASM_THREADS=single` is available only for historical diagnostics; +the canonical entrypoint defaults to the fixed-16 threaded build. Superseded +single/automatic-thread exports are under [`../legacy/`](../legacy/README.md). diff --git a/benchmarks/v1/wasm/browser-matrix.json b/benchmarks/v1/wasm/browser-matrix.json new file mode 100644 index 000000000..58425551b --- /dev/null +++ b/benchmarks/v1/wasm/browser-matrix.json @@ -0,0 +1,42 @@ +{ + "schema_version": 1, + "environments": [ + { + "id": "macos_chrome_single", + "os": "OS X", + "os_version": "Sequoia", + "browser": "Chrome", + "execution": "single-thread", + "real_mobile": false + }, + { + "id": "ios_safari_single", + "os": "ios", + "os_version": "set-via-BROWSERSTACK_OS_VERSION", + "device": "iPhone SE 2022", + "browser": "Safari", + "execution": "single-thread", + "real_mobile": true, + "device_catalog_query_required": true + }, + { + "id": "android_chrome_single", + "os": "android", + "os_version": "12.0", + "device": "Samsung Galaxy S21", + "browser": "Chrome", + "execution": "single-thread", + "real_mobile": true + }, + { + "id": "android_chrome_threaded", + "os": "android", + "os_version": "12.0", + "device": "Samsung Galaxy S21", + "browser": "Chrome", + "execution": "threaded", + "real_mobile": true, + "requires_cross_origin_isolation": true + } + ] +} diff --git a/benchmarks/v1/wasm/browserstack-run.schema.json b/benchmarks/v1/wasm/browserstack-run.schema.json new file mode 100644 index 000000000..d3f42d6e9 --- /dev/null +++ b/benchmarks/v1/wasm/browserstack-run.schema.json @@ -0,0 +1,88 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://provekit.dev/schemas/v1-browserstack-run.schema.json", + "title": "ProveKit V1 BrowserStack browser benchmark run", + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "source_revision", + "session_id", + "requested_environment", + "resolved_environment", + "static_bundle", + "benchmark_result" + ], + "properties": { + "schema_version": { + "const": 1 + }, + "source_revision": { + "type": "string", + "pattern": "^[0-9a-f]{40}$" + }, + "session_id": { + "type": "string", + "minLength": 1 + }, + "requested_environment": { + "type": "object" + }, + "resolved_environment": { + "type": "object", + "additionalProperties": false, + "required": [ + "browser_name", + "device_name", + "os_version", + "real_mobile" + ], + "properties": { + "browser_name": { + "type": "string" + }, + "browser_version": { + "type": [ + "string", + "null" + ] + }, + "device_name": { + "type": "string" + }, + "os_version": { + "type": "string" + }, + "real_mobile": { + "type": "boolean" + } + } + }, + "static_bundle": { + "type": "object", + "additionalProperties": false, + "required": [ + "manifest_sha256", + "total_bytes", + "artifact_count" + ], + "properties": { + "manifest_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "total_bytes": { + "type": "integer", + "minimum": 1 + }, + "artifact_count": { + "type": "integer", + "minimum": 1 + } + } + }, + "benchmark_result": { + "type": "object" + } + } +} diff --git a/benchmarks/v1/wasm/bun.lock b/benchmarks/v1/wasm/bun.lock new file mode 100644 index 000000000..5df19c255 --- /dev/null +++ b/benchmarks/v1/wasm/bun.lock @@ -0,0 +1,156 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "provekit-v1-browser-benchmarks", + "dependencies": { + "@noir-lang/acvm_js": "1.0.0-beta.11", + "@noir-lang/noir_js": "1.0.0-beta.11", + }, + "devDependencies": { + "playwright-core": "1.59.1", + "vite": "7.2.7", + }, + }, + }, + "packages": { + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@noir-lang/acvm_js": ["@noir-lang/acvm_js@1.0.0-beta.11", "", {}, "sha512-g1CeqJlWNyJx1j+1t9sm3MxnDChbWSHa9UOOIQYBskxczhUHuUVfYve3xbe0DwSEiIBQ3gmTIKDmRPs+QboPvA=="], + + "@noir-lang/noir_js": ["@noir-lang/noir_js@1.0.0-beta.11", "", { "dependencies": { "@noir-lang/acvm_js": "1.0.0-beta.11", "@noir-lang/noirc_abi": "1.0.0-beta.11", "@noir-lang/types": "1.0.0-beta.11", "pako": "^2.1.0" } }, "sha512-pZlz5/mGooHBUnucUULmbdU3gicxbaCg7t+wNoBN45JuFMU4vV32As4C1aTNNJDpDFaGupV7yXKVRcsJNTZ49w=="], + + "@noir-lang/noirc_abi": ["@noir-lang/noirc_abi@1.0.0-beta.11", "", { "dependencies": { "@noir-lang/types": "1.0.0-beta.11" } }, "sha512-D8nBgDGYe8uu4meu9ctGo52KIa0NeE/u2GBQi4DHJzE7/q5dVEqSyVVPImOyZWpvjPvb6thySxcDWbqY6JxOiw=="], + + "@noir-lang/types": ["@noir-lang/types@1.0.0-beta.11", "", {}, "sha512-b9zeK/uxecsOKxsgqRszNYtj7Z3A9k//GF4uQIzvYbDWyrPGgnfi297ysXZ8lqKV4xBSQ93qNp+VzW4XaTBGjQ=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.3", "", { "os": "android", "cpu": "arm" }, "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.3", "", { "os": "android", "cpu": "arm64" }, "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.3", "", { "os": "linux", "cpu": "arm" }, "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.3", "", { "os": "linux", "cpu": "arm" }, "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.3", "", { "os": "linux", "cpu": "x64" }, "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.3", "", { "os": "linux", "cpu": "x64" }, "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.3", "", { "os": "none", "cpu": "arm64" }, "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.3", "", { "os": "win32", "cpu": "x64" }, "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.3", "", { "os": "win32", "cpu": "x64" }, "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], + + "pako": ["pako@2.2.0", "", {}, "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + + "playwright-core": ["playwright-core@1.59.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg=="], + + "postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="], + + "rollup": ["rollup@4.62.3", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.3", "@rollup/rollup-android-arm64": "4.62.3", "@rollup/rollup-darwin-arm64": "4.62.3", "@rollup/rollup-darwin-x64": "4.62.3", "@rollup/rollup-freebsd-arm64": "4.62.3", "@rollup/rollup-freebsd-x64": "4.62.3", "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", "@rollup/rollup-linux-arm-musleabihf": "4.62.3", "@rollup/rollup-linux-arm64-gnu": "4.62.3", "@rollup/rollup-linux-arm64-musl": "4.62.3", "@rollup/rollup-linux-loong64-gnu": "4.62.3", "@rollup/rollup-linux-loong64-musl": "4.62.3", "@rollup/rollup-linux-ppc64-gnu": "4.62.3", "@rollup/rollup-linux-ppc64-musl": "4.62.3", "@rollup/rollup-linux-riscv64-gnu": "4.62.3", "@rollup/rollup-linux-riscv64-musl": "4.62.3", "@rollup/rollup-linux-s390x-gnu": "4.62.3", "@rollup/rollup-linux-x64-gnu": "4.62.3", "@rollup/rollup-linux-x64-musl": "4.62.3", "@rollup/rollup-openbsd-x64": "4.62.3", "@rollup/rollup-openharmony-arm64": "4.62.3", "@rollup/rollup-win32-arm64-msvc": "4.62.3", "@rollup/rollup-win32-ia32-msvc": "4.62.3", "@rollup/rollup-win32-x64-gnu": "4.62.3", "@rollup/rollup-win32-x64-msvc": "4.62.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "vite": ["vite@7.2.7", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ=="], + } +} diff --git a/benchmarks/v1/wasm/index.html b/benchmarks/v1/wasm/index.html new file mode 100644 index 000000000..fe599fad6 --- /dev/null +++ b/benchmarks/v1/wasm/index.html @@ -0,0 +1,67 @@ + + + + + + ProveKit V1 browser benchmark + + + +

ProveKit V1 browser benchmark

+

WebAssembly · pinned deterministic fixtures · add threads=auto for a bounded Rayon worker pool

+
+ + + + +
+

Ready.

+

+    
+  
+
diff --git a/benchmarks/v1/wasm/package.json b/benchmarks/v1/wasm/package.json
new file mode 100644
index 000000000..cafe63ea7
--- /dev/null
+++ b/benchmarks/v1/wasm/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "provekit-v1-browser-benchmarks",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "browserstack": "bun run scripts/browserstack.ts",
+    "build": "bash scripts/build.sh",
+    "serve": "bun run scripts/server.ts",
+    "smoke": "bun run scripts/smoke.ts"
+  },
+  "dependencies": {
+    "@noir-lang/acvm_js": "1.0.0-beta.11",
+    "@noir-lang/noir_js": "1.0.0-beta.11"
+  },
+  "devDependencies": {
+    "playwright-core": "1.59.1",
+    "vite": "7.2.7"
+  }
+}
diff --git a/benchmarks/v1/wasm/scripts/browserstack.ts b/benchmarks/v1/wasm/scripts/browserstack.ts
new file mode 100644
index 000000000..956a68809
--- /dev/null
+++ b/benchmarks/v1/wasm/scripts/browserstack.ts
@@ -0,0 +1,361 @@
+import { createHash } from "node:crypto";
+import { lstat, readFile, readdir, realpath } from "node:fs/promises";
+import { relative, resolve, sep } from "node:path";
+import matrix from "../browser-matrix.json";
+import { startServer } from "./server";
+
+interface BrowserEnvironment {
+  id: string;
+  os: string;
+  os_version: string;
+  device?: string;
+  browser: string;
+  execution: string;
+  real_mobile: boolean;
+}
+
+interface BundleManifest {
+  artifacts: Array<{
+    path: string;
+    bytes: number;
+    sha256: string;
+    mime_type: string;
+  }>;
+  totals: Record;
+}
+
+interface WebDriverResponse {
+  value?: T & {
+    error?: string;
+    message?: string;
+  };
+  sessionId?: string;
+}
+
+const wasmRoot = resolve(new URL("..", import.meta.url).pathname);
+const repositoryRoot = resolve(wasmRoot, "../../..");
+const distRoot = resolve(wasmRoot, "dist");
+const hub = "https://hub-cloud.browserstack.com/wd/hub";
+
+function requiredEnvironment(name: string): string {
+  const value = process.env[name];
+  if (!value) throw new Error(`${name} is required`);
+  return value;
+}
+
+function sha256(bytes: Uint8Array): string {
+  return createHash("sha256").update(bytes).digest("hex");
+}
+
+function expectedMimeType(path: string): string {
+  if (path.endsWith(".html")) return "text/html; charset=utf-8";
+  if (path.endsWith(".js")) return "text/javascript; charset=utf-8";
+  if (path.endsWith(".json")) return "application/json; charset=utf-8";
+  if (path.endsWith(".wasm")) return "application/wasm";
+  return "application/octet-stream";
+}
+
+async function listStaticFiles(directory: string): Promise {
+  const files: string[] = [];
+  for (const entry of await readdir(directory, { withFileTypes: true })) {
+    const path = resolve(directory, entry.name);
+    if (entry.isSymbolicLink())
+      throw new Error(`static bundle contains symlink: ${path}`);
+    if (entry.isDirectory()) {
+      files.push(...(await listStaticFiles(path)));
+    } else if (entry.isFile()) {
+      files.push(relative(repositoryRoot, path));
+    } else {
+      throw new Error(
+        `static bundle contains unsupported filesystem entry: ${path}`,
+      );
+    }
+  }
+  return files;
+}
+
+async function verifyStaticBundle() {
+  const manifestPath = resolve(distRoot, "manifest.json");
+  const manifestBytes = new Uint8Array(await readFile(manifestPath));
+  const manifest = JSON.parse(
+    new TextDecoder().decode(manifestBytes),
+  ) as BundleManifest;
+  let totalBytes = 0;
+
+  for (const artifact of manifest.artifacts) {
+    const artifactPath = resolve(repositoryRoot, artifact.path);
+    if (
+      artifactPath !== distRoot &&
+      !artifactPath.startsWith(`${distRoot}${sep}`)
+    ) {
+      throw new Error(`manifest path escapes dist: ${artifact.path}`);
+    }
+    const metadata = await lstat(artifactPath);
+    if (!metadata.isFile() || metadata.isSymbolicLink()) {
+      throw new Error(
+        `manifest artifact must be a regular non-symlink file: ${artifact.path}`,
+      );
+    }
+    const canonicalPath = await realpath(artifactPath);
+    if (
+      canonicalPath !== distRoot &&
+      !canonicalPath.startsWith(`${distRoot}${sep}`)
+    ) {
+      throw new Error(
+        `manifest artifact resolves outside dist: ${artifact.path}`,
+      );
+    }
+    const bytes = new Uint8Array(await readFile(artifactPath));
+    if (bytes.byteLength !== artifact.bytes) {
+      throw new Error(`size mismatch for ${artifact.path}`);
+    }
+    if (sha256(bytes) !== artifact.sha256) {
+      throw new Error(`SHA-256 mismatch for ${artifact.path}`);
+    }
+    if (artifact.mime_type !== expectedMimeType(artifact.path)) {
+      throw new Error(`MIME type mismatch for ${artifact.path}`);
+    }
+    totalBytes += bytes.byteLength;
+  }
+
+  const declaredTotal = Object.values(manifest.totals).reduce(
+    (sum, value) => sum + value,
+    0,
+  );
+  if (totalBytes !== declaredTotal) {
+    throw new Error(
+      `manifest total mismatch: measured ${totalBytes}, declared ${declaredTotal}`,
+    );
+  }
+  const declaredPaths = new Set(
+    manifest.artifacts.map((artifact) => artifact.path),
+  );
+  const actualPaths = (await listStaticFiles(distRoot)).filter(
+    (path) => path !== "benchmarks/v1/wasm/dist/manifest.json",
+  );
+  const unexpected = actualPaths.filter((path) => !declaredPaths.has(path));
+  const missing = [...declaredPaths].filter(
+    (path) => !actualPaths.includes(path),
+  );
+  if (unexpected.length > 0 || missing.length > 0) {
+    throw new Error(
+      `static bundle file set mismatch; unexpected=${unexpected.join(",")}; missing=${missing.join(",")}`,
+    );
+  }
+
+  return {
+    manifest_sha256: sha256(manifestBytes),
+    total_bytes: totalBytes,
+    artifact_count: manifest.artifacts.length,
+  };
+}
+
+async function webdriver(
+  path: string,
+  authorization: string,
+  method: "POST" | "DELETE",
+  body?: unknown,
+): Promise> {
+  const response = await fetch(`${hub}${path}`, {
+    method,
+    headers: {
+      Authorization: authorization,
+      "Content-Type": "application/json",
+    },
+    body: body === undefined ? undefined : JSON.stringify(body),
+  });
+  const payload = (await response.json()) as WebDriverResponse;
+  if (!response.ok || payload.value?.error) {
+    throw new Error(
+      `WebDriver ${method} ${path} failed: ${payload.value?.message ?? response.statusText}`,
+    );
+  }
+  return payload;
+}
+
+function sourceRevision(): string {
+  const result = Bun.spawnSync([
+    "git",
+    "-C",
+    repositoryRoot,
+    "rev-parse",
+    "HEAD",
+  ]);
+  if (result.exitCode !== 0)
+    throw new Error("could not resolve source revision");
+  return result.stdout.toString().trim();
+}
+
+function resolvedEnvironment(
+  capabilities: Record,
+  requested: BrowserEnvironment,
+  osVersion: string,
+) {
+  const browserVersion =
+    typeof capabilities.browserVersion === "string"
+      ? capabilities.browserVersion
+      : null;
+  return {
+    browser_name:
+      typeof capabilities.browserName === "string"
+        ? capabilities.browserName
+        : requested.browser,
+    browser_version: browserVersion,
+    device_name:
+      typeof capabilities.deviceName === "string"
+        ? capabilities.deviceName
+        : (requested.device ?? "unknown"),
+    os_version:
+      typeof capabilities.osVersion === "string"
+        ? capabilities.osVersion
+        : osVersion,
+    real_mobile: true,
+  };
+}
+
+const requestedId = Bun.argv[2];
+if (!requestedId) {
+  throw new Error(
+    "usage: bun run browserstack -- ",
+  );
+}
+if (requestedId === "--verify-bundle") {
+  console.log(JSON.stringify(await verifyStaticBundle(), null, 2));
+  process.exit(0);
+}
+
+const requested = (matrix.environments as BrowserEnvironment[]).find(
+  (environment) => environment.id === requestedId,
+);
+if (!requested) throw new Error(`unknown browser environment: ${requestedId}`);
+if (
+  !requested.real_mobile ||
+  requested.execution !== "single-thread" ||
+  !requested.device
+) {
+  throw new Error(
+    `${requestedId} is not a real-mobile single-thread environment`,
+  );
+}
+
+const username = requiredEnvironment("BROWSERSTACK_USERNAME");
+const accessKey = requiredEnvironment("BROWSERSTACK_ACCESS_KEY");
+const localIdentifier = requiredEnvironment("BROWSERSTACK_LOCAL_IDENTIFIER");
+const osVersion =
+  process.env.BROWSERSTACK_OS_VERSION ??
+  (requested.os_version.startsWith("set-via-")
+    ? undefined
+    : requested.os_version);
+if (!osVersion) {
+  throw new Error(
+    "BROWSERSTACK_OS_VERSION is required; resolve and freeze a currently available device/OS pair",
+  );
+}
+
+const warmup = Number.parseInt(process.env.MOBENCH_WARMUP ?? "1", 10);
+const iterations = Number.parseInt(process.env.MOBENCH_ITERATIONS ?? "5", 10);
+const workload = process.env.MOBENCH_WORKLOAD ?? "passport_complete_age_check";
+if (
+  !["webauthn_assertion", "passport_complete_age_check", "oprf_taceo"].includes(
+    workload,
+  )
+) {
+  throw new Error(`unsupported MOBENCH_WORKLOAD: ${workload}`);
+}
+if (!Number.isInteger(warmup) || warmup < 0 || warmup > 10) {
+  throw new Error("MOBENCH_WARMUP must be an integer from 0 to 10");
+}
+if (!Number.isInteger(iterations) || iterations < 1 || iterations > 20) {
+  throw new Error("MOBENCH_ITERATIONS must be an integer from 1 to 20");
+}
+
+const bundle = await verifyStaticBundle();
+const server = startServer();
+const authorization = `Basic ${Buffer.from(`${username}:${accessKey}`).toString("base64")}`;
+let sessionId: string | undefined;
+
+try {
+  const created = await webdriver<{
+    sessionId?: string;
+    capabilities?: Record;
+  }>("/session", authorization, "POST", {
+    capabilities: {
+      alwaysMatch: {
+        browserName: requested.browser.toLowerCase(),
+        "bstack:options": {
+          userName: username,
+          accessKey,
+          osVersion,
+          deviceName: requested.device,
+          realMobile: true,
+          local: true,
+          localIdentifier,
+          projectName: "ProveKit V1 benchmarks",
+          buildName: `provekit-v1-${sourceRevision().slice(0, 12)}`,
+          sessionName: `${requested.id} ${workload}`,
+        },
+      },
+    },
+  });
+  sessionId = created.value?.sessionId ?? created.sessionId;
+  if (!sessionId) throw new Error("BrowserStack did not return a session ID");
+
+  const capabilities = created.value?.capabilities ?? {};
+  await webdriver(`/session/${sessionId}/url`, authorization, "POST", {
+    url:
+      `http://localhost:${new URL(server.url).port}/?autorun=1` +
+      `&workload=${encodeURIComponent(workload)}&warmup=${warmup}&iterations=${iterations}`,
+  });
+
+  const deadline = Date.now() + 15 * 60 * 1000;
+  let state:
+    | { status?: string; result?: Record; error?: string }
+    | undefined;
+  while (Date.now() < deadline) {
+    const response = await webdriver<{
+      status?: string;
+      result?: Record;
+      error?: string;
+    }>(`/session/${sessionId}/execute/sync`, authorization, "POST", {
+      script: "return window.__MOBENCH_STATE__ || null",
+      args: [],
+    });
+    state = response.value;
+    if (state?.status === "complete" || state?.status === "error") break;
+    await Bun.sleep(1_000);
+  }
+
+  if (state?.status !== "complete" || !state.result) {
+    throw new Error(state?.error ?? "BrowserStack browser benchmark timed out");
+  }
+
+  console.log(
+    JSON.stringify(
+      {
+        schema_version: 1,
+        source_revision: sourceRevision(),
+        session_id: sessionId,
+        requested_environment: {
+          ...requested,
+          os_version: osVersion,
+        },
+        resolved_environment: resolvedEnvironment(
+          capabilities,
+          requested,
+          osVersion,
+        ),
+        static_bundle: bundle,
+        benchmark_result: state.result,
+      },
+      null,
+      2,
+    ),
+  );
+} finally {
+  if (sessionId) {
+    await webdriver(`/session/${sessionId}`, authorization, "DELETE").catch(
+      () => undefined,
+    );
+  }
+  server.stop(true);
+}
diff --git a/benchmarks/v1/wasm/scripts/build.sh b/benchmarks/v1/wasm/scripts/build.sh
new file mode 100755
index 000000000..491d5258f
--- /dev/null
+++ b/benchmarks/v1/wasm/scripts/build.sh
@@ -0,0 +1,130 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+wasm_root="$(cd "${script_dir}/.." && pwd)"
+benchmark_root="$(cd "${wasm_root}/.." && pwd)"
+repo_root="$(cd "${benchmark_root}/../.." && pwd)"
+dist_dir="${wasm_root}/dist"
+default_package_dir="${wasm_root}/v1-wasm-pkg"
+wasm_threads="${MOBENCH_WASM_THREADS:-}"
+if [[ -z "${wasm_threads}" ]]; then
+  wasm_threads="$(
+    [[ "${INPUT_TO_PROOF_EXECUTION_POLICY:-}" == "singlethread" ]] && echo single || echo 16
+  )"
+fi
+package_dir="${PROVEKIT_V1_WASM_PACKAGE_DIR:-}"
+if [[ -z "${package_dir}" ]]; then
+  if [[ "${wasm_threads}" == "single" ]]; then
+    package_dir="${default_package_dir}"
+  else
+    package_dir="${wasm_root}/v1-wasm-pkg-threaded"
+  fi
+fi
+workloads=(webauthn_assertion passport_complete_age_check passport_p1 oprf_taceo)
+
+for command in bun jq; do
+  if ! command -v "${command}" >/dev/null 2>&1; then
+    echo "error: ${command} is required" >&2
+    exit 1
+  fi
+done
+
+MOBENCH_CI_PREPARE=1 \
+  "${benchmark_root}/scripts/prepare-provekit-beta11-artifacts.sh"
+MOBENCH_WASM_THREADS="${wasm_threads}" \
+PROVEKIT_V1_WASM_PACKAGE_DIR="${package_dir}" \
+  "${benchmark_root}/scripts/build-provekit-v1-wasm.sh"
+
+# Vite's source import remains stable at v1-wasm-pkg. Keep the immutable
+# threaded package separately, then mirror it into that ignored build alias.
+if [[ "${package_dir}" != "${default_package_dir}" ]]; then
+  rm -rf "${default_package_dir}"
+  cp -R "${package_dir}" "${default_package_dir}"
+fi
+(
+  cd "${wasm_root}"
+  bun install --frozen-lockfile
+)
+
+if [[ "${dist_dir}" != "${repo_root}/benchmarks/v1/wasm/dist" ]]; then
+  echo "error: refusing to clean unexpected dist path ${dist_dir}" >&2
+  exit 1
+fi
+rm -rf "${dist_dir}"
+mkdir -p "${dist_dir}/assets"
+cp "${wasm_root}/index.html" "${dist_dir}/index.html"
+for workload in "${workloads[@]}"; do
+  workload_dir="${repo_root}/target/v1-benchmarks/artifacts/${workload}"
+  asset_dir="${dist_dir}/assets/${workload}"
+  mkdir -p "${asset_dir}"
+  cp "${workload_dir}/${workload}.pkp" "${asset_dir}/${workload}.pkp"
+  cp "${workload_dir}/${workload}.pkv" "${asset_dir}/${workload}.pkv"
+done
+cp "${repo_root}/target/v1-benchmarks/provekit-v1-inputs/webauthn_assertion.inputs.json" \
+  "${dist_dir}/assets/webauthn_assertion/inputs.json"
+(
+  cd "${benchmark_root}/barretenberg"
+  bun run inputs -- \
+    "${repo_root}/target/v1-benchmarks/provekit-v1-inputs/passport_complete_age_check.Prover.toml" \
+    "${dist_dir}/assets/passport_complete_age_check/inputs.json"
+  bun run inputs -- \
+    "${repo_root}/target/v1-benchmarks/provekit-v1-inputs/passport_p1.Prover.toml" \
+    "${dist_dir}/assets/passport_p1/inputs.json"
+  bun run inputs -- \
+    "${repo_root}/target/v1-benchmarks/provekit-v1-inputs/oprf_taceo.Prover.toml" \
+    "${dist_dir}/assets/oprf_taceo/inputs.json"
+)
+(
+  cd "${wasm_root}"
+  bunx vite build
+)
+
+runtime_manifest="${repo_root}/target/v1-benchmarks/provekit-sdk-browser-files.tsv"
+mkdir -p "$(dirname "${runtime_manifest}")"
+{
+  printf '# scope\tkind\tpath\tmime_type\n'
+  printf 'shared-runtime\thtml\t%s\ttext/html; charset=utf-8\n' \
+    "${dist_dir}/index.html"
+  while IFS= read -r file; do
+    case "${file}" in
+      *.wasm) mime='application/wasm' ;;
+      *.js) mime='text/javascript; charset=utf-8' ;;
+      *) continue ;;
+    esac
+    printf 'shared-runtime\tpackage-runtime\t%s\t%s\n' "${file}" "${mime}"
+  done < <(find "${dist_dir}" -maxdepth 2 -type f | LC_ALL=C sort)
+  for workload in "${workloads[@]}"; do
+    while IFS= read -r file; do
+      printf '%s\tworkload-asset\t%s\tapplication/octet-stream\n' \
+        "${workload}" "${file}"
+    done < <(find "${dist_dir}/assets/${workload}" -type f | LC_ALL=C sort)
+  done
+} >"${runtime_manifest}"
+
+(
+  cd "${repo_root}"
+  "${benchmark_root}/scripts/measure-bundle.sh" \
+    "${runtime_manifest}" \
+    "${dist_dir}/manifest.json"
+)
+
+# Keep the generated package identity alongside the static-file hashes. The
+# browser runner only consumes `totals`, while result provenance can inspect
+# this immutable build/request metadata without reading the ignored package
+# directory from the host filesystem.
+package_manifest="${package_dir}/manifest.json"
+if [[ -s "${package_manifest}" ]]; then
+  tmp_manifest="${dist_dir}/manifest.json.tmp"
+  jq --slurpfile wasm_build "${package_manifest}" \
+    '. + {wasm_build: $wasm_build[0]}' \
+    "${dist_dir}/manifest.json" >"${tmp_manifest}"
+  mv "${tmp_manifest}" "${dist_dir}/manifest.json"
+fi
+
+if [[ "${wasm_threads}" == "single" ]]; then
+  echo "Built single-thread browser benchmark at ${dist_dir}"
+else
+  echo "Built threaded browser benchmark at ${dist_dir}"
+fi
diff --git a/benchmarks/v1/wasm/scripts/server.ts b/benchmarks/v1/wasm/scripts/server.ts
new file mode 100644
index 000000000..c0862dcd2
--- /dev/null
+++ b/benchmarks/v1/wasm/scripts/server.ts
@@ -0,0 +1,48 @@
+import { resolve, sep } from "node:path";
+
+const root = resolve(new URL("../dist", import.meta.url).pathname);
+const port = Number.parseInt(process.env.PROVEKIT_BENCH_PORT ?? "4173", 10);
+
+const mimeTypes: Record = {
+  ".html": "text/html; charset=utf-8",
+  ".js": "text/javascript; charset=utf-8",
+  ".json": "application/json; charset=utf-8",
+  ".pkp": "application/octet-stream",
+  ".pkv": "application/octet-stream",
+  ".wasm": "application/wasm",
+};
+
+function contentType(path: string): string {
+  const extension = path.slice(path.lastIndexOf("."));
+  return mimeTypes[extension] ?? "application/octet-stream";
+}
+
+export function startServer() {
+  return Bun.serve({
+    hostname: "127.0.0.1",
+    port,
+    async fetch(request) {
+      const url = new URL(request.url);
+      const relativePath = decodeURIComponent(url.pathname === "/" ? "/index.html" : url.pathname);
+      const path = resolve(root, `.${relativePath}`);
+      if (path !== root && !path.startsWith(`${root}${sep}`)) {
+        return new Response("not found", { status: 404 });
+      }
+      const file = Bun.file(path);
+      if (!(await file.exists())) return new Response("not found", { status: 404 });
+      return new Response(file, {
+        headers: {
+          "Cache-Control": "no-store",
+          "Content-Type": contentType(path),
+          "Cross-Origin-Embedder-Policy": "require-corp",
+          "Cross-Origin-Opener-Policy": "same-origin",
+        },
+      });
+    },
+  });
+}
+
+if (import.meta.main) {
+  const server = startServer();
+  console.log(`ProveKit V1 browser benchmark: ${server.url}`);
+}
diff --git a/benchmarks/v1/wasm/scripts/smoke.ts b/benchmarks/v1/wasm/scripts/smoke.ts
new file mode 100644
index 000000000..e59512cd1
--- /dev/null
+++ b/benchmarks/v1/wasm/scripts/smoke.ts
@@ -0,0 +1,86 @@
+import { mkdtemp, rm } from "node:fs/promises";
+import { tmpdir } from "node:os";
+import { join } from "node:path";
+import { chromium } from "playwright-core";
+import { startRendererRssSampler } from "../../scripts/browser-process-memory";
+import { startServer } from "./server";
+
+const server = startServer();
+const executablePath =
+  process.env.CHROME_PATH ?? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
+const profile = await mkdtemp(join(tmpdir(), "provekit-wasm-chrome-"));
+const context = await chromium.launchPersistentContext(profile, {
+  executablePath,
+  headless: true,
+  args: [
+    "--enable-precise-memory-info",
+    "--js-flags=--max-old-space-size=32768",
+  ],
+});
+
+let sampler: ReturnType | undefined;
+try {
+  const page = context.pages()[0] ?? (await context.newPage());
+  const workload = process.env.MOBENCH_WORKLOAD ?? "webauthn_assertion";
+  const warmup = process.env.MOBENCH_WARMUP ?? "1";
+  const iterations = process.env.MOBENCH_ITERATIONS ?? "5";
+  const timingMode = process.env.MOBENCH_TIMING_MODE ?? "warm_reuse";
+  const wasmThreads = process.env.MOBENCH_WASM_THREADS ?? "single";
+  if (
+    wasmThreads !== "single" &&
+    wasmThreads !== "auto" &&
+    (!/^[0-9]+$/.test(wasmThreads) ||
+      Number.parseInt(wasmThreads, 10) < 2 ||
+      Number.parseInt(wasmThreads, 10) > 32)
+  ) {
+    throw new Error(
+      "MOBENCH_WASM_THREADS must be `single`, `auto`, or an integer from 2 to 32",
+    );
+  }
+  await page.goto(
+    `${server.url}?autorun=1&workload=${encodeURIComponent(workload)}&warmup=${encodeURIComponent(warmup)}&iterations=${encodeURIComponent(iterations)}&timing_mode=${encodeURIComponent(timingMode)}&threads=${encodeURIComponent(wasmThreads)}`,
+  );
+  sampler = startRendererRssSampler(profile);
+  await page.waitForFunction(
+    () => ["complete", "error"].includes(window.__MOBENCH_STATE__?.status),
+    undefined,
+    { timeout: 10 * 60 * 1000 },
+  );
+  const processMemory = await sampler.stop();
+  sampler = undefined;
+  const state = await page.evaluate(() => window.__MOBENCH_STATE__);
+  if (state.status !== "complete") throw new Error(state.error ?? "browser benchmark failed");
+  if (wasmThreads !== "single") {
+    const environment = (
+      state.result as {
+        environment?: { wasm_threads?: boolean; wasm_thread_mode?: string };
+      }
+    ).environment;
+    if (environment?.wasm_threads !== true || environment.wasm_thread_mode !== "rayon_threaded") {
+      throw new Error(
+        `requested threaded ProveKit WASM but runtime reported ${JSON.stringify(environment)}`,
+      );
+    }
+  }
+  console.log(
+    JSON.stringify(
+      {
+        ...(state.result as object),
+        process_memory: processMemory,
+        browser: {
+          name: "Google Chrome",
+          version: context.browser()?.version() ?? "unknown",
+          executable_path: executablePath,
+          headless: true,
+        },
+      },
+      null,
+      2,
+    ),
+  );
+} finally {
+  if (sampler) await sampler.stop();
+  await context.close();
+  server.stop(true);
+  await rm(profile, { recursive: true, force: true });
+}
diff --git a/benchmarks/v1/wasm/src/runner.ts b/benchmarks/v1/wasm/src/runner.ts
new file mode 100644
index 000000000..f95da7a3b
--- /dev/null
+++ b/benchmarks/v1/wasm/src/runner.ts
@@ -0,0 +1,119 @@
+type RunnerStatus = "ready" | "running" | "complete" | "error";
+
+interface RunnerState {
+  status: RunnerStatus;
+  result?: unknown;
+  error?: string;
+}
+
+declare global {
+  interface Window {
+    __MOBENCH_STATE__: RunnerState;
+  }
+}
+
+const form = document.querySelector("#controls");
+const status = document.querySelector("#status");
+const output = document.querySelector("#output");
+const runButton = document.querySelector("#run");
+const warmupInput = document.querySelector("#warmup");
+const iterationsInput = document.querySelector("#iterations");
+const workloadInput = document.querySelector("#workload");
+
+if (
+  !form ||
+  !status ||
+  !output ||
+  !runButton ||
+  !warmupInput ||
+  !iterationsInput ||
+  !workloadInput
+) {
+  throw new Error("benchmark controls are missing");
+}
+
+window.__MOBENCH_STATE__ = { status: "ready" };
+const worker = new Worker(new URL("./worker.js", import.meta.url), { type: "module" });
+
+function setState(state: RunnerState): void {
+  window.__MOBENCH_STATE__ = state;
+  status.textContent =
+    state.status === "running"
+      ? "Running… keep this tab in the foreground."
+      : state.status === "complete"
+        ? "Complete."
+        : state.status === "error"
+          ? `Failed: ${state.error}`
+          : "Ready.";
+  output.textContent = state.result
+    ? JSON.stringify(state.result, null, 2)
+    : state.error ?? "";
+  runButton.disabled = state.status === "running";
+}
+
+function boundedInteger(input: HTMLInputElement, minimum: number, maximum: number): number {
+  const value = Number.parseInt(input.value, 10);
+  if (!Number.isInteger(value) || value < minimum || value > maximum) {
+    throw new Error(`${input.id} must be between ${minimum} and ${maximum}`);
+  }
+  return value;
+}
+
+function run(): void {
+  try {
+    const warmup = boundedInteger(warmupInput, 0, 10);
+    const iterations = boundedInteger(iterationsInput, 1, 20);
+    setState({ status: "running" });
+    const timingMode = new URLSearchParams(location.search).get("timing_mode");
+    const threadQuery = new URLSearchParams(location.search).get("threads") ?? "single";
+    const wasmThreads =
+      threadQuery === "single" || threadQuery === "auto"
+        ? threadQuery
+        : /^\d+$/.test(threadQuery)
+          ? Number.parseInt(threadQuery, 10)
+          : Number.NaN;
+    if (
+      wasmThreads !== "single" &&
+      wasmThreads !== "auto" &&
+      (!Number.isInteger(wasmThreads) || wasmThreads < 2 || wasmThreads > 32)
+    ) {
+      throw new Error("threads must be `single`, `auto`, or an integer from 2 to 32");
+    }
+    worker.postMessage({
+      type: "run",
+      workload: workloadInput.value,
+      warmup,
+      iterations,
+      timing_mode: timingMode === "cold_local" ? "cold_local" : "warm_reuse",
+      wasm_threads: wasmThreads,
+    });
+  } catch (error) {
+    setState({ status: "error", error: error instanceof Error ? error.message : String(error) });
+  }
+}
+
+worker.addEventListener("message", (event: MessageEvent) => {
+  const message = event.data as { type?: string; result?: unknown; error?: string };
+  if (message.type === "complete") {
+    setState({ status: "complete", result: message.result });
+  } else if (message.type === "error") {
+    setState({ status: "error", error: message.error ?? "unknown worker error" });
+  }
+});
+
+worker.addEventListener("error", (event) => {
+  setState({ status: "error", error: event.message });
+});
+
+form.addEventListener("submit", (event) => {
+  event.preventDefault();
+  run();
+});
+
+const query = new URLSearchParams(location.search);
+if (query.get("autorun") === "1") {
+  workloadInput.value = query.get("workload") ?? "webauthn_assertion";
+  warmupInput.value = query.get("warmup") ?? "0";
+  iterationsInput.value = query.get("iterations") ?? "1";
+  run();
+}
diff --git a/benchmarks/v1/wasm/src/worker.ts b/benchmarks/v1/wasm/src/worker.ts
new file mode 100644
index 000000000..41de7bd3f
--- /dev/null
+++ b/benchmarks/v1/wasm/src/worker.ts
@@ -0,0 +1,329 @@
+import { decompressWitness } from "@noir-lang/acvm_js";
+import { Noir } from "@noir-lang/noir_js";
+import initProveKitV1, {
+  initPanicHook,
+  initThreadPool,
+  Prover,
+  Verifier,
+} from "../v1-wasm-pkg/provekit_wasm.js";
+
+type ThreadRequest = "single" | "auto" | number;
+
+interface RunCommand {
+  type: "run";
+  workload: WorkloadName;
+  warmup: number;
+  iterations: number;
+  timing_mode?: "cold_local" | "warm_reuse";
+  /**
+   * `single` preserves the historical V1 measurement. `auto` uses a bounded
+   * worker pool when the page is cross-origin isolated; a numeric value is a
+   * strict request and fails instead of silently becoming a single-thread
+   * measurement when the browser cannot share WASM memory.
+   */
+  wasm_threads?: ThreadRequest;
+}
+
+type WorkloadName = "webauthn_assertion" | "passport_complete_age_check" | "passport_p1" | "oprf_taceo";
+
+interface PhaseSample {
+  iteration: number;
+  warmup: boolean;
+  prepare_time_ms: number;
+  witness_time_ms: number;
+  prove_time_ms: number;
+  verify_time_ms: number;
+  end_to_end_time_ms: number;
+  input_to_proof_time_ms: number;
+  proof_size_bytes: number;
+  tampered_proof_rejected: boolean;
+  js_heap_bytes?: number;
+}
+
+interface PerformanceWithMemory extends Performance {
+  memory?: { usedJSHeapSize?: number };
+}
+
+interface BundleManifest {
+  totals: Record;
+}
+
+interface ThreadRuntime {
+  request: ThreadRequest;
+  requested_threads: number;
+  wasm_threads: boolean;
+  wasm_thread_count: number;
+  wasm_thread_mode: "single" | "rayon_threaded" | "fallback_single";
+  cross_origin_isolated: boolean;
+  shared_array_buffer: boolean;
+  init_thread_pool_available: boolean;
+  hardware_concurrency?: number;
+  fallback_reason?: string;
+}
+
+let runtimeInitialization: Promise | undefined;
+let threadRuntime: ThreadRuntime | undefined;
+
+function threadCapabilities() {
+  const hardwareConcurrency =
+    typeof navigator === "undefined" || !Number.isInteger(navigator.hardwareConcurrency)
+      ? undefined
+      : navigator.hardwareConcurrency;
+  return {
+    crossOriginIsolated: self.crossOriginIsolated === true,
+    sharedArrayBuffer: typeof SharedArrayBuffer !== "undefined",
+    initThreadPoolAvailable: typeof initThreadPool === "function",
+    hardwareConcurrency,
+  };
+}
+
+function requestedThreadCount(request: ThreadRequest): number {
+  if (request === "single") return 1;
+  if (request === "auto") {
+    // Keep the browser campaign deterministic while avoiding an unbounded pool
+    // on high-core-count hosts. A browser that reports one core remains scalar.
+    const hardwareConcurrency = threadCapabilities().hardwareConcurrency ?? 4;
+    return hardwareConcurrency <= 1 ? 1 : Math.min(8, hardwareConcurrency);
+  }
+  if (!Number.isInteger(request) || request < 2 || request > 32) {
+    throw new Error("wasm_threads must be `single`, `auto`, or an integer from 2 to 32");
+  }
+  return request;
+}
+
+async function initializeRuntime(request: ThreadRequest): Promise {
+  if (!runtimeInitialization) {
+    runtimeInitialization = (async () => {
+      await initProveKitV1();
+      initPanicHook();
+    })();
+  }
+  await runtimeInitialization;
+
+  const requestedThreads = requestedThreadCount(request);
+  const capabilities = threadCapabilities();
+  const canUseThreads =
+    requestedThreads > 1 &&
+    capabilities.crossOriginIsolated &&
+    capabilities.sharedArrayBuffer &&
+    capabilities.initThreadPoolAvailable;
+
+  if (threadRuntime) {
+    // wasm-bindgen-rayon owns one global pool per module. Do not allow a page
+    // to report a different thread policy after the pool has been initialized.
+    if (threadRuntime.wasm_thread_count !== (canUseThreads ? requestedThreads : 1)) {
+      throw new Error("WASM thread policy cannot change after runtime initialization");
+    }
+    return threadRuntime;
+  }
+
+  if (requestedThreads > 1 && !canUseThreads && request !== "auto") {
+    const reasons = [
+      !capabilities.crossOriginIsolated && "crossOriginIsolated is false",
+      !capabilities.sharedArrayBuffer && "SharedArrayBuffer is unavailable",
+      !capabilities.initThreadPoolAvailable && "the WASM module has no initThreadPool export",
+    ].filter(Boolean);
+    throw new Error(`threaded WASM requested but unavailable (${reasons.join(", ")})`);
+  }
+
+  if (canUseThreads) {
+    await initThreadPool(requestedThreads);
+    threadRuntime = {
+      request,
+      requested_threads: requestedThreads,
+      wasm_threads: true,
+      wasm_thread_count: requestedThreads,
+      wasm_thread_mode: "rayon_threaded",
+      cross_origin_isolated: capabilities.crossOriginIsolated,
+      shared_array_buffer: capabilities.sharedArrayBuffer,
+      init_thread_pool_available: capabilities.initThreadPoolAvailable,
+      hardware_concurrency: capabilities.hardwareConcurrency,
+    };
+    return threadRuntime;
+  }
+
+  threadRuntime = {
+    request,
+    requested_threads: requestedThreads,
+    wasm_threads: false,
+    wasm_thread_count: 1,
+    wasm_thread_mode: request === "auto" && requestedThreads > 1 ? "fallback_single" : "single",
+    cross_origin_isolated: capabilities.crossOriginIsolated,
+    shared_array_buffer: capabilities.sharedArrayBuffer,
+    init_thread_pool_available: capabilities.initThreadPoolAvailable,
+    hardware_concurrency: capabilities.hardwareConcurrency,
+    ...(request === "auto" && requestedThreads > 1
+      ? {
+          fallback_reason: [
+            !capabilities.crossOriginIsolated && "crossOriginIsolated is false",
+            !capabilities.sharedArrayBuffer && "SharedArrayBuffer is unavailable",
+            !capabilities.initThreadPoolAvailable && "the WASM module has no initThreadPool export",
+          ]
+            .filter(Boolean)
+            .join(", "),
+        }
+      : {}),
+  };
+  return threadRuntime;
+}
+
+function elapsed(start: number): number {
+  return performance.now() - start;
+}
+
+async function fetchBytes(path: string): Promise {
+  const response = await fetch(path, { cache: "no-store" });
+  if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`);
+  return new Uint8Array(await response.arrayBuffer());
+}
+
+async function fetchJson>(path: string): Promise {
+  const response = await fetch(path, { cache: "no-store" });
+  if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`);
+  return (await response.json()) as T;
+}
+
+async function fetchJsonSized>(path: string) {
+  const response = await fetch(path, { cache: "no-store" });
+  if (!response.ok) throw new Error(`failed to fetch ${path}: HTTP ${response.status}`);
+  const bytes = new Uint8Array(await response.arrayBuffer());
+  return { value: JSON.parse(new TextDecoder().decode(bytes)) as T, bytes: bytes.byteLength };
+}
+
+function currentHeapBytes(): number | undefined {
+  return (performance as PerformanceWithMemory).memory?.usedJSHeapSize;
+}
+
+async function runBenchmark(command: RunCommand): Promise {
+  const coldStarted = performance.now();
+  const assetRoot = `/assets/${command.workload}`;
+  const downloadStart = performance.now();
+  const [pkp, pkv, sizedInputs, manifest] = await Promise.all([
+    fetchBytes(`${assetRoot}/${command.workload}.pkp`),
+    fetchBytes(`${assetRoot}/${command.workload}.pkv`),
+    fetchJsonSized(`${assetRoot}/inputs.json`),
+    fetchJson("/manifest.json"),
+  ]);
+  const inputs = sizedInputs.value;
+  const downloadTimeMs = elapsed(downloadStart);
+  const sharedRuntimeBytes = manifest.totals["shared-runtime"];
+  const incrementalCircuitBytes = manifest.totals[command.workload];
+  if (!Number.isSafeInteger(sharedRuntimeBytes) || !Number.isSafeInteger(incrementalCircuitBytes)) {
+    throw new Error(`bundle manifest has no totals for ${command.workload}`);
+  }
+
+  const initStart = performance.now();
+  const runtime = await initializeRuntime(command.wasm_threads ?? "single");
+  const verifier = new Verifier(pkv);
+  const initTimeMs = elapsed(initStart);
+
+  const inspectionProver = new Prover(pkp);
+  const circuitJson = JSON.parse(new TextDecoder().decode(inspectionProver.getCircuit())) as Record;
+  const constraints = inspectionProver.getNumConstraints();
+  const witnesses = inspectionProver.getNumWitnesses();
+  inspectionProver.free();
+  const noir = new Noir(circuitJson);
+
+  const samples: PhaseSample[] = [];
+  for (let run = 0; run < command.warmup + command.iterations; run += 1) {
+    const endToEndStart = command.timing_mode === "cold_local" && run === 0
+      ? coldStarted
+      : performance.now();
+    const prepareStart = performance.now();
+    const prover = new Prover(pkp);
+    const prepareTimeMs = elapsed(prepareStart);
+
+    const witnessStart = performance.now();
+    const execution = await noir.execute(inputs);
+    const witnessMap = decompressWitness(execution.witness);
+    const witnessTimeMs = elapsed(witnessStart);
+    const proveStart = performance.now();
+    const proof = prover.proveBytes(witnessMap);
+    const proveTimeMs = elapsed(proveStart);
+    const inputToProofTimeMs = elapsed(endToEndStart);
+    prover.free();
+
+    const verifyStart = performance.now();
+    verifier.verifyBytes(proof);
+    const verifyTimeMs = elapsed(verifyStart);
+    const tamperedProof = proof.slice();
+    tamperedProof[Math.floor(tamperedProof.byteLength / 2)] ^= 1;
+    let tamperedProofRejected = false;
+    try {
+      verifier.verifyBytes(tamperedProof);
+    } catch {
+      tamperedProofRejected = true;
+    }
+    if (!tamperedProofRejected) throw new Error(`ProveKit accepted a tampered ${command.workload} proof`);
+
+    samples.push({
+      iteration: run < command.warmup ? run : run - command.warmup,
+      warmup: run < command.warmup,
+      prepare_time_ms: command.timing_mode === "cold_local" && run === 0
+        ? inputToProofTimeMs - witnessTimeMs - proveTimeMs
+        : prepareTimeMs,
+      witness_time_ms: witnessTimeMs,
+      prove_time_ms: proveTimeMs,
+      verify_time_ms: verifyTimeMs,
+      end_to_end_time_ms: elapsed(endToEndStart),
+      input_to_proof_time_ms: inputToProofTimeMs,
+      proof_size_bytes: proof.byteLength,
+      tampered_proof_rejected: tamperedProofRejected,
+      js_heap_bytes: currentHeapBytes(),
+    });
+  }
+  verifier.free();
+
+  return {
+    schema_version: 1,
+    benchmark: command.workload,
+    backend: `provekit_v1_branch_9b2a6f_wasm_${runtime.wasm_thread_mode}`,
+    download_time_ms: downloadTimeMs,
+    initialization_time_ms: initTimeMs,
+    artifacts: {
+      prover_bytes: pkp.byteLength,
+      verifier_bytes: pkv.byteLength,
+      input_bytes: sizedInputs.bytes,
+      proving_payload_size_bytes: pkp.byteLength + sizedInputs.bytes,
+    },
+    bundle: {
+      shared_runtime_bytes: sharedRuntimeBytes,
+      incremental_circuit_bytes: incrementalCircuitBytes,
+      cold_download_bytes: sharedRuntimeBytes + incrementalCircuitBytes,
+    },
+    circuit: { constraints, witnesses },
+    environment: {
+      user_agent: navigator.userAgent,
+      hardware_concurrency: navigator.hardwareConcurrency,
+      cross_origin_isolated: runtime.cross_origin_isolated,
+      shared_array_buffer: runtime.shared_array_buffer,
+      init_thread_pool_available: runtime.init_thread_pool_available,
+      wasm_threads: runtime.wasm_threads,
+      wasm_thread_count: runtime.wasm_thread_count,
+      wasm_thread_mode: runtime.wasm_thread_mode,
+      wasm_thread_request: runtime.request,
+      ...(runtime.fallback_reason ? { wasm_thread_fallback_reason: runtime.fallback_reason } : {}),
+      memory_metric: currentHeapBytes() === undefined ? "unavailable" : "chromium-used-js-heap-not-process-rss",
+    },
+    warmup: command.warmup,
+    iterations: command.iterations,
+    timing_mode: command.timing_mode ?? "warm_reuse",
+    samples,
+  };
+}
+
+self.addEventListener("message", async (event: MessageEvent) => {
+  if (event.data.type !== "run") return;
+  try {
+    self.postMessage({ type: "complete", result: await runBenchmark(event.data) });
+  } catch (error) {
+    const details: string[] = [];
+    let current: unknown = error;
+    while (current instanceof Error) {
+      details.push(`${current.name}: ${current.message}\n${current.stack ?? ""}`);
+      current = current.cause;
+    }
+    if (current !== undefined) details.push(String(current));
+    self.postMessage({ type: "error", error: details.join("\nCaused by:\n") || String(error) });
+  }
+});
diff --git a/benchmarks/v1/wasm/vite.config.ts b/benchmarks/v1/wasm/vite.config.ts
new file mode 100644
index 000000000..2e7cc457b
--- /dev/null
+++ b/benchmarks/v1/wasm/vite.config.ts
@@ -0,0 +1,21 @@
+import { defineConfig } from "vite";
+
+export default defineConfig({
+  base: "./",
+  build: {
+    outDir: "dist",
+    emptyOutDir: false,
+    rollupOptions: {
+      input: {
+        runner: "src/runner.ts",
+        worker: "src/worker.ts",
+      },
+      output: {
+        entryFileNames: "[name].js",
+      },
+    },
+  },
+  worker: {
+    format: "es",
+  },
+});
diff --git a/mobench.toml b/mobench.toml
index 4f9d7f7a0..1d15ae1ee 100644
--- a/mobench.toml
+++ b/mobench.toml
@@ -7,7 +7,7 @@ ffi_backend = "native-c-abi"
 package = "dev.world.benchmobile"
 min_sdk = 24
 target_sdk = 34
-abis = ["arm64-v8a"]
+abis = ["arm64-v8a", "armeabi-v7a"]
 
 [ios]
 bundle_id = "dev.world.benchmobile"