From f7f842bba7b9e96d58398781480d2ca11abc46bf Mon Sep 17 00:00:00 2001 From: MauroFab Date: Wed, 25 Feb 2026 19:00:35 -0300 Subject: [PATCH 01/14] bench vs others --- .gitignore | 1 + bench_vs/README.md | 59 + bench_vs/run.sh | 195 + bench_vs/sp1/fibonacci/.tldr/daemon.pid | 1 + bench_vs/sp1/fibonacci/.tldr/status | 1 + bench_vs/sp1/fibonacci/.tldrignore | 84 + bench_vs/sp1/fibonacci/Cargo.lock | 6182 ++++++++++++++++++++ bench_vs/sp1/fibonacci/Cargo.toml | 3 + bench_vs/sp1/fibonacci/program/Cargo.toml | 7 + bench_vs/sp1/fibonacci/program/src/main.rs | 14 + bench_vs/sp1/fibonacci/rust-toolchain | 3 + bench_vs/sp1/fibonacci/script/Cargo.toml | 10 + bench_vs/sp1/fibonacci/script/build.rs | 5 + bench_vs/sp1/fibonacci/script/src/main.rs | 47 + 14 files changed, 6612 insertions(+) create mode 100644 bench_vs/README.md create mode 100755 bench_vs/run.sh create mode 100644 bench_vs/sp1/fibonacci/.tldr/daemon.pid create mode 100644 bench_vs/sp1/fibonacci/.tldr/status create mode 100644 bench_vs/sp1/fibonacci/.tldrignore create mode 100644 bench_vs/sp1/fibonacci/Cargo.lock create mode 100644 bench_vs/sp1/fibonacci/Cargo.toml create mode 100644 bench_vs/sp1/fibonacci/program/Cargo.toml create mode 100644 bench_vs/sp1/fibonacci/program/src/main.rs create mode 100644 bench_vs/sp1/fibonacci/rust-toolchain create mode 100644 bench_vs/sp1/fibonacci/script/Cargo.toml create mode 100644 bench_vs/sp1/fibonacci/script/build.rs create mode 100644 bench_vs/sp1/fibonacci/script/src/main.rs diff --git a/.gitignore b/.gitignore index 9c826f0d9..3ef9f8283 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ executor/program_artifacts/ # Shared cargo target directory for ELF builds executor/shared_target/ + diff --git a/bench_vs/README.md b/bench_vs/README.md new file mode 100644 index 000000000..0a20304c3 --- /dev/null +++ b/bench_vs/README.md @@ -0,0 +1,59 @@ +# Lambda VM vs SP1 v6 Benchmark + +Compares proving time for an identical u64 wrapping Fibonacci computation. + +## Prerequisites + +1. **Lambda VM CLI** (built from this repo): + ```bash + cargo build --release -p cli + ``` + +2. **SP1 toolchain** (Succinct's prover): + ```bash + curl -L https://sp1up.succinct.xyz | bash + sp1up + ``` + +3. **RISC-V assembler** — Homebrew clang + ld.lld (macOS): + ```bash + brew install llvm + ``` + +## Usage + +```bash +# Default series: 1k, 10k, 100k, 300k iterations +./bench_vs/run.sh + +# Custom series +./bench_vs/run.sh -n 1000 50000 + +# Run only one prover +./bench_vs/run.sh --lambda-only +./bench_vs/run.sh --sp1-only +``` + +## What it measures + +Both provers execute the same program: iterative Fibonacci with `u64::wrapping_add`. +Only **proving time** is compared (wall-clock, no recursion/compression on either side). + +- **Lambda VM**: Generates RISC-V assembly at runtime, assembles to ELF, proves via the CLI. +- **SP1 v6**: Compiles a Rust guest program to RISC-V, proves via `sp1-sdk` core mode. + +## Output + +``` +=== Summary === +Program: Fibonacci (u64 wrapping) + + n Lambda VM SP1 v6 Ratio + --- --------- ------ ----- + 1000 13.3s 12.4s 0.9x + 10000 22.4s 12.9s 0.6x + 100000 116.4s 14.7s 0.1x + 300000 ... ... ... + +Green ratio = Lambda VM faster, Red = SP1 faster +``` diff --git a/bench_vs/run.sh b/bench_vs/run.sh new file mode 100755 index 000000000..1575e62a3 --- /dev/null +++ b/bench_vs/run.sh @@ -0,0 +1,195 @@ +#!/bin/bash +# Benchmark: Lambda VM vs SP1 v6 — Fibonacci proving time comparison. +# +# Usage: ./bench_vs/run.sh [-n 1000 50000 100000] [--lambda-only | --sp1-only] +# +# Without -n, runs the default series: 1000 10000 100000 300000 +# With -n, runs the specified values (space-separated): -n 1000 50000 +# +# Prerequisites: +# - Lambda VM CLI built: cargo build --release -p cli +# - SP1 toolchain installed: curl -L https://sp1up.succinct.xyz | bash && sp1up +# - clang with RISC-V target support (macOS Homebrew clang works) +# - ld.lld linker + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +TMP_DIR="/tmp/bench_fib" + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BOLD='\033[1m' +NC='\033[0m' + +# --- Defaults ---------------------------------------------------------------- +DEFAULT_SERIES=(1000 10000 100000 300000) +SERIES=() +RUN_LAMBDA=true +RUN_SP1=true + +# --- Parse args -------------------------------------------------------------- +while [[ $# -gt 0 ]]; do + case $1 in + -n) shift + while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do + SERIES+=("$1"); shift + done ;; + --lambda-only) RUN_SP1=false; shift ;; + --sp1-only) RUN_LAMBDA=false; shift ;; + -h|--help) + echo "Usage: $0 [-n N1 N2 ...] [--lambda-only | --sp1-only]" + echo "" + echo " -n N1 N2 ... Fibonacci iteration counts (space-separated)" + echo " Default series: ${DEFAULT_SERIES[*]}" + echo " --lambda-only Only run Lambda VM benchmark" + echo " --sp1-only Only run SP1 benchmark" + exit 0 + ;; + *) echo "Unknown option: $1"; exit 1 ;; + esac +done + +if [ ${#SERIES[@]} -eq 0 ]; then + SERIES=("${DEFAULT_SERIES[@]}") +fi + +echo -e "${BOLD}=== Fibonacci Benchmark: Lambda VM vs SP1 v6 ===${NC}" +echo -e "Series: ${YELLOW}${SERIES[*]}${NC}" +echo "" + +rm -rf "$TMP_DIR" && mkdir -p "$TMP_DIR" + +# --- Pre-build --------------------------------------------------------------- + +CLI="$ROOT_DIR/target/release/cli" +if $RUN_LAMBDA && [ ! -f "$CLI" ]; then + echo -e "${YELLOW}[Lambda VM] CLI not found, building...${NC}" + cargo build --release -p cli --manifest-path "$ROOT_DIR/Cargo.toml" 2>&1 | tail -1 +fi + +SP1_BIN="" +if $RUN_SP1; then + SP1_DIR="$SCRIPT_DIR/sp1/fibonacci" + echo -e "${GREEN}[SP1 v6] Building fibonacci prover...${NC}" + (cd "$SP1_DIR" && cargo build --release 2>&1 | tail -5) + SP1_BIN="$SP1_DIR/target/release/fibonacci-script" + if [ ! -f "$SP1_BIN" ]; then + echo -e "${RED}[SP1 v6] Build failed — fibonacci-script binary not found${NC}" + exit 1 + fi +fi + +# --- Run one benchmark -------------------------------------------------------- + +# Arrays to collect results for the summary table +declare -a RESULT_N RESULT_LAMBDA RESULT_SP1 + +run_one() { + local N=$1 + echo "" + echo -e "${BOLD}--- n=${N} ---${NC}" + + local lambda_time="" + local sp1_time="" + local sp1_cycles="" + + if $RUN_LAMBDA; then + # Generate assembly + cat > "$TMP_DIR/fib.s" </dev/null) + lambda_time=$(echo "$LAMBDA_OUTPUT" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') + echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" + fi + + if $RUN_SP1; then + echo -e " ${GREEN}[SP1 v6] Proving...${NC}" + SP1_OUTPUT=$("$SP1_BIN" "$N" 2>/dev/null) + sp1_time=$(echo "$SP1_OUTPUT" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') + sp1_cycles=$(echo "$SP1_OUTPUT" | grep -o 'Cycles: [0-9]*' | grep -o '[0-9]*') + echo -e " SP1 v6: ${BOLD}${sp1_time}s${NC} (${sp1_cycles} cycles)" + fi + + RESULT_N+=("$N") + RESULT_LAMBDA+=("${lambda_time:-n/a}") + RESULT_SP1+=("${sp1_time:-n/a}") +} + +# --- Run series --------------------------------------------------------------- + +for N in "${SERIES[@]}"; do + run_one "$N" +done + +# --- Summary table ------------------------------------------------------------ + +echo "" +echo -e "${BOLD}=== Summary ===${NC}" +echo -e "Program: Fibonacci (u64 wrapping)" +echo "" + +# Header +if $RUN_LAMBDA && $RUN_SP1; then + printf " %-10s %12s %12s %8s\n" "n" "Lambda VM" "SP1 v6" "Ratio" + printf " %-10s %12s %12s %8s\n" "---" "---------" "------" "-----" +elif $RUN_LAMBDA; then + printf " %-10s %12s\n" "n" "Lambda VM" + printf " %-10s %12s\n" "---" "---------" +else + printf " %-10s %12s\n" "n" "SP1 v6" + printf " %-10s %12s\n" "---" "------" +fi + +for i in "${!RESULT_N[@]}"; do + n="${RESULT_N[$i]}" + lt="${RESULT_LAMBDA[$i]}" + st="${RESULT_SP1[$i]}" + + if $RUN_LAMBDA && $RUN_SP1; then + if [ "$lt" != "n/a" ] && [ "$st" != "n/a" ]; then + RATIO=$(LC_NUMERIC=C awk "BEGIN {printf \"%.1fx\", $st / $lt}") + if (( $(LC_NUMERIC=C awk "BEGIN {print ($st > $lt)}") )); then + RATIO="${GREEN}${RATIO}${NC}" + else + RATIO="${RED}${RATIO}${NC}" + fi + printf " %-10s %11ss %11ss " "$n" "$lt" "$st" + echo -e "$RATIO" + else + printf " %-10s %12s %12s %8s\n" "$n" "${lt}s" "${st}s" "-" + fi + elif $RUN_LAMBDA; then + printf " %-10s %11ss\n" "$n" "$lt" + else + printf " %-10s %11ss\n" "$n" "$st" + fi +done + +echo "" +echo -e "Green ratio = Lambda VM faster, Red = SP1 faster" +echo "Raw data in $TMP_DIR/" diff --git a/bench_vs/sp1/fibonacci/.tldr/daemon.pid b/bench_vs/sp1/fibonacci/.tldr/daemon.pid new file mode 100644 index 000000000..10eda36c4 --- /dev/null +++ b/bench_vs/sp1/fibonacci/.tldr/daemon.pid @@ -0,0 +1 @@ +39495 \ No newline at end of file diff --git a/bench_vs/sp1/fibonacci/.tldr/status b/bench_vs/sp1/fibonacci/.tldr/status new file mode 100644 index 000000000..ad50b5340 --- /dev/null +++ b/bench_vs/sp1/fibonacci/.tldr/status @@ -0,0 +1 @@ +ready \ No newline at end of file diff --git a/bench_vs/sp1/fibonacci/.tldrignore b/bench_vs/sp1/fibonacci/.tldrignore new file mode 100644 index 000000000..e01df83cb --- /dev/null +++ b/bench_vs/sp1/fibonacci/.tldrignore @@ -0,0 +1,84 @@ +# TLDR ignore patterns (gitignore syntax) +# Auto-generated - review and customize for your project +# Docs: https://git-scm.com/docs/gitignore + +# =================== +# Dependencies +# =================== +node_modules/ +.venv/ +venv/ +env/ +__pycache__/ +.tox/ +.nox/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +vendor/ +Pods/ + +# =================== +# Build outputs +# =================== +dist/ +build/ +out/ +target/ +*.egg-info/ +*.whl +*.pyc +*.pyo + +# =================== +# Binary/large files +# =================== +*.so +*.dylib +*.dll +*.exe +*.bin +*.o +*.a +*.lib + +# =================== +# IDE/editors +# =================== +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# =================== +# Security (always exclude) +# =================== +.env +.env.* +*.pem +*.key +*.p12 +*.pfx +credentials.* +secrets.* + +# =================== +# Version control +# =================== +.git/ +.hg/ +.svn/ + +# =================== +# OS files +# =================== +.DS_Store +Thumbs.db + +# =================== +# Project-specific +# Add your custom patterns below +# =================== +# large_test_fixtures/ +# data/ diff --git a/bench_vs/sp1/fibonacci/Cargo.lock b/bench_vs/sp1/fibonacci/Cargo.lock new file mode 100644 index 000000000..8825cad2e --- /dev/null +++ b/bench_vs/sp1/fibonacci/Cargo.lock @@ -0,0 +1,6182 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[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 = "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 = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +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.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std", + "digest", + "num-bigint 0.4.6", +] + +[[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.5", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-scoped" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4042078ea593edffc452eef14e99fdb2b120caa4ad9618bcdeabc4a023b98740" +dependencies = [ + "futures", + "pin-project", + "tokio", +] + +[[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.117", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower 0.5.3", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[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", + "serde", + "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 = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.117", +] + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[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", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.9", +] + +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "ff 0.12.1", + "group 0.12.1", + "pairing", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +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.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "clap_lex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.2", + "windows-sys 0.59.0", +] + +[[package]] +name = "const-default" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +dependencies = [ + "const_format_proc_macros", +] + +[[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 = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "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 0.14.9", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.9", + "typenum", +] + +[[package]] +name = "dashu" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b3e5ac1e23ff1995ef05b912e2b012a8784506987a2651552db2c73fb3d7e0" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-macros", + "dashu-ratio", + "rustversion", +] + +[[package]] +name = "dashu-base" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b80bf6b85aa68c58ffea2ddb040109943049ce3fbdf4385d0380aef08ef289" + +[[package]] +name = "dashu-float" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85078445a8dbd2e1bd21f04a816f352db8d333643f0c9b78ca7c3d1df71063e7" +dependencies = [ + "dashu-base", + "dashu-int", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-int" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee99d08031ca34a4d044efbbb21dff9b8c54bb9d8c82a189187c0651ffdb9fbf" +dependencies = [ + "cfg-if", + "dashu-base", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93381c3ef6366766f6e9ed9cf09e4ef9dec69499baf04f0c60e70d653cf0ab10" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-ratio", + "paste", + "proc-macro2", + "quote", + "rustversion", +] + +[[package]] +name = "dashu-ratio" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e33b04dd7ce1ccf8a02a69d3419e354f2bbfdf4eb911a0b7465487248764c9" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "num-modular", + "num-order", + "rustversion", +] + +[[package]] +name = "deepsize2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b5184084af9beed35eecbf4c36baf6e26b9dc47b61b74e02f930c72a58e71b" +dependencies = [ + "deepsize_derive2", + "hashbrown 0.14.5", +] + +[[package]] +name = "deepsize_derive2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f8817865cacf3b93b943ca06b0fc5fd8e99eabfdb7ea5d296efcbc4afc4f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "downloader" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac1e888d6830712d565b2f3a974be3200be9296bc1b03db8251a4cbf18a4a34" +dependencies = [ + "digest", + "futures", + "rand 0.8.5", + "reqwest", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "dynasm" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7d4c414c94bc830797115b8e5f434d58e7e80cb42ba88508c14bc6ea270625" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dynasmrt" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "602f7458a3859195fb840e6e0cce5f4330dd9dfbfece0edaf31fe427af346f55" +dependencies = [ + "byteorder", + "dynasm", + "fnv", + "memmap2", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[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", + "ff 0.13.1", + "generic-array 0.14.9", + "group 0.13.0", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f2de9133f68db0d4627ad69db767726c99ff8585272716708227008d3f1bddd" +dependencies = [ + "const-default", + "critical-section", + "linked_list_allocator", + "rlsf", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom", + "pin-project-lite", +] + +[[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.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "byteorder", + "ff_derive", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f10d12652036b0e99197587c6ba87a8fc3031986499973c030d8b44fcc151b60" +dependencies = [ + "addchain", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fibonacci-program" +version = "0.1.0" +dependencies = [ + "sp1-zkvm", +] + +[[package]] +name = "fibonacci-script" +version = "0.1.0" +dependencies = [ + "sp1-build", + "sp1-sdk", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[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 = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "gen_ops" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304de19db7028420975a296ab0fcbbc8e69438c4ed254a1e41e2a7f37d5f0e0a" + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "serde", + "typenum", +] + +[[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", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "memuse", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core 0.6.4", + "rayon", +] + +[[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" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[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 = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +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 = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[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 0.6.2", + "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 0.62.2", +] + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[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.117", +] + +[[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", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width 0.2.2", + "web-time", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "js-sys" +version = "0.3.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dc6f6450b3f6d4ed5b16327f38fed626d375a886159ca555bd7822c0c3a5a6" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jubjub" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" +dependencies = [ + "bitvec", + "bls12_381", + "ff 0.12.1", + "group 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[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", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[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.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[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.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "linked_list_allocator" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[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.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memfd" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +dependencies = [ + "rustix", +] + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memuse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[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", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mti" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9563a7d5556636e74bbd8773241fbcbc5c89b9f6bfdc97b29b56e740c2c74b9" +dependencies = [ + "typeid_prefix", + "typeid_suffix", +] + +[[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 = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[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" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[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-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "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 = "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.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opentelemetry" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror 1.0.69", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[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", +] + +[[package]] +name = "p3-air" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d275c27bb81483d669709d7244ce333b51f9743af2474cdc09ba1509f5c290db" +dependencies = [ + "p3-field", + "p3-matrix", + "serde", +] + +[[package]] +name = "p3-baby-bear" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a083928c9055f2171e3cb0bb4767969e4955473e71ba61affe46d7a3c98a89" +dependencies = [ + "num-bigint 0.4.6", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-bn254-fr" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9abf208fbfe540d6e2a6caaa2a9a345b1c8cb23ffdcdfcc6987244525d4fc821" +dependencies = [ + "ff 0.13.1", + "num-bigint 0.4.6", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-challenger" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b725b453bbb35117a1abf0ddfd900b0676063d6e4231e0fa6bb0d76018d8ad" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-commit" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518695b56f450f9223bdd8994dda87916b97ebf1d1c03c956807e78522fdb333" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-field", + "p3-matrix", + "p3-util", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56a1f81101bff744b7ebba7f4497e917a2c6716d6e62736e4a56e555a2d98cb7" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36459d4acb03d08097d713f336c7393990bb489ab19920d4f68658c7a5c10968" +dependencies = [ + "itertools 0.12.1", + "num-bigint 0.4.6", + "num-traits", + "p3-util", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-fri" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2529a174a04189cfe705d756fb0e33d3c8fb06b167b521ddb877c78407f12a" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-interpolation", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-interpolation" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662049877c802155cdb4863db59899469fc3565d22d9047e1bd22d6b71f28e5" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-util", +] + +[[package]] +name = "p3-keccak-air" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "169c96f8f0aaa9042872fdb6bbae0477fd1363b87c23877dbb2ec7fb46f8fcfa" +dependencies = [ + "p3-air", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-koala-bear" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1f52bcb6be38bdc8fa6b38b3434d4eedd511f361d4249fd798c6a5ef817b40" +dependencies = [ + "num-bigint 0.4.6", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5583e9cd136a4095a25c41a9edfdcce2dfae58ef01639317813bdbbd5b55c583" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e524d47a49fb4265611303339c4ef970d892817b006cc330dad18afb91e411b1" +dependencies = [ + "rayon", +] + +[[package]] +name = "p3-mds" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f6cb8edcb276033d43769a3725570c340d2ed6f35c3cca4cddeee07718fa376" +dependencies = [ + "itertools 0.12.1", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand 0.8.5", +] + +[[package]] +name = "p3-merkle-tree" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e8bc3c224fc70d22f9556393e1482b52539e11c7b82ac6933c436fd82738f4" +dependencies = [ + "itertools 0.12.1", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-poseidon2" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a26197df2097b98ab7038d59a01e1fe1a0f545e7e04aa9436b2454b1836654f" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a1d3b5202096bca57cde912fbbb9cbaedaf5ac7c42a924c7166b98709d64d21" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "serde", +] + +[[package]] +name = "p3-uni-stark" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef1cdb8285a7adb78df991852d3b66d3b25cf6ffc34f528505d1aee49bdb968" +dependencies = [ + "itertools 0.12.1", + "p3-air", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-util" +version = "0.3.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec5f0388aa6d935ca3a17444086120f393f0b2f0816010b5ff95998c1c4095e3" +dependencies = [ + "serde", +] + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", +] + +[[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 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.1", + "group 0.13.0", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[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 = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap 2.13.0", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[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 = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +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.117", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "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", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.117", + "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.117", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2 0.6.2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +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 = "range-set-blaze" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8421b5d459262eabbe49048d362897ff3e3830b44eac6cfe341d6acb2f0f13d2" +dependencies = [ + "gen_ops", + "itertools 0.12.1", + "num-integer", + "num-traits", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rayon-scan" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f87cc11a0140b4b0da0ffc889885760c61b13672d80a908920b2c0df078fa14" +dependencies = [ + "rayon", +] + +[[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 = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[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-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", + "tokio-util", + "tower 0.5.3", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] + +[[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 = "rlsf" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1646a59a9734b8b7a0ac51689388a60fe1625d4b956348e9de07591a1478457a" +dependencies = [ + "cfg-if", + "const-default", + "libc", + "rustversion", + "svgbobdoc", +] + +[[package]] +name = "rrs-succinct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd079cd303257a4cb4e5aadfa79a7fe23f3c8301aa4740ccc3a99673485a352" +dependencies = [ + "downcast-rs", + "num_enum", + "paste", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[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.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.9", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_arrays" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a16b99c5ea4fe3daccd14853ad260ec00ea043b2708d1fd1da3106dcd8d9df" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "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 = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "serial_test" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f" +dependencies = [ + "futures-executor", + "futures-util", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[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 = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[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 = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slop-air" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c27279ff5aa6177ad08fd2bcde31f34fc98ea633666a835a4fad3502824dce26" +dependencies = [ + "p3-air", +] + +[[package]] +name = "slop-algebra" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1d38320f4622a9f07907b8529d031066a75a6e741ea2ef17ed1e16047f5bd77" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "serde", +] + +[[package]] +name = "slop-alloc" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51cdc27df6c9fe163f68b724d2b00b4edd24e66bf38a06e7bc473e50e36c3799" +dependencies = [ + "serde", + "slop-algebra", + "thiserror 1.0.69", +] + +[[package]] +name = "slop-baby-bear" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3500e0ad37b85d0dfd792c59615abe9741fe519c78bdc3928dc3fbbab57c2b5b" +dependencies = [ + "lazy_static", + "p3-baby-bear", + "serde", + "slop-algebra", + "slop-challenger", + "slop-poseidon2", + "slop-symmetric", +] + +[[package]] +name = "slop-basefold" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc3d75bc5651b46f135ac04140fefa4a9a4143440edcccc1e9d8e4d3dd05715" +dependencies = [ + "derive-where", + "itertools 0.14.0", + "serde", + "slop-algebra", + "slop-alloc", + "slop-baby-bear", + "slop-bn254", + "slop-challenger", + "slop-koala-bear", + "slop-merkle-tree", + "slop-multilinear", + "slop-primitives", + "slop-tensor", + "slop-utils", + "thiserror 1.0.69", +] + +[[package]] +name = "slop-basefold-prover" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17834564e6d40554b7a635db4fb8cfd61a19f7cc3438549d53b40a4e9e157b1f" +dependencies = [ + "derive-where", + "itertools 0.14.0", + "rand 0.8.5", + "serde", + "slop-algebra", + "slop-alloc", + "slop-baby-bear", + "slop-basefold", + "slop-bn254", + "slop-challenger", + "slop-commit", + "slop-dft", + "slop-fri", + "slop-futures", + "slop-koala-bear", + "slop-merkle-tree", + "slop-multilinear", + "slop-tensor", + "thiserror 1.0.69", +] + +[[package]] +name = "slop-bn254" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cb09414adf73264281cf490e2bd23be7d28415e4e729a275029ebc1a0acf6a" +dependencies = [ + "ff 0.13.1", + "p3-bn254-fr", + "serde", + "slop-algebra", + "slop-challenger", + "slop-poseidon2", + "slop-symmetric", + "zkhash", +] + +[[package]] +name = "slop-challenger" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae2cad21ea894c614166f48dce58135be2aa13ab04971cbe6e31b85ad9902" +dependencies = [ + "futures", + "p3-challenger", + "serde", + "slop-algebra", + "slop-symmetric", +] + +[[package]] +name = "slop-commit" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0ed38f216999ad9211f384f59d20ff0f70b88010a2856b7e0dde4d23b8cde8" +dependencies = [ + "p3-commit", + "serde", + "slop-alloc", +] + +[[package]] +name = "slop-dft" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9211d3c0ff3794563ffc7c3ffa3a5cde8becee5f6e831fb94552a607e320fd23" +dependencies = [ + "p3-dft", + "serde", + "slop-algebra", + "slop-alloc", + "slop-matrix", + "slop-tensor", +] + +[[package]] +name = "slop-fri" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c90e0689aa9b4f67700d6a100fd02e6e0f17de1eb806bb78e2074462b7b6201" +dependencies = [ + "p3-fri", +] + +[[package]] +name = "slop-futures" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e68c32cc3be82a37b69af3d1e4effb509839d9c2fab7457c41c3d50dd32a842e" +dependencies = [ + "crossbeam", + "futures", + "pin-project", + "rayon", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "slop-jagged" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bce3113032254921bef5e071216f35519ea08730a1f44f2ade4be7e0c305631a" +dependencies = [ + "derive-where", + "futures", + "itertools 0.14.0", + "num_cpus", + "rand 0.8.5", + "rayon", + "serde", + "slop-algebra", + "slop-alloc", + "slop-baby-bear", + "slop-basefold", + "slop-basefold-prover", + "slop-bn254", + "slop-challenger", + "slop-commit", + "slop-futures", + "slop-koala-bear", + "slop-merkle-tree", + "slop-multilinear", + "slop-stacked", + "slop-sumcheck", + "slop-symmetric", + "slop-tensor", + "slop-utils", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "slop-keccak-air" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bef24890c8a39c8caf484afa97060c41466455f9102283902ff68bbfd7f841" +dependencies = [ + "p3-keccak-air", +] + +[[package]] +name = "slop-koala-bear" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f80eb2a075f550c7e9abed16e03c727f54108f587a465d023ec810100a70f" +dependencies = [ + "lazy_static", + "p3-koala-bear", + "serde", + "slop-algebra", + "slop-challenger", + "slop-poseidon2", + "slop-symmetric", +] + +[[package]] +name = "slop-matrix" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba089c19d768cc452b511f754958254892caed33d7a8d744ffc67377111e4908" +dependencies = [ + "p3-matrix", +] + +[[package]] +name = "slop-maybe-rayon" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e968db301ffe72ca69fe7a8b61e0f5f8d3b22a12475c5c9b99141e60ad8956d" +dependencies = [ + "p3-maybe-rayon", +] + +[[package]] +name = "slop-merkle-tree" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f2721f11f0242bcc36e3cdc70cf31fdbb936b2731f1d059929b436fe002fa8" +dependencies = [ + "derive-where", + "ff 0.13.1", + "itertools 0.14.0", + "p3-merkle-tree", + "serde", + "slop-algebra", + "slop-alloc", + "slop-baby-bear", + "slop-bn254", + "slop-challenger", + "slop-commit", + "slop-futures", + "slop-koala-bear", + "slop-matrix", + "slop-poseidon2", + "slop-symmetric", + "slop-tensor", + "thiserror 1.0.69", + "zkhash", +] + +[[package]] +name = "slop-multilinear" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf5d26d5fc7751af8de644225f51c178e2af42e2b762496ba9a00fc65677617d" +dependencies = [ + "derive-where", + "futures", + "num_cpus", + "rand 0.8.5", + "rayon", + "serde", + "slop-algebra", + "slop-alloc", + "slop-challenger", + "slop-commit", + "slop-futures", + "slop-matrix", + "slop-tensor", +] + +[[package]] +name = "slop-poseidon2" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f26080f555f777867a68eb18fa34d7c321e9f0250ace86ef3f0cb0151157133" +dependencies = [ + "p3-poseidon2", +] + +[[package]] +name = "slop-primitives" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a606113e4aac9024483e283ab6ef7afc4ebd5d5ca0915b713f8d1d23aa1687bd" +dependencies = [ + "slop-algebra", +] + +[[package]] +name = "slop-stacked" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f807203f2d5505ab4b6f44a99d575aaf0d46a39b16af42397b310063667ee8" +dependencies = [ + "derive-where", + "futures", + "itertools 0.14.0", + "serde", + "slop-algebra", + "slop-alloc", + "slop-basefold", + "slop-basefold-prover", + "slop-challenger", + "slop-commit", + "slop-futures", + "slop-merkle-tree", + "slop-multilinear", + "slop-tensor", + "thiserror 1.0.69", +] + +[[package]] +name = "slop-sumcheck" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4045fc34ee3aef98a67baf650bc462327bbc95ca69e0265ba56f9b6cfc2515b" +dependencies = [ + "futures", + "itertools 0.14.0", + "rayon", + "serde", + "slop-algebra", + "slop-alloc", + "slop-baby-bear", + "slop-challenger", + "slop-multilinear", + "thiserror 1.0.69", +] + +[[package]] +name = "slop-symmetric" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eb38a05aacd00d2362bb5f51c00f3e9cb82b7091d7b862ac239171d5a3dcad4" +dependencies = [ + "p3-symmetric", +] + +[[package]] +name = "slop-tensor" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba4b24bc6985c0215c459e723228c0da10a7b35541c8ccb1b533146d49df49f" +dependencies = [ + "arrayvec", + "derive-where", + "itertools 0.14.0", + "rand 0.8.5", + "rayon", + "serde", + "slop-algebra", + "slop-alloc", + "slop-futures", + "slop-matrix", + "thiserror 1.0.69", + "transpose", +] + +[[package]] +name = "slop-uni-stark" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f7e27e2c06b9504dbb5eb3cbee929b651f9da6ea5112dd4004ce1cc3b8e586" +dependencies = [ + "p3-uni-stark", +] + +[[package]] +name = "slop-utils" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b2e9bd1717e7848d44ce8f5d3eb92209c658a0e934b02af7a5dad4f70271a6" +dependencies = [ + "p3-util", + "tracing-forest", + "tracing-subscriber", +] + +[[package]] +name = "slop-whir" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1393446116ca30b7685a5ca9bb50bb9095b8074bdd63941a8d64b3c22cc14a8" +dependencies = [ + "derive-where", + "futures", + "itertools 0.14.0", + "rand 0.8.5", + "rayon", + "serde", + "slop-algebra", + "slop-alloc", + "slop-baby-bear", + "slop-basefold", + "slop-challenger", + "slop-commit", + "slop-dft", + "slop-jagged", + "slop-koala-bear", + "slop-matrix", + "slop-merkle-tree", + "slop-multilinear", + "slop-stacked", + "slop-tensor", + "slop-utils", + "thiserror 1.0.69", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "snowbridge-amcl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "sp1-build" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c469c584f9a1f0f7a64283c94c074d1edb0446a2ff76a7f60f7e4ce804f4b2c" +dependencies = [ + "anyhow", + "cargo_metadata", + "chrono", + "clap", + "dirs", + "sp1-primitives", +] + +[[package]] +name = "sp1-core-executor" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3d6a58470da2280a8bf14457721b1f560e4d0b8e67c1067e1ce78fdcc5fde3" +dependencies = [ + "bincode", + "bytemuck", + "cfg-if", + "clap", + "deepsize2", + "elf", + "enum-map", + "eyre", + "hashbrown 0.14.5", + "hex", + "itertools 0.14.0", + "memmap2", + "num", + "rrs-succinct", + "serde", + "serde_arrays", + "serde_json", + "slop-air", + "slop-algebra", + "slop-maybe-rayon", + "slop-symmetric", + "sp1-curves", + "sp1-hypercube", + "sp1-jit", + "sp1-primitives", + "strum", + "subenum", + "thiserror 1.0.69", + "tiny-keccak", + "tracing", + "typenum", + "vec_map", +] + +[[package]] +name = "sp1-core-machine" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7704a5542a77a0b98e483bd87256362658a91b7b70a6864c5c2c92fbbc7a5a71" +dependencies = [ + "bincode", + "cfg-if", + "enum-map", + "futures", + "generic-array 1.1.0", + "hashbrown 0.14.5", + "itertools 0.14.0", + "num", + "num_cpus", + "rayon", + "rayon-scan", + "rrs-succinct", + "serde", + "serde_json", + "slop-air", + "slop-algebra", + "slop-challenger", + "slop-futures", + "slop-keccak-air", + "slop-matrix", + "slop-maybe-rayon", + "slop-uni-stark", + "snowbridge-amcl", + "sp1-core-executor", + "sp1-curves", + "sp1-derive", + "sp1-hypercube", + "sp1-jit", + "sp1-primitives", + "static_assertions", + "strum", + "sysinfo", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-forest", + "tracing-subscriber", + "typenum", +] + +[[package]] +name = "sp1-cuda" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e57b85361e6fcc7d5405867eb036c10969518fb8173e3d6744574f97954766" +dependencies = [ + "bincode", + "bytes", + "reqwest", + "serde", + "serde_json", + "sp1-core-executor", + "sp1-core-machine", + "sp1-primitives", + "sp1-prover", + "sp1-prover-types", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "sp1-curves" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eabe28a711559675f1addb4a529159c5db383a79f62819dffd4349ccb4e979e" +dependencies = [ + "cfg-if", + "dashu", + "elliptic-curve", + "generic-array 1.1.0", + "itertools 0.14.0", + "k256", + "num", + "p256", + "serde", + "slop-algebra", + "snowbridge-amcl", + "sp1-primitives", + "typenum", +] + +[[package]] +name = "sp1-derive" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09bb8b5d4eade7611018a28063f32a73f5c59bc1b29a8e517413dca66084ca0f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp1-hypercube" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ac19804d8b1bf955fb2fd7722c9b12bcbe9343a0e4b88ecf607a3e85ae63cd" +dependencies = [ + "arrayref", + "deepsize2", + "derive-where", + "futures", + "hashbrown 0.14.5", + "itertools 0.14.0", + "num-bigint 0.4.6", + "num-traits", + "num_cpus", + "rayon", + "rayon-scan", + "serde", + "slop-air", + "slop-algebra", + "slop-alloc", + "slop-basefold", + "slop-basefold-prover", + "slop-bn254", + "slop-challenger", + "slop-commit", + "slop-futures", + "slop-jagged", + "slop-koala-bear", + "slop-matrix", + "slop-merkle-tree", + "slop-multilinear", + "slop-poseidon2", + "slop-stacked", + "slop-sumcheck", + "slop-symmetric", + "slop-tensor", + "slop-uni-stark", + "slop-whir", + "sp1-derive", + "sp1-primitives", + "strum", + "thiserror 1.0.69", + "thousands", + "tokio", + "tracing", +] + +[[package]] +name = "sp1-jit" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb1eff715595ef7059f2db3845f941bbaf5c2635e2b6b0fe0b0d982d4422f6a" +dependencies = [ + "dynasmrt", + "hashbrown 0.14.5", + "memfd", + "memmap2", + "serde", + "tracing", + "uuid", +] + +[[package]] +name = "sp1-lib" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c49bc98323d52ec8bef7ae7db15fa095182edfdc2e7d9123f0c57173014e48" +dependencies = [ + "bincode", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04953c36911214897091107e2a3443fcf531892b0883ce57d4a2eea65d28c72b" +dependencies = [ + "bincode", + "blake3", + "elf", + "hex", + "itertools 0.14.0", + "lazy_static", + "num-bigint 0.4.6", + "serde", + "sha2", + "slop-algebra", + "slop-bn254", + "slop-challenger", + "slop-koala-bear", + "slop-poseidon2", + "slop-primitives", + "slop-symmetric", +] + +[[package]] +name = "sp1-prover" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47f86dbe432038fed00fd869b0937d11b87abdb0e34a676aaeb5a723f1e31e3" +dependencies = [ + "anyhow", + "bincode", + "clap", + "dirs", + "downloader", + "either", + "enum-map", + "eyre", + "futures", + "hashbrown 0.14.5", + "hex", + "indicatif", + "itertools 0.14.0", + "lru", + "mti", + "num-bigint 0.4.6", + "opentelemetry", + "pin-project", + "rand 0.8.5", + "reqwest", + "serde", + "serde_json", + "serial_test", + "sha2", + "slop-air", + "slop-algebra", + "slop-basefold", + "slop-bn254", + "slop-challenger", + "slop-futures", + "slop-jagged", + "slop-multilinear", + "slop-stacked", + "slop-symmetric", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-hypercube", + "sp1-jit", + "sp1-primitives", + "sp1-prover-types", + "sp1-recursion-circuit", + "sp1-recursion-compiler", + "sp1-recursion-executor", + "sp1-recursion-gnark-ffi", + "sp1-recursion-machine", + "sp1-verifier", + "static_assertions", + "sysinfo", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tonic", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "sp1-prover-types" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de603ae06be908cca9c4e4117b5e3aceaf4e1b6b9a98b3892ec15a4a865c80f" +dependencies = [ + "anyhow", + "async-scoped", + "bincode", + "chrono", + "futures-util", + "hashbrown 0.14.5", + "mti", + "prost", + "serde", + "tokio", + "tonic", + "tonic-build", + "tracing", +] + +[[package]] +name = "sp1-recursion-circuit" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebf27cc0c97c8280ac5fd475112cf48cd31503da0d56dc902ed46a7d95232b28" +dependencies = [ + "bincode", + "itertools 0.14.0", + "rand 0.8.5", + "rayon", + "serde", + "slop-air", + "slop-algebra", + "slop-alloc", + "slop-basefold", + "slop-basefold-prover", + "slop-bn254", + "slop-challenger", + "slop-commit", + "slop-jagged", + "slop-koala-bear", + "slop-matrix", + "slop-merkle-tree", + "slop-multilinear", + "slop-stacked", + "slop-sumcheck", + "slop-symmetric", + "slop-tensor", + "slop-whir", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-hypercube", + "sp1-primitives", + "sp1-recursion-compiler", + "sp1-recursion-executor", + "sp1-recursion-machine", + "tracing", +] + +[[package]] +name = "sp1-recursion-compiler" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c70432e7cc894a893a07d49d65149d99ad7deacb89502ec20f135c2f36ab7a" +dependencies = [ + "backtrace", + "cfg-if", + "itertools 0.14.0", + "serde", + "slop-algebra", + "slop-bn254", + "slop-symmetric", + "sp1-core-machine", + "sp1-hypercube", + "sp1-primitives", + "sp1-recursion-executor", + "tracing", + "vec_map", +] + +[[package]] +name = "sp1-recursion-executor" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07d09ed74240eddaaad86945602eda7c35ea90f969de9d7fd4faa9442ab7878c" +dependencies = [ + "backtrace", + "cfg-if", + "hashbrown 0.14.5", + "itertools 0.14.0", + "range-set-blaze", + "serde", + "slop-algebra", + "slop-maybe-rayon", + "slop-poseidon2", + "slop-symmetric", + "smallvec", + "sp1-derive", + "sp1-hypercube", + "static_assertions", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "sp1-recursion-gnark-ffi" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7b67bd9a9dcd038e68fa4a3272a78e2d3098df05250bb78857aa17fef411563" +dependencies = [ + "anyhow", + "bincode", + "bindgen", + "cfg-if", + "hex", + "num-bigint 0.4.6", + "serde", + "serde_json", + "sha2", + "slop-algebra", + "slop-symmetric", + "sp1-hypercube", + "sp1-primitives", + "sp1-recursion-compiler", + "sp1-verifier", + "tempfile", + "tracing", +] + +[[package]] +name = "sp1-recursion-machine" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4903ee3895f7cbffe8f5624e516debd2ef1a4db5b01f75ca1fe3e84b12f5a6" +dependencies = [ + "itertools 0.14.0", + "rand 0.8.5", + "slop-air", + "slop-algebra", + "slop-basefold", + "slop-matrix", + "slop-maybe-rayon", + "slop-symmetric", + "sp1-derive", + "sp1-hypercube", + "sp1-primitives", + "sp1-recursion-executor", + "strum", + "tracing", + "zkhash", +] + +[[package]] +name = "sp1-sdk" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "378f702c65ac9bea522fdde527f0260a95af155aa10d089e1e9e6ba660b60f50" +dependencies = [ + "anyhow", + "async-trait", + "bincode", + "cfg-if", + "dirs", + "eventsource-stream", + "futures", + "hex", + "indicatif", + "itertools 0.14.0", + "k256", + "num-bigint 0.4.6", + "serde", + "sha2", + "slop-algebra", + "slop-alloc", + "slop-basefold", + "slop-commit", + "slop-jagged", + "slop-merkle-tree", + "slop-multilinear", + "slop-stacked", + "slop-sumcheck", + "slop-tensor", + "sp1-build", + "sp1-core-executor", + "sp1-core-machine", + "sp1-cuda", + "sp1-hypercube", + "sp1-primitives", + "sp1-prover", + "sp1-prover-types", + "sp1-recursion-executor", + "sp1-recursion-gnark-ffi", + "sp1-verifier", + "strum", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "sp1-verifier" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1942e85d450056725480ac900711869fe1ae453a4e069bcabff3ee7791773e62" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "dirs", + "hex", + "lazy_static", + "serde", + "sha2", + "slop-algebra", + "slop-challenger", + "slop-primitives", + "slop-symmetric", + "sp1-hypercube", + "sp1-primitives", + "sp1-recursion-executor", + "sp1-recursion-machine", + "strum", + "substrate-bn-succinct-rs", + "thiserror 2.0.18", +] + +[[package]] +name = "sp1-zkvm" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdf86a2a275e6788a1b34d71bc607fa5d5452d0149a15d34f7945f005ad6e37" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-alloc", + "getrandom 0.2.17", + "getrandom 0.3.4", + "lazy_static", + "libm", + "rand 0.8.5", + "sha2", + "sp1-lib", + "sp1-primitives", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[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.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "subenum" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3d08fe7078c57309d5c3d938e50eba95ba1d33b9c3a101a8465fc6861a5416" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "substrate-bn-succinct-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a241fd7c1016fb8ad30fcf5a20986c0c4538e8f15a1b41a1761516299e377ec1" +dependencies = [ + "bytemuck", + "byteorder", + "cfg-if", + "crunchy", + "lazy_static", + "num-bigint 0.4.6", + "rand 0.8.5", + "rustc-hex", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svgbobdoc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c04b93fc15d79b39c63218f15e3fdffaa4c227830686e3b7c5f41244eb3e50" +dependencies = [ + "base64 0.13.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-width 0.1.14", +] + +[[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.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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.117", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +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.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[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.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-pemfile", + "socket2 0.5.10", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower 0.5.3", + "tower-layer", + "tower-service", +] + +[[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-appender" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +dependencies = [ + "crossbeam-channel", + "thiserror 2.0.18", + "time", + "tracing-subscriber", +] + +[[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.117", +] + +[[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-forest" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee40835db14ddd1e3ba414292272eddde9dad04d3d4b65509656414d1c42592f" +dependencies = [ + "ansi_term", + "smallvec", + "thiserror 1.0.69", + "tracing", + "tracing-subscriber", +] + +[[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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[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 = "typeid_prefix" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9da1387307fdee46aa441e4f08a1b491e659fcac1aca9cd71f2c624a0de5d1b" + +[[package]] +name = "typeid_suffix" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77b55e96f110c6db5d1a2f24072552537f0091dc90cebeaa679540bac93e7405" +dependencies = [ + "uuid", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[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 = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[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", +] + +[[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.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "atomic", + "getrandom 0.4.1", + "js-sys", + "md-5", + "sha1_smol", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +dependencies = [ + "serde", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[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.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60722a937f594b7fde9adb894d7c092fc1bb6612897c46368d18e7a20208eff2" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a89f4650b770e4521aa6573724e2aed4704372151bd0de9d16a3bbabb87441a" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac8c6395094b6b91c4af293f4c79371c163f9a6f56184d2c9a85f5a95f3950" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3fabce6159dc20728033842636887e4877688ae94382766e00b180abac9d60" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0e091bdb824da87dc01d967388880d017a0a9bc4f3bdc0d86ee9f9336e3bb5" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705eceb4ce901230f8625bd1d665128056ccbe4b7408faa625eec1ba80f59a97" +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-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[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-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.117", +] + +[[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.117", +] + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[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.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[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 0.52.6", + "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-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" +dependencies = [ + "ark-ff", + "ark-std", + "bitvec", + "blake2", + "bls12_381", + "byteorder", + "cfg-if", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand 0.8.5", + "serde", + "sha2", + "sha3", + "subtle", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/bench_vs/sp1/fibonacci/Cargo.toml b/bench_vs/sp1/fibonacci/Cargo.toml new file mode 100644 index 000000000..fc24039c2 --- /dev/null +++ b/bench_vs/sp1/fibonacci/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +members = ["program", "script"] +resolver = "2" diff --git a/bench_vs/sp1/fibonacci/program/Cargo.toml b/bench_vs/sp1/fibonacci/program/Cargo.toml new file mode 100644 index 000000000..551be48b5 --- /dev/null +++ b/bench_vs/sp1/fibonacci/program/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "fibonacci-program" +version = "0.1.0" +edition = "2021" + +[dependencies] +sp1-zkvm = "6.0.1" diff --git a/bench_vs/sp1/fibonacci/program/src/main.rs b/bench_vs/sp1/fibonacci/program/src/main.rs new file mode 100644 index 000000000..571e157b3 --- /dev/null +++ b/bench_vs/sp1/fibonacci/program/src/main.rs @@ -0,0 +1,14 @@ +#![no_main] +sp1_zkvm::entrypoint!(main); + +pub fn main() { + let n: u64 = sp1_zkvm::io::read::(); + let mut a: u64 = 0; + let mut b: u64 = 1; + for _ in 0..n { + let c = a.wrapping_add(b); + a = b; + b = c; + } + sp1_zkvm::io::commit(&b); +} diff --git a/bench_vs/sp1/fibonacci/rust-toolchain b/bench_vs/sp1/fibonacci/rust-toolchain new file mode 100644 index 000000000..9397b9526 --- /dev/null +++ b/bench_vs/sp1/fibonacci/rust-toolchain @@ -0,0 +1,3 @@ +[toolchain] +channel = "stable" +components = ["llvm-tools", "rustc-dev"] diff --git a/bench_vs/sp1/fibonacci/script/Cargo.toml b/bench_vs/sp1/fibonacci/script/Cargo.toml new file mode 100644 index 000000000..b72b33517 --- /dev/null +++ b/bench_vs/sp1/fibonacci/script/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "fibonacci-script" +version = "0.1.0" +edition = "2021" + +[dependencies] +sp1-sdk = { version = "6.0.1", features = ["blocking"] } + +[build-dependencies] +sp1-build = "6.0.1" diff --git a/bench_vs/sp1/fibonacci/script/build.rs b/bench_vs/sp1/fibonacci/script/build.rs new file mode 100644 index 000000000..d6cf925d6 --- /dev/null +++ b/bench_vs/sp1/fibonacci/script/build.rs @@ -0,0 +1,5 @@ +use sp1_build::build_program_with_args; + +fn main() { + build_program_with_args("../program", Default::default()); +} diff --git a/bench_vs/sp1/fibonacci/script/src/main.rs b/bench_vs/sp1/fibonacci/script/src/main.rs new file mode 100644 index 000000000..761d0c911 --- /dev/null +++ b/bench_vs/sp1/fibonacci/script/src/main.rs @@ -0,0 +1,47 @@ +use sp1_sdk::blocking::{ProveRequest, Prover, ProverClient}; +use sp1_sdk::{include_elf, ProvingKey, SP1Stdin}; +use std::time::Instant; + +const FIB_ELF: sp1_sdk::Elf = include_elf!("fibonacci-program"); + +fn main() { + sp1_sdk::utils::setup_logger(); + + let n: u64 = std::env::args() + .nth(1) + .expect("Usage: fibonacci-script ") + .parse() + .expect("n must be a u64"); + + let client = ProverClient::from_env(); + let mut stdin = SP1Stdin::new(); + stdin.write(&n); + + // Setup + let pk = client.setup(FIB_ELF.clone()).expect("setup failed"); + + // Execute for cycle count + let (_, report) = client + .execute(FIB_ELF.clone(), stdin.clone()) + .run() + .unwrap(); + println!("Cycles: {}", report.total_instruction_count()); + + // Core proof (no recursion) + let start = Instant::now(); + let proof = client + .prove(&pk, stdin) + .core() + .run() + .expect("prove failed"); + let elapsed = start.elapsed(); + + println!("Proving time: {:.3}s", elapsed.as_secs_f64()); + + // Verify + client + .verify(&proof, pk.verifying_key(), None) + .expect("verify failed"); + + println!("Proof verified successfully"); +} From 472ddc394a5a9cd5346fd435bdb69add8574f4c6 Mon Sep 17 00:00:00 2001 From: MauroFab Date: Wed, 25 Feb 2026 19:22:16 -0300 Subject: [PATCH 02/14] Standarize guest --- bench_vs/README.md | 4 ++-- bench_vs/run.sh | 36 ++++++++++-------------------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/bench_vs/README.md b/bench_vs/README.md index 0a20304c3..1be30c5d2 100644 --- a/bench_vs/README.md +++ b/bench_vs/README.md @@ -15,9 +15,9 @@ Compares proving time for an identical u64 wrapping Fibonacci computation. sp1up ``` -3. **RISC-V assembler** — Homebrew clang + ld.lld (macOS): +3. **Rust nightly** (for cross-compiling Lambda VM guest): ```bash - brew install llvm + rustup toolchain install nightly ``` ## Usage diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 1575e62a3..95b84d4d6 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -9,8 +9,7 @@ # Prerequisites: # - Lambda VM CLI built: cargo build --release -p cli # - SP1 toolchain installed: curl -L https://sp1up.succinct.xyz | bash && sp1up -# - clang with RISC-V target support (macOS Homebrew clang works) -# - ld.lld linker +# - Rust nightly toolchain: rustup toolchain install nightly set -euo pipefail @@ -65,6 +64,9 @@ rm -rf "$TMP_DIR" && mkdir -p "$TMP_DIR" # --- Pre-build --------------------------------------------------------------- CLI="$ROOT_DIR/target/release/cli" +LAMBDA_DIR="$SCRIPT_DIR/lambda/fibonacci" +TARGET_SPEC="$ROOT_DIR/executor/programs/riscv64im-lambda-vm-elf.json" + if $RUN_LAMBDA && [ ! -f "$CLI" ]; then echo -e "${YELLOW}[Lambda VM] CLI not found, building...${NC}" cargo build --release -p cli --manifest-path "$ROOT_DIR/Cargo.toml" 2>&1 | tail -1 @@ -97,32 +99,14 @@ run_one() { local sp1_cycles="" if $RUN_LAMBDA; then - # Generate assembly - cat > "$TMP_DIR/fib.s" <&1 | tail -1) + LAMBDA_ELF="$LAMBDA_DIR/target/riscv64im-lambda-vm-elf/release/fibonacci-bench" echo -e " ${GREEN}[Lambda VM] Proving...${NC}" - LAMBDA_OUTPUT=$("$CLI" prove "$TMP_DIR/fib.elf" -o "$TMP_DIR/lambda_proof.bin" --time 2>/dev/null) + LAMBDA_OUTPUT=$("$CLI" prove "$LAMBDA_ELF" -o "$TMP_DIR/lambda_proof.bin" --time 2>/dev/null) lambda_time=$(echo "$LAMBDA_OUTPUT" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" fi From 88171d01081e8d9ebde34497456d9ddcb4bc5b40 Mon Sep 17 00:00:00 2001 From: MauroFab Date: Wed, 25 Feb 2026 19:35:36 -0300 Subject: [PATCH 03/14] Fix decimals --- bench_vs/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 95b84d4d6..ed0b519df 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -156,7 +156,7 @@ for i in "${!RESULT_N[@]}"; do if $RUN_LAMBDA && $RUN_SP1; then if [ "$lt" != "n/a" ] && [ "$st" != "n/a" ]; then - RATIO=$(LC_NUMERIC=C awk "BEGIN {printf \"%.1fx\", $st / $lt}") + RATIO=$(LC_NUMERIC=C awk "BEGIN {printf \"%.2fx\", $st / $lt}") if (( $(LC_NUMERIC=C awk "BEGIN {print ($st > $lt)}") )); then RATIO="${GREEN}${RATIO}${NC}" else From ef7d5bb6a62990733dd2959689803f64efcd1762 Mon Sep 17 00:00:00 2001 From: MauroFab Date: Wed, 25 Feb 2026 19:36:24 -0300 Subject: [PATCH 04/14] Benchmark vs sp1 --- bench_vs/run.sh | 8 +-- bench_vs/sp1/fibonacci/.tldr/daemon.pid | 1 - bench_vs/sp1/fibonacci/.tldr/status | 1 - bench_vs/sp1/fibonacci/.tldrignore | 84 ------------------------- 4 files changed, 4 insertions(+), 90 deletions(-) delete mode 100644 bench_vs/sp1/fibonacci/.tldr/daemon.pid delete mode 100644 bench_vs/sp1/fibonacci/.tldr/status delete mode 100644 bench_vs/sp1/fibonacci/.tldrignore diff --git a/bench_vs/run.sh b/bench_vs/run.sh index ed0b519df..113666124 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -156,11 +156,11 @@ for i in "${!RESULT_N[@]}"; do if $RUN_LAMBDA && $RUN_SP1; then if [ "$lt" != "n/a" ] && [ "$st" != "n/a" ]; then - RATIO=$(LC_NUMERIC=C awk "BEGIN {printf \"%.2fx\", $st / $lt}") - if (( $(LC_NUMERIC=C awk "BEGIN {print ($st > $lt)}") )); then - RATIO="${GREEN}${RATIO}${NC}" - else + RATIO=$(LC_NUMERIC=C awk "BEGIN {printf \"%.1fx\", $lt / $st}") + if (( $(LC_NUMERIC=C awk "BEGIN {print ($lt > $st)}") )); then RATIO="${RED}${RATIO}${NC}" + else + RATIO="${GREEN}${RATIO}${NC}" fi printf " %-10s %11ss %11ss " "$n" "$lt" "$st" echo -e "$RATIO" diff --git a/bench_vs/sp1/fibonacci/.tldr/daemon.pid b/bench_vs/sp1/fibonacci/.tldr/daemon.pid deleted file mode 100644 index 10eda36c4..000000000 --- a/bench_vs/sp1/fibonacci/.tldr/daemon.pid +++ /dev/null @@ -1 +0,0 @@ -39495 \ No newline at end of file diff --git a/bench_vs/sp1/fibonacci/.tldr/status b/bench_vs/sp1/fibonacci/.tldr/status deleted file mode 100644 index ad50b5340..000000000 --- a/bench_vs/sp1/fibonacci/.tldr/status +++ /dev/null @@ -1 +0,0 @@ -ready \ No newline at end of file diff --git a/bench_vs/sp1/fibonacci/.tldrignore b/bench_vs/sp1/fibonacci/.tldrignore deleted file mode 100644 index e01df83cb..000000000 --- a/bench_vs/sp1/fibonacci/.tldrignore +++ /dev/null @@ -1,84 +0,0 @@ -# TLDR ignore patterns (gitignore syntax) -# Auto-generated - review and customize for your project -# Docs: https://git-scm.com/docs/gitignore - -# =================== -# Dependencies -# =================== -node_modules/ -.venv/ -venv/ -env/ -__pycache__/ -.tox/ -.nox/ -.pytest_cache/ -.mypy_cache/ -.ruff_cache/ -vendor/ -Pods/ - -# =================== -# Build outputs -# =================== -dist/ -build/ -out/ -target/ -*.egg-info/ -*.whl -*.pyc -*.pyo - -# =================== -# Binary/large files -# =================== -*.so -*.dylib -*.dll -*.exe -*.bin -*.o -*.a -*.lib - -# =================== -# IDE/editors -# =================== -.idea/ -.vscode/ -*.swp -*.swo -*~ - -# =================== -# Security (always exclude) -# =================== -.env -.env.* -*.pem -*.key -*.p12 -*.pfx -credentials.* -secrets.* - -# =================== -# Version control -# =================== -.git/ -.hg/ -.svn/ - -# =================== -# OS files -# =================== -.DS_Store -Thumbs.db - -# =================== -# Project-specific -# Add your custom patterns below -# =================== -# large_test_fixtures/ -# data/ From e11346a084bcfe9781a184679420a3161a9ab39e Mon Sep 17 00:00:00 2001 From: MauroFab Date: Wed, 25 Feb 2026 20:19:15 -0300 Subject: [PATCH 05/14] Add lambda program --- bench_vs/lambda/fibonacci/.cargo/config.toml | 6 ++++ bench_vs/lambda/fibonacci/Cargo.lock | 7 ++++ bench_vs/lambda/fibonacci/Cargo.toml | 8 +++++ bench_vs/lambda/fibonacci/build.rs | 10 ++++++ bench_vs/lambda/fibonacci/src/main.rs | 35 ++++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 bench_vs/lambda/fibonacci/.cargo/config.toml create mode 100644 bench_vs/lambda/fibonacci/Cargo.lock create mode 100644 bench_vs/lambda/fibonacci/Cargo.toml create mode 100644 bench_vs/lambda/fibonacci/build.rs create mode 100644 bench_vs/lambda/fibonacci/src/main.rs diff --git a/bench_vs/lambda/fibonacci/.cargo/config.toml b/bench_vs/lambda/fibonacci/.cargo/config.toml new file mode 100644 index 000000000..be730c3ec --- /dev/null +++ b/bench_vs/lambda/fibonacci/.cargo/config.toml @@ -0,0 +1,6 @@ +[target.riscv64im-lambda-vm-elf] +rustflags = [ + "-C", "link-arg=-e", + "-C", "link-arg=main", + "-C", "passes=lower-atomic" +] diff --git a/bench_vs/lambda/fibonacci/Cargo.lock b/bench_vs/lambda/fibonacci/Cargo.lock new file mode 100644 index 000000000..3a4bb7634 --- /dev/null +++ b/bench_vs/lambda/fibonacci/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "fibonacci-bench" +version = "0.1.0" diff --git a/bench_vs/lambda/fibonacci/Cargo.toml b/bench_vs/lambda/fibonacci/Cargo.toml new file mode 100644 index 000000000..8ce06fec5 --- /dev/null +++ b/bench_vs/lambda/fibonacci/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] + +[package] +name = "fibonacci-bench" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/bench_vs/lambda/fibonacci/build.rs b/bench_vs/lambda/fibonacci/build.rs new file mode 100644 index 000000000..5c189eadb --- /dev/null +++ b/bench_vs/lambda/fibonacci/build.rs @@ -0,0 +1,10 @@ +use std::env; +use std::fs; +use std::path::Path; + +fn main() { + let n = env::var("BENCH_N").unwrap_or_else(|_| "1000".to_string()); + let out_dir = env::var("OUT_DIR").unwrap(); + fs::write(Path::new(&out_dir).join("n.txt"), &n).unwrap(); + println!("cargo:rerun-if-env-changed=BENCH_N"); +} diff --git a/bench_vs/lambda/fibonacci/src/main.rs b/bench_vs/lambda/fibonacci/src/main.rs new file mode 100644 index 000000000..8f54cf604 --- /dev/null +++ b/bench_vs/lambda/fibonacci/src/main.rs @@ -0,0 +1,35 @@ +#![no_std] +#![no_main] + +use core::panic::PanicInfo; + +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} + +const N: u64 = include!(concat!(env!("OUT_DIR"), "/n.txt")); + +#[inline(never)] +fn halt(code: u64) -> ! { + unsafe { + core::arch::asm!( + "ecall", + in("a0") code, + in("a7") 5u64, + options(noreturn), + ); + } +} + +#[unsafe(no_mangle)] +pub fn main() -> ! { + let mut a: u64 = 0; + let mut b: u64 = 1; + for _ in 0..N { + let c = a.wrapping_add(b); + a = b; + b = c; + } + halt(b) +} From 687d8d87009deac5cb3b5a7823742f916efd108e Mon Sep 17 00:00:00 2001 From: MauroFab Date: Wed, 25 Feb 2026 20:20:41 -0300 Subject: [PATCH 06/14] Remove stray blank line from .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3ef9f8283..9c826f0d9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,3 @@ executor/program_artifacts/ # Shared cargo target directory for ELF builds executor/shared_target/ - From 00696591cf985633c3f939e5c06a7df753ad690a Mon Sep 17 00:00:00 2001 From: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:12:21 -0300 Subject: [PATCH 07/14] Apply suggestion from @gabrielbosio Co-authored-by: Gabriel Bosio <38794644+gabrielbosio@users.noreply.github.com> --- bench_vs/run.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 113666124..4aa249a5d 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -102,7 +102,8 @@ run_one() { echo -e " ${GREEN}[Lambda VM] Building (n=${N})...${NC}" (cd "$LAMBDA_DIR" && BENCH_N="$N" cargo +nightly build --release \ --target "$TARGET_SPEC" \ - -Z build-std=core -Z build-std-features=compiler-builtins-mem 2>&1 | tail -1) + -Z build-std=core -Z build-std-features=compiler-builtins-mem 2>&1 \ + -Z json-target-spec 2>&1 | tail -1) LAMBDA_ELF="$LAMBDA_DIR/target/riscv64im-lambda-vm-elf/release/fibonacci-bench" echo -e " ${GREEN}[Lambda VM] Proving...${NC}" From dabe54c5faf9ae4ddc58d492281b6709b4136571 Mon Sep 17 00:00:00 2001 From: MauroFab Date: Mon, 2 Mar 2026 16:57:38 -0300 Subject: [PATCH 08/14] Add instruments --- Cargo.toml | 5 + bin/cli/Cargo.toml | 1 + crypto/stark/src/constraints/evaluator.rs | 36 ---- crypto/stark/src/instruments.rs | 127 ++++++++++++++ crypto/stark/src/lib.rs | 2 + crypto/stark/src/prover.rs | 181 +++++++++++++++---- prover/Cargo.toml | 5 + prover/benches/profile_vm_prover.rs | 10 +- prover/src/instruments.rs | 204 ++++++++++++++++++++++ prover/src/lib.rs | 43 +++++ 10 files changed, 538 insertions(+), 76 deletions(-) create mode 100644 crypto/stark/src/instruments.rs create mode 100644 prover/src/instruments.rs diff --git a/Cargo.toml b/Cargo.toml index 577ab04c4..e24fd3bfc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,3 +15,8 @@ resolver = "2" [profile.dev] opt-level = 3 debug = true + +# debug=1 = line tables only: enables function names in profilers (samply, perf) +# without slowing compilation or bloating the binary significantly. +[profile.release] +debug = 1 diff --git a/bin/cli/Cargo.toml b/bin/cli/Cargo.toml index 8eb62c86f..602e58f5f 100644 --- a/bin/cli/Cargo.toml +++ b/bin/cli/Cargo.toml @@ -15,3 +15,4 @@ tikv-jemalloc-ctl = { version = "0.6", features = ["stats"], optional = true } [features] jemalloc-stats = ["dep:tikv-jemalloc-ctl"] +instruments = ["prover/instruments"] diff --git a/crypto/stark/src/constraints/evaluator.rs b/crypto/stark/src/constraints/evaluator.rs index 908d7b950..2c46e334b 100644 --- a/crypto/stark/src/constraints/evaluator.rs +++ b/crypto/stark/src/constraints/evaluator.rs @@ -18,8 +18,6 @@ use rayon::{ }; use std::marker::PhantomData; -#[cfg(feature = "instruments")] -use std::time::Instant; pub struct ConstraintEvaluator< Field: IsSubFieldOf + IsFFTField + Send + Sync, @@ -226,9 +224,6 @@ where #[cfg(all(debug_assertions, not(feature = "parallel")))] let boundary_polys: Vec>> = Vec::new(); - #[cfg(feature = "instruments")] - let timer = Instant::now(); - let trace_length = domain.interpolation_domain_size; let lde_periodic_columns = air .get_periodic_column_polynomials(trace_length) @@ -244,15 +239,6 @@ where .collect::>>, FFTError>>() .unwrap(); - #[cfg(feature = "instruments")] - println!( - " Evaluating periodic columns on lde: {:#?}", - timer.elapsed() - ); - - #[cfg(feature = "instruments")] - let timer = Instant::now(); - // Fused boundary evaluation: compute (trace[col] - value) on-the-fly // instead of pre-computing all boundary_polys_evaluations. // This eliminates N_constraints × LDE_size intermediate allocations. @@ -282,12 +268,6 @@ where }) .collect(); - #[cfg(feature = "instruments")] - println!( - " Evaluated boundary polynomials on LDE: {:#?}", - timer.elapsed() - ); - #[cfg(all(debug_assertions, not(feature = "parallel")))] let boundary_zerofiers = Vec::new(); @@ -297,22 +277,12 @@ where #[cfg(all(debug_assertions, not(feature = "parallel")))] let _transition_evaluations: Vec> = Vec::new(); - #[cfg(feature = "instruments")] - let timer = Instant::now(); let zerofier_data = air.transition_zerofier_evaluations_grouped(domain); - #[cfg(feature = "instruments")] - println!( - " Evaluated transition zerofiers: {:#?}", - timer.elapsed() - ); // Iterate over all LDE domain and compute the part of the composition polynomial // related to the transition constraints and add it to the already computed part of the // boundary constraints. - #[cfg(feature = "instruments")] - let timer = Instant::now(); - let num_transition = air.num_transition_constraints(); let num_periodic = lde_periodic_columns.len(); let offsets = &air.context().transition_offsets; @@ -330,12 +300,6 @@ where offsets, ); - #[cfg(feature = "instruments")] - println!( - " Evaluated transitions and accumulated results: {:#?}", - timer.elapsed() - ); - evaluations_t } } diff --git a/crypto/stark/src/instruments.rs b/crypto/stark/src/instruments.rs new file mode 100644 index 000000000..11ac350af --- /dev/null +++ b/crypto/stark/src/instruments.rs @@ -0,0 +1,127 @@ +use std::cell::RefCell; +use std::time::Duration; + +/// Sub-operation timing breakdown for a single table in Rounds 2-4. +#[derive(Clone, Debug, Default)] +pub struct TableSubOps { + /// reconstruct_round1 (expand_pool_to_lde) + pub trace_lde: Duration, + /// evaluator.evaluate() + pub constraints: Duration, + /// decompose_and_extend_d2 + pub comp_decompose: Duration, + /// commit_composition_polynomial + pub comp_commit: Duration, + /// Round 3: barycentric OOD evaluation + pub ood: Duration, + /// Round 4: compute_deep_composition_poly_evaluations + pub deep_comp: Duration, + /// Round 4: interpolate_fft + evaluate_fft + pub deep_extend: Duration, + /// fri::commit_phase_from_evaluations + pub fri_commit: Duration, + /// Round 4: grinding + FRI query + Merkle openings + pub queries: Duration, +} + +/// Sub-operation breakdown for Round 1 aux commit pass. +#[derive(Clone, Debug, Default)] +pub struct Round1SubOps { + /// Main trace: expand_pool_to_lde (LDE/FFT) + pub main_lde: Duration, + /// Main trace: commit_columns_bit_reversed (Merkle) + pub main_merkle: Duration, + /// Aux trace: expand_pool_to_lde (LDE/FFT) + pub aux_lde: Duration, + /// Aux trace: commit_columns_bit_reversed (Merkle) + pub aux_merkle: Duration, +} + +/// Timing data collected inside `multi_prove`. +pub struct MultiProveTiming { + pub prepass: Duration, + pub main_commits: Duration, + pub aux_build: Duration, + pub aux_commit: Duration, + pub rounds_2_4: Duration, + /// Sub-op breakdown for Round 1 (main + aux LDE vs Merkle). + pub round1_sub: Round1SubOps, + /// (name, rows, duration, sub_ops) per table for rounds 2-4. + pub table_timings: Vec<(String, usize, Duration, TableSubOps)>, +} + +thread_local! { + static TIMING_DATA: RefCell> = const { RefCell::new(None) }; + /// Round 1 sub-timings accumulated across the main-commit and aux-commit loops. + static R1_SUB: RefCell = const { RefCell::new(Round1SubOps { + main_lde: Duration::ZERO, main_merkle: Duration::ZERO, + aux_lde: Duration::ZERO, aux_merkle: Duration::ZERO, + }) }; + /// Round 2 sub-timings: (constraints, fft, merkle) + static R2_SUB: RefCell> = const { RefCell::new(None) }; + /// Round 4 sub-timings: (fft, merkle, deep_comp, queries) + static R4_SUB: RefCell> = const { RefCell::new(None) }; + /// Assembled sub-ops from prove_rounds_2_to_4 (without reconstruct_round1 LDE time). + static ROUND_SUB_OPS: RefCell> = const { RefCell::new(None) }; +} + +pub fn store(data: MultiProveTiming) { + TIMING_DATA.with(|cell| { + *cell.borrow_mut() = Some(data); + }); +} + +pub fn take() -> Option { + TIMING_DATA.with(|cell| cell.borrow_mut().take()) +} + +pub fn accum_r1_main(lde: Duration, merkle: Duration) { + R1_SUB.with(|cell| { + let mut s = cell.borrow_mut(); + s.main_lde += lde; + s.main_merkle += merkle; + }); +} + +pub fn accum_r1_aux(lde: Duration, merkle: Duration) { + R1_SUB.with(|cell| { + let mut s = cell.borrow_mut(); + s.aux_lde += lde; + s.aux_merkle += merkle; + }); +} + +pub fn take_r1_sub() -> Round1SubOps { + R1_SUB.with(|cell| { + std::mem::replace( + &mut *cell.borrow_mut(), + Round1SubOps::default(), + ) + }) +} + +pub fn store_r2_sub(constraints: Duration, fft: Duration, merkle: Duration) { + R2_SUB.with(|cell| *cell.borrow_mut() = Some((constraints, fft, merkle))); +} + +pub fn take_r2_sub() -> Option<(Duration, Duration, Duration)> { + R2_SUB.with(|cell| cell.borrow_mut().take()) +} + +pub fn store_r4_sub(fft: Duration, merkle: Duration, deep_comp: Duration, queries: Duration) { + R4_SUB.with(|cell| *cell.borrow_mut() = Some((fft, merkle, deep_comp, queries))); +} + +pub fn take_r4_sub() -> Option<(Duration, Duration, Duration, Duration)> { + R4_SUB.with(|cell| cell.borrow_mut().take()) +} + +pub fn store_round_sub_ops(data: TableSubOps) { + ROUND_SUB_OPS.with(|cell| { + *cell.borrow_mut() = Some(data); + }); +} + +pub fn take_round_sub_ops() -> Option { + ROUND_SUB_OPS.with(|cell| cell.borrow_mut().take()) +} diff --git a/crypto/stark/src/lib.rs b/crypto/stark/src/lib.rs index d8f293589..0415572af 100644 --- a/crypto/stark/src/lib.rs +++ b/crypto/stark/src/lib.rs @@ -1,6 +1,8 @@ #[cfg(feature = "debug-checks")] pub mod bus_debug; pub mod constraints; +#[cfg(feature = "instruments")] +pub mod instruments; pub mod context; pub mod debug; pub mod domain; diff --git a/crypto/stark/src/prover.rs b/crypto/stark/src/prover.rs index 085bcb03d..c0223d67a 100644 --- a/crypto/stark/src/prover.rs +++ b/crypto/stark/src/prover.rs @@ -445,10 +445,18 @@ pub trait IsStarkProver< { let num_cols = trace.num_main_columns; trace.extract_columns_main_into(main_pool); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); Self::expand_pool_to_lde::(main_pool, num_cols, domain, twiddles); + #[cfg(feature = "instruments")] + let main_lde_dur = t_sub.elapsed(); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let (tree, root) = Self::commit_columns_bit_reversed(&main_pool[..num_cols]) .ok_or(ProvingError::EmptyCommitment)?; + #[cfg(feature = "instruments")] + crate::instruments::accum_r1_main(main_lde_dur, t_sub.elapsed()); transcript.append_bytes(&root); @@ -483,8 +491,14 @@ pub trait IsStarkProver< { let num_cols = trace.num_main_columns; trace.extract_columns_main_into(main_pool); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); Self::expand_pool_to_lde::(main_pool, num_cols, domain, twiddles); + #[cfg(feature = "instruments")] + let main_lde_dur = t_sub.elapsed(); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let (precomputed_tree, precomputed_root) = Self::commit_columns_bit_reversed(&main_pool[..num_precomputed_cols]) .ok_or(ProvingError::EmptyCommitment)?; @@ -492,6 +506,8 @@ pub trait IsStarkProver< let (mult_tree, mult_root) = Self::commit_columns_bit_reversed(&main_pool[num_precomputed_cols..num_cols]) .ok_or(ProvingError::EmptyCommitment)?; + #[cfg(feature = "instruments")] + crate::instruments::accum_r1_main(main_lde_dur, t_sub.elapsed()); debug_assert_eq!( precomputed_root, precomputed_commitment, @@ -806,6 +822,8 @@ pub trait IsStarkProver< round_1_result.bus_public_inputs.as_ref(), trace_length, ); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let constraint_evaluations = evaluator.evaluate( air, &round_1_result.lde_trace, @@ -814,9 +832,13 @@ pub trait IsStarkProver< boundary_coefficients, &round_1_result.rap_challenges, ); + #[cfg(feature = "instruments")] + let constraints_dur = t_sub.elapsed(); let number_of_parts = air.composition_poly_degree_bound(trace_length) / trace_length; + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let lde_composition_poly_parts_evaluations = if number_of_parts == 2 { // Direct quotient decomposition: avoid full-size iFFT by algebraically // splitting H(x) = H₀(x²) + x·H₁(x²) using: @@ -846,12 +868,21 @@ pub trait IsStarkProver< }) .collect() }; + #[cfg(feature = "instruments")] + let fft_dur = t_sub.elapsed(); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let Some((composition_poly_merkle_tree, composition_poly_root)) = Self::commit_composition_polynomial(&lde_composition_poly_parts_evaluations) else { return Err(ProvingError::EmptyCommitment); }; + #[cfg(feature = "instruments")] + let merkle_dur = t_sub.elapsed(); + + #[cfg(feature = "instruments")] + crate::instruments::store_r2_sub(constraints_dur, fft_dur, merkle_dur); Ok(Round2 { lde_composition_poly_evaluations: lde_composition_poly_parts_evaluations, @@ -974,6 +1005,8 @@ pub trait IsStarkProver< let gammas = deep_composition_coefficients; // Compute p₀ (deep composition polynomial) as N evaluations on trace-size coset + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let deep_evals = Self::compute_deep_composition_poly_evaluations( &round_1_result.lde_trace, round_2_result, @@ -984,18 +1017,26 @@ pub trait IsStarkProver< &gammas, &trace_term_coeffs, ); + #[cfg(feature = "instruments")] + let other_dur_1 = t_sub.elapsed(); // Extend N trace-coset evaluations to 2N LDE-coset evaluations via standard LDE. // deep_evals[i] = h(offset·ω_N^i) = f(ω_N^i) where f(x) = h(offset·x). // Standard iFFT+FFT recovers f and evaluates on the 2N-th roots: f(Ω^j) = h(offset·Ω^j). let domain_size = domain.lde_roots_of_unity_coset.len(); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let deep_poly = Polynomial::interpolate_fft::(&deep_evals).expect("iFFT should succeed"); let mut lde_evals = Polynomial::evaluate_fft::(&deep_poly, 1, Some(domain_size)) .expect("FFT should succeed"); in_place_bit_reverse_permute(&mut lde_evals); + #[cfg(feature = "instruments")] + let r4_fft_dur = t_sub.elapsed(); // FRI commit phase from pre-computed evaluations (no initial FFT) + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let (fri_last_value, fri_layers) = fri::commit_phase_from_evaluations::( domain.root_order as usize, @@ -1004,8 +1045,12 @@ pub trait IsStarkProver< &coset_offset, domain_size, ); + #[cfg(feature = "instruments")] + let r4_merkle_dur = t_sub.elapsed(); // grinding: generate nonce and append it to the transcript + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let security_bits = air.context().proof_options.grinding_factor; let mut nonce = None; if security_bits > 0 { @@ -1028,6 +1073,12 @@ pub trait IsStarkProver< let deep_poly_openings = Self::open_deep_composition_poly(domain, round_1_result, round_2_result, &iotas); + #[cfg(feature = "instruments")] + { + let queries_dur = t_sub.elapsed(); + crate::instruments::store_r4_sub(r4_fft_dur, r4_merkle_dur, other_dur_1, queries_dur); + } + Round4 { fri_last_value, fri_layers_merkle_roots, @@ -1408,6 +1459,9 @@ pub trait IsStarkProver< // Pre-pass: compute domains, twiddles, and max dimensions for pool allocation // ===================================================================== + #[cfg(feature = "instruments")] + let phase_start = Instant::now(); + let mut domains = Vec::with_capacity(num_airs); let mut twiddle_caches: Vec> = Vec::with_capacity(num_airs); let mut max_main_cols = 0usize; @@ -1437,12 +1491,18 @@ pub trait IsStarkProver< .map(|_| Vec::with_capacity(max_lde_size)) .collect(); + #[cfg(feature = "instruments")] + let prepass_elapsed = phase_start.elapsed(); + // ===================================================================== // Round 1, Phase A: Commit all main traces (lightweight) // ===================================================================== // All main trace commitments must be in the transcript before sampling // LogUp challenges. Pool buffers are reused across tables. + #[cfg(feature = "instruments")] + let phase_start = Instant::now(); + let mut main_commits: Vec> = Vec::with_capacity(num_airs); for ((air, trace, _pub_inputs), twiddles) in @@ -1473,6 +1533,9 @@ pub trait IsStarkProver< }); } + #[cfg(feature = "instruments")] + let main_commits_elapsed = phase_start.elapsed(); + // ===================================================================== // Round 1, Phase B: Sample shared LogUp challenges // ===================================================================== @@ -1499,6 +1562,9 @@ pub trait IsStarkProver< // Pass 1: Build aux traces in parallel. // Each build_auxiliary_trace has internal parallelism (batch_inverse, par_chunks), // but outer parallelism over 12 tables also helps on high-core-count machines. + #[cfg(feature = "instruments")] + let phase_start = Instant::now(); + #[cfg(feature = "parallel")] let aux_iter = air_trace_pairs.par_iter_mut(); #[cfg(not(feature = "parallel"))] @@ -1513,8 +1579,14 @@ pub trait IsStarkProver< }) .collect(); + #[cfg(feature = "instruments")] + let aux_build_elapsed = phase_start.elapsed(); + // Pass 2: Sequential fork transcript → extract → LDE → commit. // Uses shared aux_pool. Each table gets its own transcript fork. + #[cfg(feature = "instruments")] + let phase_start = Instant::now(); + let mut metadatas: Vec> = Vec::with_capacity(num_airs); let mut table_transcripts = Vec::with_capacity(num_airs); @@ -1537,15 +1609,23 @@ pub trait IsStarkProver< let (aux_tree, aux_root) = if air.has_aux_trace() { let num_aux_cols = trace.num_aux_columns; trace.extract_columns_aux_into(&mut aux_pool); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); Self::expand_pool_to_lde::( &mut aux_pool, num_aux_cols, domain, twiddles, ); + #[cfg(feature = "instruments")] + let aux_lde_dur = t_sub.elapsed(); + #[cfg(feature = "instruments")] + let t_sub = Instant::now(); let (tree, root) = Self::commit_columns_bit_reversed(&aux_pool[..num_aux_cols]) .ok_or(ProvingError::EmptyCommitment)?; + #[cfg(feature = "instruments")] + crate::instruments::accum_r1_aux(aux_lde_dur, t_sub.elapsed()); table_transcript.append_bytes(&root); (Some(Rc::new(tree)), Some(root)) @@ -1567,6 +1647,9 @@ pub trait IsStarkProver< table_transcripts.push(table_transcript); } + #[cfg(feature = "instruments")] + let aux_commit_elapsed = phase_start.elapsed(); + #[cfg(feature = "debug-checks")] Self::run_debug_checks( &air_trace_pairs, @@ -1583,6 +1666,12 @@ pub trait IsStarkProver< // For each table, recompute LDE into pool buffers, reuse stored Merkle trees, // run rounds 2-4 with the table's forked transcript, then drop table data. + #[cfg(feature = "instruments")] + let phase_start = Instant::now(); + #[cfg(feature = "instruments")] + let mut table_timings: Vec<(String, usize, std::time::Duration, crate::instruments::TableSubOps)> = + Vec::with_capacity(num_airs); + let mut proofs = Vec::with_capacity(num_airs); for (((((air, trace, pub_inputs), metadata), domain), twiddles), table_transcript) in air_trace_pairs @@ -1592,7 +1681,12 @@ pub trait IsStarkProver< .zip(twiddle_caches.iter()) .zip(table_transcripts.iter_mut()) { + #[cfg(feature = "instruments")] + let table_start = Instant::now(); + // Recompute LDE evaluations into pool, reuse stored Merkle trees + #[cfg(feature = "instruments")] + let lde_start = Instant::now(); let round_1_result = Self::reconstruct_round1( *air, *trace, @@ -1602,6 +1696,8 @@ pub trait IsStarkProver< &mut main_pool, &mut aux_pool, )?; + #[cfg(feature = "instruments")] + let lde_dur = lde_start.elapsed(); let proof = Self::prove_rounds_2_to_4( *air, @@ -1612,6 +1708,19 @@ pub trait IsStarkProver< )?; proofs.push(proof); + #[cfg(feature = "instruments")] + { + let mut sub_ops = crate::instruments::take_round_sub_ops() + .unwrap_or_default(); + sub_ops.trace_lde += lde_dur; + table_timings.push(( + air.name().to_string(), + trace.num_rows(), + table_start.elapsed(), + sub_ops, + )); + } + // Return column Vecs to pool (zero-copy move back). Pool slots that were // `take`n in reconstruct_round1 get their buffers back with capacity intact. let (main_cols, aux_cols) = round_1_result.lde_trace.into_columns(); @@ -1623,6 +1732,21 @@ pub trait IsStarkProver< } } + #[cfg(feature = "instruments")] + { + // Store timing data for the top-level report in prove_with_options. + // Uses a thread-local to avoid changing multi_prove's return type. + crate::instruments::store(crate::instruments::MultiProveTiming { + prepass: prepass_elapsed, + main_commits: main_commits_elapsed, + aux_build: aux_build_elapsed, + aux_commit: aux_commit_elapsed, + rounds_2_4: phase_start.elapsed(), + round1_sub: crate::instruments::take_r1_sub(), + table_timings, + }); + } + Ok(MultiProof::new(proofs)) } @@ -1665,11 +1789,6 @@ pub trait IsStarkProver< // ==========| Round 2 |========== // =================================== - #[cfg(feature = "instruments")] - println!("- Started round 2: Compute composition polynomial"); - #[cfg(feature = "instruments")] - let timer2 = Instant::now(); - // <<<< Receive challenge: 𝛽 let beta = transcript.sample_field_element(); let trace_length = domain.interpolation_domain_size; @@ -1706,26 +1825,18 @@ pub trait IsStarkProver< // >>>> Send commitments: [H₁], [H₂] transcript.append_bytes(&round_2_result.composition_poly_root); - #[cfg(feature = "instruments")] - let elapsed2 = timer2.elapsed(); - #[cfg(feature = "instruments")] - println!(" Time spent: {:?}", elapsed2); - // =================================== // ==========| Round 3 |========== // =================================== - #[cfg(feature = "instruments")] - println!("- Started round 3: Evaluate polynomial in out of domain elements"); - #[cfg(feature = "instruments")] - let timer3 = Instant::now(); - // <<<< Receive challenge: z let z = transcript.sample_z_ood( &domain.lde_roots_of_unity_coset, &domain.trace_roots_of_unity, ); + #[cfg(feature = "instruments")] + let t_r3 = Instant::now(); let round_3_result = Self::round_3_evaluate_polynomials_in_out_of_domain_element( air, domain, @@ -1733,6 +1844,8 @@ pub trait IsStarkProver< &round_2_result, &z, ); + #[cfg(feature = "instruments")] + let round_3_dur = t_r3.elapsed(); // >>>> Send values: tⱼ(zgᵏ) let trace_ood_evaluations_columns = round_3_result.trace_ood_evaluations.columns(); @@ -1747,20 +1860,10 @@ pub trait IsStarkProver< transcript.append_field_element(element); } - #[cfg(feature = "instruments")] - let elapsed3 = timer3.elapsed(); - #[cfg(feature = "instruments")] - println!(" Time spent: {:?}", elapsed3); - // =================================== // ==========| Round 4 |========== // =================================== - #[cfg(feature = "instruments")] - println!("- Started round 4: FRI"); - #[cfg(feature = "instruments")] - let timer4 = Instant::now(); - // Part of this round is running FRI, which is an interactive // protocol on its own. Therefore we pass it the transcript // to simulate the interactions with the verifier. @@ -1774,20 +1877,24 @@ pub trait IsStarkProver< transcript, ); - #[cfg(feature = "instruments")] - let elapsed4 = timer4.elapsed(); - #[cfg(feature = "instruments")] - println!(" Time spent: {:?}", elapsed4); - #[cfg(feature = "instruments")] { - let total_time = elapsed2 + elapsed3 + elapsed4; - println!( - " Fraction of proving time per round: {:.4} {:.4} {:.4}", - elapsed2.as_nanos() as f64 / total_time.as_nanos() as f64, - elapsed3.as_nanos() as f64 / total_time.as_nanos() as f64, - elapsed4.as_nanos() as f64 / total_time.as_nanos() as f64 - ); + let zero = std::time::Duration::ZERO; + let (r2_constraints, r2_fft, r2_merkle) = + crate::instruments::take_r2_sub().unwrap_or((zero, zero, zero)); + let (r4_fft, r4_merkle, r4_deep_comp, r4_queries) = + crate::instruments::take_r4_sub().unwrap_or((zero, zero, zero, zero)); + crate::instruments::store_round_sub_ops(crate::instruments::TableSubOps { + trace_lde: std::time::Duration::ZERO, // added by caller from lde_dur + constraints: r2_constraints, + comp_decompose: r2_fft, + comp_commit: r2_merkle, + ood: round_3_dur, + deep_comp: r4_deep_comp, + deep_extend: r4_fft, + fri_commit: r4_merkle, + queries: r4_queries, + }); } info!("End proof generation"); diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 56189724d..dac711002 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -7,6 +7,7 @@ edition = "2024" default = ["parallel"] parallel = ["stark/parallel", "math/parallel", "crypto/parallel", "dep:rayon"] debug-checks = ["stark/debug-checks"] +instruments = ["stark/instruments"] [dependencies] stark = { path = "../crypto/stark" } @@ -23,3 +24,7 @@ criterion = { version = "0.5", default-features = false } [[bench]] name = "vm_prover_benchmark" harness = false + +[[bench]] +name = "profile_vm_prover" +harness = false diff --git a/prover/benches/profile_vm_prover.rs b/prover/benches/profile_vm_prover.rs index 87cb19f50..5ec78a1d3 100644 --- a/prover/benches/profile_vm_prover.rs +++ b/prover/benches/profile_vm_prover.rs @@ -3,13 +3,17 @@ // Run with: `samply record cargo bench --bench profile_vm_prover --features parallel` // Or with hyperfine: `hyperfine --runs 1 './target/release/deps/profile_vm_prover-*'` // -// Uses all_instructions_64.elf which exercises all supported RISC-V instructions. +// Default ELF: fib_iterative_372k (~372k steps, realistic workload). +// Override: cargo bench --bench profile_vm_prover --features parallel -- use lambda_vm_prover::test_utils::asm_elf_bytes; fn main() { - let elf_name = "all_instructions_64"; - let elf_bytes = asm_elf_bytes(elf_name); + let elf_name = std::env::args() + .skip(1) + .find(|a| !a.starts_with('-')) + .unwrap_or_else(|| "fib_iterative_372k".to_string()); + let elf_bytes = asm_elf_bytes(&elf_name); println!("Starting VM prover profiling..."); println!("Configuration:"); diff --git a/prover/src/instruments.rs b/prover/src/instruments.rs new file mode 100644 index 000000000..58954a919 --- /dev/null +++ b/prover/src/instruments.rs @@ -0,0 +1,204 @@ +use std::collections::BTreeMap; +use std::time::Duration; + +fn fmt_rows(rows: usize) -> String { + if rows >= 1_000_000 { + format!("{:.1}M", rows as f64 / 1_000_000.0) + } else if rows >= 1_000 { + format!("{}K", rows / 1_000) + } else { + format!("{rows}") + } +} + +fn pct(dur: Duration, total: Duration) -> f64 { + if total > Duration::ZERO { + dur.as_secs_f64() / total.as_secs_f64() * 100.0 + } else { + 0.0 + } +} + +/// Top-level row: % in first column. +fn row_top(label: &str, dur: Duration, total: Duration) { + eprintln!( + " {:<36} {:>7.2}s {:>5.1}%", + label, + dur.as_secs_f64(), + pct(dur, total), + ); +} + +/// Sub-level row: % shifted right into its own column. +fn row_sub(label: &str, dur: Duration, total: Duration) { + eprintln!( + " {:<36} {:>7.2}s {:>5.1}%", + label, + dur.as_secs_f64(), + pct(dur, total), + ); +} + +/// Strip the `[N]` suffix to get the base table name. +fn base_name(name: &str) -> &str { + name.find('[').map_or(name, |i| &name[..i]) +} + +struct MergedTable { + total_dur: Duration, + total_rows: usize, + count: usize, + sub_ops: stark::instruments::TableSubOps, +} + +/// Print a unified timing report to stderr. +pub fn print_report( + execute: Duration, + trace_build: Duration, + air_construction: Duration, + _prove: Duration, + total: Duration, +) { + let mp = stark::instruments::take(); + + eprintln!(); + eprintln!("=== PROVER TIMING ==="); + eprintln!( + " {:<36} {:>8} {:>5}", + "Phase", "Wall", "%", + ); + eprintln!(" {}", "─".repeat(58)); + + row_top("Execute", execute, total); + row_top("Trace build", trace_build, total); + row_top("AIR construction", air_construction, total); + + if let Some(mp) = mp { + let round1 = mp.main_commits + mp.aux_build + mp.aux_commit; + + row_top("Pre-pass (domains/twiddles)", mp.prepass, total); + row_top("Round 1", round1, total); + row_sub(" Main trace commits", mp.main_commits, total); + row_sub(" expand_pool_to_lde", mp.round1_sub.main_lde, total); + row_sub(" commit (Merkle)", mp.round1_sub.main_merkle, total); + row_sub(" Aux trace build (parallel)", mp.aux_build, total); + row_sub(" Aux trace commit", mp.aux_commit, total); + row_sub(" expand_pool_to_lde", mp.round1_sub.aux_lde, total); + row_sub(" commit (Merkle)", mp.round1_sub.aux_merkle, total); + row_top("Rounds 2\u{2013}4", mp.rounds_2_4, total); + + // Merge split tables: MEMW[0..4] → MEMW x5 + let mut merged: BTreeMap = BTreeMap::new(); + for (name, rows, dur, sub_ops) in &mp.table_timings { + let base = base_name(name).to_string(); + let entry = merged.entry(base).or_insert(MergedTable { + total_dur: Duration::ZERO, + total_rows: 0, + count: 0, + sub_ops: stark::instruments::TableSubOps::default(), + }); + entry.total_dur += *dur; + entry.total_rows += rows; + entry.count += 1; + entry.sub_ops.trace_lde += sub_ops.trace_lde; + entry.sub_ops.constraints += sub_ops.constraints; + entry.sub_ops.comp_decompose += sub_ops.comp_decompose; + entry.sub_ops.comp_commit += sub_ops.comp_commit; + entry.sub_ops.ood += sub_ops.ood; + entry.sub_ops.deep_comp += sub_ops.deep_comp; + entry.sub_ops.deep_extend += sub_ops.deep_extend; + entry.sub_ops.fri_commit += sub_ops.fri_commit; + entry.sub_ops.queries += sub_ops.queries; + } + + let mut sorted: Vec<_> = merged.into_iter().collect(); + sorted.sort_by(|a, b| b.1.total_dur.cmp(&a.1.total_dur)); + + let threshold = total.as_secs_f64() * 0.02; + let mut others_dur = Duration::ZERO; + let mut others_count = 0usize; + + for (name, t) in &sorted { + if t.total_dur.as_secs_f64() >= threshold { + let display_name = if t.count > 1 { + format!("{name} x{}", t.count) + } else { + name.clone() + }; + let label = format!( + " {:<18} {:>6}", + display_name, + fmt_rows(t.total_rows), + ); + row_sub(&label, t.total_dur, total); + } else { + others_dur += t.total_dur; + others_count += 1; + } + } + if others_count > 0 { + let label = format!(" ({others_count} others)"); + row_sub(&label, others_dur, total); + } + + // Sub-operation totals across all tables + let mut total_trace_lde = Duration::ZERO; + let mut total_constraints = Duration::ZERO; + let mut total_comp_decompose = Duration::ZERO; + let mut total_comp_commit = Duration::ZERO; + let mut total_ood = Duration::ZERO; + let mut total_deep_comp = Duration::ZERO; + let mut total_deep_extend = Duration::ZERO; + let mut total_fri_commit = Duration::ZERO; + let mut total_queries = Duration::ZERO; + for (_, t) in &sorted { + total_trace_lde += t.sub_ops.trace_lde; + total_constraints += t.sub_ops.constraints; + total_comp_decompose += t.sub_ops.comp_decompose; + total_comp_commit += t.sub_ops.comp_commit; + total_ood += t.sub_ops.ood; + total_deep_comp += t.sub_ops.deep_comp; + total_deep_extend += t.sub_ops.deep_extend; + total_fri_commit += t.sub_ops.fri_commit; + total_queries += t.sub_ops.queries; + } + + let sub_ops_sum = total_trace_lde + total_constraints + total_comp_decompose + + total_comp_commit + total_ood + total_deep_comp + total_deep_extend + + total_fri_commit + total_queries; + if sub_ops_sum > Duration::ZERO { + let mut sub_ops: Vec<(&str, Duration)> = vec![ + ("R1 expand_pool_to_lde", total_trace_lde), + ("R2 evaluate", total_constraints), + ("R2 decompose_and_extend_d2", total_comp_decompose), + ("R2 commit_composition_poly", total_comp_commit), + ("R3 OOD evaluation", total_ood), + ("R4 deep_composition_poly_evals", total_deep_comp), + ("R4 interpolate+evaluate_fft", total_deep_extend), + ("R4 fri::commit_phase", total_fri_commit), + ("R4 queries & openings", total_queries), + ]; + sub_ops.sort_by(|a, b| b.1.cmp(&a.1)); + eprintln!( + " {}", + " \u{2500}\u{2500} sub-operation totals (all tables) \u{2500}\u{2500}", + ); + for (label, dur) in &sub_ops { + row_sub(&format!(" {label}"), *dur, total); + } + } + + // Cross-round totals: all FFT work and all Merkle work + let total_fft = mp.round1_sub.main_lde + mp.round1_sub.aux_lde + + total_trace_lde + total_comp_decompose + total_deep_extend; + let total_merkle = mp.round1_sub.main_merkle + mp.round1_sub.aux_merkle + + total_comp_commit + total_fri_commit; + eprintln!(); + eprintln!(" {:<36} {:>7.2}s {:>5.1}%", "Total FFT", total_fft.as_secs_f64(), pct(total_fft, total)); + eprintln!(" {:<36} {:>7.2}s {:>5.1}%", "Total Merkle", total_merkle.as_secs_f64(), pct(total_merkle, total)); + } + + eprintln!(" {}", "─".repeat(58)); + eprintln!(" {:<36} {:>7.2}s", "TOTAL", total.as_secs_f64()); + eprintln!(); +} diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 7539d327a..01f51934e 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -13,6 +13,8 @@ pub mod constraints; #[cfg(feature = "debug-checks")] mod debug_report; +#[cfg(feature = "instruments")] +pub mod instruments; pub mod tables; pub mod test_utils; pub mod tests; @@ -342,15 +344,37 @@ pub fn prove_with_options( proof_options: &ProofOptions, max_rows: &MaxRowsConfig, ) -> Result { + #[cfg(feature = "instruments")] + let total_start = std::time::Instant::now(); + + // Phase 1: Execute (ELF load + run) + #[cfg(feature = "instruments")] + let phase_start = std::time::Instant::now(); + let program = Elf::load(elf_bytes).map_err(|e| Error::ElfLoad(format!("{e}")))?; let executor = Executor::new(&program, vec![]).map_err(|e| Error::Execution(format!("{e}")))?; let result = executor .run() .map_err(|e| Error::Execution(format!("{e}")))?; + #[cfg(feature = "instruments")] + let execute_elapsed = phase_start.elapsed(); + + // Phase 2: Trace build + #[cfg(feature = "instruments")] + let phase_start = std::time::Instant::now(); + // Generate all traces from ELF and execution logs. // Page tables are derived from the prover's MemoryState (all accessed pages). let mut traces = Traces::from_elf_and_logs(&program, &result.logs, max_rows)?; + + #[cfg(feature = "instruments")] + let trace_build_elapsed = phase_start.elapsed(); + + // Phase 3: AIR construction + #[cfg(feature = "instruments")] + let phase_start = std::time::Instant::now(); + let table_counts = traces.table_counts(); let airs = VmAirs::new( &program, @@ -360,14 +384,33 @@ pub fn prove_with_options( &table_counts, ); + #[cfg(feature = "instruments")] + let air_elapsed = phase_start.elapsed(); + let runtime_page_ranges = traces.runtime_page_ranges(); + // Phase 4: Prove (multi_prove) + #[cfg(feature = "instruments")] + let phase_start = std::time::Instant::now(); + let proof = Prover::multi_prove( airs.air_trace_pairs(&mut traces), &mut DefaultTranscript::::new(&[]), ) .map_err(|e| Error::Prover(format!("{e:?}")))?; + #[cfg(feature = "instruments")] + { + let prove_elapsed = phase_start.elapsed(); + instruments::print_report( + execute_elapsed, + trace_build_elapsed, + air_elapsed, + prove_elapsed, + total_start.elapsed(), + ); + } + Ok(VmProof { proof, runtime_page_ranges, From af6aab3a0e6f747356a81e176e75dc5662dfeb9a Mon Sep 17 00:00:00 2001 From: MauroFab Date: Sat, 28 Mar 2026 17:13:50 +0100 Subject: [PATCH 09/14] Fix syscall number --- bench_vs/lambda/fibonacci/src/main.rs | 2 +- bench_vs/run.sh | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bench_vs/lambda/fibonacci/src/main.rs b/bench_vs/lambda/fibonacci/src/main.rs index 8f54cf604..ff06237bc 100644 --- a/bench_vs/lambda/fibonacci/src/main.rs +++ b/bench_vs/lambda/fibonacci/src/main.rs @@ -16,7 +16,7 @@ fn halt(code: u64) -> ! { core::arch::asm!( "ecall", in("a0") code, - in("a7") 5u64, + in("a7") 93u64, options(noreturn), ); } diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 4aa249a5d..8c3cb8179 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -107,7 +107,11 @@ run_one() { LAMBDA_ELF="$LAMBDA_DIR/target/riscv64im-lambda-vm-elf/release/fibonacci-bench" echo -e " ${GREEN}[Lambda VM] Proving...${NC}" - LAMBDA_OUTPUT=$("$CLI" prove "$LAMBDA_ELF" -o "$TMP_DIR/lambda_proof.bin" --time 2>/dev/null) + LAMBDA_OUTPUT=$("$CLI" prove "$LAMBDA_ELF" -o "$TMP_DIR/lambda_proof.bin" --time 2>"$TMP_DIR/lambda_err.txt") + if [ $? -ne 0 ]; then + echo -e " ${RED}[Lambda VM] FAILED:${NC}" + cat "$TMP_DIR/lambda_err.txt" + fi lambda_time=$(echo "$LAMBDA_OUTPUT" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" fi From 687af82fa77e456f0d93c4fd40deb174fac6a72f Mon Sep 17 00:00:00 2001 From: jotabulacios Date: Tue, 31 Mar 2026 19:49:01 -0300 Subject: [PATCH 10/14] Add runtime private inputs, nightly CI workflow, and 500M step projection to bench_vs --- .github/workflows/bench-vs-nightly.yml | 58 +++ bench_vs/lambda/fibonacci/build.rs | 10 - bench_vs/lambda/fibonacci/src/main.rs | 49 ++- bench_vs/run.sh | 481 +++++++++++++++++++++---- bin/cli/src/main.rs | 68 +++- crypto/stark/src/lib.rs | 2 - prover/src/lib.rs | 22 +- 7 files changed, 590 insertions(+), 100 deletions(-) create mode 100644 .github/workflows/bench-vs-nightly.yml delete mode 100644 bench_vs/lambda/fibonacci/build.rs diff --git a/.github/workflows/bench-vs-nightly.yml b/.github/workflows/bench-vs-nightly.yml new file mode 100644 index 000000000..50e88bb63 --- /dev/null +++ b/.github/workflows/bench-vs-nightly.yml @@ -0,0 +1,58 @@ +name: Bench Vs Nightly + +on: + schedule: + # 03:00 America/Argentina/Buenos_Aires = 06:00 UTC + - cron: "0 6 * * *" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: bench-vs-nightly-${{ github.ref }} + cancel-in-progress: true + +jobs: + bench-vs: + runs-on: [self-hosted, bench] + timeout-minutes: 720 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Rust Environment + uses: ./.github/actions/setup-rust + + - name: Add cargo to PATH + run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + + - name: Add SP1 to PATH + run: echo "$HOME/.sp1/bin" >> "$GITHUB_PATH" + + - name: Install SP1 toolchain + run: | + export PATH="$HOME/.cargo/bin:$HOME/.sp1/bin:$PATH" + if ! cargo prove --version >/dev/null 2>&1; then + curl -L https://sp1up.succinct.xyz | bash + export PATH="$HOME/.sp1/bin:$PATH" + sp1up + fi + cargo prove --version + + - name: Run nightly benchmark + run: | + bash ./bench_vs/run.sh \ + -n 1000000 2000000 4000000 8000000 \ + --report-dir bench_vs_artifacts \ + --no-color + + - name: Upload nightly benchmark artifact + uses: actions/upload-artifact@v4 + with: + name: bench-vs-nightly-${{ github.sha }} + path: bench_vs_artifacts + retention-days: 90 + + - name: Publish summary + run: cat bench_vs_artifacts/summary.md >> "$GITHUB_STEP_SUMMARY" diff --git a/bench_vs/lambda/fibonacci/build.rs b/bench_vs/lambda/fibonacci/build.rs deleted file mode 100644 index 5c189eadb..000000000 --- a/bench_vs/lambda/fibonacci/build.rs +++ /dev/null @@ -1,10 +0,0 @@ -use std::env; -use std::fs; -use std::path::Path; - -fn main() { - let n = env::var("BENCH_N").unwrap_or_else(|_| "1000".to_string()); - let out_dir = env::var("OUT_DIR").unwrap(); - fs::write(Path::new(&out_dir).join("n.txt"), &n).unwrap(); - println!("cargo:rerun-if-env-changed=BENCH_N"); -} diff --git a/bench_vs/lambda/fibonacci/src/main.rs b/bench_vs/lambda/fibonacci/src/main.rs index ff06237bc..e9e673e0c 100644 --- a/bench_vs/lambda/fibonacci/src/main.rs +++ b/bench_vs/lambda/fibonacci/src/main.rs @@ -1,22 +1,52 @@ #![no_std] #![no_main] +use core::arch::asm; use core::panic::PanicInfo; +const SYSCALL_GET_PRIVATE_INPUTS: u64 = 4; +const SYSCALL_COMMIT: u64 = 64; +const SYSCALL_HALT: u64 = 93; + #[panic_handler] fn panic(_info: &PanicInfo) -> ! { loop {} } -const N: u64 = include!(concat!(env!("OUT_DIR"), "/n.txt")); +fn read_n() -> u64 { + let mut input = [0u8; 12]; + + unsafe { + asm!( + "ecall", + in("a0") input.as_mut_ptr(), + in("a7") SYSCALL_GET_PRIVATE_INPUTS, + ); + } + + let mut n_bytes = [0u8; 8]; + n_bytes.copy_from_slice(&input[4..12]); + u64::from_le_bytes(n_bytes) +} -#[inline(never)] -fn halt(code: u64) -> ! { +fn commit(bytes: &[u8]) { unsafe { - core::arch::asm!( + asm!( "ecall", - in("a0") code, - in("a7") 93u64, + in("a0") 1u64, + in("a1") bytes.as_ptr(), + in("a2") bytes.len(), + in("a7") SYSCALL_COMMIT, + ); + } +} + +fn halt() -> ! { + unsafe { + asm!( + "ecall", + in("a0") 0u64, + in("a7") SYSCALL_HALT, options(noreturn), ); } @@ -24,12 +54,15 @@ fn halt(code: u64) -> ! { #[unsafe(no_mangle)] pub fn main() -> ! { + let n = read_n(); let mut a: u64 = 0; let mut b: u64 = 1; - for _ in 0..N { + for _ in 0..n { let c = a.wrapping_add(b); a = b; b = c; } - halt(b) + + commit(&b.to_le_bytes()); + halt() } diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 8c3cb8179..5592e095c 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -2,20 +2,23 @@ # Benchmark: Lambda VM vs SP1 v6 — Fibonacci proving time comparison. # # Usage: ./bench_vs/run.sh [-n 1000 50000 100000] [--lambda-only | --sp1-only] +# [--report-dir DIR] [--no-color] # # Without -n, runs the default series: 1000 10000 100000 300000 -# With -n, runs the specified values (space-separated): -n 1000 50000 # # Prerequisites: -# - Lambda VM CLI built: cargo build --release -p cli -# - SP1 toolchain installed: curl -L https://sp1up.succinct.xyz | bash && sp1up -# - Rust nightly toolchain: rustup toolchain install nightly +# - Lambda VM CLI build dependencies available +# - SP1 toolchain installed (or available in PATH for CI) +# - Rust stable + nightly-2026-02-01 installed set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" TMP_DIR="/tmp/bench_fib" +REPORT_DIR="" +NO_COLOR=false +TARGET_STEPS=500000000 RED='\033[0;31m' GREEN='\033[0;32m' @@ -23,31 +26,53 @@ YELLOW='\033[1;33m' BOLD='\033[1m' NC='\033[0m' -# --- Defaults ---------------------------------------------------------------- +# --- Defaults --------------------------------------------------------------- DEFAULT_SERIES=(1000 10000 100000 300000) SERIES=() RUN_LAMBDA=true RUN_SP1=true -# --- Parse args -------------------------------------------------------------- +# --- Parse args ------------------------------------------------------------- while [[ $# -gt 0 ]]; do case $1 in - -n) shift + -n) + shift while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do - SERIES+=("$1"); shift - done ;; - --lambda-only) RUN_SP1=false; shift ;; - --sp1-only) RUN_LAMBDA=false; shift ;; + SERIES+=("$1") + shift + done + ;; + --lambda-only) + RUN_SP1=false + shift + ;; + --sp1-only) + RUN_LAMBDA=false + shift + ;; + --report-dir) + REPORT_DIR=$2 + shift 2 + ;; + --no-color) + NO_COLOR=true + shift + ;; -h|--help) - echo "Usage: $0 [-n N1 N2 ...] [--lambda-only | --sp1-only]" + echo "Usage: $0 [-n N1 N2 ...] [--lambda-only | --sp1-only] [--report-dir DIR] [--no-color]" echo "" - echo " -n N1 N2 ... Fibonacci iteration counts (space-separated)" - echo " Default series: ${DEFAULT_SERIES[*]}" - echo " --lambda-only Only run Lambda VM benchmark" - echo " --sp1-only Only run SP1 benchmark" + echo " -n N1 N2 ... Fibonacci iteration counts (space-separated)" + echo " Default series: ${DEFAULT_SERIES[*]}" + echo " --lambda-only Only run Lambda VM benchmark" + echo " --sp1-only Only run SP1 benchmark" + echo " --report-dir DIR Write TSV, metrics, markdown summary, and raw outputs" + echo " --no-color Disable ANSI colors" exit 0 ;; - *) echo "Unknown option: $1"; exit 1 ;; + *) + echo "Unknown option: $1" + exit 1 + ;; esac done @@ -55,21 +80,152 @@ if [ ${#SERIES[@]} -eq 0 ]; then SERIES=("${DEFAULT_SERIES[@]}") fi +if ! $RUN_LAMBDA && ! $RUN_SP1; then + echo "At least one prover must be enabled" + exit 1 +fi + +if $NO_COLOR; then + RED='' + GREEN='' + YELLOW='' + BOLD='' + NC='' +fi + +mkdir -p "$TMP_DIR" +rm -rf "$TMP_DIR"/* + +if [ -n "$REPORT_DIR" ]; then + mkdir -p "$REPORT_DIR/raw" +fi + +join_slash() { + local joined="" + local value + for value in "$@"; do + joined="${joined:+$joined/}$value" + done + printf "%s\n" "$joined" +} + +fit_series() { + local steps_slash=$1 + local values_slash=$2 + + awk -v steps="$steps_slash" -v values="$values_slash" 'BEGIN { + n = split(steps, xs, "/") + m = split(values, ys, "/") + if (n == 0 || n != m) { + print "0 0 0.0000" + exit + } + + sx = 0; sy = 0; sxy = 0; sx2 = 0 + for (i = 1; i <= n; i++) { + x = xs[i] / 1000000 + y = ys[i] + 0 + sx += x + sy += y + sxy += x * y + sx2 += x * x + } + + d = n * sx2 - sx * sx + if (d == 0) { + intercept = sy / n + printf "0 %.6f 0.0000\n", intercept + exit + } + + slope = (n * sxy - sx * sy) / d + intercept = (sy - slope * sx) / n + + my = sy / n + ss_tot = 0 + ss_res = 0 + for (i = 1; i <= n; i++) { + x = xs[i] / 1000000 + y = ys[i] + 0 + pred = slope * x + intercept + ss_res += (y - pred) * (y - pred) + ss_tot += (y - my) * (y - my) + } + + r2 = (ss_tot > 0) ? 1 - ss_res / ss_tot : 0 + if (r2 < 0) { + r2 = 0 + } + + printf "%.6f %.6f %.4f\n", slope, intercept, r2 + }' +} + +project_series() { + local slope=$1 + local intercept=$2 + local target_steps=$3 + + awk -v slope="$slope" -v intercept="$intercept" -v target="$target_steps" 'BEGIN { + projected = slope * (target / 1000000) + intercept + if (projected < 0) { + projected = 0 + } + printf "%.3f\n", projected + }' +} + +format_hours() { + local seconds=$1 + awk -v value="$seconds" 'BEGIN { printf "%.2f\n", value / 3600 }' +} + +write_u64_le() { + local value=$1 + local output_path=$2 + + python3 - "$value" "$output_path" <<'PY' +import struct +import sys + +value = int(sys.argv[1]) +path = sys.argv[2] + +with open(path, "wb") as fh: + fh.write(struct.pack("&1 | tail -1 +if $RUN_LAMBDA; then + echo -e "${GREEN}[Lambda VM] Building CLI...${NC}" + cargo build --release -p cli --manifest-path "$ROOT_DIR/Cargo.toml" 2>&1 | tail -5 +fi + +if $RUN_LAMBDA; then + echo -e "${GREEN}[Lambda VM] Building fibonacci prover...${NC}" + ( + cd "$LAMBDA_DIR" && \ + cargo +nightly-2026-02-01 build --release \ + --target "$TARGET_SPEC" \ + -Z build-std=core \ + -Z build-std-features=compiler-builtins-mem \ + -Z json-target-spec 2>&1 | tail -5 + ) + if [ ! -f "$LAMBDA_ELF" ]; then + echo -e "${RED}[Lambda VM] Build failed — fibonacci-bench ELF not found${NC}" + exit 1 + fi fi SP1_BIN="" @@ -84,101 +240,284 @@ if $RUN_SP1; then fi fi -# --- Run one benchmark -------------------------------------------------------- +# --- Run benchmark series --------------------------------------------------- + +RESULT_N=() +RESULT_LAMBDA=() +RESULT_SP1=() +RESULT_SP1_CYCLES=() +RESULT_RATIO=() -# Arrays to collect results for the summary table -declare -a RESULT_N RESULT_LAMBDA RESULT_SP1 +LAMBDA_STEPS=() +LAMBDA_TIMES=() +SP1_STEPS=() +SP1_TIMES=() + +if [ -n "$REPORT_DIR" ]; then + printf "n\tlambda_time_s\tsp1_time_s\tsp1_cycles\tratio_lambda_over_sp1\n" > "$REPORT_DIR/results.tsv" +fi run_one() { - local N=$1 - echo "" - echo -e "${BOLD}--- n=${N} ---${NC}" + local n=$1 + local lambda_time="n/a" + local sp1_time="n/a" + local sp1_cycles="n/a" + local ratio="n/a" - local lambda_time="" - local sp1_time="" - local sp1_cycles="" + echo "" + echo -e "${BOLD}--- n=${n} ---${NC}" if $RUN_LAMBDA; then - echo -e " ${GREEN}[Lambda VM] Building (n=${N})...${NC}" - (cd "$LAMBDA_DIR" && BENCH_N="$N" cargo +nightly build --release \ - --target "$TARGET_SPEC" \ - -Z build-std=core -Z build-std-features=compiler-builtins-mem 2>&1 \ - -Z json-target-spec 2>&1 | tail -1) - LAMBDA_ELF="$LAMBDA_DIR/target/riscv64im-lambda-vm-elf/release/fibonacci-bench" + local input_file="$TMP_DIR/lambda_${n}.bin" + local proof_file="$TMP_DIR/lambda_${n}.proof" + local stderr_file="$TMP_DIR/lambda_${n}.stderr" + write_u64_le "$n" "$input_file" echo -e " ${GREEN}[Lambda VM] Proving...${NC}" - LAMBDA_OUTPUT=$("$CLI" prove "$LAMBDA_ELF" -o "$TMP_DIR/lambda_proof.bin" --time 2>"$TMP_DIR/lambda_err.txt") - if [ $? -ne 0 ]; then + local lambda_output + if ! lambda_output=$("$CLI" prove "$LAMBDA_ELF" -o "$proof_file" --private-input "$input_file" --time 2>"$stderr_file"); then echo -e " ${RED}[Lambda VM] FAILED:${NC}" - cat "$TMP_DIR/lambda_err.txt" + cat "$stderr_file" + exit 1 fi - lambda_time=$(echo "$LAMBDA_OUTPUT" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') + rm -f "$proof_file" + + lambda_time=$(echo "$lambda_output" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') + if [ -z "$lambda_time" ]; then + echo -e " ${RED}[Lambda VM] FAILED: could not parse proving time${NC}" + printf "%s\n" "$lambda_output" + exit 1 + fi + echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" + LAMBDA_STEPS+=("$n") + LAMBDA_TIMES+=("$lambda_time") + + if [ -n "$REPORT_DIR" ]; then + printf "%s\n" "$lambda_output" > "$REPORT_DIR/raw/lambda_${n}.stdout" + cp "$stderr_file" "$REPORT_DIR/raw/lambda_${n}.stderr" + fi fi if $RUN_SP1; then echo -e " ${GREEN}[SP1 v6] Proving...${NC}" - SP1_OUTPUT=$("$SP1_BIN" "$N" 2>/dev/null) - sp1_time=$(echo "$SP1_OUTPUT" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') - sp1_cycles=$(echo "$SP1_OUTPUT" | grep -o 'Cycles: [0-9]*' | grep -o '[0-9]*') + local sp1_output_file="$TMP_DIR/sp1_${n}.stdout" + if ! "$SP1_BIN" "$n" > "$sp1_output_file" 2>&1; then + echo -e " ${RED}[SP1 v6] FAILED:${NC}" + cat "$sp1_output_file" + exit 1 + fi + + sp1_time=$(grep -o 'Proving time: [0-9.]*s' "$sp1_output_file" | grep -o '[0-9.]*') + sp1_cycles=$(grep -o 'Cycles: [0-9]*' "$sp1_output_file" | grep -o '[0-9]*') + if [ -z "$sp1_time" ] || [ -z "$sp1_cycles" ]; then + echo -e " ${RED}[SP1 v6] FAILED: could not parse output${NC}" + cat "$sp1_output_file" + exit 1 + fi + echo -e " SP1 v6: ${BOLD}${sp1_time}s${NC} (${sp1_cycles} cycles)" + SP1_STEPS+=("$n") + SP1_TIMES+=("$sp1_time") + + if [ -n "$REPORT_DIR" ]; then + cp "$sp1_output_file" "$REPORT_DIR/raw/sp1_${n}.stdout" + fi fi - RESULT_N+=("$N") - RESULT_LAMBDA+=("${lambda_time:-n/a}") - RESULT_SP1+=("${sp1_time:-n/a}") -} + if [ "$lambda_time" != "n/a" ] && [ "$sp1_time" != "n/a" ]; then + ratio=$(LC_NUMERIC=C awk -v lambda="$lambda_time" -v sp1="$sp1_time" 'BEGIN { printf "%.3f", lambda / sp1 }') + fi + + RESULT_N+=("$n") + RESULT_LAMBDA+=("$lambda_time") + RESULT_SP1+=("$sp1_time") + RESULT_SP1_CYCLES+=("$sp1_cycles") + RESULT_RATIO+=("$ratio") -# --- Run series --------------------------------------------------------------- + if [ -n "$REPORT_DIR" ]; then + printf "%s\t%s\t%s\t%s\t%s\n" "$n" "$lambda_time" "$sp1_time" "$sp1_cycles" "$ratio" >> "$REPORT_DIR/results.tsv" + fi +} -for N in "${SERIES[@]}"; do - run_one "$N" +for n in "${SERIES[@]}"; do + run_one "$n" done -# --- Summary table ------------------------------------------------------------ +# --- Projection ------------------------------------------------------------- + +LAMBDA_SLOPE="" +LAMBDA_INTERCEPT="" +LAMBDA_R2="" +LAMBDA_PROJECTED_S="" +LAMBDA_PROJECTED_H="" + +SP1_SLOPE="" +SP1_INTERCEPT="" +SP1_R2="" +SP1_PROJECTED_S="" +SP1_PROJECTED_H="" + +compute_projection() { + local label=$1 + local steps_slash=$2 + local times_slash=$3 + local slope intercept r2 projected_s projected_h + + if [ -z "$steps_slash" ] || [ -z "$times_slash" ]; then + return 0 + fi + + read -r slope intercept r2 <<< "$(fit_series "$steps_slash" "$times_slash")" + projected_s=$(project_series "$slope" "$intercept" "$TARGET_STEPS") + projected_h=$(format_hours "$projected_s") + + case "$label" in + lambda) + LAMBDA_SLOPE=$slope + LAMBDA_INTERCEPT=$intercept + LAMBDA_R2=$r2 + LAMBDA_PROJECTED_S=$projected_s + LAMBDA_PROJECTED_H=$projected_h + ;; + sp1) + SP1_SLOPE=$slope + SP1_INTERCEPT=$intercept + SP1_R2=$r2 + SP1_PROJECTED_S=$projected_s + SP1_PROJECTED_H=$projected_h + ;; + esac +} + +if $RUN_LAMBDA && [ ${#LAMBDA_STEPS[@]} -gt 0 ]; then + compute_projection "lambda" "$(join_slash "${LAMBDA_STEPS[@]}")" "$(join_slash "${LAMBDA_TIMES[@]}")" +fi +if $RUN_SP1 && [ ${#SP1_STEPS[@]} -gt 0 ]; then + compute_projection "sp1" "$(join_slash "${SP1_STEPS[@]}")" "$(join_slash "${SP1_TIMES[@]}")" +fi + +# --- Summary table ---------------------------------------------------------- echo "" echo -e "${BOLD}=== Summary ===${NC}" echo -e "Program: Fibonacci (u64 wrapping)" echo "" -# Header if $RUN_LAMBDA && $RUN_SP1; then - printf " %-10s %12s %12s %8s\n" "n" "Lambda VM" "SP1 v6" "Ratio" - printf " %-10s %12s %12s %8s\n" "---" "---------" "------" "-----" + printf " %-10s %12s %12s %12s %8s\n" "n" "Lambda VM" "SP1 v6" "SP1 cycles" "Ratio" + printf " %-10s %12s %12s %12s %8s\n" "---" "---------" "------" "----------" "-----" elif $RUN_LAMBDA; then printf " %-10s %12s\n" "n" "Lambda VM" printf " %-10s %12s\n" "---" "---------" else - printf " %-10s %12s\n" "n" "SP1 v6" - printf " %-10s %12s\n" "---" "------" + printf " %-10s %12s %12s\n" "n" "SP1 v6" "SP1 cycles" + printf " %-10s %12s %12s\n" "---" "------" "----------" fi for i in "${!RESULT_N[@]}"; do n="${RESULT_N[$i]}" - lt="${RESULT_LAMBDA[$i]}" - st="${RESULT_SP1[$i]}" + lambda_time="${RESULT_LAMBDA[$i]}" + sp1_time="${RESULT_SP1[$i]}" + sp1_cycles="${RESULT_SP1_CYCLES[$i]}" + ratio="${RESULT_RATIO[$i]}" if $RUN_LAMBDA && $RUN_SP1; then - if [ "$lt" != "n/a" ] && [ "$st" != "n/a" ]; then - RATIO=$(LC_NUMERIC=C awk "BEGIN {printf \"%.1fx\", $lt / $st}") - if (( $(LC_NUMERIC=C awk "BEGIN {print ($lt > $st)}") )); then - RATIO="${RED}${RATIO}${NC}" + if [ "$ratio" != "n/a" ]; then + ratio_colored=$(LC_NUMERIC=C awk -v ratio="$ratio" 'BEGIN { printf "%.1fx", ratio }') + if (( $(LC_NUMERIC=C awk -v lambda="$lambda_time" -v sp1="$sp1_time" 'BEGIN { print (lambda > sp1) }') )); then + ratio_colored="${RED}${ratio_colored}${NC}" else - RATIO="${GREEN}${RATIO}${NC}" + ratio_colored="${GREEN}${ratio_colored}${NC}" fi - printf " %-10s %11ss %11ss " "$n" "$lt" "$st" - echo -e "$RATIO" + printf " %-10s %11ss %11ss %12s " "$n" "$lambda_time" "$sp1_time" "$sp1_cycles" + echo -e "$ratio_colored" else - printf " %-10s %12s %12s %8s\n" "$n" "${lt}s" "${st}s" "-" + printf " %-10s %12s %12s %12s %8s\n" "$n" "${lambda_time}s" "${sp1_time}s" "$sp1_cycles" "-" fi elif $RUN_LAMBDA; then - printf " %-10s %11ss\n" "$n" "$lt" + printf " %-10s %11ss\n" "$n" "$lambda_time" else - printf " %-10s %11ss\n" "$n" "$st" + printf " %-10s %11ss %12s\n" "$n" "$sp1_time" "$sp1_cycles" fi done echo "" -echo -e "Green ratio = Lambda VM faster, Red = SP1 faster" +if $RUN_LAMBDA && $RUN_SP1; then + echo -e "Green ratio = Lambda VM faster, Red = SP1 faster" +fi echo "Raw data in $TMP_DIR/" + +if [ -n "$LAMBDA_PROJECTED_S" ] || [ -n "$SP1_PROJECTED_S" ]; then + echo "" + echo -e "${BOLD}=== Linear Projection to 500M Steps ===${NC}" + if [ -n "$LAMBDA_PROJECTED_S" ]; then + echo " Lambda VM: ${LAMBDA_PROJECTED_S}s (${LAMBDA_PROJECTED_H}h), R²=${LAMBDA_R2}" + fi + if [ -n "$SP1_PROJECTED_S" ]; then + echo " SP1 v6: ${SP1_PROJECTED_S}s (${SP1_PROJECTED_H}h), R²=${SP1_R2}" + fi +fi + +# --- Machine-readable report ------------------------------------------------ + +if [ -n "$REPORT_DIR" ]; then + { + echo "target_steps=$TARGET_STEPS" + echo "series=$(join_slash "${RESULT_N[@]}")" + echo "lambda_times=$(join_slash "${RESULT_LAMBDA[@]}")" + echo "sp1_times=$(join_slash "${RESULT_SP1[@]}")" + echo "sp1_cycles=$(join_slash "${RESULT_SP1_CYCLES[@]}")" + echo "ratios=$(join_slash "${RESULT_RATIO[@]}")" + if [ -n "$LAMBDA_PROJECTED_S" ]; then + echo "lambda_slope_s_per_1m=$LAMBDA_SLOPE" + echo "lambda_intercept_s=$LAMBDA_INTERCEPT" + echo "lambda_r2=$LAMBDA_R2" + echo "lambda_projected_time_s=$LAMBDA_PROJECTED_S" + echo "lambda_projected_time_h=$LAMBDA_PROJECTED_H" + fi + if [ -n "$SP1_PROJECTED_S" ]; then + echo "sp1_slope_s_per_1m=$SP1_SLOPE" + echo "sp1_intercept_s=$SP1_INTERCEPT" + echo "sp1_r2=$SP1_R2" + echo "sp1_projected_time_s=$SP1_PROJECTED_S" + echo "sp1_projected_time_h=$SP1_PROJECTED_H" + fi + } > "$REPORT_DIR/metrics.txt" + + { + echo "# Lambda VM vs SP1 v6 Benchmark" + echo + echo "| n | Lambda VM (s) | SP1 v6 (s) | SP1 cycles | Ratio |" + echo "|--:|--------------:|-----------:|-----------:|------:|" + for i in "${!RESULT_N[@]}"; do + printf "| %s | %s | %s | %s | %s |\n" \ + "${RESULT_N[$i]}" \ + "${RESULT_LAMBDA[$i]}" \ + "${RESULT_SP1[$i]}" \ + "${RESULT_SP1_CYCLES[$i]}" \ + "${RESULT_RATIO[$i]}" + done + echo + echo "## Linear Projection to 500M Steps" + echo + echo "| Prover | Slope (s / 1M steps) | Intercept (s) | R² | Projected @ 500M (s) | Projected @ 500M (h) |" + echo "|--------|----------------------:|--------------:|---:|---------------------:|---------------------:|" + if [ -n "$LAMBDA_PROJECTED_S" ]; then + printf "| Lambda VM | %s | %s | %s | %s | %s |\n" \ + "$LAMBDA_SLOPE" \ + "$LAMBDA_INTERCEPT" \ + "$LAMBDA_R2" \ + "$LAMBDA_PROJECTED_S" \ + "$LAMBDA_PROJECTED_H" + fi + if [ -n "$SP1_PROJECTED_S" ]; then + printf "| SP1 v6 | %s | %s | %s | %s | %s |\n" \ + "$SP1_SLOPE" \ + "$SP1_INTERCEPT" \ + "$SP1_R2" \ + "$SP1_PROJECTED_S" \ + "$SP1_PROJECTED_H" + fi + } > "$REPORT_DIR/summary.md" +fi diff --git a/bin/cli/src/main.rs b/bin/cli/src/main.rs index 725f0de5f..3a1917a32 100644 --- a/bin/cli/src/main.rs +++ b/bin/cli/src/main.rs @@ -101,6 +101,10 @@ enum Commands { #[arg(value_parser, value_hint = ValueHint::FilePath)] elf: PathBuf, + /// Path to the private input file + #[arg(long, value_hint = ValueHint::FilePath)] + private_input: Option, + /// Generate flamegraph folded stacks to file #[arg(long, value_hint = ValueHint::FilePath)] flamegraph: Option, @@ -116,6 +120,10 @@ enum Commands { #[arg(short, long, value_hint = ValueHint::FilePath)] output: PathBuf, + /// Path to the private input file + #[arg(long, value_hint = ValueHint::FilePath)] + private_input: Option, + /// Blowup factor (power of 2). Higher = fewer queries, smaller proof, slower proving. #[arg(long)] blowup: Option, @@ -149,13 +157,18 @@ fn main() -> ExitCode { let cli = Cli::parse(); match cli.command { - Commands::Execute { elf, flamegraph } => cmd_execute(elf, flamegraph), + Commands::Execute { + elf, + private_input, + flamegraph, + } => cmd_execute(elf, private_input, flamegraph), Commands::Prove { elf, output, + private_input, blowup, time, - } => cmd_prove(elf, output, blowup, time), + } => cmd_prove(elf, output, private_input, blowup, time), Commands::Verify { proof, elf, @@ -165,7 +178,21 @@ fn main() -> ExitCode { } } -fn cmd_execute(elf_path: PathBuf, flamegraph_path: Option) -> ExitCode { +fn read_private_input(path: Option<&PathBuf>) -> Result, String> { + match path { + Some(path) => { + eprintln!("Reading private input file..."); + std::fs::read(path).map_err(|e| format!("Failed to read private input file: {e}")) + } + None => Ok(vec![]), + } +} + +fn cmd_execute( + elf_path: PathBuf, + private_input_path: Option, + flamegraph_path: Option, +) -> ExitCode { let elf_data = match std::fs::read(&elf_path) { Ok(data) => data, Err(e) => { @@ -182,7 +209,15 @@ fn cmd_execute(elf_path: PathBuf, flamegraph_path: Option) -> ExitCode } }; - let mut executor = match Executor::new(&program, vec![]) { + let private_inputs = match read_private_input(private_input_path.as_ref()) { + Ok(inputs) => inputs, + Err(e) => { + eprintln!("{e}"); + return ExitCode::FAILURE; + } + }; + + let mut executor = match Executor::new(&program, private_inputs) { Ok(e) => e, Err(e) => { eprintln!("Failed to create executor: {:?}", e); @@ -249,7 +284,13 @@ fn cmd_execute(elf_path: PathBuf, flamegraph_path: Option) -> ExitCode ExitCode::SUCCESS } -fn cmd_prove(elf_path: PathBuf, output_path: PathBuf, blowup: Option, time: bool) -> ExitCode { +fn cmd_prove( + elf_path: PathBuf, + output_path: PathBuf, + private_input_path: Option, + blowup: Option, + time: bool, +) -> ExitCode { eprintln!("Reading ELF file..."); let elf_data = match std::fs::read(&elf_path) { Ok(data) => data, @@ -259,6 +300,14 @@ fn cmd_prove(elf_path: PathBuf, output_path: PathBuf, blowup: Option, time: } }; + let private_inputs = match read_private_input(private_input_path.as_ref()) { + Ok(inputs) => inputs, + Err(e) => { + eprintln!("{e}"); + return ExitCode::FAILURE; + } + }; + #[cfg(feature = "jemalloc-stats")] let tracker = heap_tracker::HeapTracker::start(); @@ -276,11 +325,16 @@ fn cmd_prove(elf_path: PathBuf, output_path: PathBuf, blowup: Option, time: "Generating proof (blowup={b}, queries={})...", opts.fri_number_of_queries ); - prover::prove_with_options(&elf_data, &opts, &Default::default()) + prover::prove_with_options_and_inputs( + &elf_data, + &private_inputs, + &opts, + &Default::default(), + ) } None => { eprintln!("Generating proof..."); - prover::prove(&elf_data) + prover::prove_with_inputs(&elf_data, &private_inputs) } }; let prove_elapsed = start.elapsed(); diff --git a/crypto/stark/src/lib.rs b/crypto/stark/src/lib.rs index 6cfab6ea3..41089a9e5 100644 --- a/crypto/stark/src/lib.rs +++ b/crypto/stark/src/lib.rs @@ -1,8 +1,6 @@ #[cfg(feature = "debug-checks")] pub mod bus_debug; pub mod constraints; -#[cfg(feature = "instruments")] -pub mod instruments; pub mod context; pub mod debug; pub mod domain; diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 21bfc9255..a4eb6cd7a 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -461,8 +461,14 @@ pub(crate) fn compute_expected_commit_bus_balance( /// Prove an ELF binary execution. Returns a serializable proof bundle. pub fn prove(elf_bytes: &[u8]) -> Result { - prove_with_options( + prove_with_inputs(elf_bytes, &[]) +} + +/// Prove an ELF binary execution with private inputs. Returns a serializable proof bundle. +pub fn prove_with_inputs(elf_bytes: &[u8], private_inputs: &[u8]) -> Result { + prove_with_options_and_inputs( elf_bytes, + private_inputs, &GoldilocksCubicProofOptions::with_blowup(2).expect("blowup=2 is always valid"), &MaxRowsConfig::default(), ) @@ -473,6 +479,17 @@ pub fn prove_with_options( elf_bytes: &[u8], proof_options: &ProofOptions, max_rows: &MaxRowsConfig, +) -> Result { + prove_with_options_and_inputs(elf_bytes, &[], proof_options, max_rows) +} + +/// Prove an ELF binary execution with custom proof options, max rows config, +/// and explicit private inputs. +pub fn prove_with_options_and_inputs( + elf_bytes: &[u8], + private_inputs: &[u8], + proof_options: &ProofOptions, + max_rows: &MaxRowsConfig, ) -> Result { #[cfg(feature = "instruments")] let total_start = std::time::Instant::now(); @@ -482,7 +499,8 @@ pub fn prove_with_options( let phase_start = std::time::Instant::now(); let program = Elf::load(elf_bytes).map_err(|e| Error::ElfLoad(format!("{e}")))?; - let executor = Executor::new(&program, vec![]).map_err(|e| Error::Execution(format!("{e}")))?; + let executor = Executor::new(&program, private_inputs.to_vec()) + .map_err(|e| Error::Execution(format!("{e}")))?; let result = executor .run() .map_err(|e| Error::Execution(format!("{e}")))?; From 0315a80dbd6c5678d761b79cf11485dbc2c0e4e0 Mon Sep 17 00:00:00 2001 From: jotabulacios Date: Mon, 6 Apr 2026 11:36:46 -0300 Subject: [PATCH 11/14] save work --- .github/workflows/bench-vs-nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bench-vs-nightly.yml b/.github/workflows/bench-vs-nightly.yml index 50e88bb63..eb063c5ae 100644 --- a/.github/workflows/bench-vs-nightly.yml +++ b/.github/workflows/bench-vs-nightly.yml @@ -43,7 +43,7 @@ jobs: - name: Run nightly benchmark run: | bash ./bench_vs/run.sh \ - -n 1000000 2000000 4000000 8000000 \ + -n 500000 1000000 1500000 2000000 \ --report-dir bench_vs_artifacts \ --no-color From 3f3c7aca2634f9bd85b2dc397d08a6b03ab672ef Mon Sep 17 00:00:00 2001 From: jotabulacios Date: Tue, 7 Apr 2026 15:47:57 -0300 Subject: [PATCH 12/14] Fix bench_vs 5x projection inflation and add --steps flag for nightly 1M/2M/4M/8M benchmarks --- .github/workflows/bench-vs-nightly.yml | 4 +- bench_vs/README.md | 18 ++- bench_vs/run.sh | 210 +++++++++++++++++++------ 3 files changed, 175 insertions(+), 57 deletions(-) diff --git a/.github/workflows/bench-vs-nightly.yml b/.github/workflows/bench-vs-nightly.yml index eb063c5ae..68f8d5fac 100644 --- a/.github/workflows/bench-vs-nightly.yml +++ b/.github/workflows/bench-vs-nightly.yml @@ -43,14 +43,14 @@ jobs: - name: Run nightly benchmark run: | bash ./bench_vs/run.sh \ - -n 500000 1000000 1500000 2000000 \ + --steps 1000000 2000000 4000000 8000000 \ --report-dir bench_vs_artifacts \ --no-color - name: Upload nightly benchmark artifact uses: actions/upload-artifact@v4 with: - name: bench-vs-nightly-${{ github.sha }} + name: bench-vs-nightly-${{ github.run_number }}-${{ github.sha }} path: bench_vs_artifacts retention-days: 90 diff --git a/bench_vs/README.md b/bench_vs/README.md index 1be30c5d2..1e8a8d9f3 100644 --- a/bench_vs/README.md +++ b/bench_vs/README.md @@ -29,6 +29,9 @@ Compares proving time for an identical u64 wrapping Fibonacci computation. # Custom series ./bench_vs/run.sh -n 1000 50000 +# Approximate workload steps (converted with 5 steps/iteration) +./bench_vs/run.sh --steps 1000000 2000000 4000000 8000000 + # Run only one prover ./bench_vs/run.sh --lambda-only ./bench_vs/run.sh --sp1-only @@ -42,18 +45,21 @@ Only **proving time** is compared (wall-clock, no recursion/compression on eithe - **Lambda VM**: Generates RISC-V assembly at runtime, assembles to ELF, proves via the CLI. - **SP1 v6**: Compiles a Rust guest program to RISC-V, proves via `sp1-sdk` core mode. +The linear projection uses a common axis for both provers: target workload steps. +When you pass `--steps`, that target is explicit. When you pass `-n`, the script +approximates workload as `steps ~= 5 * n`. `SP1 cycles` are still reported, but +only as telemetry and not as the regression axis. + ## Output ``` === Summary === Program: Fibonacci (u64 wrapping) - n Lambda VM SP1 v6 Ratio - --- --------- ------ ----- - 1000 13.3s 12.4s 0.9x - 10000 22.4s 12.9s 0.6x - 100000 116.4s 14.7s 0.1x - 300000 ... ... ... + Target steps Iterations Lambda VM SP1 v6 SP1 cycles Ratio + ------------ ---------- --------- ------ ---------- ----- + 1000000 200000 ...s ...s 1004794 ... + 2000000 400000 ...s ...s 2004794 ... Green ratio = Lambda VM faster, Red = SP1 faster ``` diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 5592e095c..7e3b06c23 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -1,10 +1,13 @@ #!/bin/bash # Benchmark: Lambda VM vs SP1 v6 — Fibonacci proving time comparison. # -# Usage: ./bench_vs/run.sh [-n 1000 50000 100000] [--lambda-only | --sp1-only] -# [--report-dir DIR] [--no-color] +# Usage: ./bench_vs/run.sh [-n 1000 50000 100000 | --steps 1000000 2000000] +# [--lambda-only | --sp1-only] [--report-dir DIR] +# [--target-steps N] [--no-color] # -# Without -n, runs the default series: 1000 10000 100000 300000 +# Without an explicit series, defaults to: +# - iterations mode: 1000 10000 100000 300000 +# - steps mode: 1000000 2000000 4000000 8000000 # # Prerequisites: # - Lambda VM CLI build dependencies available @@ -18,7 +21,8 @@ ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" TMP_DIR="/tmp/bench_fib" REPORT_DIR="" NO_COLOR=false -TARGET_STEPS=500000000 +TARGET_STEPS="${TARGET_STEPS:-500000000}" +APPROX_STEPS_PER_ITERATION=5 RED='\033[0;31m' GREEN='\033[0;32m' @@ -27,8 +31,10 @@ BOLD='\033[1m' NC='\033[0m' # --- Defaults --------------------------------------------------------------- -DEFAULT_SERIES=(1000 10000 100000 300000) +DEFAULT_ITERATION_SERIES=(1000 10000 100000 300000) +DEFAULT_STEP_SERIES=(1000000 2000000 4000000 8000000) SERIES=() +SERIES_MODE="" RUN_LAMBDA=true RUN_SP1=true @@ -36,6 +42,23 @@ RUN_SP1=true while [[ $# -gt 0 ]]; do case $1 in -n) + if [ -n "$SERIES_MODE" ] && [ "$SERIES_MODE" != "iterations" ]; then + echo "Cannot mix -n with --steps" + exit 1 + fi + SERIES_MODE="iterations" + shift + while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do + SERIES+=("$1") + shift + done + ;; + --steps) + if [ -n "$SERIES_MODE" ] && [ "$SERIES_MODE" != "steps" ]; then + echo "Cannot mix --steps with -n" + exit 1 + fi + SERIES_MODE="steps" shift while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do SERIES+=("$1") @@ -51,21 +74,30 @@ while [[ $# -gt 0 ]]; do shift ;; --report-dir) + if [[ $# -lt 2 ]]; then echo "--report-dir requires an argument"; exit 1; fi REPORT_DIR=$2 shift 2 ;; + --target-steps) + if [[ $# -lt 2 ]]; then echo "--target-steps requires an argument"; exit 1; fi + TARGET_STEPS=$2 + shift 2 + ;; --no-color) NO_COLOR=true shift ;; -h|--help) - echo "Usage: $0 [-n N1 N2 ...] [--lambda-only | --sp1-only] [--report-dir DIR] [--no-color]" + echo "Usage: $0 [-n N1 N2 ... | --steps S1 S2 ...] [--lambda-only | --sp1-only] [--report-dir DIR] [--target-steps N] [--no-color]" echo "" echo " -n N1 N2 ... Fibonacci iteration counts (space-separated)" - echo " Default series: ${DEFAULT_SERIES[*]}" + echo " Default iteration series: ${DEFAULT_ITERATION_SERIES[*]}" + echo " --steps S1 S2 ... Approximate workload steps; converted via ${APPROX_STEPS_PER_ITERATION} steps/iteration" + echo " Default step series: ${DEFAULT_STEP_SERIES[*]}" echo " --lambda-only Only run Lambda VM benchmark" echo " --sp1-only Only run SP1 benchmark" echo " --report-dir DIR Write TSV, metrics, markdown summary, and raw outputs" + echo " --target-steps N Projection target in workload steps (default: $TARGET_STEPS)" echo " --no-color Disable ANSI colors" exit 0 ;; @@ -73,11 +105,19 @@ while [[ $# -gt 0 ]]; do echo "Unknown option: $1" exit 1 ;; - esac + esac done +if [ -z "$SERIES_MODE" ]; then + SERIES_MODE="iterations" +fi + if [ ${#SERIES[@]} -eq 0 ]; then - SERIES=("${DEFAULT_SERIES[@]}") + if [ "$SERIES_MODE" = "steps" ]; then + SERIES=("${DEFAULT_STEP_SERIES[@]}") + else + SERIES=("${DEFAULT_ITERATION_SERIES[@]}") + fi fi if ! $RUN_LAMBDA && ! $RUN_SP1; then @@ -109,6 +149,20 @@ join_slash() { printf "%s\n" "$joined" } +approx_steps_for_iterations() { + local iterations=$1 + awk -v iterations="$iterations" -v ratio="$APPROX_STEPS_PER_ITERATION" 'BEGIN { + printf "%.0f\n", iterations * ratio + }' +} + +approx_iterations_for_steps() { + local steps=$1 + awk -v steps="$steps" -v ratio="$APPROX_STEPS_PER_ITERATION" 'BEGIN { + printf "%.0f\n", steps / ratio + }' +} + fit_series() { local steps_slash=$1 local values_slash=$2 @@ -197,7 +251,9 @@ PY } echo -e "${BOLD}=== Fibonacci Benchmark: Lambda VM vs SP1 v6 ===${NC}" -echo -e "Series: ${YELLOW}${SERIES[*]}${NC}" +echo -e "Series mode: ${YELLOW}${SERIES_MODE}${NC}" +echo -e "Requested series: ${YELLOW}${SERIES[*]}${NC}" +echo -e "Projection target: ${YELLOW}${TARGET_STEPS}${NC} workload steps" echo "" # --- Pre-build -------------------------------------------------------------- @@ -242,30 +298,60 @@ fi # --- Run benchmark series --------------------------------------------------- -RESULT_N=() +RUN_ITERATIONS=() +RUN_TARGET_STEPS=() +for value in "${SERIES[@]}"; do + if [ "$SERIES_MODE" = "steps" ]; then + target_steps=$value + iterations=$(approx_iterations_for_steps "$target_steps") + else + iterations=$value + target_steps=$(approx_steps_for_iterations "$iterations") + fi + + if [ "$iterations" -le 0 ]; then + echo "Invalid series value: $value" + exit 1 + fi + + RUN_ITERATIONS+=("$iterations") + RUN_TARGET_STEPS+=("$target_steps") +done + +if [ "$SERIES_MODE" = "steps" ]; then + echo -e "Iterations used: ${YELLOW}${RUN_ITERATIONS[*]}${NC}" + echo "" +fi + +RESULT_TARGET_STEPS=() +RESULT_ITERATIONS=() +RESULT_PROJECTION_STEPS=() RESULT_LAMBDA=() RESULT_SP1=() RESULT_SP1_CYCLES=() RESULT_RATIO=() -LAMBDA_STEPS=() +LAMBDA_PROJECTION_STEPS=() LAMBDA_TIMES=() -SP1_STEPS=() +SP1_PROJECTION_STEPS=() SP1_TIMES=() +PROJECTION_AXIS="target_workload_steps" if [ -n "$REPORT_DIR" ]; then - printf "n\tlambda_time_s\tsp1_time_s\tsp1_cycles\tratio_lambda_over_sp1\n" > "$REPORT_DIR/results.tsv" + printf "target_steps\titerations\tprojection_steps\tlambda_time_s\tsp1_time_s\tsp1_cycles\tratio_lambda_over_sp1\n" > "$REPORT_DIR/results.tsv" fi run_one() { local n=$1 + local target_steps=$2 local lambda_time="n/a" local sp1_time="n/a" local sp1_cycles="n/a" + local projection_steps=$target_steps local ratio="n/a" echo "" - echo -e "${BOLD}--- n=${n} ---${NC}" + echo -e "${BOLD}--- target≈${target_steps} steps (n=${n} iterations) ---${NC}" if $RUN_LAMBDA; then local input_file="$TMP_DIR/lambda_${n}.bin" @@ -290,8 +376,6 @@ run_one() { fi echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" - LAMBDA_STEPS+=("$n") - LAMBDA_TIMES+=("$lambda_time") if [ -n "$REPORT_DIR" ]; then printf "%s\n" "$lambda_output" > "$REPORT_DIR/raw/lambda_${n}.stdout" @@ -317,8 +401,6 @@ run_one() { fi echo -e " SP1 v6: ${BOLD}${sp1_time}s${NC} (${sp1_cycles} cycles)" - SP1_STEPS+=("$n") - SP1_TIMES+=("$sp1_time") if [ -n "$REPORT_DIR" ]; then cp "$sp1_output_file" "$REPORT_DIR/raw/sp1_${n}.stdout" @@ -329,19 +411,37 @@ run_one() { ratio=$(LC_NUMERIC=C awk -v lambda="$lambda_time" -v sp1="$sp1_time" 'BEGIN { printf "%.3f", lambda / sp1 }') fi - RESULT_N+=("$n") + if [ "$lambda_time" != "n/a" ]; then + LAMBDA_PROJECTION_STEPS+=("$target_steps") + LAMBDA_TIMES+=("$lambda_time") + fi + if [ "$sp1_time" != "n/a" ]; then + SP1_PROJECTION_STEPS+=("$target_steps") + SP1_TIMES+=("$sp1_time") + fi + + RESULT_TARGET_STEPS+=("$target_steps") + RESULT_ITERATIONS+=("$n") + RESULT_PROJECTION_STEPS+=("$projection_steps") RESULT_LAMBDA+=("$lambda_time") RESULT_SP1+=("$sp1_time") RESULT_SP1_CYCLES+=("$sp1_cycles") RESULT_RATIO+=("$ratio") if [ -n "$REPORT_DIR" ]; then - printf "%s\t%s\t%s\t%s\t%s\n" "$n" "$lambda_time" "$sp1_time" "$sp1_cycles" "$ratio" >> "$REPORT_DIR/results.tsv" + printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\n" \ + "$target_steps" \ + "$n" \ + "$projection_steps" \ + "$lambda_time" \ + "$sp1_time" \ + "$sp1_cycles" \ + "$ratio" >> "$REPORT_DIR/results.tsv" fi } -for n in "${SERIES[@]}"; do - run_one "$n" +for i in "${!RUN_ITERATIONS[@]}"; do + run_one "${RUN_ITERATIONS[$i]}" "${RUN_TARGET_STEPS[$i]}" done # --- Projection ------------------------------------------------------------- @@ -390,11 +490,11 @@ compute_projection() { esac } -if $RUN_LAMBDA && [ ${#LAMBDA_STEPS[@]} -gt 0 ]; then - compute_projection "lambda" "$(join_slash "${LAMBDA_STEPS[@]}")" "$(join_slash "${LAMBDA_TIMES[@]}")" +if $RUN_LAMBDA && [ ${#LAMBDA_PROJECTION_STEPS[@]} -gt 0 ]; then + compute_projection "lambda" "$(join_slash "${LAMBDA_PROJECTION_STEPS[@]}")" "$(join_slash "${LAMBDA_TIMES[@]}")" fi -if $RUN_SP1 && [ ${#SP1_STEPS[@]} -gt 0 ]; then - compute_projection "sp1" "$(join_slash "${SP1_STEPS[@]}")" "$(join_slash "${SP1_TIMES[@]}")" +if $RUN_SP1 && [ ${#SP1_PROJECTION_STEPS[@]} -gt 0 ]; then + compute_projection "sp1" "$(join_slash "${SP1_PROJECTION_STEPS[@]}")" "$(join_slash "${SP1_TIMES[@]}")" fi # --- Summary table ---------------------------------------------------------- @@ -405,18 +505,19 @@ echo -e "Program: Fibonacci (u64 wrapping)" echo "" if $RUN_LAMBDA && $RUN_SP1; then - printf " %-10s %12s %12s %12s %8s\n" "n" "Lambda VM" "SP1 v6" "SP1 cycles" "Ratio" - printf " %-10s %12s %12s %12s %8s\n" "---" "---------" "------" "----------" "-----" + printf " %-12s %-12s %12s %12s %12s %8s\n" "Target steps" "Iterations" "Lambda VM" "SP1 v6" "SP1 cycles" "Ratio" + printf " %-12s %-12s %12s %12s %12s %8s\n" "------------" "----------" "---------" "------" "----------" "-----" elif $RUN_LAMBDA; then - printf " %-10s %12s\n" "n" "Lambda VM" - printf " %-10s %12s\n" "---" "---------" + printf " %-12s %-12s %12s\n" "Target steps" "Iterations" "Lambda VM" + printf " %-12s %-12s %12s\n" "------------" "----------" "---------" else - printf " %-10s %12s %12s\n" "n" "SP1 v6" "SP1 cycles" - printf " %-10s %12s %12s\n" "---" "------" "----------" + printf " %-12s %-12s %12s %12s\n" "Target steps" "Iterations" "SP1 v6" "SP1 cycles" + printf " %-12s %-12s %12s %12s\n" "------------" "----------" "------" "----------" fi -for i in "${!RESULT_N[@]}"; do - n="${RESULT_N[$i]}" +for i in "${!RESULT_ITERATIONS[@]}"; do + target_steps="${RESULT_TARGET_STEPS[$i]}" + n="${RESULT_ITERATIONS[$i]}" lambda_time="${RESULT_LAMBDA[$i]}" sp1_time="${RESULT_SP1[$i]}" sp1_cycles="${RESULT_SP1_CYCLES[$i]}" @@ -430,15 +531,15 @@ for i in "${!RESULT_N[@]}"; do else ratio_colored="${GREEN}${ratio_colored}${NC}" fi - printf " %-10s %11ss %11ss %12s " "$n" "$lambda_time" "$sp1_time" "$sp1_cycles" + printf " %-12s %-12s %11ss %11ss %12s " "$target_steps" "$n" "$lambda_time" "$sp1_time" "$sp1_cycles" echo -e "$ratio_colored" else - printf " %-10s %12s %12s %12s %8s\n" "$n" "${lambda_time}s" "${sp1_time}s" "$sp1_cycles" "-" + printf " %-12s %-12s %12s %12s %12s %8s\n" "$target_steps" "$n" "${lambda_time}s" "${sp1_time}s" "$sp1_cycles" "-" fi elif $RUN_LAMBDA; then - printf " %-10s %11ss\n" "$n" "$lambda_time" + printf " %-12s %-12s %11ss\n" "$target_steps" "$n" "$lambda_time" else - printf " %-10s %11ss %12s\n" "$n" "$sp1_time" "$sp1_cycles" + printf " %-12s %-12s %11ss %12s\n" "$target_steps" "$n" "$sp1_time" "$sp1_cycles" fi done @@ -450,7 +551,9 @@ echo "Raw data in $TMP_DIR/" if [ -n "$LAMBDA_PROJECTED_S" ] || [ -n "$SP1_PROJECTED_S" ]; then echo "" - echo -e "${BOLD}=== Linear Projection to 500M Steps ===${NC}" + echo -e "${BOLD}=== Linear Projection to ${TARGET_STEPS} Workload Steps ===${NC}" + echo " Axis: target workload steps" + echo " Note: when using iterations input, target steps are approximated as ${APPROX_STEPS_PER_ITERATION} * n" if [ -n "$LAMBDA_PROJECTED_S" ]; then echo " Lambda VM: ${LAMBDA_PROJECTED_S}s (${LAMBDA_PROJECTED_H}h), R²=${LAMBDA_R2}" fi @@ -463,8 +566,13 @@ fi if [ -n "$REPORT_DIR" ]; then { + echo "series_mode=$SERIES_MODE" + echo "requested_series=$(join_slash "${SERIES[@]}")" + echo "target_steps_series=$(join_slash "${RESULT_TARGET_STEPS[@]}")" + echo "iterations=$(join_slash "${RESULT_ITERATIONS[@]}")" + echo "projection_axis=$PROJECTION_AXIS" echo "target_steps=$TARGET_STEPS" - echo "series=$(join_slash "${RESULT_N[@]}")" + echo "projection_steps=$(join_slash "${RESULT_PROJECTION_STEPS[@]}")" echo "lambda_times=$(join_slash "${RESULT_LAMBDA[@]}")" echo "sp1_times=$(join_slash "${RESULT_SP1[@]}")" echo "sp1_cycles=$(join_slash "${RESULT_SP1_CYCLES[@]}")" @@ -488,21 +596,25 @@ if [ -n "$REPORT_DIR" ]; then { echo "# Lambda VM vs SP1 v6 Benchmark" echo - echo "| n | Lambda VM (s) | SP1 v6 (s) | SP1 cycles | Ratio |" - echo "|--:|--------------:|-----------:|-----------:|------:|" - for i in "${!RESULT_N[@]}"; do - printf "| %s | %s | %s | %s | %s |\n" \ - "${RESULT_N[$i]}" \ + echo "Projection axis: \`$PROJECTION_AXIS\`" + echo + echo "| Target steps | Iterations | Projection steps | Lambda VM (s) | SP1 v6 (s) | SP1 cycles | Ratio |" + echo "|-------------:|-----------:|-----------------:|--------------:|-----------:|-----------:|------:|" + for i in "${!RESULT_ITERATIONS[@]}"; do + printf "| %s | %s | %s | %s | %s | %s | %s |\n" \ + "${RESULT_TARGET_STEPS[$i]}" \ + "${RESULT_ITERATIONS[$i]}" \ + "${RESULT_PROJECTION_STEPS[$i]}" \ "${RESULT_LAMBDA[$i]}" \ "${RESULT_SP1[$i]}" \ "${RESULT_SP1_CYCLES[$i]}" \ "${RESULT_RATIO[$i]}" done echo - echo "## Linear Projection to 500M Steps" + echo "## Linear Projection to ${TARGET_STEPS} Workload Steps" echo - echo "| Prover | Slope (s / 1M steps) | Intercept (s) | R² | Projected @ 500M (s) | Projected @ 500M (h) |" - echo "|--------|----------------------:|--------------:|---:|---------------------:|---------------------:|" + echo "| Prover | Slope (s / 1M workload steps) | Intercept (s) | R² | Projected @ ${TARGET_STEPS} (s) | Projected @ ${TARGET_STEPS} (h) |" + echo "|--------|-------------------------------:|--------------:|---:|------------------------------:|------------------------------:|" if [ -n "$LAMBDA_PROJECTED_S" ]; then printf "| Lambda VM | %s | %s | %s | %s | %s |\n" \ "$LAMBDA_SLOPE" \ From e9e9fbdebc2666fd44ed9854d27f239fcf973f5a Mon Sep 17 00:00:00 2001 From: jotabulacios Date: Tue, 14 Apr 2026 09:54:08 -0300 Subject: [PATCH 13/14] Switch bench_vs projection to measured cycles and add --cycles CLI flag --- bench_vs/README.md | 59 +++++++--- bench_vs/run.sh | 129 ++++++++++++++-------- bench_vs/sp1/fibonacci/script/src/main.rs | 14 ++- bin/cli/src/main.rs | 42 ++++++- 4 files changed, 179 insertions(+), 65 deletions(-) diff --git a/bench_vs/README.md b/bench_vs/README.md index 1e8a8d9f3..c38daa601 100644 --- a/bench_vs/README.md +++ b/bench_vs/README.md @@ -32,23 +32,49 @@ Compares proving time for an identical u64 wrapping Fibonacci computation. # Approximate workload steps (converted with 5 steps/iteration) ./bench_vs/run.sh --steps 1000000 2000000 4000000 8000000 +# Project to a target cycle count +./bench_vs/run.sh --target-cycles 500000000 + # Run only one prover ./bench_vs/run.sh --lambda-only ./bench_vs/run.sh --sp1-only ``` -## What it measures +## What is measured Both provers execute the same program: iterative Fibonacci with `u64::wrapping_add`. -Only **proving time** is compared (wall-clock, no recursion/compression on either side). - -- **Lambda VM**: Generates RISC-V assembly at runtime, assembles to ELF, proves via the CLI. -- **SP1 v6**: Compiles a Rust guest program to RISC-V, proves via `sp1-sdk` core mode. -The linear projection uses a common axis for both provers: target workload steps. -When you pass `--steps`, that target is explicit. When you pass `-n`, the script -approximates workload as `steps ~= 5 * n`. `SP1 cycles` are still reported, but -only as telemetry and not as the regression axis. +The timing window on both sides is **end-to-end single-shot proving, with no +verification and no recursion/compression**. Concretely: + +| Phase | Lambda VM timer | SP1 v6 timer | +|--------------------------------------------|:---------------:|:------------:| +| Read ELF + input from disk | ❌ | ❌ | +| Pre-pass execution to count cycles | ❌ | ❌ | +| `setup` / verifying-key derivation | N/A (none) | ✅ | +| ELF parse + guest execution (inside prove) | ✅ | ✅ | +| Trace build | ✅ | ✅ | +| AIR construction | ✅ | ✅ | +| STARK prove (`core` mode) | ✅ | ✅ | +| Proof serialization / write | ❌ | ❌ | +| Verify | ❌ | ❌ | + +Both sides run one extra execution pass **outside** the timer to report dynamic +instruction counts (SP1's `execute(...)` / Lambda's executor pre-pass). This +costs wall-clock time in the CI job but does not inflate the measured proving +time, and the cost is symmetric between the two provers. + +Lambda VM uses the default proof options from `prover::prove_with_inputs` +(`GoldilocksCubicProofOptions::with_blowup(2)`, 50 FRI queries). SP1 v6 uses +the `core` proof mode exposed by `sp1-sdk::ProverClient::from_env()`. + +## Projection axis + +The linear projection uses **measured cycles** per prover — Lambda's executor +log count and SP1's `report.total_instruction_count()`. For Fibonacci the two +values agree to within ~1% (both compile to the same inner loop shape on +RISC-V). When cycle data is missing, the script falls back to the approximate +`target_workload_steps ~= 5 * n` label that was passed on the command line. ## Output @@ -56,10 +82,17 @@ only as telemetry and not as the regression axis. === Summary === Program: Fibonacci (u64 wrapping) - Target steps Iterations Lambda VM SP1 v6 SP1 cycles Ratio - ------------ ---------- --------- ------ ---------- ----- - 1000000 200000 ...s ...s 1004794 ... - 2000000 400000 ...s ...s 2004794 ... + Target steps Iterations Lambda (s) Lambda cycles SP1 (s) SP1 cycles Ratio + ------------ ---------- ---------- ------------- ------- ---------- ----- + 1000000 200000 ...s 1004794 ...s 1004794 ... + 2000000 400000 ...s 2004794 ...s 2004794 ... +Timing window covers single-shot end-to-end proving; SP1 includes setup; both exclude verification. Green ratio = Lambda VM faster, Red = SP1 faster ``` + +With `--report-dir DIR` the script writes: +- `results.tsv` — raw per-run data (`target_steps`, `iterations`, `lambda_time_s`, `lambda_axis_value`, `lambda_cycles`, `sp1_time_s`, `sp1_axis_value`, `sp1_cycles`, `ratio`). +- `metrics.txt` — key=value pairs including `timing_window=setup_plus_end_to_end_prove_no_verify`. +- `summary.md` — the same table plus linear projection to `TARGET_CYCLES` cycles. +- `raw/` — stdout/stderr of every individual run. diff --git a/bench_vs/run.sh b/bench_vs/run.sh index 7e3b06c23..f72f3731e 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -3,7 +3,7 @@ # # Usage: ./bench_vs/run.sh [-n 1000 50000 100000 | --steps 1000000 2000000] # [--lambda-only | --sp1-only] [--report-dir DIR] -# [--target-steps N] [--no-color] +# [--target-cycles N] [--no-color] # # Without an explicit series, defaults to: # - iterations mode: 1000 10000 100000 300000 @@ -21,7 +21,7 @@ ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" TMP_DIR="/tmp/bench_fib" REPORT_DIR="" NO_COLOR=false -TARGET_STEPS="${TARGET_STEPS:-500000000}" +TARGET_CYCLES="${TARGET_CYCLES:-${TARGET_STEPS:-500000000}}" APPROX_STEPS_PER_ITERATION=5 RED='\033[0;31m' @@ -78,9 +78,15 @@ while [[ $# -gt 0 ]]; do REPORT_DIR=$2 shift 2 ;; + --target-cycles) + if [[ $# -lt 2 ]]; then echo "--target-cycles requires an argument"; exit 1; fi + TARGET_CYCLES=$2 + shift 2 + ;; --target-steps) if [[ $# -lt 2 ]]; then echo "--target-steps requires an argument"; exit 1; fi - TARGET_STEPS=$2 + TARGET_CYCLES=$2 + echo "Warning: --target-steps is deprecated; use --target-cycles" >&2 shift 2 ;; --no-color) @@ -88,7 +94,7 @@ while [[ $# -gt 0 ]]; do shift ;; -h|--help) - echo "Usage: $0 [-n N1 N2 ... | --steps S1 S2 ...] [--lambda-only | --sp1-only] [--report-dir DIR] [--target-steps N] [--no-color]" + echo "Usage: $0 [-n N1 N2 ... | --steps S1 S2 ...] [--lambda-only | --sp1-only] [--report-dir DIR] [--target-cycles N] [--no-color]" echo "" echo " -n N1 N2 ... Fibonacci iteration counts (space-separated)" echo " Default iteration series: ${DEFAULT_ITERATION_SERIES[*]}" @@ -96,8 +102,9 @@ while [[ $# -gt 0 ]]; do echo " Default step series: ${DEFAULT_STEP_SERIES[*]}" echo " --lambda-only Only run Lambda VM benchmark" echo " --sp1-only Only run SP1 benchmark" - echo " --report-dir DIR Write TSV, metrics, markdown summary, and raw outputs" - echo " --target-steps N Projection target in workload steps (default: $TARGET_STEPS)" + echo " --report-dir DIR Write TSV, metrics, markdown summary, and raw outputs" + echo " --target-cycles N Projection target in cycles (default: $TARGET_CYCLES)" + echo " --target-steps N Deprecated alias for --target-cycles" echo " --no-color Disable ANSI colors" exit 0 ;; @@ -253,7 +260,7 @@ PY echo -e "${BOLD}=== Fibonacci Benchmark: Lambda VM vs SP1 v6 ===${NC}" echo -e "Series mode: ${YELLOW}${SERIES_MODE}${NC}" echo -e "Requested series: ${YELLOW}${SERIES[*]}${NC}" -echo -e "Projection target: ${YELLOW}${TARGET_STEPS}${NC} workload steps" +echo -e "Projection target: ${YELLOW}${TARGET_CYCLES}${NC} cycles" echo "" # --- Pre-build -------------------------------------------------------------- @@ -325,9 +332,11 @@ fi RESULT_TARGET_STEPS=() RESULT_ITERATIONS=() -RESULT_PROJECTION_STEPS=() RESULT_LAMBDA=() +RESULT_LAMBDA_AXIS=() +RESULT_LAMBDA_CYCLES=() RESULT_SP1=() +RESULT_SP1_AXIS=() RESULT_SP1_CYCLES=() RESULT_RATIO=() @@ -335,23 +344,25 @@ LAMBDA_PROJECTION_STEPS=() LAMBDA_TIMES=() SP1_PROJECTION_STEPS=() SP1_TIMES=() -PROJECTION_AXIS="target_workload_steps" +# Axis: use measured dynamic instruction counts per prover. If cycle data is +# unavailable for a run, fall back to the approximated target_workload_steps. +PROJECTION_AXIS="measured_cycles" if [ -n "$REPORT_DIR" ]; then - printf "target_steps\titerations\tprojection_steps\tlambda_time_s\tsp1_time_s\tsp1_cycles\tratio_lambda_over_sp1\n" > "$REPORT_DIR/results.tsv" + printf "target_steps\titerations\tlambda_time_s\tlambda_axis_value\tlambda_cycles\tsp1_time_s\tsp1_axis_value\tsp1_cycles\tratio_lambda_over_sp1\n" > "$REPORT_DIR/results.tsv" fi run_one() { local n=$1 local target_steps=$2 local lambda_time="n/a" + local lambda_cycles="n/a" local sp1_time="n/a" local sp1_cycles="n/a" - local projection_steps=$target_steps local ratio="n/a" echo "" - echo -e "${BOLD}--- target≈${target_steps} steps (n=${n} iterations) ---${NC}" + echo -e "${BOLD}--- target~=${target_steps} steps (n=${n} iterations) ---${NC}" if $RUN_LAMBDA; then local input_file="$TMP_DIR/lambda_${n}.bin" @@ -361,7 +372,7 @@ run_one() { echo -e " ${GREEN}[Lambda VM] Proving...${NC}" local lambda_output - if ! lambda_output=$("$CLI" prove "$LAMBDA_ELF" -o "$proof_file" --private-input "$input_file" --time 2>"$stderr_file"); then + if ! lambda_output=$("$CLI" prove "$LAMBDA_ELF" -o "$proof_file" --private-input "$input_file" --time --cycles 2>"$stderr_file"); then echo -e " ${RED}[Lambda VM] FAILED:${NC}" cat "$stderr_file" exit 1 @@ -369,13 +380,21 @@ run_one() { rm -f "$proof_file" lambda_time=$(echo "$lambda_output" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') + lambda_cycles=$(echo "$lambda_output" | grep -o 'Cycles: [0-9]*' | grep -o '[0-9]*') if [ -z "$lambda_time" ]; then echo -e " ${RED}[Lambda VM] FAILED: could not parse proving time${NC}" printf "%s\n" "$lambda_output" exit 1 fi + if [ -z "$lambda_cycles" ]; then + lambda_cycles="n/a" + fi - echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" + if [ "$lambda_cycles" != "n/a" ]; then + echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC} (${lambda_cycles} cycles)" + else + echo -e " Lambda VM: ${BOLD}${lambda_time}s${NC}" + fi if [ -n "$REPORT_DIR" ]; then printf "%s\n" "$lambda_output" > "$REPORT_DIR/raw/lambda_${n}.stdout" @@ -411,30 +430,45 @@ run_one() { ratio=$(LC_NUMERIC=C awk -v lambda="$lambda_time" -v sp1="$sp1_time" 'BEGIN { printf "%.3f", lambda / sp1 }') fi + # Axis selection per prover: use measured cycles when available, otherwise + # fall back to the approximated target_steps. + local lambda_axis="$target_steps" + if [ "$lambda_cycles" != "n/a" ]; then + lambda_axis="$lambda_cycles" + fi + local sp1_axis="$target_steps" + if [ "$sp1_cycles" != "n/a" ]; then + sp1_axis="$sp1_cycles" + fi + if [ "$lambda_time" != "n/a" ]; then - LAMBDA_PROJECTION_STEPS+=("$target_steps") + LAMBDA_PROJECTION_STEPS+=("$lambda_axis") LAMBDA_TIMES+=("$lambda_time") fi if [ "$sp1_time" != "n/a" ]; then - SP1_PROJECTION_STEPS+=("$target_steps") + SP1_PROJECTION_STEPS+=("$sp1_axis") SP1_TIMES+=("$sp1_time") fi RESULT_TARGET_STEPS+=("$target_steps") RESULT_ITERATIONS+=("$n") - RESULT_PROJECTION_STEPS+=("$projection_steps") RESULT_LAMBDA+=("$lambda_time") + RESULT_LAMBDA_AXIS+=("$lambda_axis") + RESULT_LAMBDA_CYCLES+=("$lambda_cycles") RESULT_SP1+=("$sp1_time") + RESULT_SP1_AXIS+=("$sp1_axis") RESULT_SP1_CYCLES+=("$sp1_cycles") RESULT_RATIO+=("$ratio") if [ -n "$REPORT_DIR" ]; then - printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\n" \ + printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" \ "$target_steps" \ "$n" \ - "$projection_steps" \ "$lambda_time" \ + "$lambda_axis" \ + "$lambda_cycles" \ "$sp1_time" \ + "$sp1_axis" \ "$sp1_cycles" \ "$ratio" >> "$REPORT_DIR/results.tsv" fi @@ -469,7 +503,7 @@ compute_projection() { fi read -r slope intercept r2 <<< "$(fit_series "$steps_slash" "$times_slash")" - projected_s=$(project_series "$slope" "$intercept" "$TARGET_STEPS") + projected_s=$(project_series "$slope" "$intercept" "$TARGET_CYCLES") projected_h=$(format_hours "$projected_s") case "$label" in @@ -505,20 +539,21 @@ echo -e "Program: Fibonacci (u64 wrapping)" echo "" if $RUN_LAMBDA && $RUN_SP1; then - printf " %-12s %-12s %12s %12s %12s %8s\n" "Target steps" "Iterations" "Lambda VM" "SP1 v6" "SP1 cycles" "Ratio" - printf " %-12s %-12s %12s %12s %12s %8s\n" "------------" "----------" "---------" "------" "----------" "-----" + printf " %-12s %-12s %14s %14s %14s %14s %8s\n" "Target steps" "Iterations" "Lambda (s)" "Lambda cycles" "SP1 (s)" "SP1 cycles" "Ratio" + printf " %-12s %-12s %14s %14s %14s %14s %8s\n" "------------" "----------" "----------" "-------------" "-------" "----------" "-----" elif $RUN_LAMBDA; then - printf " %-12s %-12s %12s\n" "Target steps" "Iterations" "Lambda VM" - printf " %-12s %-12s %12s\n" "------------" "----------" "---------" + printf " %-12s %-12s %14s %14s\n" "Target steps" "Iterations" "Lambda (s)" "Lambda cycles" + printf " %-12s %-12s %14s %14s\n" "------------" "----------" "----------" "-------------" else - printf " %-12s %-12s %12s %12s\n" "Target steps" "Iterations" "SP1 v6" "SP1 cycles" - printf " %-12s %-12s %12s %12s\n" "------------" "----------" "------" "----------" + printf " %-12s %-12s %14s %14s\n" "Target steps" "Iterations" "SP1 (s)" "SP1 cycles" + printf " %-12s %-12s %14s %14s\n" "------------" "----------" "-------" "----------" fi for i in "${!RESULT_ITERATIONS[@]}"; do target_steps="${RESULT_TARGET_STEPS[$i]}" n="${RESULT_ITERATIONS[$i]}" lambda_time="${RESULT_LAMBDA[$i]}" + lambda_cycles="${RESULT_LAMBDA_CYCLES[$i]}" sp1_time="${RESULT_SP1[$i]}" sp1_cycles="${RESULT_SP1_CYCLES[$i]}" ratio="${RESULT_RATIO[$i]}" @@ -531,19 +566,20 @@ for i in "${!RESULT_ITERATIONS[@]}"; do else ratio_colored="${GREEN}${ratio_colored}${NC}" fi - printf " %-12s %-12s %11ss %11ss %12s " "$target_steps" "$n" "$lambda_time" "$sp1_time" "$sp1_cycles" + printf " %-12s %-12s %13ss %14s %13ss %14s " "$target_steps" "$n" "$lambda_time" "$lambda_cycles" "$sp1_time" "$sp1_cycles" echo -e "$ratio_colored" else - printf " %-12s %-12s %12s %12s %12s %8s\n" "$target_steps" "$n" "${lambda_time}s" "${sp1_time}s" "$sp1_cycles" "-" + printf " %-12s %-12s %14s %14s %14s %14s %8s\n" "$target_steps" "$n" "${lambda_time}s" "$lambda_cycles" "${sp1_time}s" "$sp1_cycles" "-" fi elif $RUN_LAMBDA; then - printf " %-12s %-12s %11ss\n" "$target_steps" "$n" "$lambda_time" + printf " %-12s %-12s %13ss %14s\n" "$target_steps" "$n" "$lambda_time" "$lambda_cycles" else - printf " %-12s %-12s %11ss %12s\n" "$target_steps" "$n" "$sp1_time" "$sp1_cycles" + printf " %-12s %-12s %13ss %14s\n" "$target_steps" "$n" "$sp1_time" "$sp1_cycles" fi done echo "" +echo -e "Timing window covers single-shot end-to-end proving; SP1 includes setup; both exclude verification." if $RUN_LAMBDA && $RUN_SP1; then echo -e "Green ratio = Lambda VM faster, Red = SP1 faster" fi @@ -551,14 +587,14 @@ echo "Raw data in $TMP_DIR/" if [ -n "$LAMBDA_PROJECTED_S" ] || [ -n "$SP1_PROJECTED_S" ]; then echo "" - echo -e "${BOLD}=== Linear Projection to ${TARGET_STEPS} Workload Steps ===${NC}" - echo " Axis: target workload steps" - echo " Note: when using iterations input, target steps are approximated as ${APPROX_STEPS_PER_ITERATION} * n" + echo -e "${BOLD}=== Linear Projection to ${TARGET_CYCLES} Cycles ===${NC}" + echo " Axis: measured dynamic instruction count per prover (cycles). When cycle data is" + echo " unavailable the script falls back to target_workload_steps ~= ${APPROX_STEPS_PER_ITERATION} * n." if [ -n "$LAMBDA_PROJECTED_S" ]; then - echo " Lambda VM: ${LAMBDA_PROJECTED_S}s (${LAMBDA_PROJECTED_H}h), R²=${LAMBDA_R2}" + echo " Lambda VM: ${LAMBDA_PROJECTED_S}s (${LAMBDA_PROJECTED_H}h), R2=${LAMBDA_R2}" fi if [ -n "$SP1_PROJECTED_S" ]; then - echo " SP1 v6: ${SP1_PROJECTED_S}s (${SP1_PROJECTED_H}h), R²=${SP1_R2}" + echo " SP1 v6: ${SP1_PROJECTED_S}s (${SP1_PROJECTED_H}h), R2=${SP1_R2}" fi fi @@ -571,10 +607,13 @@ if [ -n "$REPORT_DIR" ]; then echo "target_steps_series=$(join_slash "${RESULT_TARGET_STEPS[@]}")" echo "iterations=$(join_slash "${RESULT_ITERATIONS[@]}")" echo "projection_axis=$PROJECTION_AXIS" - echo "target_steps=$TARGET_STEPS" - echo "projection_steps=$(join_slash "${RESULT_PROJECTION_STEPS[@]}")" + echo "timing_window=setup_plus_end_to_end_prove_no_verify" + echo "target_cycles=$TARGET_CYCLES" echo "lambda_times=$(join_slash "${RESULT_LAMBDA[@]}")" + echo "lambda_axis_values=$(join_slash "${RESULT_LAMBDA_AXIS[@]}")" + echo "lambda_cycles=$(join_slash "${RESULT_LAMBDA_CYCLES[@]}")" echo "sp1_times=$(join_slash "${RESULT_SP1[@]}")" + echo "sp1_axis_values=$(join_slash "${RESULT_SP1_AXIS[@]}")" echo "sp1_cycles=$(join_slash "${RESULT_SP1_CYCLES[@]}")" echo "ratios=$(join_slash "${RESULT_RATIO[@]}")" if [ -n "$LAMBDA_PROJECTED_S" ]; then @@ -596,25 +635,27 @@ if [ -n "$REPORT_DIR" ]; then { echo "# Lambda VM vs SP1 v6 Benchmark" echo - echo "Projection axis: \`$PROJECTION_AXIS\`" + echo "Timing window: \`single-shot end-to-end prove\` (SP1 includes setup; both exclude verification and recursion)." + echo + echo "Projection axis: \`$PROJECTION_AXIS\` (measured dynamic instruction count per prover)." echo - echo "| Target steps | Iterations | Projection steps | Lambda VM (s) | SP1 v6 (s) | SP1 cycles | Ratio |" - echo "|-------------:|-----------:|-----------------:|--------------:|-----------:|-----------:|------:|" + echo "| Target steps | Iterations | Lambda VM (s) | Lambda cycles | SP1 v6 (s) | SP1 cycles | Ratio |" + echo "|-------------:|-----------:|--------------:|--------------:|-----------:|-----------:|------:|" for i in "${!RESULT_ITERATIONS[@]}"; do printf "| %s | %s | %s | %s | %s | %s | %s |\n" \ "${RESULT_TARGET_STEPS[$i]}" \ "${RESULT_ITERATIONS[$i]}" \ - "${RESULT_PROJECTION_STEPS[$i]}" \ "${RESULT_LAMBDA[$i]}" \ + "${RESULT_LAMBDA_CYCLES[$i]}" \ "${RESULT_SP1[$i]}" \ "${RESULT_SP1_CYCLES[$i]}" \ "${RESULT_RATIO[$i]}" done echo - echo "## Linear Projection to ${TARGET_STEPS} Workload Steps" + echo "## Linear Projection to ${TARGET_CYCLES} Cycles" echo - echo "| Prover | Slope (s / 1M workload steps) | Intercept (s) | R² | Projected @ ${TARGET_STEPS} (s) | Projected @ ${TARGET_STEPS} (h) |" - echo "|--------|-------------------------------:|--------------:|---:|------------------------------:|------------------------------:|" + echo "| Prover | Slope (s / 1M cycles) | Intercept (s) | R2 | Projected @ ${TARGET_CYCLES} (s) | Projected @ ${TARGET_CYCLES} (h) |" + echo "|--------|----------------------:|--------------:|---:|------------------------------:|------------------------------:|" if [ -n "$LAMBDA_PROJECTED_S" ]; then printf "| Lambda VM | %s | %s | %s | %s | %s |\n" \ "$LAMBDA_SLOPE" \ diff --git a/bench_vs/sp1/fibonacci/script/src/main.rs b/bench_vs/sp1/fibonacci/script/src/main.rs index 761d0c911..85730518a 100644 --- a/bench_vs/sp1/fibonacci/script/src/main.rs +++ b/bench_vs/sp1/fibonacci/script/src/main.rs @@ -17,18 +17,20 @@ fn main() { let mut stdin = SP1Stdin::new(); stdin.write(&n); - // Setup - let pk = client.setup(FIB_ELF.clone()).expect("setup failed"); - - // Execute for cycle count + // Cycle count — executed *before* the timer starts, matching Lambda's + // pre-pass for symmetry. This costs extra wall-clock but does not inflate + // the measured proving time. let (_, report) = client .execute(FIB_ELF.clone(), stdin.clone()) .run() .unwrap(); println!("Cycles: {}", report.total_instruction_count()); - // Core proof (no recursion) + // Timed window: end-to-end single-shot proving, including `setup` + // (verifying-key derivation) and the `core` proof itself. No recursion / + // compression, no verification. let start = Instant::now(); + let pk = client.setup(FIB_ELF.clone()).expect("setup failed"); let proof = client .prove(&pk, stdin) .core() @@ -38,7 +40,7 @@ fn main() { println!("Proving time: {:.3}s", elapsed.as_secs_f64()); - // Verify + // Verify (outside the timer, same as Lambda). client .verify(&proof, pk.verifying_key(), None) .expect("verify failed"); diff --git a/bin/cli/src/main.rs b/bin/cli/src/main.rs index 3a1917a32..162a201ef 100644 --- a/bin/cli/src/main.rs +++ b/bin/cli/src/main.rs @@ -128,9 +128,13 @@ enum Commands { #[arg(long)] blowup: Option, - /// Print timing breakdown + /// Print proving time #[arg(long)] time: bool, + + /// Execute one pre-pass outside the timer and print dynamic instruction count + #[arg(long)] + cycles: bool, }, /// Verify a proof bundle @@ -168,7 +172,8 @@ fn main() -> ExitCode { private_input, blowup, time, - } => cmd_prove(elf, output, private_input, blowup, time), + cycles, + } => cmd_prove(elf, output, private_input, blowup, time, cycles), Commands::Verify { proof, elf, @@ -290,6 +295,7 @@ fn cmd_prove( private_input_path: Option, blowup: Option, time: bool, + cycles: bool, ) -> ExitCode { eprintln!("Reading ELF file..."); let elf_data = match std::fs::read(&elf_path) { @@ -308,6 +314,35 @@ fn cmd_prove( } }; + // Pre-pass: execute once outside the timer to count dynamic instructions. + // Mirrors SP1's cycle-count pass so both provers report the same kind of + // number without inflating the measured proving time. + let cycle_count = if cycles { + let program = match Elf::load(&elf_data) { + Ok(p) => p, + Err(e) => { + eprintln!("Failed to load ELF for cycle count: {:?}", e); + return ExitCode::FAILURE; + } + }; + let executor = match Executor::new(&program, private_inputs.clone()) { + Ok(e) => e, + Err(e) => { + eprintln!("Failed to create executor for cycle count: {:?}", e); + return ExitCode::FAILURE; + } + }; + match executor.run() { + Ok(result) => Some(result.logs.len() as u64), + Err(e) => { + eprintln!("Execution failed during cycle count: {:?}", e); + return ExitCode::FAILURE; + } + } + } else { + None + }; + #[cfg(feature = "jemalloc-stats")] let tracker = heap_tracker::HeapTracker::start(); @@ -370,6 +405,9 @@ fn cmd_prove( } eprintln!("Proof written to {:?}", output_path); + if let Some(c) = cycle_count { + println!("Cycles: {}", c); + } if time { println!("Proving time: {:.3}s", prove_elapsed.as_secs_f64()); } From 1e1459e0e3e34fa0a329af25666d4de52d2daabf Mon Sep 17 00:00:00 2001 From: jotabulacios Date: Tue, 14 Apr 2026 15:06:54 -0300 Subject: [PATCH 14/14] Fix grep pipefail in bench_vs/run.sh by switching to sed --- bench_vs/run.sh | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/bench_vs/run.sh b/bench_vs/run.sh index f72f3731e..3784c6357 100755 --- a/bench_vs/run.sh +++ b/bench_vs/run.sh @@ -257,6 +257,22 @@ with open(path, "wb") as fh: PY } +extract_proving_time() { + sed -nE '/Proving time: [0-9.]+s/ { + s/.*Proving time: ([0-9.]+)s.*/\1/ + p + q + }' +} + +extract_cycles() { + sed -nE '/Cycles: [0-9]+/ { + s/.*Cycles: ([0-9]+).*/\1/ + p + q + }' +} + echo -e "${BOLD}=== Fibonacci Benchmark: Lambda VM vs SP1 v6 ===${NC}" echo -e "Series mode: ${YELLOW}${SERIES_MODE}${NC}" echo -e "Requested series: ${YELLOW}${SERIES[*]}${NC}" @@ -379,8 +395,8 @@ run_one() { fi rm -f "$proof_file" - lambda_time=$(echo "$lambda_output" | grep -o 'Proving time: [0-9.]*s' | grep -o '[0-9.]*') - lambda_cycles=$(echo "$lambda_output" | grep -o 'Cycles: [0-9]*' | grep -o '[0-9]*') + lambda_time=$(printf "%s\n" "$lambda_output" | extract_proving_time) + lambda_cycles=$(printf "%s\n" "$lambda_output" | extract_cycles) if [ -z "$lambda_time" ]; then echo -e " ${RED}[Lambda VM] FAILED: could not parse proving time${NC}" printf "%s\n" "$lambda_output" @@ -411,8 +427,8 @@ run_one() { exit 1 fi - sp1_time=$(grep -o 'Proving time: [0-9.]*s' "$sp1_output_file" | grep -o '[0-9.]*') - sp1_cycles=$(grep -o 'Cycles: [0-9]*' "$sp1_output_file" | grep -o '[0-9]*') + sp1_time=$(extract_proving_time < "$sp1_output_file") + sp1_cycles=$(extract_cycles < "$sp1_output_file") if [ -z "$sp1_time" ] || [ -z "$sp1_cycles" ]; then echo -e " ${RED}[SP1 v6] FAILED: could not parse output${NC}" cat "$sp1_output_file"