diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c0531e7..d218d4a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,12 +36,12 @@ jobs: steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@nightly + with: + toolchain: nightly-2025-07-17 - name: Install Dependencies - run: sudo apt install protobuf-compiler - - name: Cargo Test with prover - run: cargo test --release --features=prover - - name: Cargo Test with prover_v2 - run: cargo test --release --features=prover_v2 + run: sudo apt update && sudo apt install protobuf-compiler + - run: curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/ProjectZKM/toolchain/refs/heads/main/setup.sh | sh + - run: source ~/.zkm-toolchain/env && cargo test --release clippy: name: Clippy @@ -49,11 +49,13 @@ jobs: steps: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@nightly + with: + toolchain: nightly-2025-07-17 + - run: curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/ProjectZKM/toolchain/refs/heads/main/setup.sh | sh + - run: source ~/.zkm-toolchain/env && cargo build - name: Install Dependencies - run: sudo apt install protobuf-compiler - - run: rustup component add clippy - - run: cargo clippy --features=prover --all-targets -- -D warnings - - run: cargo clippy --features=prover_v2 --all-targets -- -D warnings + run: sudo apt update && sudo apt install protobuf-compiler + - run: cargo clippy --all-targets -- -D warnings fmt: name: Rustfmt diff --git a/.gitignore b/.gitignore index 1cd0c6fe..7b04a742 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ /output .vscode .idea +/**/.env +tools/certs/* +proof-service/config/prover1.toml +examples/fibonacci/guest/target +examples/fibonacci/host/proof-with-pis.bin \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..55d7173b --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,10019 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[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 = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[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 = "air" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/ziren-gpu?branch=feat%2Fmulti-provers#87032eb670b9f9fbb117f99ae747bb4e23415374" +dependencies = [ + "lazy_static", + "p3-air", + "p3-field", + "p3-koala-bear", + "p3-matrix", + "p3-monty-31", + "tracing", + "zkm-core-machine", + "zkm-stark", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-consensus" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6440213a22df93a87ed512d2f668e7dc1d62a05642d107f82d61edc9e12370" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "borsh", + "c-kzg", + "derive_more 2.1.0", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-consensus-any" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d0bea09287942405c4f9d2a4f22d1e07611c2dbd9d5bf94b75366340f9e6e0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-eips" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd2c7ae05abcab4483ce821f12f285e01c0b33804e6883dd9ca1569a87ee2be" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "borsh", + "c-kzg", + "derive_more 2.1.0", + "either", + "serde", + "serde_with", + "sha2", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-json-abi" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003f46c54f22854a32b9cc7972660a476968008ad505427eabab49225309ec40" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http 1.4.0", + "serde", + "serde_json", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4029954d9406a40979f3a3b46950928a0fdcfe3ea8a9b0c17490d57e8aa0e3" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more 2.1.0", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-network-primitives" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7805124ad69e57bbae7731c9c344571700b2a18d351bda9e0eba521c991d1bcb" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.1.0", + "foldhash 0.2.0", + "hashbrown 0.16.1", + "indexmap 2.12.1", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b43c1622aac2508d528743fd4cfdac1dea92d5a8fa894038488ff7edd0af0b32" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5fafb741c19b3cca4cdd04fa215c89413491f9695a3e928dee2ae5657f607e" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6f180c399ca7c1e2fe17ea58343910cad0090878a696ff5a50241aee12fc529" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc39ad2c0a3d2da8891f4081565780703a593f090f768f884049aa3aa929cbc" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve 0.13.8", + "k256", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-signer-local" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930e17cb1e46446a193a593a3bfff8d0ecee4e510b802575ebe300ae2e43ef75" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.17", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.12.1", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.111", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.111", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" +dependencies = [ + "serde", + "winnow 0.7.14", +] + +[[package]] +name = "alloy-sol-types" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-trie" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 2.1.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae109e33814b49fc0a62f2528993aa8a2dd346c26959b151f05441dc0b9da292" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.111", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[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 = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +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" +dependencies = [ + "serde", +] + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[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.111", +] + +[[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.111", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-config" +version = "1.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0149602eeaf915158e14029ba0c78dedb8c08d554b024d54c8f239aab46511d" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-sdk-sso", + "aws-sdk-ssooidc", + "aws-sdk-sts", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "hex", + "http 1.4.0", + "ring 0.17.14", + "time", + "tokio", + "tracing", + "url", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01c9521fa01558f750d183c8c68c81b0155b9d193a4ba7f84c36bd1b6d04a06" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "zeroize", +] + +[[package]] +name = "aws-lc-rs" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b5ce75405893cd713f9ab8e297d8e438f624dde7d706108285f7e17a25a180f" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "179c3777a8b5e70e90ea426114ffc565b2c1a9f82f6c4a0c5a34aa6ef5e781b6" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "aws-runtime" +version = "1.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce527fb7e53ba9626fc47824f25e256250556c40d8f81d27dd92aa38239d632" +dependencies = [ + "aws-credential-types", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "http-body 0.4.6", + "percent-encoding", + "pin-project-lite", + "tracing", + "uuid 1.19.0", +] + +[[package]] +name = "aws-sdk-s3" +version = "1.116.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4c10050aa905b50dc2a1165a9848d598a80c3a724d6f93b5881aa62235e4a5" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-checksums", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "bytes", + "fastrand", + "hex", + "hmac", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "lru 0.12.5", + "percent-encoding", + "regex-lite", + "sha2", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-sso" +version = "1.90.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f18e53542c522459e757f81e274783a78f8c81acdfc8d1522ee8a18b5fb1c66" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-ssooidc" +version = "1.92.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532f4d866012ffa724a4385c82e8dd0e59f0ca0e600f3f22d4c03b6824b34e4a" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-sts" +version = "1.94.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be6fbbfa1a57724788853a623378223fe828fc4c09b146c992f0c95b6256174" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "fastrand", + "http 0.2.12", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "1.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +dependencies = [ + "aws-credential-types", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "crypto-bigint 0.5.5", + "form_urlencoded", + "hex", + "hmac", + "http 0.2.12", + "http 1.4.0", + "p256 0.11.1", + "percent-encoding", + "ring 0.17.14", + "sha2", + "subtle", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-async" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.63.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95bd108f7b3563598e4dc7b62e1388c9982324a2abd622442167012690184591" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "bytes", + "crc-fast", + "hex", + "http 0.2.12", + "http-body 0.4.6", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.60.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" +dependencies = [ + "aws-smithy-types", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.62.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +dependencies = [ + "aws-smithy-eventstream", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "futures-util", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http-client" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "h2 0.3.27", + "h2 0.4.12", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper 1.8.1", + "hyper-rustls 0.24.2", + "hyper-rustls 0.27.7", + "hyper-util", + "pin-project-lite", + "rustls 0.21.12", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.61.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +dependencies = [ + "aws-smithy-types", +] + +[[package]] +name = "aws-smithy-observability" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +dependencies = [ + "aws-smithy-runtime-api", +] + +[[package]] +name = "aws-smithy-query" +version = "0.60.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +dependencies = [ + "aws-smithy-types", + "urlencoding", +] + +[[package]] +name = "aws-smithy-runtime" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-http-client", + "aws-smithy-observability", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "fastrand", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "http-body 1.0.1", + "pin-project-lite", + "pin-utils", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +dependencies = [ + "aws-smithy-async", + "aws-smithy-types", + "bytes", + "http 0.2.12", + "http 1.4.0", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-types" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http 0.2.12", + "http 1.4.0", + "http-body 0.4.6", + "http-body 1.0.1", + "http-body-util", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.60.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "1.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +dependencies = [ + "aws-credential-types", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "rustc_version 0.4.1", + "tracing", +] + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 0.1.2", + "tower 0.4.13", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "mime", + "rustversion", + "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 1.4.0", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[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.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[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 2.10.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease 0.2.37", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.111", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcoin-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] + +[[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 0.10.7", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq 0.3.1", +] + +[[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.7", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[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 0.22.0", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "blst" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[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.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +dependencies = [ + "serde", +] + +[[package]] +name = "bytes-utils" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "c-kzg" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +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 1.0.27", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cbindgen" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" +dependencies = [ + "clap", + "heck 0.4.1", + "indexmap 2.12.1", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.111", + "tempfile", + "toml 0.8.23", +] + +[[package]] +name = "cc" +version = "1.2.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "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.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[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.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "clap_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest 0.10.7", + "generic-array 0.14.7", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror 1.0.69", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "common" +version = "0.1.0" +dependencies = [ + "anyhow", + "aws-config", + "aws-sdk-s3", + "tokio", + "tonic", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[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", + "windows-sys 0.59.0", +] + +[[package]] +name = "const-hex" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +dependencies = [ + "cfg-if", + "cpufeatures", + "proptest", + "serde_core", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_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.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc-fast" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" +dependencies = [ + "crc", + "digest 0.10.7", + "rand 0.9.2", + "regex", + "rustversion", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[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.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[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.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb230974aaf0aca4d71665bed0aca156cf43b764fcb9583b69c6c3e686f35e72" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctrlc" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" +dependencies = [ + "dispatch2", + "nix", + "windows-sys 0.61.2", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "fiat-crypto", + "rustc_version 0.4.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim", + "syn 2.0.111", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.111", +] + +[[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 = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" +dependencies = [ + "derive_more-impl 2.1.0", +] + +[[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.111", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.111", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[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-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +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 = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] + +[[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.111", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dtor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.10", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "serdect", + "signature 2.2.0", + "spki 0.7.3", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array 0.14.7", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.1", + "generic-array 0.14.7", + "group 0.13.0", + "hkdf", + "pem-rfc7468", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand 0.8.5", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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.111", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "era_cudart" +version = "0.154.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a26bb3038da2def3a910c1052b30e2e20b78cbea51efb5d71c6033877ade4a" +dependencies = [ + "bitflags 2.10.0", + "era_cudart_sys", + "paste", +] + +[[package]] +name = "era_cudart_sys" +version = "0.154.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322b32fb10bdffc0cebe146cbdc7ba0f3fa6ed7aac8700facff0c0077c5642b8" +dependencies = [ + "regex-lite", +] + +[[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 = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand 0.8.5", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror 1.0.69", + "uuid 0.8.2", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror 1.0.69", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease 0.2.37", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.27", + "serde", + "serde_json", + "syn 2.0.111", + "toml 0.8.23", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.111", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve 0.13.8", + "ethabi", + "generic-array 0.14.7", + "k256", + "num_enum 0.7.5", + "once_cell", + "open-fastrlp", + "rand 0.8.5", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.111", + "tempfile", + "thiserror 1.0.69", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest 0.11.27", + "semver 1.0.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve 0.13.8", + "eth-keystore", + "ethers-core", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver 1.0.27", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror 1.0.69", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "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 = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.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 = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "fibonacci-host" +version = "0.1.0" +dependencies = [ + "hex", + "zkm-build", + "zkm-sdk", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf57c49a95fd1fe24b90b3033bee6dc7e8f1288d51494cb44e627c295e38542" +dependencies = [ + "rustversion", + "serde_core", + "typenum", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "git2" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +dependencies = [ + "bitflags 2.10.0", + "libc", + "libgit2-sys", + "log", + "url", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[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.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.12.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.4.0", + "indexmap 2.12.1", + "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 = "halo2curves" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380afeef3f1d4d3245b76895172018cfb087d9976a7cabcd5597775b2933e07" +dependencies = [ + "blake2", + "digest 0.10.7", + "ff 0.13.1", + "group 0.13.0", + "halo2derive", + "hex", + "lazy_static", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "pairing 0.23.0", + "pasta_curves 0.5.1", + "paste", + "rand 0.8.5", + "rand_core 0.6.4", + "rayon", + "serde", + "serde_arrays", + "sha2", + "static_assertions", + "subtle", + "unroll", +] + +[[package]] +name = "halo2derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb99e7492b4f5ff469d238db464131b86c2eaac814a78715acba369f64d2c76" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hickory-proto" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror 1.0.69", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[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 = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.0", +] + +[[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 1.4.0", + "http-body 1.0.1", + "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 = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[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 0.4.12", + "http 1.4.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "log", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.4.0", + "hyper 1.8.1", + "hyper-util", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.32", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-util" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.1", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[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 = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[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.111", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +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", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[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 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "serdect", + "sha2", + "signature 2.2.0", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set 0.5.3", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph 0.6.5", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libgit2-sys" +version = "0.17.0+1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[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" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[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", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +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", + "rand 0.8.5", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[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", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive 0.7.5", + "rustversion", +] + +[[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 = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "nums" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3c74f925fb8cfc49a8022f2afce48a0683b70f9e439885594e84c5edbf5b01" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "nybbles" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[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 = "oneshot" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "primeorder", + "sha2", +] + +[[package]] +name = "p3-air" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "p3-field", + "p3-matrix", +] + +[[package]] +name = "p3-bn254-fr" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "ff 0.13.1", + "halo2curves", + "num-bigint 0.4.6", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-challenger" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-circle" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-commit" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-challenger", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-util", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "nums", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-fri" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-interpolation", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-interpolation" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", +] + +[[package]] +name = "p3-keccak" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-field", + "p3-symmetric", + "p3-util", + "tiny-keccak", +] + +[[package]] +name = "p3-keccak-air" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "p3-air", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-koala-bear" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "p3-field", + "p3-mds", + "p3-monty-31", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", + "transpose", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "rayon", +] + +[[package]] +name = "p3-mds" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand 0.8.5", +] + +[[package]] +name = "p3-merkle-tree" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-mersenne-31" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "num-bigint 0.4.6", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-monty-31" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "num-bigint 0.4.6", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "rand 0.8.5", + "serde", + "serde_json", + "tracing", + "transpose", +] + +[[package]] +name = "p3-poseidon2" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "p3-field", + "serde", +] + +[[package]] +name = "p3-uni-stark" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools 0.13.0", + "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.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "lock_api", + "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 = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group 0.13.0", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[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 = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[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", + "hex", + "lazy_static", + "rand 0.8.5", + "serde", + "static_assertions", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.12.1", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset 0.5.7", + "indexmap 2.12.1", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[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.111", +] + +[[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 = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der 0.7.10", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.10", + "spki 0.7.3", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[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 = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[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.111", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve 0.13.8", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[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.7", +] + +[[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.111", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "protobuf", + "thiserror 1.0.69", +] + +[[package]] +name = "proof-service" +version = "0.2.0" +dependencies = [ + "anyhow", + "bincode", + "clap", + "common", + "env_logger 0.10.2", + "ethers", + "hex", + "hyper 0.14.32", + "lazy_static", + "log", + "once_cell", + "prometheus", + "prost 0.11.9", + "prover_v2", + "rand 0.8.5", + "rayon", + "serde", + "serde_derive", + "serde_json", + "sha2", + "sqlx", + "tokio", + "toml 0.5.11", + "tonic", + "tonic-build", + "tracing", + "tracing-forest", + "tracing-subscriber", + "uuid 1.19.0", +] + +[[package]] +name = "proptest" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +dependencies = [ + "bit-set 0.8.0", + "bit-vec 0.8.0", + "bitflags 2.10.0", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools 0.10.5", + "lazy_static", + "log", + "multimap 0.8.3", + "petgraph 0.6.5", + "prettyplease 0.1.25", + "prost 0.11.9", + "prost-types 0.11.9", + "regex", + "syn 1.0.109", + "tempfile", + "which 4.4.2", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap 0.10.1", + "once_cell", + "petgraph 0.7.1", + "prettyplease 0.2.37", + "prost 0.13.5", + "prost-types 0.13.5", + "regex", + "syn 2.0.111", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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.111", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost 0.13.5", +] + +[[package]] +name = "protobuf" +version = "2.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" + +[[package]] +name = "prover_v2" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "common", + "crossbeam-channel", + "lazy_static", + "lru 0.14.0", + "once_cell", + "p3-maybe-rayon", + "parking_lot", + "serde", + "serde_json", + "tempfile", + "tracing", + "zkm-core-executor", + "zkm-core-machine", + "zkm-gpu-core", + "zkm-gpu-prover", + "zkm-prover", + "zkm-recursion-circuit", + "zkm-recursion-compiler", + "zkm-recursion-core", + "zkm-sdk", + "zkm-stark", + "zstd 0.13.3", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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", + "serde", +] + +[[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.3", + "serde", +] + +[[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.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + +[[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 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.27", + "hickory-resolver", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls 0.24.1", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tower 0.5.2", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + +[[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.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[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.16", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rrs-succinct" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3372685893a9f67d18e98e792d690017287fd17379a83d798d958e517d380fa9" +dependencies = [ + "downcast-rs", + "num_enum 0.5.11", + "paste", +] + +[[package]] +name = "rsa" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +dependencies = [ + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "signature 2.2.0", + "spki 0.7.3", + "subtle", + "zeroize", +] + +[[package]] +name = "ruint" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.27", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +dependencies = [ + "log", + "ring 0.16.20", + "sct", + "webpki", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "aws-lc-rs", + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.103.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "aws-lc-rs", + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more 1.0.0", + "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.111", +] + +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array 0.14.7", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.10", + "generic-array 0.14.7", + "pkcs8 0.10.2", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" +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.111", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.12.1", + "schemars 0.9.0", + "schemars 1.1.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct 0.2.0", + "serde", +] + +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "thiserror 2.0.17", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "size" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.10", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64 0.22.1", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap 2.12.1", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.17", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.111", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.111", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.10.0", + "byteorder", + "bytes", + "crc", + "digest 0.10.7", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array 0.14.7", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.10.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.17", + "time", + "tracing", + "url", +] + +[[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 = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.111", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest 0.11.27", + "semver 1.0.27", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "url", + "zip", +] + +[[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.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[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.111", +] + +[[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 = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[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.111", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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 = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.1", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[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.111", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.9", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.35", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +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.12.1", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.12.1", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.14", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime 0.7.3", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tonic" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.6.20", + "base64 0.13.1", + "bytes", + "flate2", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.11.9", + "prost-derive 0.11.9", + "rustls-native-certs 0.6.3", + "rustls-pemfile", + "tokio", + "tokio-rustls 0.23.4", + "tokio-stream", + "tokio-util", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + +[[package]] +name = "tonic-build" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" +dependencies = [ + "prettyplease 0.1.25", + "proc-macro2", + "prost-build 0.11.9", + "quote", + "syn 1.0.109", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "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.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +dependencies = [ + "log", + "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.17", + "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.111", +] + +[[package]] +name = "tracing-core" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +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-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[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 = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.5", + "rustls 0.21.12", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "twirp-build-rs" +version = "0.13.0-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8160cc3d9282e192ec842f1ab44e9d396312ff5472bdab58f5e7f4d882b22eea" +dependencies = [ + "prost-build 0.13.5", +] + +[[package]] +name = "twirp-rs" +version = "0.13.0-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27dfcc06b8d9262bc2d4b8d1847c56af9971a52dd8a0076876de9db763227d0d" +dependencies = [ + "async-trait", + "axum 0.7.9", + "futures", + "http 1.4.0", + "http-body-util", + "hyper 1.8.1", + "prost 0.13.5", + "reqwest 0.12.24", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower 0.5.2", + "url", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[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 = "unroll" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.16", + "serde", +] + +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "rand 0.9.2", + "uuid-macro-internal", + "wasm-bindgen", +] + +[[package]] +name = "uuid-macro-internal" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39d11901c36b3650df7acb0f9ebe624f35b5ac4e1922ecd3c57f444648429594" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +dependencies = [ + "serde", +] + +[[package]] +name = "vergen" +version = "8.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" +dependencies = [ + "anyhow", + "cfg-if", + "git2", + "rustversion", + "time", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.111", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[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 = "web-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +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" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + +[[package]] +name = "which" +version = "6.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" +dependencies = [ + "either", + "home", + "rustix 0.38.44", + "winsafe", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +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.111", +] + +[[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.111", +] + +[[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 = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper 0.6.0", + "thiserror 2.0.17", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[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.111", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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.111", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[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.111", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq 0.1.5", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" +dependencies = [ + "ark-ff 0.4.2", + "ark-std 0.4.0", + "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 = "zkm-build" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "anyhow", + "cargo_metadata", + "chrono", + "clap", + "dirs", +] + +[[package]] +name = "zkm-core-executor" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "anyhow", + "bincode", + "bytemuck", + "elf", + "enum-map", + "env_logger 0.11.8", + "eyre", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "log", + "nohash-hasher", + "num", + "p3-field", + "p3-koala-bear", + "p3-maybe-rayon", + "p3-symmetric", + "rand 0.8.5", + "rayon-scan", + "rrs-succinct", + "serde", + "serde_json", + "sha2", + "strum", + "strum_macros", + "thiserror 1.0.69", + "tiny-keccak", + "tracing", + "tracing-subscriber", + "typenum", + "vec_map", + "zkm-curves", + "zkm-primitives", + "zkm-stark", +] + +[[package]] +name = "zkm-core-machine" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "bincode", + "cbindgen", + "cc", + "cfg-if", + "elliptic-curve 0.13.8", + "generic-array 1.3.5", + "glob", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "k256", + "log", + "num", + "num_cpus", + "p256 0.13.2", + "p3-air", + "p3-challenger", + "p3-field", + "p3-keccak-air", + "p3-koala-bear", + "p3-matrix", + "p3-maybe-rayon", + "p3-poseidon2", + "p3-uni-stark", + "p3-util", + "pathdiff", + "rand 0.8.5", + "rayon", + "rayon-scan", + "serde", + "serde_json", + "size", + "snowbridge-amcl", + "static_assertions", + "strum", + "strum_macros", + "tempfile", + "thiserror 1.0.69", + "tiny-keccak", + "tracing", + "tracing-forest", + "tracing-subscriber", + "typenum", + "web-time", + "zkm-core-executor", + "zkm-curves", + "zkm-derive", + "zkm-primitives", + "zkm-stark", +] + +[[package]] +name = "zkm-cuda" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "bincode", + "ctrlc", + "prost 0.13.5", + "prost-build 0.13.5", + "serde", + "tokio", + "tracing", + "twirp-build-rs", + "twirp-rs", + "zkm-core-machine", + "zkm-prover", +] + +[[package]] +name = "zkm-curves" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "cfg-if", + "curve25519-dalek", + "dashu", + "elliptic-curve 0.13.8", + "generic-array 1.3.5", + "itertools 0.13.0", + "k256", + "num", + "p256 0.13.2", + "p3-field", + "serde", + "snowbridge-amcl", + "typenum", + "zkm-primitives", + "zkm-stark", +] + +[[package]] +name = "zkm-derive" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "zkm-gpu-core" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/ziren-gpu?branch=feat%2Fmulti-provers#87032eb670b9f9fbb117f99ae747bb4e23415374" +dependencies = [ + "air", + "bincode", + "cbindgen", + "cc", + "ctor", + "era_cudart", + "era_cudart_sys", + "hashbrown 0.14.5", + "ignore", + "itertools 0.13.0", + "lazy_static", + "log", + "once_cell", + "oneshot", + "p3-air", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-interpolation", + "p3-koala-bear", + "p3-matrix", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "pathdiff", + "rand 0.8.5", + "rayon", + "serde", + "thiserror 1.0.69", + "tracing", + "tracing-subscriber", + "transpose", + "which 6.0.3", + "zkhash", + "zkm-core-executor", + "zkm-core-machine", + "zkm-prover", + "zkm-recursion-core", + "zkm-stark", +] + +[[package]] +name = "zkm-gpu-prover" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/ziren-gpu?branch=feat%2Fmulti-provers#87032eb670b9f9fbb117f99ae747bb4e23415374" +dependencies = [ + "bincode", + "clap", + "p3-koala-bear", + "p3-matrix", + "rayon", + "sysinfo", + "tempfile", + "tracing", + "web-time", + "zkm-core-executor", + "zkm-core-machine", + "zkm-gpu-core", + "zkm-primitives", + "zkm-prover", + "zkm-recursion-circuit", + "zkm-recursion-compiler", + "zkm-recursion-core", + "zkm-stark", +] + +[[package]] +name = "zkm-lib" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "bincode", + "cfg-if", + "elliptic-curve 0.13.8", + "serde", + "sha2", + "zkm-primitives", +] + +[[package]] +name = "zkm-primitives" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "bincode", + "hex", + "lazy_static", + "num-bigint 0.4.6", + "p3-field", + "p3-koala-bear", + "p3-monty-31", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "zkm-prover" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "anyhow", + "bincode", + "clap", + "dirs", + "eyre", + "itertools 0.13.0", + "lru 0.12.5", + "num-bigint 0.4.6", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-field", + "p3-koala-bear", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rayon", + "serde", + "serde_json", + "serial_test", + "thiserror 1.0.69", + "tracing", + "tracing-appender", + "tracing-subscriber", + "zkm-core-executor", + "zkm-core-machine", + "zkm-primitives", + "zkm-recursion-circuit", + "zkm-recursion-compiler", + "zkm-recursion-core", + "zkm-recursion-gnark-ffi", + "zkm-stark", +] + +[[package]] +name = "zkm-recursion-circuit" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "hashbrown 0.14.5", + "itertools 0.13.0", + "num-traits", + "p3-air", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-koala-bear", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand 0.8.5", + "rayon", + "serde", + "tracing", + "zkm-core-executor", + "zkm-core-machine", + "zkm-derive", + "zkm-primitives", + "zkm-recursion-compiler", + "zkm-recursion-core", + "zkm-recursion-gnark-ffi", + "zkm-stark", +] + +[[package]] +name = "zkm-recursion-compiler" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "backtrace", + "itertools 0.13.0", + "p3-bn254-fr", + "p3-field", + "p3-koala-bear", + "p3-symmetric", + "serde", + "tracing", + "vec_map", + "zkm-core-machine", + "zkm-primitives", + "zkm-recursion-core", + "zkm-recursion-derive", + "zkm-stark", +] + +[[package]] +name = "zkm-recursion-core" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "backtrace", + "cbindgen", + "cc", + "ff 0.13.1", + "glob", + "hashbrown 0.14.5", + "itertools 0.13.0", + "p3-air", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-koala-bear", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-monty-31", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "pathdiff", + "rand 0.8.5", + "serde", + "static_assertions", + "thiserror 1.0.69", + "tracing", + "vec_map", + "zkhash", + "zkm-core-machine", + "zkm-derive", + "zkm-primitives", + "zkm-stark", +] + +[[package]] +name = "zkm-recursion-derive" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "zkm-recursion-gnark-ffi" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "anyhow", + "bincode", + "bindgen", + "cc", + "cfg-if", + "hex", + "log", + "num-bigint 0.4.6", + "p3-field", + "p3-koala-bear", + "p3-symmetric", + "serde", + "serde_json", + "sha2", + "tempfile", + "zkm-core-machine", + "zkm-recursion-compiler", + "zkm-stark", +] + +[[package]] +name = "zkm-sdk" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "alloy-signer", + "alloy-signer-local", + "alloy-sol-types", + "anyhow", + "async-trait", + "bincode", + "cfg-if", + "dirs", + "ethers", + "futures", + "hashbrown 0.14.5", + "hex", + "indicatif", + "itertools 0.13.0", + "log", + "num-bigint 0.4.6", + "p3-field", + "p3-fri", + "p3-koala-bear", + "prost 0.11.9", + "reqwest 0.11.27", + "serde", + "serde_json", + "strum", + "strum_macros", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tonic", + "tonic-build", + "tracing", + "twirp-rs", + "uuid 1.19.0", + "vergen", + "zkm-build", + "zkm-core-executor", + "zkm-core-machine", + "zkm-cuda", + "zkm-primitives", + "zkm-prover", + "zkm-stark", +] + +[[package]] +name = "zkm-stark" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "arrayref", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "p3-air", + "p3-challenger", + "p3-circle", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-keccak", + "p3-koala-bear", + "p3-matrix", + "p3-maybe-rayon", + "p3-mds", + "p3-merkle-tree", + "p3-mersenne-31", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rand 0.8.5", + "rayon-scan", + "serde", + "strum", + "strum_macros", + "sysinfo", + "tracing", + "tracing-forest", + "tracing-subscriber", + "zkm-derive", + "zkm-primitives", + "zkm-zkvm", +] + +[[package]] +name = "zkm-zkvm" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/Ziren#2aa1d4cc79d76c36e62a6317234308b03e3ecf7d" +dependencies = [ + "bincode", + "cfg-if", + "getrandom 0.2.16", + "lazy_static", + "rand 0.8.5", + "serde", + "sha2", + "zkm-lib", + "zkm-primitives", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe 7.2.4", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index c74b6d6a..1625cac4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,20 +1,68 @@ +[workspace.package] +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +rust-version = "1.80" +repository = "https://github.com/ProjectZKM/zkm-prover" +keywords = ["zkMIPS", "zero-knowledge", "zkvm", "MIPS"] +categories = ["cryptography"] + [workspace] members = [ - "prover", "common", "proof-service", + "examples/fibonacci/host", "prover_v2", ] - resolver = "2" -#[patch."https://github.com/zkMIPS/zkm.git"] -#zkm-prover = { path = "../zkm/prover" } -#zkm-emulator = { path = "../zkm/emulator" } -#zkm-recursion = { path = "../zkm/recursion" } -# -#[patch."https://github.com/zkMIPS/plonky2.git"] -#plonky2 = { path = "../plonky2-origin/plonky2" } -#starky = { path = "../plonky2-origin/starky" } -#plonky2_util = { path = "../plonky2-origin/util" } -#plonky2_maybe_rayon = { path = "../plonky2-origin/maybe_rayon" } +[workspace.dependencies] +common = { path = "./common" } + +tonic = { version = "0.8.3", features = ["gzip"] } +prost = "0.11.0" +tokio = { version = "1.21.0", features = ["macros", "rt-multi-thread", "signal"] } + +uuid = { version = "1.2", features = ["v4", "fast-rng", "macro-diagnostics"] } +sqlx = { version = "0.8.1", features = ["mysql", "time", "runtime-tokio"] } +serde_derive = "1.0.92" +log = "0.4.0" +env_logger = "0.10" +toml = "0.5.1" +clap = "4.5.2" +hex = "0.4.3" +ethers = "2.0.14" +prometheus = "0.13" +hyper = { version = "^0.14", features = ["server", "http1", "tcp"] } +rand = "0.8" +sha2 = "0.10.9" + +tracing = "0.1.37" +tracing-forest = { version = "0.1.6", features = ["ansi", "smallvec"] } +tracing-subscriber = { version = "0.3.19", features = ["std", "env-filter"] } +rayon = "1.10.0" + +serde_json = "1.0.140" +serde = { version = "1.0.219", features = ["derive", "rc"] } +bincode = "1.3.3" +anyhow = "1.0.97" +once_cell = "1.13.0" +zstd = "0.13.3" +lru = "0.14.0" +parking_lot = "0.12" +crossbeam-channel = "0.5" + +tempfile = "3.18.0" +lazy_static = "1.5.0" + +zkm-core-machine = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-core-executor = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-stark = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-prover = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-recursion-compiler = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-recursion-core = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-recursion-circuit = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-sdk = { git = "https://github.com/ProjectZKM/Ziren" } +zkm-build = { git = "https://github.com/ProjectZKM/Ziren" } + +p3-maybe-rayon = { git = "https://github.com/ProjectZKM/Plonky3" } diff --git a/README.md b/README.md index 0acb7fcf..1fc609fa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # zkm-prover -A parallel proving service for [ZKM](https://github.com/zkMIPS/zkm). +A parallel proving service for [ZKM](https://github.com/ProjectZKM/zkm). ## Stage Workflow @@ -90,21 +90,27 @@ docker run --name db-proof-service -e MYSQL_ROOT_PASSWORD=123456 -v ./initdb.d:/ ``` -### Prover +For Ziren: + +1. Launch the Mysql service. +``` +docker run --name zkm-mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=zkm2 -e MYSQL_USER=stage -e MYSQL_PASSWORD=123456 -p 3306:3306 -v /var/mysql-data:/var/lib/mysql -d mysql:latest +``` -Create the prover nodes `config.toml` below. +You can use `docker exec -it zkm-mysql mysql -u stage -p` to login the database and check out the schemes. + +2. Migrate the tables + +set your `DATABASE_URL`, like `DATABASE_URL=mysql://stage:${password}@localhost/zkm2`. -```toml -# Replace it with your IP address and port -addr = "0.0.0.0:50000" -prover_addrs = [] -# The NFS file system path / S3 must be used, and all node configurations must be the same -base_dir = "/tmp/zkm/test_proof" -proving_key_paths = ["/tmp/zkm/proving.key"] +``` +cargo install sqlx-cli +sqlx migrate run ``` -Refer to sample [sha2](https://github.com/zkMIPS/zkm/blob/main/recursion/src/lib.rs#L165) to generate the proving key -and verifying key. +### Prover + +Create the prover nodes `config.toml` by [gen_config.sh](./proof-service/config/gen_config.sh). Start @@ -114,30 +120,48 @@ export RUST_LOG=info; nohup ./target/release/proof-service --config ./proof-serv ### Stage -Create the stage server `config.toml` below, and set up the `prover_addrs`. +Create the stage server `config.toml` by [gen_config.sh](./proof-service/config/gen_config.sh), and set up the `prover_addrs`. -```toml -# Replace it with your IP address and port -addr = "0.0.0.0:50000" -# All prover node -prover_addrs = ["127.0.0.1:50001"] -database_url = "mysql://root:123456@localhost:3306/zkm" -# The NFS file system path / S3 must be used, and all node configurations must be the same -base_dir = "/tmp/zkm/test_proof" +Start -# File Server -fileserver_url = "http://0.0.0.0:40000/public" -fileserver_addr = "0.0.0.0:40000" +``` +export RUST_LOG=info; nohup ./target/release/proof-service --stage --config ./proof-service/config/stage.toml > stage.out & ``` -Start +### File Server + +Use [Static Web Server](https://static-web-server.net/getting-started/) as the file server. ``` -export RUST_LOG=info; nohup ./target/release/proof-service --stage --config ./proof-service/config/stage.toml > stage.out & +cargo install static-web-server +static-web-server --port 40000 --root /tmp/zkm/ +``` + +### Run Reth + +1. Add your address to whilitest + +``` +INSERT INTO user (address) VALUES ('$your address without 0x prefix'); +``` + +2. Generate your certificate as per to [config](./proof-service/config/README.md) + + +3. Prove your program + +A simple example would be like Fibonacci. + +``` +cd examples/host +# configure your network prover +cargo run -r +``` + +For Reth: ``` +git clone https://github.com/ProjectZKM/reth-processor -b stateless -## Features +cargo run -r -- --block-number 23794449 --rpc-url ${your rpc} --debug-rpc-url ${your debug rpc} --chain-id 1 --prove -[x] - Stage Checkpoint -[ ] - Task Checkpoint -[ ] - Task Scheduler +``` \ No newline at end of file diff --git a/common/Cargo.toml b/common/Cargo.toml index 337e39cf..97b18ab3 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = "1.0.75" -tokio = { version = "1", features = ["full"] } -tonic = { version = "0.8.1", features = ["tls", "transport"] } +anyhow = { workspace = true } +tokio = { workspace = true } +tonic = { workspace = true } aws-config = { version = "1.1.9", features = ["behavior-version-latest"] } aws-sdk-s3 = "1.21.0" \ No newline at end of file diff --git a/common/src/tls.rs b/common/src/tls.rs index 77b4d36e..4e6bcba1 100644 --- a/common/src/tls.rs +++ b/common/src/tls.rs @@ -29,6 +29,7 @@ async fn get_cert_and_identity( let mut ca: Option = None; let mut identity: Option = None; if ca_cert_path.is_file() { + println!("Loading CA cert from {:?}", ca_cert_path); let ca_cert = tokio::fs::read(ca_cert_path) .await .unwrap_or_else(|err| panic!("Failed to read {:?}, err: {:?}", ca_cert_path, err)); @@ -36,6 +37,10 @@ async fn get_cert_and_identity( } if cert_path.is_file() && key_path.is_file() { + println!( + "Loading server identity cert and key from {:?} and {:?}", + cert_path, key_path + ); let cert = tokio::fs::read(cert_path) .await .unwrap_or_else(|err| panic!("Failed to read {:?}, err: {:?}", cert_path, err)); diff --git a/docker-compose.yml b/docker-compose.yml index c5a5b408..88fd425f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,5 @@ -# image: zkm-prover:latest => https://github.com/zkMIPS/zkm-prover/blob/main/Dockerfile -# image: gnark-plonky2-verifier:latest => https://github.com/zkMIPS/gnark-plonky2-verifier/blob/main/Dockerfile +# image: zkm-prover:latest => https://github.com/ProjectZKM/zkm-prover/blob/main/Dockerfile +# image: gnark-plonky2-verifier:latest => https://github.com/ProjectZKM/gnark-plonky2-verifier/blob/main/Dockerfile networks: default: name: zkm-prover @@ -10,7 +10,7 @@ services: depends_on: zkm-prover: condition: service_started - image: zkmips/zkm-prover:latest + image: projectzkm/zkm-prover:latest ports: - 50000:50000 environment: @@ -26,7 +26,7 @@ services: zkm-prover: container_name: zkm-prover restart: unless-stopped - image: zkmips/zkm-prover:latest + image: projectzkm/zkm-prover:latest environment: - RUST_LOG=info volumes: diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..9a33f403 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,2 @@ +# Example + diff --git a/examples/fibonacci/guest/Cargo.lock b/examples/fibonacci/guest/Cargo.lock new file mode 100644 index 00000000..1dbc78e5 --- /dev/null +++ b/examples/fibonacci/guest/Cargo.lock @@ -0,0 +1,813 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[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 = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[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 = "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 = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "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", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[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", + "generic-array", + "group", + "hkdf", + "rand_core", + "sec1", + "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 = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fibonacci" +version = "1.1.0" +dependencies = [ + "zkm-zkvm", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[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 = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "linked_list_allocator" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[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", + "rand", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nums" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3c74f925fb8cfc49a8022f2afce48a0683b70f9e439885594e84c5edbf5b01" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "rand", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "p3-dft" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools", + "num-bigint", + "num-integer", + "num-traits", + "nums", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-koala-bear" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "p3-field", + "p3-mds", + "p3-monty-31", + "p3-poseidon2", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", + "transpose", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" + +[[package]] +name = "p3-mds" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-monty-31" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools", + "num-bigint", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "rand", + "serde", + "serde_json", + "tracing", + "transpose", +] + +[[package]] +name = "p3-poseidon2" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "itertools", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.1.0" +source = "git+https://github.com/ProjectZKM/Plonky3#faa24ca4597eebeecbf71b194b71c7d1a99b3f01" +dependencies = [ + "lock_api", + "serde", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rlsf" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222fb240c3286247ecdee6fa5341e7cdad0ffdf8e7e401d9937f2d58482a20bf" +dependencies = [ + "cfg-if", + "const-default", + "libc", + "svgbobdoc", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.110", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[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", + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-width", +] + +[[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.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.110", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[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 = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.110", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zkm-lib" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/ziren#48a6e677648f82af41fd20bb15c2171a5d2a2d6b" +dependencies = [ + "bincode", + "cfg-if", + "elliptic-curve", + "serde", + "sha2", + "zkm-primitives", +] + +[[package]] +name = "zkm-primitives" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/ziren#48a6e677648f82af41fd20bb15c2171a5d2a2d6b" +dependencies = [ + "bincode", + "hex", + "lazy_static", + "num-bigint", + "p3-field", + "p3-koala-bear", + "p3-monty-31", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "zkm-zkvm" +version = "1.2.2" +source = "git+https://github.com/ProjectZKM/ziren#48a6e677648f82af41fd20bb15c2171a5d2a2d6b" +dependencies = [ + "bincode", + "cfg-if", + "critical-section", + "embedded-alloc", + "getrandom", + "lazy_static", + "libm", + "rand", + "serde", + "sha2", + "zkm-lib", + "zkm-primitives", +] diff --git a/examples/fibonacci/guest/Cargo.toml b/examples/fibonacci/guest/Cargo.toml new file mode 100644 index 00000000..0f3175b5 --- /dev/null +++ b/examples/fibonacci/guest/Cargo.toml @@ -0,0 +1,10 @@ +[workspace] + +[package] +name = "fibonacci" +version = "1.1.0" +edition = "2021" +publish = false + +[dependencies] +zkm-zkvm = { git = "https://github.com/ProjectZKM/ziren", features= ["embedded"] } diff --git a/examples/fibonacci/guest/src/main.rs b/examples/fibonacci/guest/src/main.rs new file mode 100644 index 00000000..acd61611 --- /dev/null +++ b/examples/fibonacci/guest/src/main.rs @@ -0,0 +1,38 @@ +//! A simple program that takes a number `n` as input, and writes the `n-1`th and `n`th fibonacci +//! number as an output. + +// These two lines are necessary for the program to properly compile. +// +// Under the hood, we wrap your main function with some extra code so that it behaves properly +// inside the zkVM. +#![no_std] +#![no_main] +zkm_zkvm::entrypoint!(main); + +pub fn main() { + // Read an input to the program. + // + // Behind the scenes, this compiles down to a system call which handles reading inputs + // from the prover. + let n = zkm_zkvm::io::read::(); + + // Write n to public input + zkm_zkvm::io::commit(&n); + + // Compute the n'th fibonacci number, using normal Rust code. + let mut a = 0; + let mut b = 1; + for _ in 0..n { + let mut c = a + b; + c %= 7919; // Modulus to prevent overflow. + a = b; + b = c; + } + + // Write the output of the program. + // + // Behind the scenes, this also compiles down to a system call which handles writing + // outputs to the prover. + zkm_zkvm::io::commit(&a); + zkm_zkvm::io::commit(&b); +} diff --git a/examples/fibonacci/host/.env.example b/examples/fibonacci/host/.env.example new file mode 100644 index 00000000..9db26324 --- /dev/null +++ b/examples/fibonacci/host/.env.example @@ -0,0 +1,11 @@ +ZKM_PROVER="network" +ENDPOINT=https://10.3.0.39:50000 +ZKM_PRIVATE_KEY=0x + +TOOL="/" +CA_CERT_PATH=${TOOL}/tool/ca.pem +SSL_CERT_PATH=${TOOL}/tool/client.pem +SSL_KEY_PATH=${TOOL}/tool/client.key +SINGLE_NODE=true +ZKM_PROOF_POLL_INTERVAL=1000 +MAX_PROVER_NUM=1 diff --git a/examples/fibonacci/host/Cargo.toml b/examples/fibonacci/host/Cargo.toml new file mode 100644 index 00000000..488bbb40 --- /dev/null +++ b/examples/fibonacci/host/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "fibonacci-host" +version = { workspace = true } +edition = { workspace = true } +default-run = "fibonacci-host" +publish = false + +[dependencies] +hex.workspace = true +zkm-sdk = { workspace = true } + +[build-dependencies] +zkm-build = { workspace = true } + +[[bin]] +name = "plonk_bn254" +path = "bin/plonk_bn254.rs" + +[[bin]] +name = "groth16_bn254" +path = "bin/groth16_bn254.rs" + +[[bin]] +name = "compressed" +path = "bin/compressed.rs" + +[[bin]] +name = "execute" +path = "bin/execute.rs" + +[[bin]] +name = "fibonacci-host" +path = "src/main.rs" diff --git a/examples/fibonacci/host/bin/compressed.rs b/examples/fibonacci/host/bin/compressed.rs new file mode 100644 index 00000000..b238aecc --- /dev/null +++ b/examples/fibonacci/host/bin/compressed.rs @@ -0,0 +1,35 @@ +use zkm_sdk::{include_elf, utils, ProverClient, ZKMStdin}; + +/// The ELF we want to execute inside the zkVM. +const ELF: &[u8] = include_elf!("fibonacci"); + +fn main() { + // Setup logging. + utils::setup_logger(); + + // Create an input stream and write '500' to it. + let n = 500u32; + let mut stdin = ZKMStdin::new(); + stdin.write(&n); + + // Generate the constant-sized proof for the given program and input. + let client = ProverClient::new(); + let (pk, vk) = client.setup(ELF); + let mut proof = client.prove(&pk, stdin).compressed().run().unwrap(); + + println!("generated proof"); + // Read and verify the output. + let a = proof.public_values.read::(); + let b = proof.public_values.read::(); + println!("a: {}, b: {}", a, b); + + // Verify proof and public values + client.verify(&proof, &vk).expect("verification failed"); + + // Save the proof. + proof + .save("compressed-proof-with-pis.bin") + .expect("saving proof failed"); + + println!("successfully generated and verified proof for the program!") +} diff --git a/examples/fibonacci/host/bin/execute.rs b/examples/fibonacci/host/bin/execute.rs new file mode 100644 index 00000000..b5276e6c --- /dev/null +++ b/examples/fibonacci/host/bin/execute.rs @@ -0,0 +1,36 @@ +use zkm_sdk::{include_elf, utils, ProverClient, ZKMStdin}; + +/// The ELF we want to execute inside the zkVM. +const ELF: &[u8] = include_elf!("fibonacci"); + +fn main() { + // Setup logging. + utils::setup_logger(); + + // Create an input stream and write '500' to it. + let n = 500u32; + + let mut stdin = ZKMStdin::new(); + stdin.write(&n); + + // Only execute the program and get a `ZKMPublicValues` object. + let client = ProverClient::new(); + let (mut public_values, execution_report) = client.execute(ELF, stdin).run().unwrap(); + + // Print the total number of cycles executed and the full execution report with a breakdown of + // the MIPS opcode and syscall counts. + println!( + "Executed program with {} cycles", + execution_report.total_instruction_count() + execution_report.total_syscall_count() + ); + println!("Full execution report:\n{:?}", execution_report); + + // Read and verify the output. + let n = public_values.read::(); + let a = public_values.read::(); + let b = public_values.read::(); + + println!("n: {}", n); + println!("a: {}", a); + println!("b: {}", b); +} diff --git a/examples/fibonacci/host/bin/groth16_bn254.rs b/examples/fibonacci/host/bin/groth16_bn254.rs new file mode 100644 index 00000000..72ec60a2 --- /dev/null +++ b/examples/fibonacci/host/bin/groth16_bn254.rs @@ -0,0 +1,42 @@ +use zkm_sdk::{include_elf, utils, HashableKey, ProverClient, ZKMStdin}; + +/// The ELF we want to execute inside the zkVM. +const ELF: &[u8] = include_elf!("fibonacci"); + +fn main() { + // Setup logging. + utils::setup_logger(); + + // Create an input stream and write '500' to it. + let n = 500u32; + + let mut stdin = ZKMStdin::new(); + stdin.write(&n); + + // Set up the pk and vk. + let client = ProverClient::new(); + let (pk, vk) = client.setup(ELF); + println!("vk: {:?}", vk.bytes32()); + + // Generate the Groth16 proof. + let proof = client.prove(&pk, stdin).groth16().run().unwrap(); + println!("generated proof"); + + // Get the public values as bytes. + let public_values = proof.public_values.as_slice(); + println!("public values: 0x{}", hex::encode(public_values)); + + // Get the proof as bytes. + let solidity_proof = proof.bytes(); + println!("proof: 0x{}", hex::encode(solidity_proof)); + + // Verify proof and public values + client.verify(&proof, &vk).expect("verification failed"); + + // Save the proof. + proof + .save("fibonacci-groth16.bin") + .expect("saving proof failed"); + + println!("successfully generated and verified proof for the program!") +} diff --git a/examples/fibonacci/host/bin/plonk_bn254.rs b/examples/fibonacci/host/bin/plonk_bn254.rs new file mode 100644 index 00000000..7e80a105 --- /dev/null +++ b/examples/fibonacci/host/bin/plonk_bn254.rs @@ -0,0 +1,43 @@ +use zkm_sdk::{include_elf, utils, HashableKey, ProverClient, ZKMStdin}; + +/// The ELF we want to execute inside the zkVM. +const ELF: &[u8] = include_elf!("fibonacci"); + +fn main() { + // Setup logging. + utils::setup_logger(); + + // Create an input stream and write '500' to it. + let n = 500u32; + + let mut stdin = ZKMStdin::new(); + stdin.write(&n); + + // Set up the pk and vk. + let client = ProverClient::new(); + let (pk, vk) = client.setup(ELF); + println!("vk: {:?}", vk.bytes32()); + + // Generate the Plonk proof. + let proof = client.prove(&pk, stdin).plonk().run().unwrap(); + println!("generated proof"); + + // Get the public values as bytes. + let public_values = proof.public_values.as_slice(); + println!("public values: 0x{}", hex::encode(public_values)); + + // Get the proof as bytes. + let solidity_proof = proof.bytes(); + println!("proof: 0x{}", hex::encode(solidity_proof)); + println!("vk: {:?}", vk.bytes32()); + + // Verify proof and public values + client.verify(&proof, &vk).expect("verification failed"); + + // Save the proof. + proof + .save("fibonacci-plonk.bin") + .expect("saving proof failed"); + + println!("successfully generated and verified proof for the program!") +} diff --git a/examples/fibonacci/host/build.rs b/examples/fibonacci/host/build.rs new file mode 100644 index 00000000..e7ea36ac --- /dev/null +++ b/examples/fibonacci/host/build.rs @@ -0,0 +1,3 @@ +fn main() { + zkm_build::build_program("../guest"); +} diff --git a/examples/fibonacci/host/src/main.rs b/examples/fibonacci/host/src/main.rs new file mode 100644 index 00000000..0f42b841 --- /dev/null +++ b/examples/fibonacci/host/src/main.rs @@ -0,0 +1,61 @@ +use zkm_sdk::{include_elf, utils, ProverClient, ZKMProofWithPublicValues, ZKMStdin}; + +/// The ELF we want to execute inside the zkVM. +const ELF: &[u8] = include_elf!("fibonacci"); + +fn main() { + // Setup logging. + utils::setup_logger(); + + // Create an input stream and write '1000' to it. + let n = 1000u32; + + // The input stream that the guest will read from using `zkm_zkvm::io::read`. Note that the + // types of the elements in the input stream must match the types being read in the guest. + let mut stdin = ZKMStdin::new(); + stdin.write(&n); + + // Create a `ProverClient` method. + let client = ProverClient::new(); + + // Execute the guest using the `ProverClient.execute` method, without generating a proof. + let (_, report) = client.execute(ELF, stdin.clone()).run().unwrap(); + println!( + "executed program with {} cycles", + report.total_instruction_count() + ); + + // Generate the proof for the given guest and input. + let (pk, vk) = client.setup(ELF); + let mut proof = client.prove(&pk, stdin).run().unwrap(); + + println!("generated proof"); + + // Read and verify the output. + // + // Note that this output is read from values committed to in the guest using + // `zkm_zkvm::io::commit`. + let _ = proof.public_values.read::(); + let a = proof.public_values.read::(); + let b = proof.public_values.read::(); + + println!("a: {}", a); + println!("b: {}", b); + + // Verify proof and public values + client.verify(&proof, &vk).expect("verification failed"); + + // Test a round trip of proof serialization and deserialization. + proof + .save("proof-with-pis.bin") + .expect("saving proof failed"); + let deserialized_proof = + ZKMProofWithPublicValues::load("proof-with-pis.bin").expect("loading proof failed"); + + // Verify the deserialized proof. + client + .verify(&deserialized_proof, &vk) + .expect("verification failed"); + + println!("successfully generated and verified proof for the program!") +} diff --git a/proof-service/Cargo.toml b/proof-service/Cargo.toml index f6d0e9a5..21f68716 100644 --- a/proof-service/Cargo.toml +++ b/proof-service/Cargo.toml @@ -6,22 +6,18 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -prover = { path = "../prover", optional = true } -prover_v2 = { path = "../prover_v2", optional = true } +prover_v2 = { path = "../prover_v2" } +common = { workspace = true } -plonky2 = { git = "https://github.com/zkMIPS/plonky2.git", branch = "zkm_dev", optional = true } +bincode.workspace = true -common = { path = "../common" } - -bincode = "1.3.3" - -tonic = "0.8.3" -prost = "0.11.0" +tonic = { workspace = true, features = ["gzip"] } +prost.workspace = true tokio = { version = "1.21.0", features = ["macros", "rt-multi-thread", "signal"] } -once_cell = "1.8" -uuid = { version = "1.2", features = ["v4", "fast-rng", "macro-diagnostics"] } -sqlx = { version = "0.8.1", features = ["mysql", "time", "runtime-tokio"] } +once_cell.workspace = true +uuid.workspace = true +sqlx.workspace = true serde = "1.0.92" serde_json = "1.0" serde_derive = "1.0.92" @@ -39,18 +35,18 @@ rand = "0.8" sha2 = "0.10.9" # file server -warp = "0.3" tracing = "0.1.37" tracing-forest = { version = "0.1.6", features = ["ansi", "smallvec"] } tracing-subscriber = { version = "0.3.19", features = ["std", "env-filter"] } rayon = "1.10.0" +[[bin]] +name = "proof-service" +path = "src/bin/proof-service.rs" + [build-dependencies] tonic-build = "0.8.0" [features] default = [] -prover = ["dep:prover"] -prover_v2 = ["dep:prover_v2"] - -gpu = ["dep:plonky2", "prover/gpu"] +gpu = ["prover_v2/gpu"] diff --git a/proof-service/build.rs b/proof-service/build.rs index 872655e1..4247c378 100644 --- a/proof-service/build.rs +++ b/proof-service/build.rs @@ -1,12 +1,4 @@ fn main() -> Result<(), Box> { - if cfg!(all(feature = "prover", feature = "prover_v2")) { - panic!("Cannot enable both prover and prover_v2 features!"); - } - - if cfg!(not(any(feature = "prover", feature = "prover_v2"))) { - panic!("Either prover or prover_v2 must be enabled!"); - } - println!("cargo:rerun-if-changed=../proto/src/proto/prover/v1/prover.proto"); println!("cargo:rerun-if-changed=../proto/src/proto/stage/v1/stage.proto"); println!("cargo:rerun-if-changed=../proto/src/proto/include/v1/includes.proto"); diff --git a/proof-service/config/README.md b/proof-service/config/README.md index e294243a..e8f08660 100644 --- a/proof-service/config/README.md +++ b/proof-service/config/README.md @@ -10,6 +10,7 @@ First, you should set these variables according to your environment. - stage - proving_key_paths = ["/mnt/data/zkm/proving.key", "/mnt/data/zkm2/proving.key"] - tls +- metrics_addr = "0.0.0.0:50011" - base_dir Notice that the proving_key_paths should be aligned with [`ProverVersion`](../../proto/src/include/v1/include.proto), each prover version is used to index its proving key download URL. @@ -18,4 +19,24 @@ Then you can run this script in below way. ```bash bash gen_config.sh +``` + +### Generate cirtificates + +* Stage + +``` +bash -x certgen.sh --cn stage --ssl-dns localhost --ssl-ip 127.0.0.1,0.0.0.0 +``` + +* Prover + +``` +bash -x certgen.sh --cn prover1 --ssl-dns localhost --ssl-ip 127.0.0.1,0.0.0.0 +``` + +* Client + +``` +bash -x certgen.sh --cn client --ssl-dns localhost --ssl-ip 127.0.0.1,0.0.0.0 ``` \ No newline at end of file diff --git a/proof-service/config/config.toml b/proof-service/config/config.toml index 9f7ed09b..9a385731 100644 --- a/proof-service/config/config.toml +++ b/proof-service/config/config.toml @@ -1,9 +1,8 @@ addr = "0.0.0.0:50001" metrics_addr = "0.0.0.0:50011" -database_url = "mysql://stage:123456@localhost:13306/zkm" +database_url = "mysql://stage:123456@localhost:13306/zkm2" # Must be: $zkm url, $zkm2 url -proving_key_paths = ["/tmp/input/"] +proving_key_paths = [] prover_addrs = [] base_dir = "/tmp/zkm/test/test_proof" -fileserver_url = "/tmp/zkm/fileserver" -fileserver_addr = "0.0.0.0:40001" +fileserver_url = "http://0.0.0.0:40000/test/test_proof/proof" \ No newline at end of file diff --git a/proof-service/config/gen_config.sh b/proof-service/config/gen_config.sh index 7b61088b..c9ecfd4b 100755 --- a/proof-service/config/gen_config.sh +++ b/proof-service/config/gen_config.sh @@ -1,7 +1,8 @@ #!/bin/bash # You should provide some variable to use this config bash -provers=("localhost:50001" "localhost:50002") +#provers=("localhost:50001" "localhost:50002") +provers=("localhost:50001") stage="localhost:50000" snarks=("localhost:50051") tls=false diff --git a/proof-service/config/prover.toml.template b/proof-service/config/prover.toml.template index 593df715..0cc203c4 100644 --- a/proof-service/config/prover.toml.template +++ b/proof-service/config/prover.toml.template @@ -1,4 +1,7 @@ addr = "{{addr}}" +metrics_addr = "0.0.0.0:50011" +database_url = "mysql://stage:123456@localhost:3306/zkm2" prover_addrs = [{{prover_addrs}}] base_dir = "{{base_dir}}" proving_key_paths = ["/mnt/data/zkm/proving.key", "/mnt/data/zkm2/proving.key"] +fileserver_url = "http://0.0.0.0:40000/test/test_proof/proof" diff --git a/proof-service/config/prover_tls.toml.template b/proof-service/config/prover_tls.toml.template index b6f49f5a..31700f17 100644 --- a/proof-service/config/prover_tls.toml.template +++ b/proof-service/config/prover_tls.toml.template @@ -1,7 +1,10 @@ addr = "{{addr}}" prover_addrs = [{{prover_addrs}}] +metrics_addr = "0.0.0.0:50011" +database_url = "mysql://stage:123456@localhost:3306/zkm2" proving_key_paths = ["/mnt/data/zkm/proving.key", "/mnt/data/zkm2/proving.key"] base_dir = "{{base_dir}}" +fileserver_url = "http://0.0.0.0:40000/test/test_proof/proof" ca_cert_path = "tools/certs/ca.pem" cert_path = "tools/certs/{{prover_name}}.pem" diff --git a/proof-service/config/stage.toml b/proof-service/config/stage.toml index 62bb4d41..e60520d7 100644 --- a/proof-service/config/stage.toml +++ b/proof-service/config/stage.toml @@ -1,9 +1,11 @@ addr = "0.0.0.0:50000" -metrics_addr = "0.0.0.0:50010" -database_url = "mysql://stage:123456@localhost:13306/zkm" -# Must be: $zkm url, $zkm2 url -proving_key_paths = [] -prover_addrs = ["127.0.0.1:50001"] +prover_addrs = ["localhost:50001"] +metrics_addr = "0.0.0.0:50012" +database_url = "mysql://stage:123456@localhost:3306/zkm2" base_dir = "/tmp/zkm/test/test_proof" -fileserver_url = "/tmp/zkm/fileserver" -fileserver_addr = "0.0.0.0:40000" +fileserver_url = "http://0.0.0.0:40000/test/test_proof" +proving_key_paths = ["/tmp/input-null/", "/tmp/input"] + +ca_cert_path = "/home/ubuntu/sd/zkm-prover/tools/certs/ca.pem" +cert_path = "/home/ubuntu/sd/zkm-prover/tools/certs/stage.pem" +key_path = "/home/ubuntu/sd/zkm-prover/tools/certs/stage.key" \ No newline at end of file diff --git a/proof-service/config/stage.toml.template b/proof-service/config/stage.toml.template index 7a986e59..4f8c6205 100644 --- a/proof-service/config/stage.toml.template +++ b/proof-service/config/stage.toml.template @@ -1,5 +1,11 @@ addr = "{{addr}}" prover_addrs = [{{prover_addrs}}] +metrics_addr = "0.0.0.0:50011" +proving_key_paths = ["/tmp/input-null/", "/tmp/input"] +database_url = "mysql://stage:123456@localhost:3306/zkm2" base_dir = "{{base_dir}}" -fileserver_url = "/data/zkm/proof-service/" -fileserver_addr = "0.0.0.0:40000" \ No newline at end of file +fileserver_url = "http://0.0.0.0:40000/test/test_proof/proof" + +ca_cert_path = "tools/certs/ca.pem" +cert_path = "tools/certs/stage.pem" +key_path = "tools/certs/stage.key" \ No newline at end of file diff --git a/proof-service/config/stage_tls.toml.template b/proof-service/config/stage_tls.toml.template index 51546c89..32de694c 100644 --- a/proof-service/config/stage_tls.toml.template +++ b/proof-service/config/stage_tls.toml.template @@ -1,8 +1,10 @@ addr = "{{addr}}" prover_addrs = [{{prover_addrs}}] +database_url = "mysql://stage:123456@localhost:3306/zkm2" base_dir = "{{base_dir}}" -fileserver_url = "/data/zkm/proof-service/" -fileserver_addr = "0.0.0.0:40000" +metrics_addr = "0.0.0.0:50012" +proving_key_paths = ["/tmp/input-null/", "/tmp/input"] +fileserver_url = "http://0.0.0.0:40000/test/test_proof/proof" ca_cert_path = "tools/certs/ca.pem" cert_path = "tools/certs/stage.pem" diff --git a/proof-service/examples/README.md b/proof-service/examples/README.md deleted file mode 100644 index 91c68c9c..00000000 --- a/proof-service/examples/README.md +++ /dev/null @@ -1,141 +0,0 @@ -# Examples - -## Hello world - -* Compile the Go code to MIPS - -Write your own hello.go, and compile - -``` -$ GOOS=linux GOARCH=mips GOMIPS=softfloat go build hello.go -o /tmp/zkm/test/hello_world -``` - -If you build your own server, you can use Docker Compose (The image is built based on AMD64) - -``` -$ docker-compose up -d -``` - -* Adjust parameter request stage service -- `ELF_PATH`: The go program path compiled in the above steps -- `ENDPOINT`: The access address of stage service -- `RUST_LOG`: Log level -- `OUTPUT_DIR`: Store results folder path -- `SEG_SIZE`: SEG_SIZE default 131072 - -The smaller the SEG_SIZE, the longer the cost will be -``` -$ RUST_LOG=info ELF_PATH=/tmp/zkm/test/hello_world OUTPUT_DIR=/tmp/zkm/test ENDPOINT=http://127.0.0.1:50000 cargo run --release --example stage -``` - -* If SEG_SIZE=262144, Wait for about 20 minutes. If you see "success", a proof will be generated. You can see the corresponding file in OUTPUT_DIR - - -## [Minigeth](https://github.com/zkMIPS/cannon-mips) - -* Compile the minigeth_mips - -``` -$ git clone https://github.com/zkMIPS/cannon-mips -$ cd cannon-mips && make minigeth_mips -$ cp mipsevm/minigeth /tmp/zkm/test/ -``` - -* Download the block and place it in the corresponding directory - -``` -$ mkdir -p /tmp/cannon -$ export BASEDIR=/tmp/cannon; minigeth/go-ethereum 13284491 -$ mkdir -p /tmp/zkm/test/0_13284491 -$ cp -R /tmp/cannon/0_13284491 /tmp/zkm/test -``` - -* Adjust parameter request stage service - -``` -$ export RUST_LOG=info -$ ELF_PATH=/tmp/zkm/test/minigeth BLOCK_NO=13284491 BLOCK_PATH=/tmp/zkm/test/0_13284491 SEG_SIZE=262144 cargo run --release --example stage -``` - -## [Revme](https://github.com/zkMIPS/zkm/tree/main/prover/examples/revme) - -* Generate suite_json - -``` -$ git clone https://github.com/zkMIPS/revme -$ RPC_URL=http://localhost:8545 CHAIN_ID=1337 BLOCK_NO=3 RUST_LOG=debug SUITE_JSON_PATH=./test-vectors/suite3.json cargo run --example process -``` - -* Compile the remve_mips -``` -$ git clone https://github.com/zkMIPS/zkm -$ cd zkm/prover/examples/revme -$ cargo build --release --target=mips-unknown-linux-musl -``` - -* Adjust parameter request stage service - -- `ENDPOINT`: zkm-prover service endpoint -- `CA_CERT_PATH`: zkm-prover service CA CERT -- `PRIVATE_KEY`: wallet private key, used for message signing only. DON'T hold any asset in this address. -- `ELF_PATH`: the file compiled in the previous step -- `PUBLIC_INPUT_PATH`: Output file for the Generate Suite_json step - -When you apply the access of the proof network, you need to submit the address with checksum. - -``` -$ export RUST_LOG=info -$ ENDPOINT=... CA_CERT_PATH=... PRIVATE_KEY=... ELF_PATH=...revm SEG_SIZE=262144 PUBLIC_INPUT_PATH=... cargo run --release --example stage -``` - -# Deployment - -* Generate config toml - -``` -$ cd ../config -$ bash gen_config.sh -``` - -And you can view more detail in [gen_config](../config/README.md). - -* Use S3 to store your data - -We provide the support of s3, and you can enable s3 support by setting base_dir to a s3 path such as `s3://{bucket}/{object}`. - -Besides, you may need to configure some s3 configurations in your environment variables as below or read more details in [s3-configuration](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html). - -``` -$ export AWS_ACCESS_KEY_ID="test" -$ export AWS_SECRET_ACCESS_KEY="test" -$ export AWS_DEFAULT_REGION="us-east-1" -$ export AWS_ENDPOINT_URL="{{ENDPOINT_URL}}" -``` - -* Compile zkm-prover - -``` -cargo build --release -``` - -* Start prover_server. - -``` -# use prover1_tls.toml and prover2_tls.toml instead if tls is enabled -$ RUST_LOG=info ./target/release/proof-service --config ./service/config/prover1.toml -$ RUST_LOG=info ./target/release/proof-service --config ./service/config/prover2.toml -``` - -* Start stage_server. - -``` -# use stage_tls.toml instead if tls is enabled -RUST_LOG=info ./target/release/proof-service --config ./service/config/stage.toml --stage -``` - -* Start example stage - -``` -# set CA_CERT_PATH, CERT_PATH and KEY_PATH if tls is enabled -RUST_LOG=info cargo run --release --example stage -``` diff --git a/proof-service/examples/stage.rs b/proof-service/examples/stage.rs deleted file mode 100644 index 2e25e695..00000000 --- a/proof-service/examples/stage.rs +++ /dev/null @@ -1,185 +0,0 @@ -use common::file; -use common::tls::Config; -use std::env; -use std::path::Path; -use std::time::Instant; -use tokio::time; -use tonic::transport::ClientTlsConfig; -use tonic::transport::Endpoint; - -use ethers::signers::{LocalWallet, Signer}; - -use proof_service::proto::includes::v1::BlockFileItem; -use proof_service::proto::stage_service::v1::Status; -use proof_service::proto::stage_service::v1::{ - stage_service_client::StageServiceClient, GenerateProofRequest, GetStatusRequest, -}; - -async fn sign_ecdsa(request: &mut GenerateProofRequest, private_key: &str) { - assert!(!private_key.is_empty()); - if !private_key.is_empty() { - let wallet = private_key.parse::().unwrap(); - let sign_data = match request.block_no { - Some(block_no) => { - format!("{}&{}&{}", request.proof_id, block_no, request.seg_size) - } - None => { - format!("{}&{}", request.proof_id, request.seg_size) - } - }; - let signature = wallet.sign_message(sign_data).await.unwrap(); - request.signature = signature.to_string(); - } -} - -#[tokio::main] -async fn main() -> Result<(), Box> { - // first wallet in hardhat node - env::set_var( - "PRIVATE_KEY", - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - ); - - env::set_var( - "ARGS", - "711e9609339e92b03ddc0a211827dba421f38f9ed8b9d806e1ffdd8c15ffa03d world!", - ); - - env_logger::try_init().unwrap_or_default(); - let elf_path = env::var("ELF_PATH").unwrap_or("/tmp/zkm/test/hello_world".to_string()); - let output_dir = env::var("OUTPUT_DIR").unwrap_or("/tmp/zkm/test".to_string()); - let block_path = env::var("BLOCK_PATH").unwrap_or("".to_string()); - let block_no = env::var("BLOCK_NO").unwrap_or("0".to_string()); - let block_no = block_no.parse::<_>().unwrap_or(0); - let seg_size = env::var("SEG_SIZE").unwrap_or("131072".to_string()); - let seg_size = seg_size.parse::<_>().unwrap_or(131072); - let args = env::var("ARGS").unwrap_or("".to_string()); - let _public_input_path = env::var("PUBLIC_INPUT_PATH").unwrap_or("".to_string()); - let _private_input_path = env::var("PRIVATE_INPUT_PATH").unwrap_or("".to_string()); - let endpoint = env::var("ENDPOINT").unwrap_or("http://127.0.0.1:50000".to_string()); - let ca_cert_path = env::var("CA_CERT_PATH").unwrap_or("".to_string()); - let cert_path = env::var("CERT_PATH").unwrap_or("".to_string()); - let key_path = env::var("KEY_PATH").unwrap_or("".to_string()); - let domain_name = env::var("DOMAIN_NAME").unwrap_or("stage".to_string()); - let private_key = env::var("PRIVATE_KEY").unwrap_or("".to_string()); - let target_step = env::var("TARGET_STEP").unwrap_or("5".to_string()); - let target_step = target_step.parse::().unwrap_or(5); - let ssl_config = if ca_cert_path.is_empty() { - None - } else { - Some(Config::new(&ca_cert_path, &cert_path, &key_path).await?) - }; - - let elf_data = file::new(&elf_path).read().unwrap(); - - // FIXME - let mut block_data = Vec::new(); - if block_no > 0 { - let files = file::new(&block_path).read_dir().unwrap(); - for file_name in files { - let file_path = format!("{}/{}", block_path, file_name); - let block_file_item = BlockFileItem { - file_name: file_name.to_string(), - file_content: file::new(&file_path).read().unwrap(), - }; - block_data.push(block_file_item); - } - } - - let args: Vec<&str> = args.split_whitespace().collect(); - // let public_input_stream: Vec = hex::decode(args[0]).unwrap(); - let private_input_stream = args[1].as_bytes().to_vec(); - - // It depends on whether the guest program uses io::read() or io::read_vec(). - // If it’s the former, then `bincode::serialize` is used; otherwise, it’s not. - // In `sha2-rust` example, the guest program uses io::read(). - // let public_input_stream: Vec = bincode::serialize(&public_input_stream).unwrap(); - let private_input_stream: Vec = bincode::serialize(&private_input_stream).unwrap(); - let private_input_stream: Vec = bincode::serialize(&vec![private_input_stream]).unwrap(); - - //let public_input_stream = if public_input_path.is_empty() { - // vec![] - //} else { - // file::new(&public_input_path).read().unwrap() - //}; - - //let private_input_stream = if private_input_path.is_empty() { - // vec![] - //} else { - // file::new(&private_input_path).read().unwrap() - //}; - - let proof_id = uuid::Uuid::new_v4().to_string(); - let mut request = GenerateProofRequest { - proof_id: proof_id.clone(), - elf_data, - block_data, - block_no: Some(block_no), - seg_size, - public_input_stream: vec![], - private_input_stream, - target_step: Some(target_step), // 1, 3, 5 - ..Default::default() - }; - sign_ecdsa(&mut request, &private_key).await; - log::info!("request: {:?}", proof_id); - let start = Instant::now(); - let endpoint = match ssl_config { - Some(config) => { - let mut tls_config = ClientTlsConfig::new().domain_name(domain_name); - if let Some(ca_cert) = config.ca_cert { - tls_config = tls_config.ca_certificate(ca_cert); - } - if let Some(identity) = config.identity { - tls_config = tls_config.identity(identity); - } - Endpoint::new(endpoint)?.tls_config(tls_config)? - } - None => Endpoint::new(endpoint)?, - }; - let mut stage_client = StageServiceClient::connect(endpoint).await?; - let response = stage_client.generate_proof(request).await?.into_inner(); - log::info!("generate_proof response: {:?}", response); - if response.status == Status::Computing as i32 { - loop { - let get_status_request = GetStatusRequest { - proof_id: proof_id.clone(), - }; - let get_status_response = stage_client - .get_status(get_status_request) - .await? - .into_inner(); - if get_status_response.status != Status::Computing as i32 { - if let Some(status) = Status::from_i32(get_status_response.status) { - match status { - Status::Success => { - log::info!( - "generate_proof success public_inputs_size: {}, output_size: {}", - get_status_response.proof_with_public_inputs.len(), - get_status_response.output_stream.len(), - ); - log::info!("public_values {:?}", get_status_response.public_values_url); - log::info!("snark_proof_url {:?}", get_status_response.snark_proof_url); - let output_dir = Path::new(&output_dir); - let public_inputs_path = output_dir.join("proof_with_public_inputs"); - let _ = file::new(&public_inputs_path.to_string_lossy()) - .write(get_status_response.proof_with_public_inputs.as_slice()); - } - _ => { - log::info!( - "generate_proof failed status: {}", - get_status_response.status - ); - } - } - } - break; - } - time::sleep(time::Duration::from_secs(1)).await; - } - } - let end = Instant::now(); - let elapsed = end.duration_since(start); - log::info!("Elapsed time: {:?} secs", elapsed.as_secs()); - Ok(()) -} diff --git a/proof-service/migrations/20251113071844_prover_job_queue.sql b/proof-service/migrations/20251113071844_prover_job_queue.sql new file mode 100644 index 00000000..f07accad --- /dev/null +++ b/proof-service/migrations/20251113071844_prover_job_queue.sql @@ -0,0 +1,19 @@ +-- Add migration script here +CREATE TABLE IF NOT EXISTS prover_job_queue +( + id serial primary key, + job_status int not null, + job_priority int not null, + job_type text not null, + + created_at timestamp not null default now(), + updated_by text not null, + updated_at timestamp not null default now(), + + proof_id text not null, + computed_request_id text not null, + job_data json not null, + INDEX proof_id_req_id(proof_id(255), computed_request_id(255)), + INDEX job_status_updated_at(job_status, updated_at), + INDEX job_type(job_type(255)) +); \ No newline at end of file diff --git a/proof-service/migrations/20251113071922_proofs.sql b/proof-service/migrations/20251113071922_proofs.sql new file mode 100644 index 00000000..a1de3ca1 --- /dev/null +++ b/proof-service/migrations/20251113071922_proofs.sql @@ -0,0 +1,10 @@ +-- Add migration script here +CREATE TABLE IF NOT EXISTS proofs +( + id serial primary key, + proof_id text not null, + computed_request_id text not null, + proof blob not null, + created_at timestamp not null default now(), + INDEX proof_id_req_id(proof_id(255), computed_request_id(255)) +); \ No newline at end of file diff --git a/proof-service/src/bin/proof-service.rs b/proof-service/src/bin/proof-service.rs index a4d93d40..ed3fd88a 100644 --- a/proof-service/src/bin/proof-service.rs +++ b/proof-service/src/bin/proof-service.rs @@ -1,13 +1,12 @@ use clap::Parser; use common::tls::Config as TlsConfig; -use std::net::SocketAddr; +use tonic::codec::CompressionEncoding; use tonic::transport::Server; use tonic::transport::ServerTlsConfig; use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response}; use prometheus::{Encoder, TextEncoder}; - use proof_service::{ config, metrics, proto::{ @@ -22,8 +21,10 @@ use proof_service::{ #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { - #[arg(short = 'c', long = "config", default_value_t = String::from("./config/config.toml"))] + /// Path to the config file + #[arg(short = 'c', long = "config", default_value_t = String::from("./proof-service/config/config.toml"))] config: String, + /// Run in stage mode #[arg(short = 's', long = "stage", default_value_t = false)] stage: bool, } @@ -32,6 +33,7 @@ struct Args { async fn main() -> Result<(), Box> { config::setup_logger(); let args = Args::parse(); + println!("Args: {:?}", args); let runtime_config = config::RuntimeConfig::from_toml(&args.config).expect("Config is missing"); let addr = runtime_config.addr.as_str().parse()?; let nodes_lock = crate::prover_node::instance(); @@ -43,11 +45,12 @@ async fn main() -> Result<(), Box> { } let mut server = Server::builder(); if runtime_config.key_path.is_some() { + tracing::info!("Starting gRPC server with TLS"); let tls_config = TlsConfig::new( &runtime_config .ca_cert_path .clone() - .unwrap_or("".to_string()), + .expect("valid ca cert path"), &runtime_config.cert_path.clone().unwrap(), &runtime_config.key_path.clone().unwrap(), ) @@ -64,18 +67,20 @@ async fn main() -> Result<(), Box> { let grpc_server = if args.stage { let stage = StageServiceSVC::new(runtime_config.clone()).await?; server - .add_service(StageServiceServer::new(stage)) + .add_service( + StageServiceServer::new(stage) + .send_compressed(CompressionEncoding::Gzip) + .accept_compressed(CompressionEncoding::Gzip), + ) .serve(addr) } else { - #[cfg(all(feature = "prover", feature = "gpu"))] - { - plonky2::create_ctx(13, 13); - plonky2::init_globalmem(134217728); - prover::init_stark_op_stream_simple(); - } let prover = ProverServiceSVC::new(runtime_config.clone()); server - .add_service(ProverServiceServer::new(prover)) + .add_service( + ProverServiceServer::new(prover) + .send_compressed(CompressionEncoding::Gzip) + .accept_compressed(CompressionEncoding::Gzip), + ) .serve(addr) }; @@ -98,15 +103,8 @@ async fn main() -> Result<(), Box> { metrics::init_registry(); let metrics_server = hyper::Server::bind(&metrics_addr).serve(make_svc); - // let file_server = tokio::spawn(async move { - // if let Err(e) = start_file_server(&runtime_config.fileserver_addr).await { - // eprintln!("Error running HTTP server: {}", e); - // } - // }); - tokio::pin!(grpc_server); tokio::pin!(metrics_server); - // tokio::pin!(file_server); tracing::info!( "Starting stage/prover:{} on {}", @@ -117,21 +115,7 @@ async fn main() -> Result<(), Box> { tokio::select! { res = grpc_server => res?, res = metrics_server => res?, - // res = file_server => res?, - } - - #[cfg(all(feature = "prover", feature = "gpu"))] - if !args.stage { - plonky2::destroy_ctx(); } Ok(()) } - -pub async fn start_file_server(host: &str) -> Result<(), Box> { - let file_server = warp::fs::dir("public"); - warp::serve(file_server) - .run(host.parse::().expect("host is invalid")) - .await; - Ok(()) -} diff --git a/proof-service/src/config.rs b/proof-service/src/config.rs index 602547ec..32d81cc8 100644 --- a/proof-service/src/config.rs +++ b/proof-service/src/config.rs @@ -14,9 +14,9 @@ pub struct RuntimeConfig { pub prover_addrs: Vec, pub base_dir: String, + pub max_concurrent_tasks: Option, pub fileserver_url: Option, - // pub fileserver_addr: String, pub proving_key_paths: Vec, pub ca_cert_path: Option, @@ -32,8 +32,8 @@ impl RuntimeConfig { database_url: "mysql://user:password@localhost:3306/dbname".to_string(), prover_addrs: ["0.0.0.0:50000".to_string()].to_vec(), base_dir: "/tmp".to_string(), + max_concurrent_tasks: Some(1), fileserver_url: None, - // fileserver_addr: "0.0.0.0:40000".to_string(), proving_key_paths: vec![], ca_cert_path: None, cert_path: None, diff --git a/proof-service/src/database.rs b/proof-service/src/database.rs index 1d2fd45c..bc0fdbee 100644 --- a/proof-service/src/database.rs +++ b/proof-service/src/database.rs @@ -1,5 +1,7 @@ use ethers::abi::ethereum_types; use serde_derive::{Deserialize, Serialize}; +use tracing::instrument; + #[derive(Serialize, Deserialize, Debug, Clone, Default, sqlx::FromRow)] pub struct StageTask { pub id: String, @@ -110,6 +112,7 @@ impl Database { } #[allow(dead_code)] + #[instrument(level = "info", skip_all, fields(Step = %step))] pub async fn update_stage_task_check_at( &self, proof_id: &str, diff --git a/proof-service/src/prover_client.rs b/proof-service/src/prover_client.rs index 0d5f4cc9..762f7b98 100644 --- a/proof-service/src/prover_client.rs +++ b/proof-service/src/prover_client.rs @@ -1,23 +1,25 @@ use crate::proto::prover_service::v1::{ prover_service_client::ProverServiceClient, AggregateRequest, GetTaskResultRequest, - GetTaskResultResponse, ProveRequest, ResultCode, SnarkProofRequest, SplitElfRequest, + GetTaskResultResponse, ProveRequest, ResultCode, SingleNodeRequest, SnarkProofRequest, + SplitElfRequest, }; use common::tls::Config as TlsConfig; use std::sync::{Arc, Mutex}; -use crate::stage::tasks::{ - AggTask, ProveTask, SnarkTask, SplitTask, TASK_STATE_FAILED, TASK_STATE_PROCESSING, - TASK_STATE_SUCCESS, TASK_STATE_UNPROCESSED, TASK_TIMEOUT, -}; -use tonic::Request; - +use crate::database::Database; +use crate::proto::includes::v1::Step; use crate::prover_node::{NodeStatus, ProverNode}; use crate::stage::stage::get_timestamp; +use crate::stage::tasks::{ + AggTask, ProveTask, SingleNodeTask, SnarkTask, SplitTask, TASK_STATE_FAILED, + TASK_STATE_PROCESSING, TASK_STATE_SUCCESS, TASK_STATE_UNPROCESSED, TASK_TIMEOUT, +}; use rand::rngs::StdRng; use rand::seq::SliceRandom; use rand::SeedableRng; use std::time::Duration; use tonic::transport::Channel; +use tonic::Request; #[derive(Debug, Copy, Clone, Eq, PartialEq)] enum TaskType { @@ -25,6 +27,7 @@ enum TaskType { Prove, Agg, Snark, + SingleNode, } fn get_nodes(task_type: TaskType) -> Vec { @@ -68,7 +71,6 @@ async fn get_idle_client( // unset the client if it was offline more than 180s, and will reconnect later *node.client.lock().unwrap() = None; } - *status = NodeStatus::Busy; } @@ -100,10 +102,39 @@ pub fn result_code_to_state(code: i32) -> u32 { } } -pub async fn split(mut split_task: SplitTask, tls_config: Option) -> Option { +pub async fn split( + mut split_task: SplitTask, + tls_config: Option, + cur_prover_num: Arc>, + max_prover_num: u32, +) -> Option { split_task.state = TASK_STATE_UNPROCESSED; + // check if the number of current prover nodes is less than max_prover_num + { + let count = cur_prover_num.lock().await; + if *count >= max_prover_num { + return Some(split_task); + } + } let client = get_idle_client(tls_config, TaskType::Split).await; if let Some((addrs, mut client, node_status)) = client { + { + // after getting an idle client, we can check the current prover number again + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[before]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + if *count >= max_prover_num { + // cannot run more than max_prover_num nodes at the same time. + // set the node status to Idle, so it can be reused later + let mut status = node_status.lock().unwrap(); + *status = NodeStatus::Idle; + return Some(split_task); + } + *count += 1; + } let request = SplitElfRequest { proof_id: split_task.proof_id.clone(), computed_request_id: split_task.task_id.clone(), @@ -129,6 +160,16 @@ pub async fn split(mut split_task: SplitTask, tls_config: Option) -> let mut grpc_request = Request::new(request); grpc_request.set_timeout(Duration::from_secs(TASK_TIMEOUT)); let response = client.split_elf(grpc_request).await; + { + // Decrease the current prover number. + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[after]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + *count -= 1; + } let mut status = node_status.lock().unwrap(); if let Ok(response) = response { *status = NodeStatus::Idle; @@ -163,10 +204,39 @@ pub async fn split(mut split_task: SplitTask, tls_config: Option) -> Some(split_task) } -pub async fn prove(mut prove_task: ProveTask, tls_config: Option) -> Option { +pub async fn prove( + mut prove_task: ProveTask, + tls_config: Option, + cur_prover_num: Arc>, + max_prover_num: u32, +) -> Option { prove_task.state = TASK_STATE_UNPROCESSED; + // check if the number of current prover nodes is less than max_prover_num + { + let count = cur_prover_num.lock().await; + if *count >= max_prover_num { + return Some(prove_task); + } + } let client = get_idle_client(tls_config, TaskType::Prove).await; if let Some((addrs, mut client, node_status)) = client { + { + // after getting an idle client, we can check the current prover number again + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[before]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + if *count >= max_prover_num { + // cannot run more than max_prover_num nodes at the same time. + // set the node status to Idle, so it can be reused later + let mut status = node_status.lock().unwrap(); + *status = NodeStatus::Idle; + return Some(prove_task); + } + *count += 1; + } if prove_task.trace.node_info == addrs { // If the task is already failed and the node is the same, skip it let mut status = node_status.lock().unwrap(); @@ -195,6 +265,16 @@ pub async fn prove(mut prove_task: ProveTask, tls_config: Option) -> let mut grpc_request = Request::new(request); grpc_request.set_timeout(Duration::from_secs(TASK_TIMEOUT)); let response = client.prove(grpc_request).await; + { + // Decrease the current prover number. + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[after]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + *count -= 1; + } let mut status = node_status.lock().unwrap(); if let Ok(response) = response { *status = NodeStatus::Idle; @@ -226,10 +306,39 @@ pub async fn prove(mut prove_task: ProveTask, tls_config: Option) -> Some(prove_task) } -pub async fn aggregate(mut agg_task: AggTask, tls_config: Option) -> Option { +pub async fn aggregate( + mut agg_task: AggTask, + tls_config: Option, + cur_prover_num: Arc>, + max_prover_num: u32, +) -> Option { agg_task.state = TASK_STATE_UNPROCESSED; + // check if the number of current prover nodes is less than max_prover_num + { + let count = cur_prover_num.lock().await; + if *count >= max_prover_num { + return Some(agg_task); + } + } let client = get_idle_client(tls_config, TaskType::Agg).await; if let Some((addrs, mut client, node_status)) = client { + { + // after getting an idle client, we can check the current prover number again + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[before]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + if *count >= max_prover_num { + // cannot run more than max_prover_num nodes at the same time. + // set the node status to Idle, so it can be reused later + let mut status = node_status.lock().unwrap(); + *status = NodeStatus::Idle; + return Some(agg_task); + } + *count += 1; + } let request = AggregateRequest { proof_id: agg_task.proof_id.clone(), computed_request_id: agg_task.task_id.clone(), @@ -254,6 +363,16 @@ pub async fn aggregate(mut agg_task: AggTask, tls_config: Option) -> let mut grpc_request = Request::new(request); grpc_request.set_timeout(Duration::from_secs(TASK_TIMEOUT)); let response = client.aggregate(grpc_request).await; + { + // Decrease the current prover number. + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[after]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + *count -= 1; + } let mut status = node_status.lock().unwrap(); if let Ok(response) = response { *status = NodeStatus::Idle; @@ -287,14 +406,41 @@ pub async fn aggregate(mut agg_task: AggTask, tls_config: Option) -> pub async fn snark_proof( mut snark_task: SnarkTask, tls_config: Option, + cur_prover_num: Arc>, + max_prover_num: u32, ) -> Option { + // check if the number of current prover nodes is less than max_prover_num + { + let count = cur_prover_num.lock().await; + if *count >= max_prover_num { + return Some(snark_task); + } + } let client = get_idle_client(tls_config, TaskType::Snark).await; if let Some((addrs, mut client, node_status)) = client { + { + // after getting an idle client, we can check the current prover number again + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[before]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + if *count >= max_prover_num { + // cannot run more than max_prover_num nodes at the same time. + // set the node status to Idle, so it can be reused later + let mut status = node_status.lock().unwrap(); + *status = NodeStatus::Idle; + return Some(snark_task); + } + *count += 1; + } let request = SnarkProofRequest { version: snark_task.version, proof_id: snark_task.proof_id.clone(), computed_request_id: snark_task.task_id.clone(), agg_receipt: snark_task.agg_receipt.clone(), + from_input: snark_task.from_input, }; tracing::info!( "[snark_proof] rpc {} {}:{} start", @@ -305,6 +451,16 @@ pub async fn snark_proof( let mut grpc_request = Request::new(request); grpc_request.set_timeout(Duration::from_secs(TASK_TIMEOUT)); let response = client.snark_proof(grpc_request).await; + { + // Decrease the current prover number. + let mut count = cur_prover_num.lock().await; + tracing::debug!( + "[after]: current prover num: {}, max prover num: {}", + *count, + max_prover_num + ); + *count -= 1; + } let mut status = node_status.lock().unwrap(); if let Ok(response) = response { *status = NodeStatus::Idle; @@ -339,6 +495,84 @@ pub async fn snark_proof( Some(snark_task) } +pub async fn single_node( + mut single_node_task: SingleNodeTask, + tls_config: Option, + db: Database, + proof_id: &str, + old_check_at: u64, + check_at: u64, +) -> anyhow::Result { + single_node_task.state = TASK_STATE_UNPROCESSED; + loop { + let tls_config = tls_config.clone(); + let client = get_idle_client(tls_config, TaskType::SingleNode).await; + if let Some((addrs, mut client, node_status)) = client { + // update status in the db in order to help client get status response + db.update_stage_task_check_at(proof_id, old_check_at, check_at, Step::Prove as i32) + .await?; + let request = SingleNodeRequest { + proof_id: single_node_task.proof_id.clone(), + computed_request_id: single_node_task.task_id.clone(), + base_dir: single_node_task.base_dir.clone(), + elf_path: single_node_task.elf_path.clone(), + elf: single_node_task.elf.clone(), + private_input_path: single_node_task.private_input_path.clone(), + private_inputs: single_node_task.private_inputs.clone(), + receipt_inputs_path: single_node_task.receipt_inputs_path.clone(), + receipt_inputs: single_node_task.receipt_inputs.clone(), + program_id: single_node_task.program_id.clone(), + target_step: single_node_task.target_step.into(), + seg_size: single_node_task.seg_size, + local_prover_threads: single_node_task.local_prover_threads, + }; + tracing::info!( + "[single node] rpc {} {}:{} start", + addrs, + request.proof_id, + request.computed_request_id + ); + let now = std::time::Instant::now(); + let mut grpc_request = Request::new(request); + grpc_request.set_timeout(Duration::from_secs(TASK_TIMEOUT)); + let response = client.single_node(grpc_request).await; + let mut status = node_status.lock().unwrap(); + if let Ok(response) = response { + *status = NodeStatus::Idle; + if let Some(response_result) = response.get_ref().result.as_ref() { + single_node_task.state = result_code_to_state(response_result.code); + // FIXME: node_info usage? + single_node_task.trace.node_info = addrs.clone(); + single_node_task.total_cycles = response.get_ref().total_steps; + single_node_task.proof = response.get_ref().proof.clone(); + single_node_task.public_values = response.get_ref().public_values.clone(); + single_node_task.vk = response.get_ref().vk.clone(); + tracing::info!( + "[single node] rpc {} {}:{} code:{:?} message:{:?} end. Elapsed {:?}", + addrs, + response.get_ref().proof_id, + response.get_ref().computed_request_id, + response_result.code, + response_result.message, + now.elapsed(), + ); + return Ok(single_node_task); + } + } else { + *status = NodeStatus::OffLine(get_timestamp()); + tracing::warn!( + "Node {} is unreachable, marked Offline to avoid reuse", + addrs + ); + } + break; + } + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + } + + Ok(single_node_task) +} + #[allow(dead_code)] pub async fn get_task_status( client: &mut ProverServiceClient, diff --git a/proof-service/src/prover_node.rs b/proof-service/src/prover_node.rs index 871f3425..96c521cf 100644 --- a/proof-service/src/prover_node.rs +++ b/proof-service/src/prover_node.rs @@ -90,26 +90,10 @@ impl ProverNode { } if let Some(client) = client { - tracing::info!("Getting client {} status", self.addr); + // tracing::info!("Getting client {} status", self.addr); let client = ProverServiceClient::::new(client); return Some(client); - // let request = GetStatusRequest {}; - // let response = client.get_status(Request::new(request)).await; - // if let Ok(response) = response { - // let status = response.get_ref().status; - // tracing::info!("client {} status {}", self.addr, status); - // if get_status_response::Status::from_i32(status) - // == Some(get_status_response::Status::Idle) - // || get_status_response::Status::from_i32(status) - // == Some(get_status_response::Status::Unspecified) - // { - // return Some(client); - // } - // } else { - // tracing::info!("client {} status None", self.addr); - // self.set_client(None); - // } } None } diff --git a/proof-service/src/prover_service.rs b/proof-service/src/prover_service.rs index 90e7f565..59b931c3 100644 --- a/proof-service/src/prover_service.rs +++ b/proof-service/src/prover_service.rs @@ -1,24 +1,17 @@ -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use std::time::Instant; use tonic::{Request, Response, Status}; use crate::proto::includes::v1::ProverVersion; use crate::proto::prover_service::v1::{ - get_status_response, prover_service_server::ProverService, AggregateRequest, AggregateResponse, - GetStatusRequest, GetStatusResponse, GetTaskResultRequest, GetTaskResultResponse, ProveRequest, - ProveResponse, Result, ResultCode, SnarkProofRequest, SnarkProofResponse, SplitElfRequest, - SplitElfResponse, + prover_service_server::ProverService, AggregateRequest, AggregateResponse, GetStatusRequest, + GetStatusResponse, GetTaskResultRequest, GetTaskResultResponse, ProveRequest, ProveResponse, + Result, ResultCode, SingleNodeRequest, SingleNodeResponse, SnarkProofRequest, + SnarkProofResponse, SplitElfRequest, SplitElfResponse, }; use crate::{config, metrics}; -#[cfg(feature = "prover")] -use prover::{ - contexts::{AggContext, ProveContext, SnarkContext}, - executor::SplitContext, - pipeline::Pipeline, -}; -#[cfg(feature = "prover_v2")] use prover_v2::{ - contexts::{AggContext, ProveContext, SnarkContext, SplitContext}, + contexts::{AggContext, ProveContext, SingleNodeContext, SnarkContext, SplitContext}, pipeline::Pipeline, }; @@ -54,24 +47,15 @@ async fn run_back_task< #[derive(Default)] pub struct ProverServiceSVC { pub config: config::RuntimeConfig, - #[cfg(feature = "prover")] - pipeline: Arc>, - #[cfg(feature = "prover_v2")] - pipeline: Arc>, + pipeline: Arc, } impl ProverServiceSVC { pub fn new(config: config::RuntimeConfig) -> Self { - let version = if cfg!(feature = "prover") { - ProverVersion::Zkm - } else if cfg!(feature = "prover_v2") { - ProverVersion::Zkm2 - } else { - panic!("Not supported prover version"); - }; - let pipeline = Arc::new(Mutex::new(Pipeline::new( + let version = ProverVersion::Zkm2; + let pipeline = Arc::new(Pipeline::new( &config.base_dir, &config.get_proving_key_path(version.into()), - ))); + )); Self { config, pipeline } } } @@ -110,14 +94,7 @@ impl ProverService for ProverServiceSVC { ) -> tonic::Result, Status> { metrics::record_metrics("prover::get_status", || async { // tracing::info!("{:#?}", request); - let mut response = GetStatusResponse::default(); - let success = self.pipeline.lock().unwrap().get_status(); - tracing::info!("node {:?}: lock pipeline {:?}", self.config.addr, success); - if success { - response.status = get_status_response::Status::Idle.into(); - } else { - response.status = get_status_response::Status::Computing.into(); - } + let response = GetStatusResponse::default(); Ok(Response::new(response)) }) .await @@ -161,16 +138,9 @@ impl ProverService for ProverServiceSVC { ); let pipeline = self.pipeline.clone(); - let split_func = move || { - // todo: use try_lock? - let guard = pipeline.lock().unwrap_or_else(|e| { - tracing::error!("Mutex poisoned, recovering"); - e.into_inner() - }); - - guard.split(&split_context) - }; + let split_func = move || pipeline.split(&split_context); let result = run_back_task(split_func).await; + let mut response = SplitElfResponse { proof_id: request.get_ref().proof_id.clone(), computed_request_id: request.get_ref().computed_request_id.clone(), @@ -212,14 +182,6 @@ impl ProverService for ProverServiceSVC { //request.get_ref().seg_path, ); let start = Instant::now(); - #[cfg(feature = "prover")] - let prove_context = ProveContext::new( - request.get_ref().block_no, - request.get_ref().seg_size, - &request.get_ref().segment, - &request.get_ref().receipts_input, - ); - #[cfg(feature = "prover_v2")] let prove_context = ProveContext { proof_id: request.get_ref().proof_id.clone(), program_id: request.get_ref().program_id.clone(), @@ -227,19 +189,13 @@ impl ProverService for ProverServiceSVC { elf_path: request.get_ref().elf_path.clone(), segment: request.get_ref().segment.clone(), seg_size: request.get_ref().seg_size, + ..Default::default() }; let pipeline = self.pipeline.clone(); - // todo: lock the pipeline - let prove_func = move || { - let guard = pipeline.lock().unwrap_or_else(|e| { - tracing::error!("Mutex poisoned, recovering"); - e.into_inner() - }); - - guard.prove_root(&prove_context) - }; + let prove_func = move || pipeline.prove_root(&prove_context); let result = run_back_task(prove_func).await; + let mut response = ProveResponse { proof_id: request.get_ref().proof_id.clone(), computed_request_id: request.get_ref().computed_request_id.clone(), @@ -276,19 +232,6 @@ impl ProverService for ProverServiceSVC { request.get_ref().inputs.len() ); let start = Instant::now(); - #[cfg(feature = "prover")] - let agg_context = { - let inputs = request.get_ref().inputs.clone(); - AggContext::new( - request.get_ref().seg_size, - &inputs[0].receipt_input, - &inputs[1].receipt_input, - inputs[0].is_agg, - inputs[1].is_agg, - request.get_ref().is_final, - ) - }; - #[cfg(feature = "prover_v2")] let agg_context = AggContext { vk: request.get_ref().vk.clone(), proofs: request @@ -304,14 +247,9 @@ impl ProverService for ProverServiceSVC { }; let pipeline = self.pipeline.clone(); - let agg_func = move || { - let ppl = pipeline.lock().unwrap_or_else(|e| { - tracing::error!("Mutex poisoned, recovering"); - e.into_inner() - }); - ppl.prove_aggregate(&agg_context) - }; + let agg_func = move || pipeline.prove_aggregate(&agg_context); let result = run_back_task(agg_func).await; + let mut response = AggregateResponse { proof_id: request.get_ref().proof_id.clone(), computed_request_id: request.get_ref().computed_request_id.clone(), @@ -353,17 +291,13 @@ impl ProverService for ProverServiceSVC { proof_id: request.get_ref().proof_id.clone(), // proving_key_path: self.config.get_proving_key_path(request.get_ref().version), agg_receipt: request.get_ref().agg_receipt.clone(), + from_input: request.get_ref().from_input, }; let pipeline = self.pipeline.clone(); - let snark_func = move || { - let guard = pipeline.lock().unwrap_or_else(|e| { - tracing::error!("Mutex poisoned, recovering"); - e.into_inner() - }); - guard.prove_snark(&snark_context) - }; + let snark_func = move || pipeline.prove_snark(&snark_context); let result = run_back_task(snark_func).await; + let mut response = SnarkProofResponse { proof_id: request.get_ref().proof_id.clone(), computed_request_id: request.get_ref().computed_request_id.clone(), @@ -387,4 +321,68 @@ impl ProverService for ProverServiceSVC { }) .await } + + async fn single_node( + &self, + request: Request, + ) -> tonic::Result, Status> { + metrics::record_metrics("prover::single_node", || async { + tracing::info!( + "[single_node] {}:{} start", + request.get_ref().proof_id, + request.get_ref().computed_request_id, + ); + let start = Instant::now(); + let single_node_context = SingleNodeContext { + proof_id: request.get_ref().proof_id.to_string(), + program_id: request.get_ref().program_id.to_string(), + elf_path: request.get_ref().elf_path.to_string(), + elf: request.get_ref().elf.clone(), + base_dir: request.get_ref().base_dir.to_string(), + private_input_path: request.get_ref().private_input_path.to_string(), + private_inputs: request.get_ref().private_inputs.clone(), + receipt_inputs_path: request.get_ref().receipt_inputs_path.to_string(), + receipt_inputs: request.get_ref().receipt_inputs.clone(), + target_step: request.get_ref().target_step, + seg_size: request.get_ref().seg_size, + local_prover_threads: request.get_ref().local_prover_threads as usize, + }; + + let pipeline = self.pipeline.clone(); + let single_node_func = move || pipeline.prove_single_node(&single_node_context); + let result = run_back_task(single_node_func).await; + let (proof, public_values, vk) = match &result { + Ok((_, _, p, pv, vk)) => (p.clone(), pv.clone(), vk.clone()), + _ => (vec![], vec![], vec![]), + }; + + let mut response = SingleNodeResponse { + proof_id: request.get_ref().proof_id.clone(), + computed_request_id: request.get_ref().computed_request_id.clone(), + total_steps: result.clone().unwrap_or_default().1, + proof, + public_values, + vk, + ..Default::default() + }; + + // True if and only if no error occurs and cycles > 0 + let result: std::result::Result<(bool, Vec), String> = match result { + Ok(cycle) => Ok((cycle.1 > 0 && cycle.0, vec![])), + Err(e) => Err(e), + }; + on_done!(result, response); + let end = Instant::now(); + let elapsed = end.duration_since(start); + tracing::info!( + "[single node] {}:{} code:{} elapsed:{} end", + request.get_ref().proof_id, + request.get_ref().computed_request_id, + response.result.as_ref().unwrap().code, + elapsed.as_secs() + ); + Ok(Response::new(response)) + }) + .await + } } diff --git a/proof-service/src/stage/stage.rs b/proof-service/src/stage/stage.rs index 179eccc8..cd3cff81 100644 --- a/proof-service/src/stage/stage.rs +++ b/proof-service/src/stage/stage.rs @@ -1,11 +1,11 @@ use crate::proto::includes::v1::Step; -#[cfg(feature = "prover_v2")] use crate::stage::safe_read; use crate::stage::tasks::{ - agg_task::AggTask, generate_task::GenerateTask, ProveTask, SnarkTask, SplitTask, Trace, - TASK_STATE_FAILED, TASK_STATE_INITIAL, TASK_STATE_PROCESSING, TASK_STATE_SUCCESS, - TASK_STATE_UNPROCESSED, + agg_task::AggTask, generate_task::GenerateTask, ProveTask, SingleNodeTask, SnarkTask, + SplitTask, Trace, TASK_STATE_FAILED, TASK_STATE_INITIAL, TASK_STATE_PROCESSING, + TASK_STATE_SUCCESS, TASK_STATE_UNPROCESSED, }; +use common::file; use rayon::prelude::*; use std::{ fmt::{Debug, Formatter}, @@ -102,6 +102,7 @@ impl Stage { pub fn new(generate_task: GenerateTask) -> Self { Stage { //base_dir: generate_task.base_dir.clone(), + step: generate_task.from_step, generate_task, split_task: SplitTask::default(), prove_tasks: Vec::new(), @@ -109,7 +110,6 @@ impl Stage { snark_task: SnarkTask::default(), is_error: false, errmsg: "".to_string(), - step: Step::Init, is_tasks_gen_done: false, } } @@ -131,8 +131,7 @@ impl Stage { self.gen_prove_task_post(); crate::metrics::SEGMENTS_GAUGE.set(self.prove_tasks.len() as f64); tracing::info!( - "proof_id {} done. Generate {} prove_tasks", - self.generate_task.proof_id, + "Split done. Generate {} prove_tasks", self.prove_tasks.len() ); if !self.generate_task.composite_proof { @@ -174,6 +173,11 @@ impl Stage { } } } + Step::Agg => { + assert_eq!(self.generate_task.from_step, Step::Agg); + self.gen_snark_task(); + self.step = Step::Snark; + } Step::Snark => { if self.snark_task.state == TASK_STATE_SUCCESS { self.step = Step::End; @@ -266,7 +270,7 @@ impl Stage { } // Pre-allocate 64 tasks if self.prove_tasks.is_empty() { - self.prove_tasks = (0..64) + self.prove_tasks = (0..16) .into_par_iter() .map(|i| self.task_with_no(i)) .collect(); @@ -306,7 +310,6 @@ impl Stage { } } - #[cfg(feature = "prover_v2")] { let files = common::file::new(&self.generate_task.seg_path) .read_dir() @@ -337,15 +340,6 @@ impl Stage { self.prove_tasks.push(prove_task); } } - - #[cfg(feature = "prover")] - if self.prove_tasks.len() < 2 { - self.is_error = true; - self.errmsg = format!( - "Segment count is {}, please reduce SEG_SIZE !", - self.prove_tasks.len() - ); - } } pub fn get_prove_task(&mut self) -> Option { @@ -398,49 +392,6 @@ impl Stage { .count() } - #[cfg(feature = "prover")] - pub fn gen_agg_tasks(&mut self) { - // FIXME: we don't have to wait all the prove tasks done for the single GenerateTask. We should keep track of the agg_index in the Stage structure. - let mut agg_index = 0; - let mut result = Vec::new(); - let mut current_length = self.prove_tasks.len(); - for i in (0..current_length - 1).step_by(2) { - agg_index += 1; - result.push(AggTask::init_from_two_prove_task( - &(self.prove_tasks[i]), - &(self.prove_tasks[i + 1]), - agg_index, - )); - } - if current_length % 2 == 1 { - result.push(AggTask::init_from_single_prove_task( - &(self.prove_tasks[current_length - 1]), - agg_index + 1, - )); - } - self.agg_tasks.append(&mut result.clone()); - - current_length = result.len(); - while current_length > 1 { - let mut new_result = Vec::new(); - for i in (0..current_length - 1).step_by(2) { - agg_index += 1; - let agg_task = - AggTask::init_from_two_agg_task(&result[i], &result[i + 1], agg_index); - self.agg_tasks.push(agg_task.clone()); - new_result.push(agg_task); - } - if current_length % 2 == 1 { - new_result.push(result[current_length - 1].clone()); - } - result = new_result; - current_length = result.len(); - } - let last_agg_tasks = self.agg_tasks.len() - 1; - self.agg_tasks[last_agg_tasks].is_final = true; - } - - #[cfg(feature = "prover_v2")] pub fn gen_agg_tasks(&mut self) { use prover_v2::FIRST_LAYER_BATCH_SIZE; // The batch size for reducing two layers of recursion. @@ -580,11 +531,26 @@ impl Stage { self.snark_task.task_id = uuid::Uuid::new_v4().to_string(); self.snark_task.state = TASK_STATE_UNPROCESSED; // fill in the input receipts - for agg_task in &self.agg_tasks { - if agg_task.is_final { - self.snark_task.agg_receipt = agg_task.output.clone(); + if self.generate_task.from_step == Step::Init { + for agg_task in &self.agg_tasks { + if agg_task.is_final { + self.snark_task.agg_receipt = agg_task.output.clone(); + self.snark_task.from_input = false; + } } + } else if self.generate_task.from_step == Step::Agg { + // read from receipt_inputs_path + let receipt_datas = std::fs::read(&self.generate_task.receipt_inputs_path).unwrap(); + let receipts = bincode::deserialize::>>(&receipt_datas).unwrap(); + self.snark_task.agg_receipt = receipts[0].clone(); + self.snark_task.from_input = true; + } else { + unreachable!( + "gen_snark_task: unsupported from_step: {:?}", + self.generate_task.from_step + ); } + tracing::info!( "gen_snark_task: {:?} {:?}", self.snark_task.proof_id, @@ -612,6 +578,85 @@ impl Stage { f.write_all(&snark_task.output).unwrap(); on_task!(snark_task, dst, self); } + pub fn get_single_node_task(&self) -> SingleNodeTask { + let elf = safe_read(&self.generate_task.elf_path); + let private_inputs = if self.generate_task.private_input_path.is_empty() { + Vec::new() + } else { + std::fs::read(&self.generate_task.private_input_path) + .ok() + .and_then(|data| { + if data.is_empty() { + Some(Vec::new()) + } else { + bincode::deserialize::>>(&data).ok() + } + }) + .unwrap_or_default() + }; + let receipt_inputs = if self.generate_task.receipt_inputs_path.is_empty() { + Vec::new() + } else { + std::fs::read(&self.generate_task.receipt_inputs_path) + .ok() + .and_then(|data| { + if data.is_empty() { + Some(Vec::new()) + } else { + bincode::deserialize::>>(&data).ok() + } + }) + .unwrap_or_default() + }; + SingleNodeTask { + task_id: uuid::Uuid::new_v4().to_string(), + program_id: self.generate_task.program_id.clone(), + base_dir: self.generate_task.base_dir.clone(), + proof_id: self.generate_task.proof_id.clone(), + state: TASK_STATE_UNPROCESSED, + elf_path: self.generate_task.elf_path.clone(), + elf, + private_input_path: self.generate_task.private_input_path.clone(), + private_inputs, + receipt_inputs_path: self.generate_task.receipt_inputs_path.clone(), + receipt_inputs, + target_step: self.generate_task.target_step, + seg_size: self.generate_task.seg_size, + // In single node task, we use max_prover_num as number of local provers + local_prover_threads: self.generate_task.max_prover_num, + ..Default::default() + } + } + pub fn on_single_node_task(&mut self, single_node_task: &SingleNodeTask) { + if single_node_task.state == TASK_STATE_SUCCESS { + tracing::info!( + "Single node task {} success, output size: {}", + single_node_task.task_id, + single_node_task.proof.len() + ); + if self.generate_task.target_step == Step::Agg { + // Here we also use snark_path to store agg proof ; + let mut f = std::fs::File::create(&self.generate_task.snark_path) + .unwrap_or_else(|_| panic!("can not open {}", &self.generate_task.snark_path)); + f.write_all(&single_node_task.proof).unwrap(); + } + // store public values + let public_values_path = + format!("{}/wrap/public_values.bin", single_node_task.base_dir); + file::new(&public_values_path) + .write_all(&single_node_task.public_values) + .unwrap(); + // store vk + let vk_path = format!("{}/vk.bin", single_node_task.base_dir); + file::new(&vk_path) + .write_all(&single_node_task.vk) + .unwrap_or_default(); + self.step = Step::End; + } else { + self.is_error = true; + tracing::error!("Single node task {} failed", single_node_task.task_id); + } + } } impl Debug for Stage { @@ -659,35 +704,35 @@ impl Debug for Stage { } } -#[cfg(test)] -#[cfg(feature = "prover")] -mod tests { - use super::*; - #[test] - fn test_gen_agg_tasks() { - for n in 12..20 { - let mut stage = Stage::default(); - for i in 0..n { - stage.prove_tasks.insert( - i, - ProveTask { - output: vec![1, 2, 3], - file_no: i, - ..Default::default() - }, - ); - } - stage.gen_agg_tasks(); - stage.agg_tasks.iter().for_each(|element| { - let left = element.inputs.first().is_some_and(|input| input.is_agg); - let right = element.inputs.get(1).is_some_and(|input| input.is_agg); - - println!( - "agg: left:{} right:{} final:{}", - left, right, element.is_final, - ); - }); - assert!(stage.agg_tasks.len() <= n); - } - } -} +//#[cfg(test)] +//#[cfg(feature = "prover")] +//mod tests { +// use super::*; +// #[test] +// fn test_gen_agg_tasks() { +// for n in 12..20 { +// let mut stage = Stage::default(); +// for i in 0..n { +// stage.prove_tasks.insert( +// i, +// ProveTask { +// output: vec![1, 2, 3], +// file_no: i, +// ..Default::default() +// }, +// ); +// } +// stage.gen_agg_tasks(); +// stage.agg_tasks.iter().for_each(|element| { +// let left = element.inputs.first().is_some_and(|input| input.is_agg); +// let right = element.inputs.get(1).is_some_and(|input| input.is_agg); +// +// println!( +// "agg: left:{} right:{} final:{}", +// left, right, element.is_final, +// ); +// }); +// assert!(stage.agg_tasks.len() <= n); +// } +// } +//} diff --git a/proof-service/src/stage/stage_service.rs b/proof-service/src/stage/stage_service.rs index b215ddd3..d5921d9e 100644 --- a/proof-service/src/stage/stage_service.rs +++ b/proof-service/src/stage/stage_service.rs @@ -5,18 +5,14 @@ use crate::proto::stage_service::v1::{ }; use anyhow::Error; use common::tls::Config as TlsConfig; -use std::sync::Mutex; -use crate::stage::{stage_worker, tasks, GenerateTask}; +use crate::stage::{tasks, GenerateTask}; use tonic::{Request, Response, Status}; use crate::config; use common::file; -#[cfg(feature = "prover")] -use prover::provers; - use ethers::types::Signature; use sha2::{Digest, Sha256}; use std::io::Write; @@ -25,17 +21,15 @@ use std::str::FromStr; use crate::database; use crate::metrics; +use crate::database::StageTask; use crate::proto::includes::v1::{ProverVersion, Step}; -use lazy_static::lazy_static; -use std::collections::HashMap; - -lazy_static! { - static ref GLOBAL_TASKMAP: Mutex> = Mutex::new(HashMap::new()); -} +use crate::stage::stage_worker::TaskManager; +use tokio::sync::mpsc; pub struct StageServiceSVC { db: database::Database, config: config::RuntimeConfig, + tx: mpsc::Sender, } impl StageServiceSVC { @@ -55,9 +49,13 @@ impl StageServiceSVC { let database_url = config.database_url.as_str(); let db = database::Database::new(database_url); sqlx::migrate!("./migrations").run(&db.db_pool).await?; - let _ = - stage_worker::start(config.prover_addrs.len(), tls_config.clone(), db.clone()).await; - Ok(StageServiceSVC { db, config }) + + let (task_manager, tx) = TaskManager::new(db.clone(), config.max_concurrent_tasks); + let tx = task_manager.load_incomplete_tasks_from_db(tx).await?; + + task_manager.start(tls_config); + + Ok(StageServiceSVC { db, config, tx }) } pub fn verify_signature(&self, request: &GenerateProofRequest) -> Result { @@ -90,6 +88,7 @@ impl StageService for StageServiceSVC { if let Ok(task) = task { response.status = task.status; response.step = task.step; + response.proving_time = task.check_at as u64; let execute_info: Vec = self .db .get_prove_task_infos(&request.get_ref().proof_id, tasks::TASK_ITYPE_SPLIT) @@ -129,29 +128,14 @@ impl StageService for StageServiceSVC { }; if target_step != Step::Split && !composite_proof { if let Some(result) = task.result { - response.proof_with_public_inputs = if target_step == Step::Agg { - file::new(&proof_path).read().unwrap() - } else { - result.into_bytes() - }; + response.proof_with_public_inputs = + if target_step == Step::Agg && task.status == 0 { + file::new(&proof_path).read().unwrap_or_default() + } else { + result.into_bytes() + }; } if let Some(fileserver_url) = &self.config.fileserver_url { - #[cfg(feature = "prover")] - if target_step == Step::Snark { - response.snark_proof_url = format!( - "{}/{}/snark/proof_with_public_inputs.json", - fileserver_url, - request.get_ref().proof_id - ); - response.stark_proof_url = format!( - "{}/{}/wrap/proof_with_public_inputs.json", - fileserver_url, - request.get_ref().proof_id - ); - } - #[cfg(feature = "prover")] - let suffix = "json"; - #[cfg(feature = "prover_v2")] let suffix = "bin"; response.public_values_url = format!( "{}/{}/wrap/public_values.{}", @@ -178,29 +162,6 @@ impl StageService for StageServiceSVC { tracing::info!("[generate_proof] {} start", request.get_ref().proof_id); // check seg_size - #[cfg(feature = "prover")] - if !request.get_ref().composite_proof - && !provers::valid_seg_size(request.get_ref().seg_size as usize) - { - let response = GenerateProofResponse { - proof_id: request.get_ref().proof_id.clone(), - status: InvalidParameter.into(), - error_message: format!( - "invalid seg_size support [{}-{}]", - provers::MIN_SEG_SIZE, - provers::MAX_SEG_SIZE - ), - ..Default::default() - }; - tracing::warn!( - "[generate_proof] {} invalid seg_size support [{}-{}] {}", - request.get_ref().proof_id, - request.get_ref().seg_size, - provers::MIN_SEG_SIZE, - provers::MAX_SEG_SIZE - ); - return Ok(Response::new(response)); - } // check signature let user_address: String; match self.verify_signature(request.get_ref()) { @@ -245,6 +206,24 @@ impl StageService for StageServiceSVC { } } + let from_step = request.get_ref().from_step.unwrap_or(Step::Init.into()); + let single_node = request.get_ref().single_node; + if !(from_step == Step::Init as i32 || from_step == Step::Agg as i32) { + let response = GenerateProofResponse { + proof_id: request.get_ref().proof_id.clone(), + status: InvalidParameter.into(), + error_message: "invalid FromStep, only Support Init and Agg".to_string(), + ..Default::default() + }; + tracing::warn!( + "[generate_proof] {} invalid TargetStep {:?}", + request.get_ref().proof_id, + from_step, + ); + return Ok(Response::new(response)); + } + let from_step = Step::from_i32(from_step).unwrap(); + let target_step = request.get_ref().target_step.unwrap_or(Step::Snark.into()); if !(target_step == Step::Split as i32 || target_step == Step::Agg as i32 @@ -267,16 +246,97 @@ impl StageService for StageServiceSVC { let target_step = Step::from_i32(target_step).unwrap(); let base_dir = self.config.base_dir.clone(); + + // check elf_data or elf_id + // If elf_data is empty, and from_step is Init, elf_id should exist. + let (elf_path, elf_id) = { + if from_step == Step::Init { + let elf_dir = format!("{}/elf", base_dir); + if request.get_ref().elf_data.is_empty() { + // check if elf_id exists + if request.get_ref().elf_id.is_none() { + let response = GenerateProofResponse { + proof_id: request.get_ref().proof_id.clone(), + status: InvalidParameter.into(), + error_message: "elf_data or elf_id should not be empty".to_string(), + ..Default::default() + }; + tracing::warn!( + "[generate_proof] {} elf_data or elf_id should not be empty", + request.get_ref().proof_id, + ); + return Ok(Response::new(response)); + } else { + let elf_id = request.get_ref().elf_id.clone().unwrap(); + // remove "0x" if exists + let elf_id = elf_id.strip_prefix("0x").unwrap_or(&elf_id); + let elf_path = format!("{}/{}", elf_dir, elf_id); + if !std::path::Path::new(&elf_path).exists() { + let response = GenerateProofResponse { + proof_id: request.get_ref().proof_id.clone(), + status: InvalidParameter.into(), + error_message: "elf_id not found".to_string(), + ..Default::default() + }; + tracing::warn!( + "[generate_proof] {} elf_id not found", + request.get_ref().proof_id, + ); + return Ok(Response::new(response)); + } + tracing::info!( + "[generate_proof] {} elf_id found cache: {}", + request.get_ref().proof_id, + elf_id + ); + (elf_path, elf_id.to_string()) + } + } else { + // compute elf_id + let mut hasher = Sha256::new(); + hasher.update(&request.get_ref().elf_data); + let elf_hash = hasher.finalize(); + let elf_id = hex::encode(elf_hash); + + let elf_path = format!("{}/{}", elf_dir, elf_id); + if !std::path::Path::new(&elf_path).exists() { + tracing::info!( + "[generate_proof] {} elf_id not found, write to cache: {}", + request.get_ref().proof_id, + elf_path + ); + + file::new(&elf_path) + .write(&request.get_ref().elf_data) + .map_err(|e| { + tracing::error!( + "[generate_proof] {} write elf_data to {} failed: {:?}", + request.get_ref().proof_id, + elf_path, + e + ); + Status::internal(e.to_string()) + })?; + } else { + tracing::info!( + "[generate_proof] {} elf_id found cache but provided: {}", + request.get_ref().proof_id, + elf_id + ); + } + + (elf_path, elf_id) + } + } else { + (String::new(), String::new()) + } + }; + let dir_path = format!("{}/proof/{}", base_dir, request.get_ref().proof_id); file::new(&dir_path) .create_dir_all() .map_err(|e| Status::internal(e.to_string()))?; - let elf_path = format!("{}/elf", dir_path); - file::new(&elf_path) - .write(&request.get_ref().elf_data) - .map_err(|e| Status::internal(e.to_string()))?; - let block_no = request.get_ref().block_no.unwrap_or(0u64); let block_dir = format!("{}/0_{}", dir_path, block_no); file::new(&block_dir) @@ -314,6 +374,35 @@ impl StageService for StageServiceSVC { private_input_stream_path }; + if from_step == Step::Agg { + // if from_step is Agg, we need to check if the receipt_inputs is empty + // or the single node is true + if request.get_ref().receipt_inputs.is_empty() || single_node { + let response = GenerateProofResponse { + proof_id: request.get_ref().proof_id.clone(), + status: InvalidParameter.into(), + error_message: "receipt_inputs should not empty".to_string(), + ..Default::default() + }; + tracing::warn!( + "[generate_proof] {} empty receipt_inputs", + request.get_ref().proof_id, + ); + return Ok(Response::new(response)); + } + } + let mut max_prover_num = request.get_ref().max_prover_num; + if !single_node { + let available_provers = self.config.prover_addrs.len() as u32; + if max_prover_num == 0 { + // In single node mode, if 0, it means use all available provers. + max_prover_num = available_provers; + } else { + // Otherwise, cap the number to the maximum available provers. + max_prover_num = std::cmp::min(max_prover_num, available_provers); + } + } + let receipt_inputs_path = if request.get_ref().receipt_inputs.is_empty() { "".to_string() } else { @@ -345,11 +434,7 @@ impl StageService for StageServiceSVC { .create_dir_all() .map_err(|e| Status::internal(e.to_string()))?; - let output_stream_path = if cfg!(feature = "prover") { - format!("{}/{}", output_stream_dir, "output_stream") - } else { - String::new() - }; + let output_stream_path = String::new(); let seg_path = format!("{}/segment", dir_path); file::new(&seg_path) @@ -368,26 +453,30 @@ impl StageService for StageServiceSVC { file::new(&wrap_dir) .create_dir_all() .map_err(|e| Status::internal(e.to_string()))?; + + // if from_step == Agg, we need write dummy data to public values in case of panic + if from_step == Step::Agg { + let public_values_path = { + let suffix = "bin"; + format!("{}/public_values.{}", wrap_dir, suffix) + }; + // Write empty vector to public_values_path file + file::new(&public_values_path) + .write(&[]) + .map_err(|e| Status::internal(e.to_string()))?; + } + let snark_dir = format!("{}/snark", dir_path); file::new(&snark_dir) .create_dir_all() .map_err(|e| Status::internal(e.to_string()))?; let snark_path = format!("{}/proof_with_public_inputs.json", snark_dir); - let prover_version = if cfg!(feature = "prover") { - ProverVersion::Zkm - } else if cfg!(feature = "prover_v2") { - ProverVersion::Zkm2 - } else { - return Err(Status::internal("ProverVersion error")); - }; - // compute program id - let mut hasher = Sha256::new(); - hasher.update(&request.get_ref().elf_data); - let elf_hash = hasher.finalize(); + let prover_version = ProverVersion::Zkm2; + let generate_task = GenerateTask::new( prover_version, - hex::encode(elf_hash), + elf_id, &request.get_ref().proof_id, &dir_path, &elf_path, @@ -400,44 +489,48 @@ impl StageService for StageServiceSVC { &output_stream_path, Some(block_no), request.get_ref().seg_size, + max_prover_num, + from_step, target_step, + single_node, request.get_ref().composite_proof, &receipt_inputs_path, &receipts_path, ); + let context = serde_json::to_string(&generate_task).map_err(|e| { + Status::internal(format!("Failed to serialize GenerateTask context: {}", e)) + })?; + let stage_task = StageTask { + id: generate_task.proof_id.clone(), + status: Computing.into(), + context: Some(context.clone()), + ..Default::default() + }; + let _ = self .db .insert_stage_task( &request.get_ref().proof_id, &user_address, Computing.into(), - &serde_json::to_string(&generate_task).unwrap(), + &context, ) - .await; + .await + .map_err(|e| { + Status::internal(format!("Failed to insert task into database: {}", e)) + })?; + + self.tx + .send(stage_task) + .await + .map_err(|e| Status::internal(format!("Failed to send task to queue: {}", e)))?; + // TODO: we use the stage server as the file server, any better way? let mut snark_proof_url = String::new(); let mut stark_proof_url = String::new(); - #[cfg(feature = "prover")] - if let Some(fileserver_url) = &self.config.fileserver_url { - if target_step == Step::Snark { - snark_proof_url = format!( - "{}/{}/snark/proof_with_public_inputs.json", - fileserver_url, - request.get_ref().proof_id - ); - stark_proof_url = format!( - "{}/{}/wrap/proof_with_public_inputs.json", - fileserver_url, - request.get_ref().proof_id - ); - } - }; let mut public_values_url = match &self.config.fileserver_url { Some(fileserver_url) => { - #[cfg(feature = "prover")] - let suffix = "json"; - #[cfg(feature = "prover_v2")] let suffix = "bin"; format!( "{}/{}/wrap/public_values.{}", diff --git a/proof-service/src/stage/stage_worker.rs b/proof-service/src/stage/stage_worker.rs index dae67a00..a6437b06 100644 --- a/proof-service/src/stage/stage_worker.rs +++ b/proof-service/src/stage/stage_worker.rs @@ -1,5 +1,7 @@ use crate::database; -use crate::database::StageTask; +use crate::database::{Database, StageTask}; +use crate::proto::includes::v1::Step; +use crate::proto::stage_service; use crate::prover_client; use crate::stage::{ stage::get_timestamp, @@ -8,21 +10,21 @@ use crate::stage::{ GenerateTask, }; use crate::TlsConfig; +use anyhow::Context; use common::file; -use std::collections::HashMap; +// use std::collections::HashMap; use std::sync::Arc; -use std::sync::Mutex; +// use std::sync::Mutex; +use crate::stage::tasks::SplitTask; +use tokio::sync::{mpsc, Semaphore}; use tokio::time; - -use crate::proto::includes::v1::Step; -use crate::proto::stage_service; +use tracing::{error, info, instrument, warn}; macro_rules! save_task { ($task:ident, $db_pool:ident, $type:expr) => { if $task.state == TASK_STATE_FAILED || $task.state == TASK_STATE_SUCCESS { tracing::info!( - "begin to save task: {:?}:{:?} type {:?} status {}", - $task.proof_id, + "begin to save task: {:?} type {:?} status {}", $task.task_id, $type, $task.state @@ -46,86 +48,204 @@ macro_rules! save_task { }; } -async fn run_stage_task( - node_num: usize, - mut task: StageTask, +/// Helper function to dispatch a task to a prover client in a new tokio task. +/// +/// This encapsulates the common pattern of: +/// 1. Spawning a new asynchronous task. +/// 2. Calling a specific `prover_client` function. +/// 3. Wrapping the specific result type (e.g., `ProveTask`) into the general `Task` enum. +/// 4. Sending the wrapped task back through the results channel. +/// +/// # Type Parameters +/// * `T`: The specific task type (e.g., `SplitTask`, `ProveTask`). +/// * `F`: The type of the asynchronous client call function. +/// * `Fut`: The future returned by the client call. +/// * `W`: The type of the closure that wraps the result `T` into a `Task`. +fn dispatch_task( + task_payload: T, + client_call: F, + wrapper: W, + tx: mpsc::Sender, + tls_config: Option, + cur_prover_num: Arc>, + max_prover_num: u32, +) where + T: Send + 'static, + F: FnOnce(T, Option, Arc>, u32) -> Fut + Send + 'static, + Fut: std::future::Future> + Send, + W: FnOnce(T) -> Task + Send + 'static, +{ + tokio::spawn(async move { + if let Some(response_payload) = + client_call(task_payload, tls_config, cur_prover_num, max_prover_num).await + { + let task_result = wrapper(response_payload); + if let Err(e) = tx.send(task_result).await { + error!("Failed to send task result back to main loop: {}", e); + } + } + }); +} + +/// Handles the logic for a single-node proving task. +#[instrument(level = "info", skip_all, fields(proof_id = %task.id))] +async fn run_single_node_task( + task: &StageTask, + mut stage: Stage, tls_config: Option, - db: database::Database, + db: &Database, + task_start_time: std::time::Instant, ) { - if let Some(context) = task.context { + if task.step != Step::Init as i32 { + tracing::debug!("single node task, but it has already been processed"); + return; + } + + let single_node_task = stage.get_single_node_task(); + let mut split_task = SplitTask { + task_id: uuid::Uuid::new_v4().to_string(), + proof_id: single_node_task.proof_id.clone(), + ..Default::default() + }; + + let response = prover_client::single_node( + single_node_task, + tls_config, + db.clone(), + &task.id, + task.check_at as u64, + get_timestamp(), + ) + .await; + + let mut result = vec![]; + if let Ok(single_node_task) = response { + stage.on_single_node_task(&single_node_task); + if stage.generate_task.target_step == Step::Snark { + result = single_node_task.proof; + } + split_task.total_steps = single_node_task.total_cycles; + split_task.state = TASK_STATE_SUCCESS; + } else { + stage.is_error = true; + split_task.state = TASK_STATE_FAILED; + } + save_task!(split_task, db, TASK_ITYPE_SPLIT); + + // Finalize task status in the database + finalize_stage_task(task, &stage, task_start_time, result, db).await; +} + +#[instrument(level = "info", skip_all, fields(proof_id = %task.id))] +async fn run_stage_task(mut task: StageTask, tls_config: Option, db: Database) { + info!("Running stage task"); + if let Some(ref context) = task.context { let task_decoded = serde_json::from_str::(&context); match task_decoded { Ok(generate_context) => { - let mut check_at = get_timestamp(); + let task_start_time = std::time::Instant::now(); + let mut stage = Stage::new(generate_context.clone()); - let (tx, mut rx) = tokio::sync::mpsc::channel(128); + + // single node handler. + if generate_context.single_node { + run_single_node_task(&task, stage, tls_config, &db, task_start_time).await; + return; + } + + // Distributed (multi-node) handler + let mut check_at = get_timestamp(); + let (tx, mut rx) = mpsc::channel(128); stage.dispatch(); + + // update db, record the latest status and step + let _ = db + .update_stage_task_check_at( + &task.id, + task.check_at as u64, + check_at, + stage.step.into(), + ) + .await; + task.check_at = check_at as i64; + check_at = get_timestamp(); + let mut interval = time::interval(time::Duration::from_millis(200)); + let max_prover_num = stage.generate_task.max_prover_num; + let cur_prover_num = Arc::new(tokio::sync::Mutex::new(0u32)); loop { let current_step = stage.step; match stage.step { Step::Prove => { - let split_task = stage.get_split_task(); - if let Some(split_task) = split_task { - let tx = tx.clone(); - let tls_config = tls_config.clone(); - tokio::spawn(async move { - let response = - prover_client::split(split_task, tls_config).await; - if let Some(split_task) = response { - let _ = tx.send(Task::Split(split_task)).await; - } - }); + // Dispatch split tasks. + if let Some(task_payload) = stage.get_split_task() { + dispatch_task( + task_payload, + prover_client::split, + Task::Split, + tx.clone(), + tls_config.clone(), + cur_prover_num.clone(), + max_prover_num, + ); } - // This is a temporary workaround. - if stage.count_processing_prove_tasks() < node_num { - if let Some(prove_task) = stage.get_prove_task() { - let tx = tx.clone(); - let tls_config = tls_config.clone(); - tokio::spawn(async move { - let response = - prover_client::prove(prove_task, tls_config).await; - if let Some(prove_task) = response { - let _ = tx.send(Task::Prove(prove_task)).await; - } - }); + + // Dispatch prove tasks until the concurrent prover limit is reached. + while stage.count_processing_prove_tasks() < max_prover_num as usize { + if let Some(task_payload) = stage.get_prove_task() { + dispatch_task( + task_payload, + prover_client::prove, + Task::Prove, + tx.clone(), + tls_config.clone(), + cur_prover_num.clone(), + max_prover_num, + ); + } else { + // No more prove tasks available, break the inner loop. + break; } } - if stage.is_tasks_gen_done - && stage.count_unfinished_prove_tasks() < node_num + // Dispatch aggregate tasks if conditions are met. + while stage.is_tasks_gen_done + && stage.count_unfinished_prove_tasks() < max_prover_num as usize { - let agg_task = stage.get_agg_task(); - tracing::debug!("get_agg_task: {:?}", agg_task.is_some()); - if let Some(agg_task) = agg_task { - let tx = tx.clone(); - let tls_config = tls_config.clone(); - tokio::spawn(async move { - let response = - prover_client::aggregate(agg_task, tls_config).await; - if let Some(agg_task) = response { - let _ = tx.send(Task::Agg(agg_task)).await; - } - }); + if let Some(task_payload) = stage.get_agg_task() { + tracing::debug!("get_agg_task: true"); + dispatch_task( + task_payload, + prover_client::aggregate, + Task::Agg, + tx.clone(), + tls_config.clone(), + cur_prover_num.clone(), + max_prover_num, + ); + } else { + // No more aggregation tasks available, break the inner loop. + tracing::debug!("get_agg_task: false"); + break; } } } Step::Snark => { - let snark_task = stage.get_snark_task(); - if let Some(snark_task) = snark_task { - let tx = tx.clone(); - let tls_config = tls_config.clone(); - tokio::spawn(async move { - let response = - prover_client::snark_proof(snark_task, tls_config).await; - if let Some(snark_task) = response { - let _ = tx.send(Task::Snark(snark_task)).await; - } - }); + if let Some(task_payload) = stage.get_snark_task() { + dispatch_task( + task_payload, + prover_client::snark_proof, + Task::Snark, + tx.clone(), + tls_config.clone(), + cur_prover_num.clone(), + max_prover_num, + ); } } _ => {} } + tokio::select! { task = rx.recv() => { if let Some(task) = task { @@ -156,6 +276,7 @@ async fn run_stage_task( break; } stage.dispatch(); + let ts_now = get_timestamp(); if check_at + 10 < ts_now || current_step != stage.step { check_at = ts_now; @@ -174,34 +295,15 @@ async fn run_stage_task( } } } - if stage.is_error() { - let get_status = || match stage.step { - Step::Split => stage_service::v1::Status::SplitError, - Step::Prove => stage_service::v1::Status::ProveError, - Step::Agg => stage_service::v1::Status::AggError, - Step::Snark => stage_service::v1::Status::SnarkError, - _ => stage_service::v1::Status::InternalError, - }; - let status = get_status(); - db.update_stage_task(&task.id, status.into(), "") - .await - .unwrap(); + + let result = if stage.is_success() && generate_context.target_step == Step::Snark { + file::new(&generate_context.snark_path) + .read() + .unwrap_or_default() } else { - // If generate compressed proof, do not store in database, use file instead. - let result = if generate_context.target_step == Step::Snark { - file::new(&generate_context.snark_path).read().unwrap() - } else { - vec![] - }; - db.update_stage_task( - &task.id, - stage_service::v1::Status::Success.into(), - &String::from_utf8(result).expect("Invalid UTF-8 bytes"), - ) - .await - .unwrap(); - tracing::info!("[stage] finished {:?} ", stage); - } + vec![] + }; + finalize_stage_task(&task, &stage, task_start_time, result, &db).await; } Err(_) => { let _ = db @@ -216,68 +318,139 @@ async fn run_stage_task( } } -async fn load_stage_task(node_num: usize, tls_config: Option, db: database::Database) { - let store = Arc::new(Mutex::new(HashMap::new())); - loop { - let limit = 5; - let status = stage_service::v1::Status::Computing.into(); - let check_at = get_timestamp(); - // FIXME: why do we just fetch the task in last 1 min? - let result = db - .get_incomplete_stage_tasks(status, (check_at - 60) as i64, limit) - .await; - match result { - Ok(tasks) => { - if tasks.is_empty() { - time::sleep(time::Duration::from_secs(1)).await; - } else { - for mut task in tasks { - { - if store.lock().unwrap().contains_key(&task.id) { - continue; - } - let rows_affected = db - .update_stage_task_check_at( - &task.id, - task.check_at as u64, - check_at, - task.step, - ) - .await; - if let Ok(rows_affected) = rows_affected { - if rows_affected == 1 { - task.check_at = check_at as i64; - store.lock().unwrap().insert(task.id.clone(), check_at); - let store_arc = store.clone(); - let tls_config_copy = tls_config.clone(); - let db_copy = db.clone(); - tokio::spawn(async move { - let id = task.id.clone(); - run_stage_task(node_num, task, tls_config_copy, db_copy) - .await; - store_arc.lock().unwrap().remove(&id); - }); - } - } - } - } - } - } - Err(e) => { - tracing::error!("{:?}", e); - time::sleep(time::Duration::from_secs(10)).await; - } +/// Updates the final status of a StageTask in the database after it has completed or failed. +async fn finalize_stage_task( + task: &StageTask, + stage: &Stage, + task_start_time: std::time::Instant, + result: Vec, + db: &Database, +) { + if stage.is_error() { + let get_status = || match stage.step { + Step::Split => stage_service::v1::Status::SplitError, + Step::Prove => stage_service::v1::Status::ProveError, + Step::Agg => stage_service::v1::Status::AggError, + Step::Snark => stage_service::v1::Status::SnarkError, + _ => stage_service::v1::Status::InternalError, + }; + let status = get_status(); + if let Err(e) = db.update_stage_task(&task.id, status.into(), "").await { + error!("Failed to update stage task to error status: {:?}", e); + } + } else if stage.is_success() { + // Task is successful + let task_duration = task_start_time.elapsed().as_millis() as u64; + + // update the step, and store the duration in the `check_at` field. + if let Err(e) = db + .update_stage_task_check_at( + &task.id, + task.check_at as u64, + task_duration, + stage.step.into(), + ) + .await + { + error!("Failed to update stage task check_at on success: {:?}", e); + } + + let result_str = String::from_utf8(result).expect("Invalid UTF-8 bytes in proof result"); + if let Err(e) = db + .update_stage_task( + &task.id, + stage_service::v1::Status::Success.into(), + &result_str, + ) + .await + { + error!("Failed to update stage task to success status: {:?}", e); } + + info!( + "[stage] finished {:?} total_time {} ms", + stage, task_duration + ); } } -pub async fn start( - node_num: usize, - tls_config: Option, - db: database::Database, -) -> anyhow::Result { - tokio::spawn(async move { - load_stage_task(node_num, tls_config, db).await; - }); - Ok(true) +pub struct TaskManager { + pub db: Database, + task_receiver: mpsc::Receiver, + pub semaphore: Arc, +} + +impl TaskManager { + pub fn new( + db: Database, + max_concurrent_tasks: Option, + ) -> (Self, mpsc::Sender) { + let max_concurrent_tasks = max_concurrent_tasks.unwrap_or(1); + let (task_sender, task_receiver) = mpsc::channel(256); + let semaphore = Arc::new(Semaphore::new(max_concurrent_tasks)); + ( + Self { + db, + task_receiver, + semaphore, + }, + task_sender, + ) + } + + pub async fn process_tasks(&mut self, tls_config: Option) { + info!("Starting task processor..."); + + while let Some(task) = self.task_receiver.recv().await { + let permit = self.semaphore.clone().acquire_owned().await.unwrap(); + + let tls_clone = tls_config.clone(); + let db = self.db.clone(); + tokio::spawn(async move { + run_stage_task(task, tls_clone, db).await; + drop(permit); + }); + } + } + + pub fn start(mut self, tls: Option) { + tokio::spawn(async move { self.process_tasks(tls).await }); + } + + pub async fn load_incomplete_tasks_from_db( + &self, + task_sender: mpsc::Sender, + ) -> anyhow::Result> { + info!("Loading incomplete tasks from database..."); + + let tasks = self + .db + .get_incomplete_stage_tasks( + stage_service::v1::Status::Computing.into(), + get_timestamp() as i64, + i32::MAX, + ) + .await + .context("Failed to load incomplete tasks from database")?; + + info!("Found {} incomplete tasks", tasks.len()); + + let mut loaded_count = 0; + for task in tasks { + match task_sender.try_send(task) { + Ok(()) => loaded_count += 1, + Err(mpsc::error::TrySendError::Full(_)) => { + warn!("Task queue is full, stopping load"); + break; + } + Err(mpsc::error::TrySendError::Closed(_)) => { + error!("Task queue is closed"); + break; + } + } + } + info!("Loaded {loaded_count} tasks to memory queue"); + + Ok(task_sender) + } } diff --git a/proof-service/src/stage/tasks/generate_task.rs b/proof-service/src/stage/tasks/generate_task.rs index a2226b3b..65fabec9 100644 --- a/proof-service/src/stage/tasks/generate_task.rs +++ b/proof-service/src/stage/tasks/generate_task.rs @@ -18,7 +18,10 @@ pub struct GenerateTask { pub output_stream_path: String, pub block_no: Option, pub seg_size: u32, + pub max_prover_num: u32, pub target_step: Step, + pub from_step: Step, + pub single_node: bool, pub composite_proof: bool, pub receipt_inputs_path: String, pub receipts_path: String, @@ -88,7 +91,10 @@ impl GenerateTask { output_stream_path: &str, block_no: Option, seg_size: u32, + max_prover_num: u32, + from_step: Step, target_step: Step, + single_node: bool, composite_proof: bool, receipt_inputs_path: &str, receipts_path: &str, @@ -108,7 +114,10 @@ impl GenerateTask { output_stream_path: output_stream_path.to_string(), block_no, seg_size, + max_prover_num, target_step, + from_step, + single_node, composite_proof, receipt_inputs_path: receipt_inputs_path.to_string(), receipts_path: receipts_path.to_string(), diff --git a/proof-service/src/stage/tasks/mod.rs b/proof-service/src/stage/tasks/mod.rs index 5084c174..f7eba44b 100644 --- a/proof-service/src/stage/tasks/mod.rs +++ b/proof-service/src/stage/tasks/mod.rs @@ -18,6 +18,10 @@ pub mod agg_task; pub use agg_task::AggTask; pub mod generate_task; + +pub mod single_node_task; +pub use single_node_task::SingleNodeTask; + pub mod snark_task; pub use snark_task::SnarkTask; diff --git a/proof-service/src/stage/tasks/single_node_task.rs b/proof-service/src/stage/tasks/single_node_task.rs new file mode 100644 index 00000000..cd3413ad --- /dev/null +++ b/proof-service/src/stage/tasks/single_node_task.rs @@ -0,0 +1,30 @@ +use crate::proto::includes::v1::Step; +use crate::stage::tasks::Trace; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct SingleNodeTask { + pub task_id: String, + pub program_id: String, + pub base_dir: String, + pub state: u32, + pub proof_id: String, + pub elf_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub elf: Vec, + pub private_input_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub private_inputs: Vec>, + pub receipt_inputs_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub receipt_inputs: Vec>, + pub target_step: Step, + pub trace: Trace, + pub proof: Vec, + pub public_values: Vec, + pub vk: Vec, + pub seg_size: u32, + pub total_cycles: u64, + #[serde(default)] + pub local_prover_threads: u32, +} diff --git a/proof-service/src/stage/tasks/snark_task.rs b/proof-service/src/stage/tasks/snark_task.rs index b0859dcf..c0f91161 100644 --- a/proof-service/src/stage/tasks/snark_task.rs +++ b/proof-service/src/stage/tasks/snark_task.rs @@ -14,6 +14,7 @@ pub struct SnarkTask { #[serde(skip_serializing, skip_deserializing)] pub agg_receipt: Vec, + pub from_input: bool, #[serde(skip_serializing, skip_deserializing)] pub output: Vec, //snark_proof_with_public_inputs diff --git a/proto/src/proto/prover/v1/prover.proto b/proto/src/proto/prover/v1/prover.proto index fc96bd45..2e514879 100644 --- a/proto/src/proto/prover/v1/prover.proto +++ b/proto/src/proto/prover/v1/prover.proto @@ -30,6 +30,7 @@ service ProverService { rpc Prove(ProveRequest) returns (ProveResponse) {} rpc Aggregate(AggregateRequest) returns (AggregateResponse) {} rpc SnarkProof(SnarkProofRequest) returns (SnarkProofResponse) {} + rpc SingleNode(SingleNodeRequest) returns (SingleNodeResponse) {} } message GetStatusRequest {} @@ -134,6 +135,7 @@ message SnarkProofRequest { string computed_request_id = 2; includes.v1.ProverVersion version = 3; bytes agg_receipt = 4; + bool from_input = 5; // if true, the agg_receipt is from input, otherwise it is from agg output } message SnarkProofResponse { @@ -142,3 +144,29 @@ message SnarkProofResponse { bytes snark_proof_with_public_inputs = 3; Result result = 4; } + +message SingleNodeRequest { + string proof_id = 1; + string computed_request_id = 2; + string base_dir = 3; + string elf_path = 4; + string private_input_path = 5; + string receipt_inputs_path = 6; + string program_id = 7; + includes.v1.Step target_step = 8; + uint32 seg_size = 9; + bytes elf = 10; + repeated bytes private_inputs = 11; + repeated bytes receipt_inputs = 12; + uint32 local_prover_threads = 13; +} + +message SingleNodeResponse { + string proof_id = 1; + string computed_request_id = 2; + bytes proof = 3; + bytes public_values = 4; + bytes vk = 5; + uint64 total_steps = 6; + Result result = 7; +} diff --git a/proto/src/proto/stage/v1/stage.proto b/proto/src/proto/stage/v1/stage.proto index e0f9a0b6..1e820343 100644 --- a/proto/src/proto/stage/v1/stage.proto +++ b/proto/src/proto/stage/v1/stage.proto @@ -27,7 +27,8 @@ message GenerateProofRequest { repeated includes.v1.BlockFileItem block_data = 3; optional uint64 block_no = 4; uint32 seg_size = 5; - // !!!del!!! string args = 6; + // sha256(elf_data) + optional string elf_id = 6; string signature = 7; bytes public_input_stream = 8; bytes private_input_stream = 9; @@ -37,6 +38,10 @@ message GenerateProofRequest { bool composite_proof = 11; repeated bytes receipt_inputs = 12; repeated bytes receipts = 13; + optional includes.v1.Step from_step = 14; + // if true, the proof will be generated in a single node + bool single_node = 15; + uint32 max_prover_num = 16; } message GenerateProofResponse { @@ -65,4 +70,5 @@ message GetStatusResponse { uint64 total_steps = 10; bytes receipt = 11; bytes elf_id = 12; + uint64 proving_time = 13; // in milliseconds } diff --git a/prover/Cargo.toml b/prover/Cargo.toml deleted file mode 100644 index 8f9636fb..00000000 --- a/prover/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "prover" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -plonky2 = { git = "https://github.com/zkMIPS/plonky2.git", branch = "zkm_dev" } - -zkm-prover = { git = "https://github.com/zkMIPS/zkm.git", branch = "main" } -zkm-emulator = { git = "https://github.com/zkMIPS/zkm.git", branch = "main" } -zkm-recursion = { git = "https://github.com/zkMIPS/zkm.git", branch = "main" } - -#zkm-prover = { path = "../../zkm/prover" } -#zkm-emulator = { path = "../../zkm/emulator" } -#zkm-recursion = { path = "../../zkm/recursion" } - -bincode = "1.3.3" -log = { version = "0.4.14", default-features = false } -anyhow = "1.0.75" -num = "0.4.0" -serde = { version = "1.0.144", features = ["derive"] } -serde_json = "1.0" -once_cell = "1.13.0" -elf = { version = "0.7", default-features = false } - -common = { path = "../common" } - -[features] -gpu = [] diff --git a/prover/src/contexts/agg_context.rs b/prover/src/contexts/agg_context.rs deleted file mode 100644 index 54ea2dda..00000000 --- a/prover/src/contexts/agg_context.rs +++ /dev/null @@ -1,33 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize, Default)] -pub struct AggContext { - pub seg_size: u32, - pub receipt_path1: Vec, - pub receipt_path2: Vec, - pub is_agg_1: bool, - pub is_agg_2: bool, - pub is_final: bool, - // temprary output directory -} - -impl AggContext { - #[allow(clippy::too_many_arguments)] - pub fn new( - seg_size: u32, - receipt_path1: &Vec, - receipt_path2: &Vec, - is_agg_1: bool, - is_agg_2: bool, - is_final: bool, - ) -> Self { - AggContext { - seg_size, - receipt_path1: receipt_path1.to_owned(), - receipt_path2: receipt_path2.to_owned(), - is_agg_1, - is_agg_2, - is_final, - } - } -} diff --git a/prover/src/contexts/mod.rs b/prover/src/contexts/mod.rs deleted file mode 100644 index ec4edf47..00000000 --- a/prover/src/contexts/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub mod prove_context; -pub use prove_context::ProveContext; - -pub mod agg_context; -pub use agg_context::AggContext; - -pub mod snark_context; -pub use snark_context::SnarkContext; diff --git a/prover/src/contexts/prove_context.rs b/prover/src/contexts/prove_context.rs deleted file mode 100644 index 4298025e..00000000 --- a/prover/src/contexts/prove_context.rs +++ /dev/null @@ -1,26 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize, Default)] -pub struct ProveContext { - pub block_no: Option, - pub seg_size: u32, - pub segment: String, - //pub receipt_output: Vec, - pub receipts_input: Vec>, -} - -impl ProveContext { - pub fn new( - block_no: Option, - seg_size: u32, - segment: &str, - receipts_input: &Vec>, - ) -> Self { - ProveContext { - block_no, - seg_size, - segment: segment.into(), - receipts_input: receipts_input.to_owned(), - } - } -} diff --git a/prover/src/contexts/snark_context.rs b/prover/src/contexts/snark_context.rs deleted file mode 100644 index 8eb8eab5..00000000 --- a/prover/src/contexts/snark_context.rs +++ /dev/null @@ -1,9 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize, Default)] -pub struct SnarkContext { - pub version: i32, - pub proof_id: String, - // pub proving_key_path: String, - pub agg_receipt: Vec, -} diff --git a/prover/src/executor/executor.rs b/prover/src/executor/executor.rs deleted file mode 100644 index 69053e27..00000000 --- a/prover/src/executor/executor.rs +++ /dev/null @@ -1,131 +0,0 @@ -use common::file; -use elf::{endian::AnyEndian, ElfBytes}; -use num::ToPrimitive; -use zkm_emulator::state::{InstrumentedState, State}; -use zkm_emulator::utils::get_block_path; - -#[derive(Default)] -pub struct Executor {} - -use crate::executor::SplitContext; - -impl Executor { - pub fn split(&self, ctx: &SplitContext) -> Result<(u64, u32), String> { - // 1. split ELF into segs - let elf_path = ctx.elf_path.clone(); - let block_no = ctx.block_no.unwrap_or(0); - let seg_path = ctx.seg_path.clone(); - let seg_size = ctx.seg_size.to_usize().expect("u32->usize failed"); - let mut args: Vec<&str> = ctx.args.split_whitespace().collect(); - if args.len() > 2 { - args.truncate(2); - } - - log::info!("split {} load elf file", elf_path); - let data = file::new(&elf_path).read(); - let mut block_path = get_block_path(&ctx.base_dir, &block_no.to_string(), ""); - let input_path = if block_path.ends_with('/') { - format!("{}input", block_path) - } else { - format!("{}/input", block_path) - }; - - if let Result::Ok(data) = data { - let file_result = ElfBytes::::minimal_parse(data.as_slice()); - match file_result { - Result::Ok(file) => { - let mut state = State::load_elf(&file); - state.patch_elf(&file); - // state.patch_stack(args); - state.patch_stack(vec![]); - // public_input_stream - if !ctx.public_input_path.is_empty() { - let data = file::new(&ctx.public_input_path) - .read() - .expect("read public_input_stream failed"); - state.input_stream.push(data.clone()); - log::info!("split set public_input data {}", data.len()); - } - - // private_input_stream - // FIXME: only one private input is allowed. need to support many. - if !ctx.private_input_path.is_empty() { - let data = file::new(&ctx.private_input_path) - .read() - .expect("read private_input_stream failed"); - state.input_stream.push(data.clone()); - log::info!("split set private_input data {}", data.len()); - } - - if !ctx.receipt_inputs_path.is_empty() { - let data = file::new(&ctx.receipt_inputs_path) - .read() - .expect("read receipt_inputs_stream failed"); - let receipt_inputs = bincode::deserialize::>>(&data) - .expect("deserialize receipt_inputs_stream failed"); - for receipt_input in receipt_inputs.iter() { - state.input_stream.push(receipt_input.clone()); - log::info!("split set receipt_inputs data {}", data.len()); - } - } - - if block_no > 0 { - log::info!("split set input data {}", input_path); - let input_data = file::new(&input_path).read().unwrap(); - state - .memory - .set_memory_range(0x30000000, Box::new(input_data.as_slice())) - .expect("set memory range failed"); - } else { - block_path = "".to_string(); - } - - let mut instrumented_state = InstrumentedState::new(state, block_path); - let seg_path_clone = seg_path.clone(); - file::new(&seg_path_clone).create_dir_all().unwrap(); - let new_write = |_: &str| -> Option { None }; - instrumented_state.split_segment(false, &seg_path_clone, new_write); - - let new_write = - |name: &str| -> Option> { Some(file::new(name)) }; - let mut loop_index = 0; - loop { - if instrumented_state.state.exited { - break; - } - let cycles = instrumented_state.step(); - let split_seg_size = if loop_index < 8 { - seg_size as u64 >> 2 - } else { - seg_size as u64 - }; - if cycles >= split_seg_size { - instrumented_state.split_segment(true, &seg_path_clone, new_write); - loop_index += 1; - } - } - instrumented_state.split_segment(true, &seg_path_clone, new_write); - log::info!( - "Split done {} : {}", - instrumented_state.state.total_step, - instrumented_state.state.total_cycle - ); - instrumented_state.dump_memory(); - // write public_values_stream - let _ = file::new(&ctx.output_path) - .write(&instrumented_state.state.public_values_stream) - .unwrap(); - return Ok(( - instrumented_state.state.total_step, - instrumented_state.pre_segment_id, - )); - } - Err(e) => { - log::error!("split minimal_parse error {:?}", e.to_string()); - return Err(e.to_string()); - } - } - } - Ok((0, 0)) - } -} diff --git a/prover/src/executor/mod.rs b/prover/src/executor/mod.rs deleted file mode 100644 index ce4555b9..00000000 --- a/prover/src/executor/mod.rs +++ /dev/null @@ -1,51 +0,0 @@ -#[allow(clippy::module_inception)] -mod executor; - -pub use executor::*; - -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize, Default)] -pub struct SplitContext { - pub base_dir: String, - pub elf_path: String, - pub block_no: Option, - pub seg_size: u32, - pub seg_path: String, - pub public_input_path: String, - pub private_input_path: String, - // public_values_stream - pub output_path: String, - pub args: String, - pub receipt_inputs_path: String, -} - -impl SplitContext { - #[allow(clippy::too_many_arguments)] - pub fn new( - basedir: &str, - _program_id: &str, - elf_path: &str, - block_no: Option, - seg_size: u32, - seg_path: &str, - public_input_path: &str, - private_input_path: &str, - output_path: &str, - args: &str, - receipt_inputs_path: &str, - ) -> Self { - SplitContext { - base_dir: basedir.to_string(), - elf_path: elf_path.to_string(), - block_no, - seg_size, - seg_path: seg_path.to_string(), - public_input_path: public_input_path.to_string(), - private_input_path: private_input_path.to_string(), - output_path: output_path.to_string(), - args: args.to_string(), - receipt_inputs_path: receipt_inputs_path.to_string(), - } - } -} diff --git a/prover/src/lib.rs b/prover/src/lib.rs deleted file mode 100644 index 723f06bf..00000000 --- a/prover/src/lib.rs +++ /dev/null @@ -1,74 +0,0 @@ -pub mod contexts; -pub mod executor; -pub mod pipeline; -pub mod provers; - -#[cfg(feature = "gpu")] -pub fn init_stark_op_stream_simple() { - use plonky2::field::abstract_field::{ - get_ops_stream, get_ops_stream_simple, AbstractFieldForVec, SimpleOpsNode, - }; - let ops_vec_1: Option> = { - let file_path = "/mnt_zkm/app/mytest_get_opstreams/log_simplify_arithmetic.txt"; - match get_ops_stream_simple(file_path) { - Ok(Some(ops)) => Some(ops), - Ok(None) => None, - Err(_) => None, - } - }; - let ops_vec_2: Option> = { - let file_path = "/mnt_zkm/app/mytest_get_opstreams/log_simplify_cpu.txt"; - match get_ops_stream_simple(file_path) { - Ok(Some(ops)) => Some(ops), - Ok(None) => None, - Err(_) => None, - } - }; - let ops_vec_3: Option> = { - let file_path = "/mnt_zkm/app/mytest_get_opstreams/log_simplify_poseidon.txt"; - match get_ops_stream_simple(file_path) { - Ok(Some(ops)) => Some(ops), - Ok(None) => None, - Err(_) => None, - } - }; - let ops_vec_4: Option> = { - let file_path = "/mnt_zkm/app/mytest_get_opstreams/log_simplify_poseidonsponge.txt"; - match get_ops_stream_simple(file_path) { - Ok(Some(ops)) => Some(ops), - Ok(None) => None, - Err(_) => None, - } - }; - let ops_vec_5: Option> = { - let file_path = "/mnt_zkm/app/mytest_get_opstreams/log_simplify_logic.txt"; - match get_ops_stream_simple(file_path) { - Ok(Some(ops)) => Some(ops), - Ok(None) => None, - Err(_) => None, - } - }; - let ops_vec_6: Option> = { - let file_path = "/mnt_zkm/app/mytest_get_opstreams/log_simplify_mem.txt"; - match get_ops_stream_simple(file_path) { - Ok(Some(ops)) => Some(ops), - Ok(None) => None, - Err(_) => None, - } - }; - let mut abstract_field_vec = plonky2::field::abstract_field::SIMPLE_STARKS_ABSTRACT_FIELD_VEC - .lock() - .unwrap(); - abstract_field_vec.push(ops_vec_1.clone()); - abstract_field_vec.push(ops_vec_2.clone()); - abstract_field_vec.push(ops_vec_3.clone()); - abstract_field_vec.push(ops_vec_4.clone()); - abstract_field_vec.push(ops_vec_5.clone()); - abstract_field_vec.push(ops_vec_6.clone()); - log::info!("streams_len: {}", ops_vec_1.unwrap().len()); - log::info!("streams_len: {}", ops_vec_2.unwrap().len()); - log::info!("streams_len: {}", ops_vec_3.unwrap().len()); - log::info!("streams_len: {}", ops_vec_4.unwrap().len()); - log::info!("streams_len: {}", ops_vec_5.unwrap().len()); - log::info!("streams_len: {}", ops_vec_6.unwrap().len()); -} diff --git a/prover/src/pipeline.rs b/prover/src/pipeline.rs deleted file mode 100644 index b5f6dc8e..00000000 --- a/prover/src/pipeline.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::contexts::{AggContext, ProveContext, SnarkContext}; -use crate::provers::{AggProver, Prover, RootProver, SnarkProver}; - -use crate::executor::{Executor, SplitContext}; -use std::sync::Mutex; -#[derive(Default)] -pub struct Pipeline { - mutex: Mutex, - executor: Executor, - root_prover: RootProver, - agg_prover: AggProver, - snark_prover: SnarkProver, -} - -impl Pipeline { - pub fn new(base_dir: &str, keys_input_dir: &str) -> Self { - Pipeline { - mutex: Mutex::new(0), - executor: Executor::default(), - root_prover: RootProver::default(), - agg_prover: AggProver::default(), - snark_prover: SnarkProver::new(keys_input_dir, base_dir), - } - } - - pub fn split(&self, split_context: &SplitContext) -> Result<(bool, u64, u32), String> { - match self.executor.split(split_context) { - Ok((steps, segments)) => Ok((true, steps, segments)), - Err(e) => Err(e.to_string()), - } - } - - pub fn prove_root( - &self, - prove_context: &ProveContext, - ) -> std::result::Result<(bool, Vec), String> { - let result = self.mutex.try_lock(); - match result { - Ok(_guard) => match self.root_prover.prove(prove_context) { - Ok(receipt_output) => Ok(receipt_output), - Err(e) => { - log::error!("prove_root error {:#?}", e); - Err(e.to_string()) - } - }, - Err(e) => { - log::error!("prove_root busy: {:?}", e); - Ok((false, vec![])) - } - } - } - - pub fn prove_aggregate( - &self, - agg_context: &AggContext, - ) -> std::result::Result<(bool, Vec), String> { - let result = self.mutex.try_lock(); - match result { - Ok(_guard) => match self.agg_prover.prove(agg_context) { - Ok(agg_receipt_output) => Ok(agg_receipt_output), - Err(e) => { - log::error!("prove_aggregate error {:#?}", e); - Err(e.to_string()) - } - }, - Err(e) => { - log::error!("prove_aggregate busy: {:?}", e); - Ok((false, vec![])) - } - } - } - - pub fn prove_snark( - &self, - snark_context: &SnarkContext, - ) -> std::result::Result<(bool, Vec), String> { - let result = self.mutex.try_lock(); - match result { - Ok(_guard) => match self.snark_prover.prove(snark_context) { - Ok(output) => Ok(output), - Err(e) => { - log::error!("prove_snark error {:#?}", e); - Err(e.to_string()) - } - }, - Err(e) => { - log::error!("prove_snark busy: {:?}", e); - Ok((false, vec![])) - } - } - } - - /// Return zkm-prover status - pub fn get_status(&self) -> bool { - let result = self.mutex.try_lock(); - result.is_ok() - } -} diff --git a/prover/src/provers/agg_prover.rs b/prover/src/provers/agg_prover.rs deleted file mode 100644 index f04a5825..00000000 --- a/prover/src/provers/agg_prover.rs +++ /dev/null @@ -1,43 +0,0 @@ -use super::Prover; -use super::{C, D, F}; -use crate::contexts::AggContext; -use plonky2::util::timing::TimingTree; -use std::time::Duration; -use zkm_prover::generation::state::Receipt; - -#[derive(Default)] -pub struct AggProver {} - -impl Prover> for AggProver { - fn prove(&self, ctx: &AggContext) -> anyhow::Result<(bool, Vec)> { - let receipt_path1 = ctx.receipt_path1.clone(); - let receipt_path2 = ctx.receipt_path2.clone(); - //let agg_receipt_path = ctx.agg_receipt_path.clone(); - let is_agg1 = ctx.is_agg_1; - let is_agg2 = ctx.is_agg_2; - - let timing = TimingTree::new("agg init all_circuits", log::Level::Info); - let all_circuits = &*crate::provers::instance().lock().unwrap(); - timing.filter(Duration::from_millis(100)).print(); - - //let receipt_first_content = file::new(&receipt_path1).read_to_string()?; - let receipt_first: Receipt = serde_json::from_slice(&receipt_path1)?; - - //let receipt_next_content = file::new(&receipt_path2).read_to_string()?; - let receipt_next: Receipt = serde_json::from_slice(&receipt_path2)?; - - // We can duplicate the proofs here because the state hasn't mutated. - let new_agg_receipt = zkm_recursion::aggregate_proof( - all_circuits, - receipt_first, - receipt_next, - is_agg1, - is_agg2, - )?; - // write receipt write file - let agg_receipt_output = serde_json::to_vec(&new_agg_receipt)?; - //let _ = file::new(&agg_receipt_path).write(json_string.as_bytes())?; - - Ok((true, agg_receipt_output)) - } -} diff --git a/prover/src/provers/mod.rs b/prover/src/provers/mod.rs deleted file mode 100644 index 05f23688..00000000 --- a/prover/src/provers/mod.rs +++ /dev/null @@ -1,41 +0,0 @@ -mod root_prover; -pub use root_prover::RootProver; - -mod agg_prover; -pub use agg_prover::AggProver; - -mod snark_prover; -pub use snark_prover::SnarkProver; - -use anyhow::Result; - -use plonky2::field::goldilocks_field::GoldilocksField; -use plonky2::plonk::config::PoseidonGoldilocksConfig; -use zkm_prover::fixed_recursive_verifier::AllRecursiveCircuits; - -use once_cell::sync::OnceCell; -use std::sync::Mutex; - -pub const MIN_SEG_SIZE: usize = 1 << 10; -pub const MAX_SEG_SIZE: usize = 1 << 22; - -pub fn valid_seg_size(seg_size: usize) -> bool { - if (MIN_SEG_SIZE..=MAX_SEG_SIZE).contains(&seg_size) { - return true; - } - false -} - -pub trait Prover { - fn prove(&self, ctx: &T) -> Result<(bool, R)>; -} -type F = GoldilocksField; -const D: usize = 2; -type C = PoseidonGoldilocksConfig; - -static INSTANCE_ALL_CIRCUITS: OnceCell>> = OnceCell::new(); - -pub fn instance() -> &'static Mutex> { - // FIXME: replace it by zkm_recursion::create_recursive_circuit() - INSTANCE_ALL_CIRCUITS.get_or_init(|| Mutex::new(zkm_recursion::create_recursive_circuit())) -} diff --git a/prover/src/provers/root_prover.rs b/prover/src/provers/root_prover.rs deleted file mode 100644 index b58951e2..00000000 --- a/prover/src/provers/root_prover.rs +++ /dev/null @@ -1,68 +0,0 @@ -use super::Prover; -use super::{C, D, F}; -use crate::contexts::ProveContext; -use common::file; -use plonky2::util::timing::TimingTree; -use std::time::Duration; -use zkm_prover::all_stark::AllStark; -use zkm_prover::config::StarkConfig; -use zkm_prover::cpu::kernel::assembler::segment_kernel; -use zkm_prover::generation::state::{AssumptionReceipts, Receipt}; - -#[derive(Default)] -pub struct RootProver {} - -impl Prover> for RootProver { - fn prove(&self, ctx: &ProveContext) -> anyhow::Result<(bool, Vec)> { - //let basedir = ctx.base_dir.clone(); - let block_no = ctx.block_no.unwrap_or(0); - - let mut receipts: AssumptionReceipts = vec![]; - if !ctx.receipts_input.is_empty() { - //let receipt_datas = - // bincode::deserialize::>>(&ctx.receipts_input).expect("deserialize receipts failed"); - for receipt_data in ctx.receipts_input.iter() { - let receipt: Receipt = - bincode::deserialize(receipt_data).map_err(|e| anyhow::anyhow!(e))?; - receipts.push(receipt.into()); - log::info!("prove set receipts {:?}", receipt_data.len()); - } - } - - let mut timing = TimingTree::new("root_prove init all_stark", log::Level::Info); - let all_stark = AllStark::::default(); - let config = StarkConfig::standard_fast_config(); - timing.filter(Duration::from_millis(100)).print(); - timing = TimingTree::new("root_prove init all_circuits", log::Level::Info); - let all_circuits = &*crate::provers::instance().lock().unwrap(); - timing.filter(Duration::from_millis(100)).print(); - - timing = TimingTree::new("root_prove load input", log::Level::Info); - - //let file = String::from(""); - let seg_data = file::new(&ctx.segment).read()?; - // TODO: don't support block_data - let seg_reader = std::io::Cursor::new(seg_data); - let input = segment_kernel("", &block_no.to_string(), "", seg_reader); - timing.filter(Duration::from_millis(100)).print(); - - timing = TimingTree::new("root_prove prove", log::Level::Info); - let receipt = all_circuits.prove_root_with_assumption( - &all_stark, - &input, - &config, - &mut timing, - receipts, - )?; - all_circuits.verify_root(receipt.clone())?; - timing.filter(Duration::from_millis(100)).print(); - - //timing = TimingTree::new("root_prove write result", log::Level::Info); - - //// write receipt write file - //let json_string = serde_json::to_string(&receipt)?; - //let _ = file::new(&receipt_path).write(json_string.as_bytes())?; - //timing.filter(Duration::from_millis(100)).print(); - Ok((true, serde_json::to_vec(&receipt)?)) - } -} diff --git a/prover/src/provers/snark_prover.rs b/prover/src/provers/snark_prover.rs deleted file mode 100644 index f79bb852..00000000 --- a/prover/src/provers/snark_prover.rs +++ /dev/null @@ -1,47 +0,0 @@ -use crate::contexts::SnarkContext; -use crate::provers::Prover; -use zkm_recursion::as_groth16; - -#[derive(Default)] -pub struct SnarkProver { - key_path: String, - base_dir: String, -} - -impl SnarkProver { - pub fn new(key_path: &str, base_dir: &str) -> Self { - Self { - key_path: key_path.to_string(), - base_dir: format!("{}/proof", base_dir), - } - } -} - -impl Prover> for SnarkProver { - fn prove(&self, ctx: &SnarkContext) -> anyhow::Result<(bool, Vec)> { - let base_dir = format!("{}/{}", self.base_dir, ctx.proof_id); - let input_dir = format!("{}/wrap", base_dir); - let output_dir = format!("{}/snark", base_dir); - - log::info!( - "snark prove: input_dir {:?}, output_dir: {:?}", - input_dir, - output_dir - ); - - assert!(!ctx.agg_receipt.is_empty()); - // wrap stark - let all_circuits = &*crate::provers::instance().lock().unwrap(); - let agg_receipt = serde_json::from_slice(&ctx.agg_receipt)?; - zkm_recursion::wrap_stark_bn254(all_circuits, agg_receipt, &input_dir)?; - - as_groth16(&self.key_path, &input_dir, &output_dir)?; - - let snark_proof_with_public_inputs = std::fs::read(format!( - "{}/snark_proof_with_public_inputs.json", - output_dir - ))?; - - Ok((true, snark_proof_with_public_inputs)) - } -} diff --git a/prover_v2/Cargo.toml b/prover_v2/Cargo.toml index b9bd6042..c2c79096 100644 --- a/prover_v2/Cargo.toml +++ b/prover_v2/Cargo.toml @@ -12,21 +12,27 @@ anyhow = "1.0.97" once_cell = "1.13.0" zstd = "0.13.3" lru = "0.14.0" +parking_lot = "0.12" +crossbeam-channel = "0.5" -zkm-core-machine = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-core-executor = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-stark = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-prover = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-recursion-compiler = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-recursion-core = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-recursion-circuit = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } -zkm-sdk = { git = "https://github.com/zkMIPS/zkMIPS", branch = "feat/network" } +zkm-core-machine.workspace = true +zkm-core-executor.workspace = true +zkm-stark.workspace = true +zkm-prover.workspace = true +zkm-recursion-compiler.workspace = true +zkm-recursion-core.workspace = true +zkm-recursion-circuit.workspace = true +zkm-sdk.workspace = true -p3-maybe-rayon = { git = "https://github.com/zkMIPS/Plonky3" } +p3-maybe-rayon.workspace = true -common = { path = "../common" } +zkm-gpu-prover = { git = "https://github.com/ProjectZKM/ziren-gpu", branch = "feat/multi-provers", optional = true } +zkm-gpu-core = { git = "https://github.com/ProjectZKM/ziren-gpu", branch = "feat/multi-provers", optional = true } + +common.workspace = true tempfile = "3.18.0" lazy_static = "1.5.0" [features] -debug = [] \ No newline at end of file +debug = [] +gpu = ["dep:zkm-gpu-prover", "dep:zkm-gpu-core"] diff --git a/prover_v2/src/agg_prover.rs b/prover_v2/src/agg_prover.rs index c6a2e219..ca631445 100644 --- a/prover_v2/src/agg_prover.rs +++ b/prover_v2/src/agg_prover.rs @@ -1,5 +1,5 @@ use crate::contexts::AggContext; -use crate::{get_prover, NetworkProve}; +use crate::{get_prover, NetworkProve, ProverComponents}; use zkm_core_executor::ZKMReduceProof; use zkm_prover::build::Witnessable; use zkm_prover::{InnerSC, ZKMCircuitWitness, ZKMProver, ZKMRecursionProverError}; @@ -11,15 +11,39 @@ use zkm_recursion_core::Runtime; use zkm_sdk::ZKMProof; use zkm_stark::{Challenge, MachineProver, StarkGenericConfig, Val, ZKMCoreOpts}; +#[cfg(feature = "gpu")] +use zkm_stark::MachineProvingKey; + +#[cfg(feature = "gpu")] +use zkm_gpu_prover::GpuProverHandle; + #[derive(Default)] pub struct AggProver {} impl AggProver { pub fn prove(&self, ctx: &AggContext) -> anyhow::Result> { - let network_prove = NetworkProve::default(); let prover = get_prover(); + self.prove_with_prover(0, &prover, ctx) + } + + fn prove_with_prover( + &self, + idx: usize, + prover: &ZKMProver, + ctx: &AggContext, + ) -> anyhow::Result> { + tracing::info!( + "GPU {} Aggregation job start: leaf_layer={} deferred={} proofs={} first_shard={}", + idx, + ctx.is_leaf_layer, + ctx.is_deferred, + ctx.proofs.len(), + ctx.is_first_shard + ); + let network_prove = NetworkProve::default(); let input = if ctx.is_leaf_layer { if !ctx.is_deferred { + tracing::info!("GPU {idx} Aggregation job building core witness"); let shard_proofs = ctx .proofs .iter() @@ -34,11 +58,13 @@ impl AggProver { vk_root: prover.recursion_vk_root, }) } else { + tracing::info!("GPU {idx} Aggregation job using deferred witness"); let deferred_witness: ZKMDeferredWitnessValues<_> = bincode::deserialize(&ctx.proofs[0])?; ZKMCircuitWitness::Deferred(deferred_witness) } } else { + tracing::info!("GPU {idx} Aggregation job building compress witness"); let reduced_proofs: Vec> = ctx .proofs .iter() @@ -62,42 +88,63 @@ impl AggProver { }) }; - let reduced_proof = self.compress(&prover, input, network_prove.opts.recursion_opts)?; + tracing::info!("GPU {idx} Aggregation job entering recursive compression"); + let reduced_proof = self.compress(prover, input, network_prove.opts.recursion_opts)?; + tracing::info!("GPU {idx} Aggregation job finished recursive compression"); Ok(serde_json::to_string(&reduced_proof)?.into_bytes()) } + #[cfg(feature = "gpu")] + pub fn prove_with_gpu_handle( + &self, + idx: usize, + handle: &GpuProverHandle, + ctx: &AggContext, + ) -> anyhow::Result> { + handle + .with_prover(|prover| self.prove_with_prover(idx, prover, ctx)) + .map_err(|err| anyhow::anyhow!("failed to execute agg proof on GPU: {err}"))? + } + fn compress( &self, - prover: &ZKMProver, + prover: &ZKMProver, input: ZKMCircuitWitness, recursion_opts: ZKMCoreOpts, ) -> anyhow::Result { // Get the program and witness stream. - let (program, witness_stream) = tracing::debug_span!("get program and witness stream") - .in_scope(|| match input { + tracing::info!("Agg compress: building program and witness stream"); + let (program, witness_stream, is_complete) = + tracing::debug_span!("get program and witness stream").in_scope(|| match input { ZKMCircuitWitness::Core(input) => { let mut witness_stream = Vec::new(); Witnessable::::write(&input, &mut witness_stream); - (prover.recursion_program(&input), witness_stream) + (prover.recursion_program(&input), witness_stream, false) } ZKMCircuitWitness::Deferred(input) => { let mut witness_stream = Vec::new(); Witnessable::::write(&input, &mut witness_stream); - (prover.deferred_program(&input), witness_stream) + (prover.deferred_program(&input), witness_stream, false) } ZKMCircuitWitness::Compress(input) => { let mut witness_stream = Vec::new(); + let is_complete = input.is_complete; let input_with_merkle = prover.make_merkle_proofs(input); Witnessable::::write(&input_with_merkle, &mut witness_stream); - (prover.compress_program(&input_with_merkle), witness_stream) + ( + prover.compress_program(&input_with_merkle), + witness_stream, + is_complete, + ) } }); // Execute the runtime. + tracing::info!("Agg compress: executing runtime"); let record = tracing::debug_span!("execute runtime").in_scope(|| { let mut runtime = Runtime::, Challenge, _>::new( program.clone(), @@ -106,12 +153,12 @@ impl AggProver { runtime.witness_stream = witness_stream.into(); runtime .run() + .map(|_| runtime.record) .map_err(|e| ZKMRecursionProverError::RuntimeError(e.to_string())) - .unwrap(); - runtime.record - }); + })?; // Generate the dependencies. + tracing::info!("Agg compress: generating dependencies"); let mut records = vec![record]; tracing::debug_span!("generate dependencies").in_scope(|| { prover.compress_prover.machine().generate_dependencies( @@ -122,26 +169,31 @@ impl AggProver { }); // Generate the traces. + tracing::info!("Agg compress: generating traces"); let record = records.into_iter().next().unwrap(); let traces = tracing::debug_span!("generate traces") .in_scope(|| prover.compress_prover.generate_traces(&record)); let (vk, proof) = tracing::debug_span!("batch").in_scope(|| { + tracing::info!("Agg compress: setting up keys"); // Get the keys. let (pk, vk) = tracing::debug_span!("Setup compress program") .in_scope(|| prover.compress_prover.setup(&program)); // Observe the proving key. + tracing::info!("Agg compress: observing proving key"); let mut challenger = prover.compress_prover.config().challenger(); tracing::debug_span!("observe proving key").in_scope(|| { pk.observe_into(&mut challenger); }); // Commit to the record and traces. + tracing::info!("Agg compress: committing"); let data = tracing::debug_span!("commit") .in_scope(|| prover.compress_prover.commit(&record, traces)); // Generate the proof. + tracing::info!("Agg compress: opening proof"); let proof = tracing::debug_span!("open").in_scope(|| { prover .compress_prover @@ -149,20 +201,23 @@ impl AggProver { .unwrap() }); - // Verify the proof. - #[cfg(feature = "debug")] - prover - .compress_prover - .machine() - .verify( - &vk, - &zkm2_stark::MachineProof { - shard_proofs: vec![proof.clone()], - }, - &mut prover.compress_prover.config().challenger(), - ) - .unwrap(); + // Verify the proof if in debug mode, or if the proof is final + if cfg!(feature = "debug") || is_complete { + prover + .compress_prover + .machine() + .verify( + &vk, + &zkm_stark::MachineProof { + shard_proofs: vec![proof.clone()], + }, + &mut prover.compress_prover.config().challenger(), + ) + .unwrap(); + tracing::info!("Agg compress: proof verified"); + } + tracing::info!("Agg compress: proof ready"); (vk, proof) }); diff --git a/prover_v2/src/contexts.rs b/prover_v2/src/contexts.rs index 93063f15..3298e4c6 100644 --- a/prover_v2/src/contexts.rs +++ b/prover_v2/src/contexts.rs @@ -1,19 +1,26 @@ use serde::{Deserialize, Serialize}; +use zkm_core_executor::ExecutionRecord; #[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct SplitContext { pub base_dir: String, pub program_id: String, pub elf_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub elf: Vec, pub block_no: Option, pub seg_size: u32, pub seg_path: String, // TODO: remove pub public_input_path: String, pub private_input_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub private_inputs: Vec>, pub output_path: String, pub args: String, pub receipt_inputs_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub receipt_inputs: Vec>, } impl SplitContext { @@ -35,14 +42,17 @@ impl SplitContext { base_dir: basedir.to_string(), program_id: program_id.to_string(), elf_path: elf_path.to_string(), + elf: Vec::new(), block_no, seg_size, seg_path: seg_path.to_string(), public_input_path: public_input_path.to_string(), private_input_path: private_input_path.to_string(), + private_inputs: Vec::new(), output_path: output_path.to_string(), args: args.to_string(), receipt_inputs_path: receipt_inputs_path.to_string(), + receipt_inputs: Vec::new(), } } } @@ -53,9 +63,15 @@ pub struct ProveContext { pub program_id: String, pub index: usize, pub elf_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub elf: Vec, // execution record // pub segment: Vec, pub segment: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub segment_bytes: Vec, + #[serde(skip_serializing_if = "Option::is_none", default)] + pub segment_obj: Option, pub seg_size: u32, // pub receipts_input: Vec>, } @@ -79,4 +95,25 @@ pub struct SnarkContext { pub proof_id: String, // pub proving_key_path: String, pub agg_receipt: Vec, + pub from_input: bool, +} + +#[derive(Clone, Debug, Serialize, Deserialize, Default)] +pub struct SingleNodeContext { + pub proof_id: String, + pub program_id: String, + pub elf_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub elf: Vec, + pub base_dir: String, + pub seg_size: u32, + pub private_input_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub private_inputs: Vec>, + pub receipt_inputs_path: String, + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub receipt_inputs: Vec>, + pub target_step: i32, + #[serde(default)] + pub local_prover_threads: usize, } diff --git a/prover_v2/src/executor.rs b/prover_v2/src/executor.rs index b0677f72..90089154 100644 --- a/prover_v2/src/executor.rs +++ b/prover_v2/src/executor.rs @@ -4,7 +4,7 @@ use std::fs::File; use std::io::{self, Seek, Write}; use std::sync::{ mpsc::sync_channel, - {Arc, Mutex}, + OnceLock, {Arc, Mutex}, }; use std::thread::ScopedJoinHandle; use std::time::Instant; @@ -20,6 +20,7 @@ use zkm_core_machine::{ shape::CoreShapeConfig, utils::{concurrency::TurnBasedSync, trace_checkpoint, ZKMCoreProverError}, }; +use zkm_prover::components::ZKMProverComponents; use zkm_prover::{CoreSC, ZKMProver}; use zkm_stark::koala_bear_poseidon2::KoalaBearPoseidon2; use zkm_stark::{ @@ -27,10 +28,103 @@ use zkm_stark::{ }; pub use crate::contexts::SplitContext; -use crate::{ - get_prover, NetworkProve, Segment, StateWithPublicValues, FIRST_LAYER_BATCH_SIZE, KEY_CACHE, - PROGRAM_CACHE, -}; +use crate::{get_prover, NetworkProve, FIRST_LAYER_BATCH_SIZE, KEY_CACHE, PROGRAM_CACHE, VK_CACHE}; + +pub trait SegmentSink: Send + Sync { + fn on_segments(&self, base_index: usize, segments: Vec); + + fn on_segment_count(&self, _total: usize) {} + + fn on_deferred(&self, _index: usize, _data: Vec) {} +} + +pub struct FileSegmentSink<'a> { + base_path: &'a str, +} + +impl<'a> FileSegmentSink<'a> { + pub fn new(base_path: &'a str) -> Self { + Self { base_path } + } + + fn segment_path(&self, index: usize) -> String { + format!("{}/{}", self.base_path, index) + } + + fn deferred_path(&self, index: usize) -> String { + format!("{}/deferred_proof_{}", self.base_path, index) + } +} + +impl<'a> SegmentSink for FileSegmentSink<'a> { + fn on_segments(&self, base_index: usize, segments: Vec) { + for (offset, segment) in segments.into_iter().enumerate() { + let encoded_segment = bincode::serialize(&segment).unwrap(); + // use zstd to compress, level = 2 or 3 + let compressed_segment = + zstd::stream::encode_all(&*encoded_segment, 2).expect("zstd compress failed"); + + write_file(self.segment_path(base_index + offset), &compressed_segment) + .expect("Failed to write segment"); + } + } + + fn on_segment_count(&self, total: usize) { + write_file( + format!("{}/segments.txt", self.base_path), + total.to_string().as_bytes(), + ) + .expect("Failed to write segment count"); + } + + fn on_deferred(&self, index: usize, data: Vec) { + file::new(&self.deferred_path(index)) + .write_all(&data) + .expect("Failed to write deferred proof"); + } +} + +pub struct ChannelSegmentSink { + sender: std::sync::mpsc::Sender<(usize, ExecutionRecord)>, + total_segments: Mutex, + deferred: Mutex)>>, +} + +impl ChannelSegmentSink { + pub fn new(sender: std::sync::mpsc::Sender<(usize, ExecutionRecord)>) -> Self { + Self { + sender, + total_segments: Mutex::new(0), + deferred: Mutex::new(Vec::new()), + } + } + + pub fn total_segments(&self) -> usize { + *self.total_segments.lock().unwrap() + } + + pub fn deferred_inputs(&self) -> Vec<(usize, Vec)> { + self.deferred.lock().unwrap().clone() + } +} + +impl SegmentSink for ChannelSegmentSink { + fn on_segments(&self, base_index: usize, segments: Vec) { + for (offset, record) in segments.into_iter().enumerate() { + self.sender + .send((base_index + offset, record)) + .expect("segment receiver dropped"); + } + } + + fn on_segment_count(&self, total: usize) { + *self.total_segments.lock().unwrap() = total; + } + + fn on_deferred(&self, index: usize, data: Vec) { + self.deferred.lock().unwrap().push((index, data)); + } +} #[derive(Default)] pub struct Executor {} @@ -39,15 +133,23 @@ impl Executor { let prover = get_prover(); let mut network_prove = NetworkProve::new(ctx.seg_size); - let encoded_input = file::new(&ctx.private_input_path).read()?; - let inputs_data: Vec> = bincode::deserialize(&encoded_input)?; + let inputs_data: Vec> = if !ctx.private_inputs.is_empty() { + ctx.private_inputs.clone() + } else { + let encoded_input = file::new(&ctx.private_input_path).read()?; + bincode::deserialize(&encoded_input)? + }; inputs_data.into_iter().for_each(|input| { network_prove.stdin.write_vec(input); }); - if !ctx.receipt_inputs_path.is_empty() { - let receipt_datas = std::fs::read(&ctx.receipt_inputs_path)?; - let receipts = bincode::deserialize::>>(&receipt_datas)?; + if !ctx.receipt_inputs.is_empty() || !ctx.receipt_inputs_path.is_empty() { + let receipts = if !ctx.receipt_inputs.is_empty() { + ctx.receipt_inputs.clone() + } else { + let receipt_datas = std::fs::read(&ctx.receipt_inputs_path)?; + bincode::deserialize::>>(&receipt_datas)? + }; for receipt in receipts.iter() { let receipt: ( ZKMReduceProof, @@ -58,44 +160,48 @@ impl Executor { tracing::info!("Write {} receipts", receipts.len()); } - let mut program_cache = PROGRAM_CACHE.lock().unwrap(); - let program = if let Some(program) = program_cache.cache.get(&ctx.program_id) { - tracing::info!("load program from cache"); - program - } else { - tracing::info!("No program in cache, generate new program"); - let elf_path = ctx.elf_path.clone(); - let elf = file::new(&elf_path).read()?; - let program = prover - .get_program(&elf) - .map_err(|e| anyhow::Error::msg(e.to_string()))?; - program_cache.push(ctx.program_id.clone(), program); - program_cache.cache.get(&ctx.program_id).unwrap() + let program = { + let mut program_cache = PROGRAM_CACHE.lock(); + if let Some(program) = program_cache.cache.get(&ctx.program_id) { + tracing::info!("load program from cache"); + program.clone() + } else { + tracing::info!("No program in cache, generate new program"); + let elf = if !ctx.elf.is_empty() { + ctx.elf.clone() + } else { + let elf_path = ctx.elf_path.clone(); + file::new(&elf_path).read()? + }; + let program = prover + .get_program(&elf) + .map_err(|e| anyhow::Error::msg(e.to_string()))?; + program_cache.push(ctx.program_id.clone(), program.clone()); + program + } }; - let mut cache = KEY_CACHE.lock().unwrap(); - let vk = if let Some((_, vk)) = cache.cache.get(&ctx.program_id) { - tracing::info!("load vk from cache"); - vk - } else { - tracing::info!("No vk in cache, generate new keys"); - let (pk, vk) = prover.core_prover.setup(program); - cache.push(ctx.program_id.clone(), (pk, vk)); - &cache.cache.get(&ctx.program_id).unwrap().1 + let device_id = 0; + let entry = { + let mut cache = KEY_CACHE.lock(); + cache.entry(device_id, ctx.program_id.clone()) }; + let (_, vk) = entry.get_or_init_with(|| prover.core_prover.setup(&program)); let vk_bytes = bincode::serialize(&vk)?; file::new(&format!("{}/vk.bin", ctx.base_dir)).write_all(&vk_bytes)?; let context = network_prove.context_builder.build(); + let segment_sink = FileSegmentSink::new(&ctx.seg_path); let (total_steps, total_segments, public_values_stream) = self.split_with_context( &prover, ctx, - program, + &program, vk, &network_prove.stdin, network_prove.opts.core_opts, context, prover.core_shape_config.as_ref(), + &segment_sink, )?; // write public_values_stream // file::new(&ctx.output_path).write(&public_values_stream)?; @@ -105,17 +211,111 @@ impl Executor { Ok((total_steps, total_segments)) } - #[allow(clippy::too_many_arguments)] - pub fn split_with_context<'a>( + pub fn split_streaming( &self, - prover: &'a ZKMProver, ctx: &SplitContext, + sender: std::sync::mpsc::Sender<(usize, ExecutionRecord)>, + ) -> anyhow::Result<(u64, u32, Vec, Vec<(usize, Vec)>, Vec)> { + // To prevent the executor from occupying a GPU exclusively, + // the prover used here doesn’t use GPU resources. + let prover = get_executor(); + let mut network_prove = NetworkProve::new(ctx.seg_size); + + let inputs_data: Vec> = if !ctx.private_inputs.is_empty() { + ctx.private_inputs.clone() + } else { + let encoded_input = file::new(&ctx.private_input_path).read()?; + bincode::deserialize(&encoded_input)? + }; + inputs_data.into_iter().for_each(|input| { + network_prove.stdin.write_vec(input); + }); + + if !ctx.receipt_inputs.is_empty() || !ctx.receipt_inputs_path.is_empty() { + let receipts = if !ctx.receipt_inputs.is_empty() { + ctx.receipt_inputs.clone() + } else { + let receipt_datas = std::fs::read(&ctx.receipt_inputs_path)?; + bincode::deserialize::>>(&receipt_datas)? + }; + for receipt in receipts.iter() { + let receipt: ( + ZKMReduceProof, + StarkVerifyingKey, + ) = bincode::deserialize(receipt).map_err(|e| anyhow::anyhow!(e))?; + network_prove.stdin.write_proof(receipt.0, receipt.1); + } + tracing::info!("Write {} receipts", receipts.len()); + } + + let program = { + let mut program_cache = PROGRAM_CACHE.lock(); + if let Some(program) = program_cache.cache.get(&ctx.program_id) { + tracing::info!("load program from cache"); + program.clone() + } else { + tracing::info!("No program in cache, generate new program"); + let elf = if !ctx.elf.is_empty() { + ctx.elf.clone() + } else { + let elf_path = ctx.elf_path.clone(); + file::new(&elf_path).read()? + }; + let program = prover + .get_program(&elf) + .map_err(|e| anyhow::Error::msg(e.to_string()))?; + program_cache.push(ctx.program_id.clone(), program.clone()); + program + } + }; + + let vk = { + let mut vk_cache = VK_CACHE.lock(); + if let Some(vk) = vk_cache.get(&ctx.program_id) { + vk + } else { + let (_, vk) = prover.core_prover.setup(&program); + vk_cache.push(ctx.program_id.clone(), vk.clone()); + vk + } + }; + let vk_bytes = bincode::serialize(&vk)?; + + let context = network_prove.context_builder.build(); + let segment_sink = Arc::new(ChannelSegmentSink::new(sender)); + let (total_steps, total_segments, public_values_stream) = self.split_with_context( + &prover, + ctx, + &program, + &vk, + &network_prove.stdin, + network_prove.opts.core_opts, + context, + prover.core_shape_config.as_ref(), + segment_sink.as_ref(), + )?; + + Ok(( + total_steps, + total_segments, + public_values_stream, + segment_sink.deferred_inputs(), + vk_bytes, + )) + } + + #[allow(clippy::too_many_arguments)] + pub fn split_with_context<'a, S: SegmentSink, C: ZKMProverComponents>( + &self, + prover: &'a ZKMProver, + _ctx: &SplitContext, program: &Program, vk: &StarkVerifyingKey, stdin: &ZKMStdin, opts: ZKMCoreOpts, mut context: ZKMContext<'a>, shape_config: Option<&CoreShapeConfig<::Val>>, + segment_sink: &S, ) -> anyhow::Result<(u64, u32, Vec)> { context.subproof_verifier = Some(prover as &dyn SubproofVerifier); // Setup the runtime. @@ -231,7 +431,7 @@ impl Executor { records.len(), now.elapsed() ); - debug_assert_eq!(records.len(), 1); + // debug_assert_eq!(records.len(), 1); *report_aggregate.lock().unwrap() += report; // reset_seek(&mut checkpoint); checkpoint @@ -263,7 +463,7 @@ impl Executor { } // See if any deferred shards are ready to be committed to. - let mut deferred = deferred.split(done, opts.split_opts); + let mut deferred = deferred.split(done, None, opts.split_opts); tracing::info!("deferred {} records", deferred.len()); // Update the public values & prover state for the shards which do not @@ -284,61 +484,22 @@ impl Executor { state.start_pc = state.next_pc; record.public_values = *state; } + records.append(&mut deferred); let mut segment_index = segment_index.lock().unwrap(); let base_index = *segment_index; - *segment_index += records.len() + deferred.len(); + *segment_index += records.len(); - write_file( - format!("{}/segments.txt", ctx.seg_path), - segment_index.to_string().as_bytes(), - ) - .expect("Failed to write file_no"); + segment_sink.on_segment_count(*segment_index); // Let another worker update the state. record_gen_sync.advance_turn(); - let segments: Vec<_> = std::iter::once(Segment::State(Box::new( - StateWithPublicValues { - state: exe_state, - public_values: records[0].public_values, - }, - ))) - .chain(deferred.into_iter().map(|r| Segment::Record(Box::new(r)))) - .collect(); - - segments.par_iter().enumerate().for_each(|(i, segment)| { - let now = Instant::now(); - let encoded_segment = bincode::serialize(&segment).unwrap(); - // use zstd to compress, level = 2 or 3 - let compressed_segment = - zstd::stream::encode_all(&*encoded_segment, 2) - .expect("zstd compress failed"); - write_file( - format!("{}/{}", ctx.seg_path, base_index + i), - &compressed_segment, - ) - .expect("Failed to write segment"); - - tracing::info!( - "Wrote record {} in {:?}", - base_index + i, - now.elapsed() - ); - }); + let last_pv = records.last().unwrap().public_values(); + segment_sink.on_segments(base_index, records); // process deferred proofs if done && !stdin.proofs.is_empty() { - let last_record = if segments.len() == 1 { - records.last().unwrap() - } else { - let last_segment = segments.last().unwrap(); - match last_segment { - Segment::Record(record) => record, - _ => unreachable!("last segment should be a record"), - } - }; - let last_pv = last_record.public_values(); let last_proof_pv = last_pv.as_slice().borrow(); let deferred_proofs = stdin .proofs @@ -356,14 +517,7 @@ impl Executor { |(i, deferred_input)| { let encoded_proof = bincode::serialize(&deferred_input).unwrap(); - // Start numbering from 2^16. - file::new(&format!( - "{}/deferred_proof_{}", - ctx.seg_path, - (1 << 16) | i - )) - .write_all(&encoded_proof) - .expect("Failed to write deferred proof"); + segment_sink.on_deferred((1 << 16) | i, encoded_proof); }, ); } @@ -444,3 +598,9 @@ fn write_file(path: String, buf: &[u8]) -> anyhow::Result<()> { Ok(()) } + +static EXECUTOR: OnceLock> = OnceLock::new(); + +pub fn get_executor() -> Arc { + EXECUTOR.get_or_init(|| Arc::new(ZKMProver::new())).clone() +} diff --git a/prover_v2/src/gpu_scheduler.rs b/prover_v2/src/gpu_scheduler.rs new file mode 100644 index 00000000..4fd02280 --- /dev/null +++ b/prover_v2/src/gpu_scheduler.rs @@ -0,0 +1,187 @@ +#![cfg(feature = "gpu")] + +use std::sync::{mpsc, Arc}; +use std::thread::{self, JoinHandle}; + +use anyhow::{anyhow, Context}; +use crossbeam_channel::{unbounded, Receiver, Sender, TryRecvError}; +use zkm_gpu_core::cuda_runtime; + +use crate::agg_prover::AggProver; +use crate::contexts::{AggContext, ProveContext}; +use crate::root_prover::RootProver; +use zkm_gpu_prover::{GpuProverHandle, MultiGpuProver}; + +/// A clonable dispatcher for submitting GPU jobs. +#[derive(Clone)] +pub struct GpuJobDispatcher { + inner: Arc, +} + +struct GpuJobInner { + root_tx: Sender, + agg_tx: Sender, +} + +enum JobMessage { + Root { + ctx: ProveContext, + result_tx: mpsc::Sender)>>, + }, + Agg { + job_id: u64, + ctx: AggContext, + result_tx: mpsc::Sender<(u64, anyhow::Result>)>, + }, + Shutdown, +} + +impl GpuJobDispatcher { + pub fn submit_root( + &self, + ctx: ProveContext, + result_tx: mpsc::Sender)>>, + ) -> anyhow::Result<()> { + self.inner + .root_tx + .send(JobMessage::Root { ctx, result_tx }) + .map_err(|e| anyhow!("failed to dispatch root job: {e}")) + } + + pub fn submit_agg( + &self, + job_id: u64, + ctx: AggContext, + result_tx: mpsc::Sender<(u64, anyhow::Result>)>, + ) -> anyhow::Result<()> { + self.inner + .agg_tx + .send(JobMessage::Agg { + job_id, + ctx, + result_tx, + }) + .map_err(|e| anyhow!("failed to dispatch aggregation job: {e}")) + } +} + +pub struct GpuJobPool { + dispatcher: Option, + workers: Vec>, +} + +impl GpuJobPool { + pub fn new(pool: Arc, worker_count: usize) -> anyhow::Result { + let available = pool.len(); + if available == 0 { + return Err(anyhow!("no GPU provers available")); + } + let worker_count = worker_count.max(1).min(available); + + let (root_tx, root_rx) = unbounded(); + let (agg_tx, agg_rx) = unbounded(); + let dispatcher = GpuJobDispatcher { + inner: Arc::new(GpuJobInner { root_tx, agg_tx }), + }; + + let mut workers = Vec::with_capacity(worker_count); + let root_prover = Arc::new(RootProver::default()); + let agg_prover = Arc::new(AggProver::default()); + + for i in 0..worker_count { + let handle = pool + .get(i) + .with_context(|| format!("missing GPU handle at index {i}"))?; + let worker_root_rx = root_rx.clone(); + let worker_agg_rx = agg_rx.clone(); + let root_prover = Arc::clone(&root_prover); + let agg_prover = Arc::clone(&agg_prover); + + workers.push(thread::spawn(move || { + worker_loop( + i, + handle, + worker_root_rx, + worker_agg_rx, + root_prover, + agg_prover, + ) + })); + } + + Ok(Self { + dispatcher: Some(dispatcher), + workers, + }) + } + + pub fn dispatcher(&self) -> GpuJobDispatcher { + self.dispatcher.as_ref().unwrap().clone() + } +} + +impl Drop for GpuJobPool { + fn drop(&mut self) { + if let Some(dispatcher) = self.dispatcher.take() { + // Send shutdown signals equal to worker count. + for _ in 0..self.workers.len() { + let _ = dispatcher.inner.root_tx.send(JobMessage::Shutdown); + } + for _ in 0..self.workers.len() { + let _ = dispatcher.inner.agg_tx.send(JobMessage::Shutdown); + } + drop(dispatcher); + } + for handle in self.workers.drain(..) { + let _ = handle.join(); + } + } +} + +fn worker_loop( + idx: usize, + handle: Arc, + root_rx: Receiver, + agg_rx: Receiver, + root_prover: Arc, + agg_prover: Arc, +) { + loop { + let job = match root_rx.try_recv() { + Ok(job) => Some(job), + Err(TryRecvError::Empty) => match crossbeam_channel::select! { + recv(root_rx) -> msg => msg.ok(), + recv(agg_rx) -> msg => msg.ok(), + } { + Some(job) => Some(job), + None => return, + }, + Err(TryRecvError::Disconnected) => match agg_rx.recv() { + Ok(job) => Some(job), + Err(_) => None, + }, + }; + + let Some(job) = job else { return }; + + match job { + JobMessage::Root { ctx, result_tx } => { + tracing::info!("GPU {idx} processing root job"); + let res = root_prover + .prove_with_gpu_handle(idx, &handle, &ctx) + .map(|proof| (ctx.index, proof)); + let _ = result_tx.send(res); + } + JobMessage::Agg { + job_id, + ctx, + result_tx, + } => { + tracing::info!("GPU {idx} processing agg job"); + let res = agg_prover.prove_with_gpu_handle(idx, &handle, &ctx); + let _ = result_tx.send((job_id, res)); + } + JobMessage::Shutdown => return, + } + } +} diff --git a/prover_v2/src/lib.rs b/prover_v2/src/lib.rs index 1ef1aee4..baa03de1 100644 --- a/prover_v2/src/lib.rs +++ b/prover_v2/src/lib.rs @@ -1,27 +1,37 @@ use lru::LruCache; use once_cell::sync::OnceCell; -use serde::{Deserialize, Serialize}; +use parking_lot::Mutex; use std::num::NonZeroUsize; -use std::sync::Mutex; +use std::sync::{Arc, OnceLock}; use std::time::Duration; -use zkm_core_executor::{ExecutionRecord, ExecutionState, Program, ZKMContextBuilder}; +use zkm_core_executor::{Program, ZKMContextBuilder}; use zkm_core_machine::io::ZKMStdin; +#[cfg(feature = "gpu")] +use zkm_gpu_core::{ + merkle_tree::FieldMerkleTreeDeviceCommitter, + poseidon2::{bn254::DeviceHasherBn254, koala_bear::DeviceHasherKoalaBear}, + stark::StarkProvingKeyDevice, +}; use zkm_prover::{CoreSC, OuterSC, ZKMProver}; -use zkm_stark::{PublicValues, StarkProvingKey, StarkVerifyingKey, ZKMProverOpts}; +#[cfg(not(feature = "gpu"))] +use zkm_stark::StarkProvingKey; +use zkm_stark::{StarkVerifyingKey, ZKMProverOpts}; pub use zkm_sdk; pub mod agg_prover; pub mod contexts; pub mod executor; +#[cfg(feature = "gpu")] +pub mod gpu_scheduler; pub mod root_prover; pub mod snark_prover; pub mod pipeline; +pub mod single_node_prover; pub const FIRST_LAYER_BATCH_SIZE: usize = 1; -#[derive(Default)] pub struct NetworkProve<'a> { pub context_builder: ZKMContextBuilder<'a>, pub stdin: ZKMStdin, @@ -29,6 +39,20 @@ pub struct NetworkProve<'a> { pub timeout: Option, } +impl Default for NetworkProve<'_> { + fn default() -> Self { + Self { + context_builder: ZKMContextBuilder::default(), + stdin: ZKMStdin::default(), + #[cfg(not(feature = "gpu"))] + opts: ZKMProverOpts::default(), + #[cfg(feature = "gpu")] + opts: zkm_gpu_prover::gpu_prover_opts(), + timeout: None, + } + } +} + impl NetworkProve<'_> { pub fn new(shard_size: u32) -> Self { if shard_size > 0 { @@ -51,50 +75,90 @@ impl NetworkProve<'_> { } } -#[derive(Debug, Clone, Default, Serialize, Deserialize)] -pub struct StateWithPublicValues { - pub state: ExecutionState, - pub public_values: PublicValues, +// #[derive(Debug, Clone, Default, Serialize, Deserialize)] +// pub struct StateWithPublicValues { +// pub state: ExecutionState, +// pub public_values: PublicValues, +// } +// +// #[derive(Debug, Clone, Serialize, Deserialize)] +// pub enum Segment { +// State(Box), +// Record(Box), +// } + +#[cfg(feature = "gpu")] +type ProverComponents = zkm_gpu_prover::components::GpuProverComponents; +#[cfg(not(feature = "gpu"))] +type ProverComponents = zkm_prover::components::DefaultProverComponents; + +static GLOBAL_PROVER: OnceLock>> = OnceLock::new(); + +pub fn get_prover() -> Arc> { + GLOBAL_PROVER + .get_or_init(|| Arc::new(ZKMProver::new())) + .clone() } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum Segment { - State(Box), - Record(Box), -} +#[cfg(not(feature = "gpu"))] +type WrapProvingKey = StarkProvingKey; +#[cfg(feature = "gpu")] +type WrapProvingKey = + StarkProvingKeyDevice>; -static GLOBAL_PROVER: OnceCell> = OnceCell::new(); -fn prover_instance() -> &'static Mutex { - GLOBAL_PROVER.get_or_init(|| Mutex::new(ZKMProver::new())) -} +static WRAP_KEYS: OnceCell<(WrapProvingKey, StarkVerifyingKey)> = OnceCell::new(); + +#[cfg(not(feature = "gpu"))] +type ProvingKey = StarkProvingKey; +#[cfg(feature = "gpu")] +type ProvingKey = + StarkProvingKeyDevice>; +type KeyCacheKey = (u32, String); -pub fn get_prover() -> impl std::ops::DerefMut { - prover_instance() - .lock() - .expect("GLOBAL_PROVER lock poisoned") +pub struct KeyCacheEntry { + value: OnceLock<(ProvingKey, StarkVerifyingKey)>, } -static WRAP_KEYS: OnceCell<(StarkProvingKey, StarkVerifyingKey)> = - OnceCell::new(); +impl KeyCacheEntry { + pub fn new() -> Self { + Self { + value: OnceLock::new(), + } + } -const DEFAULT_CACHE_SIZE: usize = 3; + pub fn get_or_init_with(&self, init: F) -> (&ProvingKey, &StarkVerifyingKey) + where + F: FnOnce() -> (ProvingKey, StarkVerifyingKey), + { + self.value.get_or_init(init); + let pair = self.value.get().expect("key cache entry was initialized"); + (&pair.0, &pair.1) + } +} pub struct StarkKeyCache { - pub cache: LruCache, StarkVerifyingKey)>, + pub cache: LruCache>, } impl StarkKeyCache { pub fn new(size: usize) -> Self { - let cache = LruCache::, StarkVerifyingKey)>::new( - NonZeroUsize::new(size).unwrap(), - ); + let cache = + LruCache::>::new(NonZeroUsize::new(size).unwrap()); Self { cache } } - pub fn contains(&mut self, key: &String) -> bool { - self.cache.get(key).is_some() + + pub fn get(&mut self, device_id: u32, program_id: &str) -> Option> { + self.cache.get(&(device_id, program_id.to_owned())).cloned() } - pub fn push(&mut self, key: String, v: (StarkProvingKey, StarkVerifyingKey)) { - self.cache.push(key.clone(), v); + + pub fn entry(&mut self, device_id: u32, program_id: String) -> Arc { + if let Some(entry) = self.cache.get(&(device_id, program_id.clone())) { + entry.clone() + } else { + let entry = Arc::new(KeyCacheEntry::new()); + self.cache.push((device_id, program_id), entry.clone()); + entry + } } } @@ -115,9 +179,31 @@ impl ProgramCache { } } +pub struct VkCache { + pub cache: LruCache>, +} + +impl VkCache { + pub fn new(size: usize) -> Self { + let cache = + LruCache::>::new(NonZeroUsize::new(size).unwrap()); + Self { cache } + } + pub fn get(&mut self, key: &String) -> Option> { + self.cache.get(key).cloned() + } + pub fn push(&mut self, key: String, v: StarkVerifyingKey) { + self.cache.push(key.clone(), v); + } +} + +const DEFAULT_CACHE_SIZE: usize = 5; + lazy_static::lazy_static! { pub static ref KEY_CACHE: Mutex = - Mutex::new(StarkKeyCache::new(DEFAULT_CACHE_SIZE)); - pub static ref PROGRAM_CACHE: Mutex = - Mutex::new(ProgramCache::new(DEFAULT_CACHE_SIZE)); + Mutex::new(StarkKeyCache::new(DEFAULT_CACHE_SIZE * 8)); + pub static ref PROGRAM_CACHE: Mutex = + Mutex::new(ProgramCache::new(DEFAULT_CACHE_SIZE * 8)); + pub static ref VK_CACHE: Mutex = + Mutex::new(VkCache::new(DEFAULT_CACHE_SIZE)); } diff --git a/prover_v2/src/pipeline.rs b/prover_v2/src/pipeline.rs index 4229c266..caac5d92 100644 --- a/prover_v2/src/pipeline.rs +++ b/prover_v2/src/pipeline.rs @@ -1,28 +1,27 @@ -use std::sync::Mutex; - use crate::agg_prover::AggProver; -use crate::contexts::{AggContext, ProveContext, SnarkContext, SplitContext}; +use crate::contexts::{AggContext, ProveContext, SingleNodeContext, SnarkContext, SplitContext}; use crate::executor::Executor; use crate::root_prover::RootProver; +use crate::single_node_prover::SingleNodeProver; use crate::snark_prover::SnarkProver; #[derive(Default)] pub struct Pipeline { - mutex: Mutex, executor: Executor, root_prover: RootProver, agg_prover: AggProver, snark_prover: SnarkProver, + single_node_prover: SingleNodeProver, } impl Pipeline { pub fn new(_base_dir: &str, keys_input_dir: &str) -> Self { Pipeline { - mutex: Mutex::new(0), executor: Executor::default(), root_prover: RootProver::default(), agg_prover: AggProver::default(), snark_prover: SnarkProver::new(keys_input_dir), + single_node_prover: SingleNodeProver::new(keys_input_dir), } } @@ -30,59 +29,49 @@ impl Pipeline { self.executor .split(split_context) .map(|(step, segments)| (true, step, segments)) - .map_err(|e| e.to_string()) + .map_err(|e| { + tracing::error!("split error {:#?}", e); + e.to_string() + }) } pub fn prove_root(&self, prove_context: &ProveContext) -> Result<(bool, Vec), String> { - match self.mutex.try_lock() { - Ok(_) => self - .root_prover - .prove(prove_context) - .map(|receipt_output| (true, receipt_output)) - .map_err(|e| { - tracing::error!("prove_root error {:#?}", e); - e.to_string() - }), - Err(e) => { - tracing::error!("prove_root busy: {:?}", e); - Ok((false, vec![])) - } - } + self.root_prover + .prove(prove_context) + .map(|receipt_output| (true, receipt_output)) + .map_err(|e| { + tracing::error!("prove_root error {:#?}", e); + e.to_string() + }) } pub fn prove_aggregate(&self, agg_context: &AggContext) -> Result<(bool, Vec), String> { - match self.mutex.try_lock() { - Ok(_) => self - .agg_prover - .prove(agg_context) - .map(|agg_receipt_output| (true, agg_receipt_output)) - .map_err(|e| { - tracing::error!("prove_aggregate error {:#?}", e); - e.to_string() - }), - Err(e) => { - tracing::error!("prove_aggregate busy: {:?}", e); - Ok((false, vec![])) - } - } + self.agg_prover + .prove(agg_context) + .map(|agg_receipt_output| (true, agg_receipt_output)) + .map_err(|e| { + tracing::error!("prove_aggregate error {:#?}", e); + e.to_string() + }) } pub fn prove_snark(&self, snark_context: &SnarkContext) -> Result<(bool, Vec), String> { - match self.mutex.try_lock() { - Ok(_) => self.snark_prover.prove(snark_context).map_err(|e| { - tracing::error!("prove_snark error {:#?}", e); - e.to_string() - }), - Err(e) => { - tracing::error!("prove_snark busy: {:?}", e); - Ok((false, vec![])) - } - } + self.snark_prover.prove(snark_context).map_err(|e| { + tracing::error!("prove_snark error {:#?}", e); + e.to_string() + }) } - /// Return zkm-prover status - pub fn get_status(&self) -> bool { - let result = self.mutex.try_lock(); - result.is_ok() + pub fn prove_single_node( + &self, + single_node_context: &SingleNodeContext, + ) -> Result<(bool, u64, Vec, Vec, Vec), String> { + self.single_node_prover + .prove(single_node_context) + .map(|(cycles, proof, public_values, vk)| (true, cycles, proof, public_values, vk)) + .map_err(|e| { + tracing::error!("prove_single_node error {:#?}", e); + e.to_string() + }) } } diff --git a/prover_v2/src/root_prover.rs b/prover_v2/src/root_prover.rs index 246ce566..4addc68c 100644 --- a/prover_v2/src/root_prover.rs +++ b/prover_v2/src/root_prover.rs @@ -1,127 +1,169 @@ use crate::contexts::ProveContext; -use crate::{get_prover, NetworkProve, Segment, KEY_CACHE, PROGRAM_CACHE}; -use common::file; -use zkm_core_machine::utils::trace_checkpoint; -use zkm_prover::CoreSC; +use crate::{get_prover, NetworkProve, ProverComponents, KEY_CACHE}; +use zkm_core_executor::ExecutionRecord; use zkm_stark::{MachineProver, StarkGenericConfig}; +#[cfg(feature = "gpu")] +use zkm_stark::MachineProvingKey; + +#[cfg(feature = "gpu")] +use zkm_gpu_core::cuda_runtime; + +#[cfg(feature = "gpu")] +use zkm_gpu_prover::GpuProverHandle; +use zkm_prover::ZKMProver; + #[derive(Default)] pub struct RootProver {} impl RootProver { pub fn prove(&self, ctx: &ProveContext) -> anyhow::Result> { - let now = std::time::Instant::now(); - let segment: Segment = { - let mut retries = 0; - const MAX_RETRIES: usize = 10; - - loop { - let result = std::fs::read(&ctx.segment) - .and_then(|segment| { - zstd::stream::decode_all(&*segment) - .map_err(|e| std::io::Error::other(format!("zstd decode failed: {e}"))) - }) - .and_then(|decoded| { - bincode::deserialize::(&decoded).map_err(|e| { - std::io::Error::new( - std::io::ErrorKind::InvalidData, - format!("deserialize failed: {e}"), - ) - }) - }); - - match result { - Ok(r) => break r, - Err(e) => { - if retries >= MAX_RETRIES { - return Err(anyhow::anyhow!( - "Segment read/decode failed after {} retries: {}", - MAX_RETRIES, - e - )); - } - tracing::warn!("Segment {:?} error: {}, retrying...", ctx.segment, e); - retries += 1; - std::thread::sleep(std::time::Duration::from_millis(300)); - } - } - } - }; - tracing::info!("read segment time: {:?}", now.elapsed()); + let segment = Self::prepare_segment(ctx)?; + let prover = get_prover(); + self.prove_with_prover(0, &prover, ctx, segment) + } - let network_prove = NetworkProve::new(ctx.seg_size); - let opts = network_prove.opts.core_opts; + pub fn prove_from_segment( + &self, + ctx: &ProveContext, + segment: ExecutionRecord, + ) -> anyhow::Result> { let prover = get_prover(); + self.prove_with_prover(0, &prover, ctx, segment) + } - let mut record = match segment { - Segment::State(state) => { - let mut program_cache = PROGRAM_CACHE.lock().unwrap(); - let program = if let Some(program) = program_cache.cache.get(&ctx.program_id) { - tracing::info!("load program from cache"); - program - } else { - tracing::info!("No program in cache, generate new program"); - let elf = file::new(&ctx.elf_path).read()?; - let program = prover - .get_program(&elf) - .map_err(|e| anyhow::Error::msg(e.to_string()))?; - program_cache.push(ctx.program_id.clone(), program); - program_cache.cache.get(&ctx.program_id).unwrap() - }; - let public_values = state.public_values; - let (records, _) = tracing::debug_span!("trace checkpoint").in_scope(|| { - trace_checkpoint::( - program.clone(), - state.state, - opts, - prover.core_shape_config.as_ref(), - ) - }); - let mut record = records.into_iter().next().unwrap(); - let _ = record.defer(); - record.public_values = public_values; - record - } - Segment::Record(record) => *record, - }; + fn prepare_segment(ctx: &ProveContext) -> anyhow::Result { + if let Some(segment) = ctx.segment_obj.clone() { + Ok(segment) + } else if !ctx.segment_bytes.is_empty() { + Self::decode_record(&ctx.segment_bytes) + } else { + Self::read_record_from_file(&ctx.segment) + } + } + + fn prove_with_prover( + &self, + idx: usize, + prover: &ZKMProver, + ctx: &ProveContext, + mut record: ExecutionRecord, + ) -> anyhow::Result> { + let segment_index = ctx.index; + tracing::info!("GPU {idx} starting root proof for segment {segment_index}"); + let network_prove = NetworkProve::new(ctx.seg_size); + let opts = network_prove.opts.core_opts; + tracing::info!("GPU {idx} segment {segment_index}: record loaded"); let now = std::time::Instant::now(); - let mut cache = KEY_CACHE.lock().unwrap(); - let pk = if let Some((pk, _)) = cache.cache.get(&ctx.program_id) { - pk - } else { - let (pk, vk) = prover.core_prover.setup(&record.program); - cache.push(ctx.program_id.clone(), (pk, vk)); - &cache.cache.get(&ctx.program_id).unwrap().0 + let device_id = idx as u32; + let entry = { + let mut cache = KEY_CACHE.lock(); + cache.entry(device_id, ctx.program_id.clone()) }; - tracing::info!("setup time: {:?}", now.elapsed()); + tracing::info!("GPU {idx} segment {segment_index}: acquiring key cache entry"); + let (pk, _) = entry.get_or_init_with(|| { + tracing::info!("GPU {idx} segment {segment_index}: running setup"); + prover.core_prover.setup(&record.program) + }); + tracing::info!("GPU {idx} setup time: {:?}", now.elapsed()); let now = std::time::Instant::now(); + tracing::info!("GPU {idx} segment {segment_index}: generating dependencies"); prover.core_prover.machine().generate_dependencies( std::slice::from_mut(&mut record), &opts, None, ); - tracing::info!("generate dependencies time: {:?}", now.elapsed()); + tracing::info!("GPU {idx} generate dependencies time: {:?}", now.elapsed()); // Fix the shape of the record. let now = std::time::Instant::now(); if let Some(shape_config) = &prover.core_shape_config { - shape_config.fix_shape(&mut record).unwrap(); + tracing::info!("GPU {idx} segment {segment_index}: fixing shape"); + shape_config.fix_shape(&mut record)?; } - tracing::info!("fix shape time: {:?}", now.elapsed()); + tracing::info!("GPU {idx} fix shape time: {:?}", now.elapsed()); let now = std::time::Instant::now(); + tracing::info!("GPU {idx} segment {segment_index}: generating traces"); let main_trace = prover.core_prover.generate_traces(&record); - tracing::info!("generate traces time: {:?}", now.elapsed()); + tracing::info!("GPU {idx} generate traces time: {:?}", now.elapsed()); let mut challenger = prover.core_prover.config().challenger(); pk.observe_into(&mut challenger); let now = std::time::Instant::now(); + tracing::info!("GPU {idx} segment {segment_index}: committing main trace"); let main_data = prover.core_prover.commit(&record, main_trace); - tracing::info!("commit time: {:?}", now.elapsed()); + tracing::info!("GPU {idx} commit time: {:?}", now.elapsed()); let now = std::time::Instant::now(); + tracing::info!("GPU {idx} segment {segment_index}: opening proof"); let proof = prover.core_prover.open(pk, main_data, &mut challenger)?; - tracing::info!("open time: {:?}", now.elapsed()); + tracing::info!("GPU {idx} open time: {:?}", now.elapsed()); + + tracing::info!("GPU {idx} finished segment {segment_index}"); Ok(bincode::serialize(&proof)?) } + + #[cfg(feature = "gpu")] + pub fn prove_with_gpu_handle( + &self, + idx: usize, + handle: &GpuProverHandle, + ctx: &ProveContext, + ) -> anyhow::Result> { + let segment = Self::prepare_segment(ctx)?; + let proof = handle + .with_prover(|prover| self.prove_with_prover(idx, prover, ctx, segment)) + .map_err(|err| anyhow::anyhow!("failed to execute root proof on GPU: {err}"))??; + + Ok(proof) + } + + fn decode_record(bytes: &[u8]) -> anyhow::Result { + let decoded = zstd::stream::decode_all(bytes) + .map_err(|e| anyhow::anyhow!("zstd decode failed: {e}"))?; + Ok(bincode::deserialize::(&decoded) + .map_err(|e| anyhow::anyhow!("segment deserialize failed: {e}"))?) + } + + fn read_record_from_file(path: &str) -> anyhow::Result { + let now = std::time::Instant::now(); + let mut retries = 0; + const MAX_RETRIES: usize = 10; + + loop { + let result = std::fs::read(path) + .and_then(|segment| { + zstd::stream::decode_all(&*segment) + .map_err(|e| std::io::Error::other(format!("zstd decode failed: {e}"))) + }) + .and_then(|decoded| { + bincode::deserialize::(&decoded).map_err(|e| { + std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("deserialize failed: {e}"), + ) + }) + }); + + match result { + Ok(r) => { + tracing::info!("read segment time: {:?}", now.elapsed()); + break Ok(r); + } + Err(e) => { + if retries >= MAX_RETRIES { + break Err(anyhow::anyhow!( + "Segment read/decode failed after {} retries: {}", + MAX_RETRIES, + e + )); + } + tracing::warn!("Segment {:?} error: {}, retrying...", path, e); + retries += 1; + std::thread::sleep(std::time::Duration::from_millis(300)); + } + } + } + } } diff --git a/prover_v2/src/single_node_prover.rs b/prover_v2/src/single_node_prover.rs new file mode 100644 index 00000000..f0c02e61 --- /dev/null +++ b/prover_v2/src/single_node_prover.rs @@ -0,0 +1,890 @@ +#![cfg_attr( + not(feature = "gpu"), + allow(unused_imports, dead_code, unused_variables) +)] + +use crate::contexts::{AggContext, ProveContext, SingleNodeContext, SnarkContext, SplitContext}; +use crate::executor::Executor; +#[cfg(feature = "gpu")] +use crate::gpu_scheduler::{GpuJobDispatcher, GpuJobPool}; +use crate::snark_prover::SnarkProver; +use crate::{get_prover, NetworkProve, FIRST_LAYER_BATCH_SIZE, KEY_CACHE, PROGRAM_CACHE}; +use anyhow::{anyhow, Context}; +use common::file; +use std::cmp; +use std::collections::{BTreeMap, HashMap, VecDeque}; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::{mpsc, Arc, OnceLock}; +use zkm_core_executor::{ExecutionRecord, ZKMReduceProof}; +#[cfg(feature = "gpu")] +use zkm_gpu_prover::MultiGpuProver; +use zkm_prover::ZKMVerifyingKey; +use zkm_sdk::network::prover::stage_service::Step; +use zkm_sdk::ZKMProof; +use zkm_stark::koala_bear_poseidon2::KoalaBearPoseidon2; +use zkm_stark::{MachineProver, StarkVerifyingKey}; + +#[cfg(feature = "gpu")] +struct AggregatorConfig { + total_segments: usize, + deferred_inputs: Vec<(usize, Vec)>, + vk_bytes: Vec, +} + +#[cfg(feature = "gpu")] +struct StreamingAggregator { + vk_bytes: Vec, + is_complete: bool, + first_layer_expected: usize, + produced_first_layer: usize, + first_shard_emitted: bool, + plan: AggregationPlan, + nodes: Vec, + final_result: Option>, + next_job_id: u64, + pending_jobs: HashMap, +} + +#[cfg(feature = "gpu")] +struct AggregationPlan { + level_counts: Vec, + level_offsets: Vec, + parents: Vec>, + expected_inputs: Vec, + layers: Vec, + indices: Vec, +} + +#[cfg(feature = "gpu")] +impl AggregationPlan { + fn new(total_leaves: usize) -> Self { + let mut level_counts = Vec::new(); + let mut count = cmp::max(total_leaves, 1); + loop { + level_counts.push(count); + if count == 1 { + break; + } + count = (count + 1) / 2; + } + + let mut level_offsets = Vec::with_capacity(level_counts.len()); + let mut offset = 0usize; + for &c in &level_counts { + level_offsets.push(offset); + offset += c; + } + let total_nodes = offset; + let mut parents = vec![None; total_nodes]; + let mut expected_inputs = vec![0; total_nodes]; + let mut layers = vec![0; total_nodes]; + let mut indices = vec![0; total_nodes]; + + for (layer, &count) in level_counts.iter().enumerate() { + let base = level_offsets[layer]; + for idx in 0..count { + let node_id = base + idx; + layers[node_id] = layer; + indices[node_id] = idx; + } + } + + for layer in 0..level_counts.len().saturating_sub(1) { + let child_base = level_offsets[layer]; + let parent_base = level_offsets[layer + 1]; + for idx in 0..level_counts[layer] { + let child_id = child_base + idx; + let parent_idx = idx / 2; + let slot = idx % 2; + let parent_id = parent_base + parent_idx; + parents[child_id] = Some((parent_id, slot)); + expected_inputs[parent_id] += 1; + } + } + + Self { + level_counts, + level_offsets, + parents, + expected_inputs, + layers, + indices, + } + } + + fn total_nodes(&self) -> usize { + self.parents.len() + } + + fn leaf_node_id(&self, index: usize) -> usize { + self.level_offsets[0] + index + } + + fn parent(&self, node_id: usize) -> Option<(usize, usize)> { + self.parents.get(node_id).copied().flatten() + } + + fn expected_inputs(&self, node_id: usize) -> usize { + *self.expected_inputs.get(node_id).unwrap_or(&0) + } + + fn is_leaf(&self, node_id: usize) -> bool { + self.layers.get(node_id).copied().unwrap_or(0) == 0 + } + + fn is_top_level(&self, node_id: usize) -> bool { + if let Some(layer) = self.layers.get(node_id) { + layer + 1 == self.level_counts.len() + } else { + false + } + } + + fn layer_of(&self, node_id: usize) -> usize { + self.layers.get(node_id).copied().unwrap_or(0) + } + + fn index_within_layer(&self, node_id: usize) -> usize { + self.indices.get(node_id).copied().unwrap_or(0) + } +} + +#[cfg(feature = "gpu")] +#[derive(Clone, Default)] +struct AggNodeState { + received_inputs: usize, + inputs: [Option>; 2], + job_inflight: bool, +} + +#[cfg(feature = "gpu")] +impl StreamingAggregator { + fn new(vk_bytes: Vec, total_segments: usize, deferred_len: usize) -> Self { + let first_layer_batch_size = cmp::max(FIRST_LAYER_BATCH_SIZE, 1); + let chunk_ranges = (total_segments + first_layer_batch_size - 1) / first_layer_batch_size; + + let first_layer_expected = chunk_ranges + deferred_len; + let plan = AggregationPlan::new(cmp::max(first_layer_expected, 1)); + let nodes = vec![AggNodeState::default(); plan.total_nodes()]; + + Self { + vk_bytes, + is_complete: total_segments == 1 && deferred_len == 0, + first_layer_expected, + produced_first_layer: 0, + first_shard_emitted: false, + plan, + nodes, + final_result: None, + next_job_id: 0, + pending_jobs: HashMap::new(), + } + } + + fn push_normal_chunk( + &mut self, + proofs: Vec>, + is_first_chunk: bool, + output_index: usize, + ) -> anyhow::Result> { + self.schedule_leaf_job(proofs, is_first_chunk, false, output_index) + } + + fn push_deferred( + &mut self, + proof: Vec, + output_index: usize, + ) -> anyhow::Result> { + self.schedule_leaf_job(vec![proof], false, true, output_index) + } + + fn schedule_leaf_job( + &mut self, + proofs: Vec>, + mark_first_chunk: bool, + is_deferred: bool, + output_index: usize, + ) -> anyhow::Result> { + if output_index >= self.first_layer_expected { + return Err(anyhow!("invalid leaf index {output_index}")); + } + self.produced_first_layer += 1; + let mut is_first_shard = false; + if !is_deferred && mark_first_chunk && !self.first_shard_emitted { + self.first_shard_emitted = true; + is_first_shard = true; + } + + let node_id = self.plan.leaf_node_id(output_index); + let ctx = AggContext { + vk: self.vk_bytes.clone(), + proofs, + is_complete: self.is_complete && self.plan.is_top_level(node_id), + is_first_shard, + is_leaf_layer: true, + is_deferred, + }; + Ok(vec![self.enqueue_job(node_id, ctx)]) + } + + fn handle_job_completion( + &mut self, + job_id: u64, + proof: Vec, + ) -> anyhow::Result> { + let Some(node_id) = self.pending_jobs.remove(&job_id) else { + return Err(anyhow!("received completion for unknown aggregation job")); + }; + if let Some(state) = self.nodes.get_mut(node_id) { + state.job_inflight = false; + } + tracing::info!( + "Aggregator job {} completed for node {} layer {} index {}", + job_id, + node_id, + self.plan.layer_of(node_id), + self.plan.index_within_layer(node_id) + ); + Ok(self.propagate_output(node_id, proof)) + } + + fn propagate_output(&mut self, node_id: usize, proof: Vec) -> Vec { + if let Some((parent_id, slot)) = self.plan.parent(node_id) { + tracing::info!( + "Aggregator node {} sending proof to parent {} slot {}", + node_id, + parent_id, + slot + ); + if let Some(state) = self.nodes.get_mut(parent_id) { + state.inputs[slot] = Some(proof); + state.received_inputs += 1; + } + self.try_schedule_node(parent_id) + } else { + tracing::info!("Aggregator reached final result at node {}", node_id); + self.final_result = Some(proof); + Vec::new() + } + } + + fn try_schedule_node(&mut self, node_id: usize) -> Vec { + if self.plan.is_leaf(node_id) { + return Vec::new(); + } + let expected = self.plan.expected_inputs(node_id); + if expected == 0 { + return Vec::new(); + } + let state = &mut self.nodes[node_id]; + if state.job_inflight || state.received_inputs < expected { + tracing::debug!( + "Aggregator node {} waiting for inputs {}/{}", + node_id, + state.received_inputs, + expected + ); + return Vec::new(); + } + let mut proofs = Vec::with_capacity(expected); + for slot in 0..2 { + if let Some(data) = state.inputs[slot].take() { + proofs.push(data); + if proofs.len() == expected { + break; + } + } + } + debug_assert_eq!(proofs.len(), expected); + state.received_inputs = 0; + let ctx = AggContext { + vk: Vec::new(), + proofs, + is_complete: self.plan.is_top_level(node_id), + is_first_shard: false, + is_leaf_layer: false, + is_deferred: false, + }; + vec![self.enqueue_job(node_id, ctx)] + } + + fn enqueue_job(&mut self, node_id: usize, ctx: AggContext) -> AggJobRequest { + let job_id = self.next_job_id; + self.next_job_id += 1; + self.pending_jobs.insert(job_id, node_id); + if let Some(state) = self.nodes.get_mut(node_id) { + state.job_inflight = true; + } + tracing::info!( + "Aggregator enqueue job {} for node {} layer {} index {}", + job_id, + node_id, + self.plan.layer_of(node_id), + self.plan.index_within_layer(node_id) + ); + AggJobRequest { id: job_id, ctx } + } + + fn is_done(&self) -> bool { + self.final_result.is_some() + && self.produced_first_layer == self.first_layer_expected + && self.pending_jobs.is_empty() + } + + fn take_final(self) -> anyhow::Result> { + self.final_result + .ok_or_else(|| anyhow!("aggregation finished without result")) + } +} + +#[cfg(feature = "gpu")] +struct AggJobRequest { + id: u64, + ctx: AggContext, +} + +#[cfg(feature = "gpu")] +fn dispatch_agg_jobs( + dispatcher: &GpuJobDispatcher, + result_tx: &mpsc::Sender<(u64, anyhow::Result>)>, + jobs: I, + pending_gpu_jobs: &mut usize, +) -> anyhow::Result<()> +where + I: IntoIterator, +{ + for job in jobs.into_iter() { + tracing::info!( + "Dispatching aggregation job {} current_pending={}", + job.id, + pending_gpu_jobs + ); + dispatcher + .submit_agg(job.id, job.ctx, result_tx.clone()) + .map_err(|e| anyhow!("failed to dispatch aggregation job: {e}"))?; + *pending_gpu_jobs += 1; + tracing::info!( + "Aggregation job {} submitted, pending_gpu_jobs={}", + job.id, + pending_gpu_jobs + ); + } + Ok(()) +} + +#[cfg(feature = "gpu")] +fn run_aggregator( + config_rx: mpsc::Receiver, + proof_rx: mpsc::Receiver)>>, + snark_tx: Option>>, + dispatcher: GpuJobDispatcher, + remaining_roots: Arc, + gpu_capacity: usize, +) -> anyhow::Result> { + use std::time::Duration; + + let config = config_rx + .recv() + .context("aggregator config channel closed before receiving config")?; + + let chunk_size = cmp::max(FIRST_LAYER_BATCH_SIZE, 1); + tracing::info!( + "Aggregator initialized: total_segments={} chunk_size={} deferred_inputs={}", + config.total_segments, + chunk_size, + config.deferred_inputs.len() + ); + let mut chunk_ranges = Vec::new(); + let mut start = 0usize; + while start < config.total_segments { + let end = cmp::min(start + chunk_size, config.total_segments); + chunk_ranges.push((start, end)); + start = end; + } + + let mut aggregator = StreamingAggregator::new( + config.vk_bytes.clone(), + config.total_segments, + config.deferred_inputs.len(), + ); + let mut proofs = BTreeMap::>::new(); + let mut next_chunk_index = 0usize; + let mut deferred_inputs = config.deferred_inputs; + deferred_inputs.sort_by_key(|(idx, _)| *idx); + let mut deferred_processed = false; + + let mut queued_jobs = VecDeque::new(); + let mut allow_agg = false; + + let (agg_job_tx, agg_job_rx) = mpsc::channel::<(u64, anyhow::Result>)>(); + let mut pending_gpu_jobs = 0usize; + let mut root_channel_open = true; + let mut deferred_next_index = chunk_ranges.len(); + + loop { + tracing::debug!( + "Aggregator loop state: remaining_roots={} pending_gpu_jobs={} queued_jobs={} next_chunk={} allow_agg={} is_done={}", + remaining_roots.load(Ordering::Relaxed), + pending_gpu_jobs, + queued_jobs.len(), + next_chunk_index, + allow_agg, + aggregator.is_done() + ); + if !allow_agg { + let current_roots = remaining_roots.load(Ordering::Relaxed); + if current_roots <= gpu_capacity { + allow_agg = true; + tracing::info!( + "Enabling aggregation dispatch: remaining_roots={}, gpu_capacity={}, queued_jobs={}", + current_roots, + gpu_capacity, + queued_jobs.len() + ); + dispatch_agg_jobs( + &dispatcher, + &agg_job_tx, + queued_jobs.drain(..), + &mut pending_gpu_jobs, + )?; + } + } + + while let Ok((job_id, result)) = agg_job_rx.try_recv() { + pending_gpu_jobs = pending_gpu_jobs.saturating_sub(1); + let followups = match result { + Ok(proof) => aggregator.handle_job_completion(job_id, proof)?, + Err(err) => return Err(err), + }; + tracing::info!( + "Aggregation job {} finished, pending_gpu_jobs={} allow_agg={}", + job_id, + pending_gpu_jobs, + allow_agg + ); + if allow_agg { + dispatch_agg_jobs(&dispatcher, &agg_job_tx, followups, &mut pending_gpu_jobs)?; + } else { + queued_jobs.extend(followups); + } + } + + if next_chunk_index == chunk_ranges.len() && !deferred_processed { + for (_, proof) in deferred_inputs.iter() { + let jobs = aggregator.push_deferred(proof.clone(), deferred_next_index)?; + if allow_agg { + dispatch_agg_jobs(&dispatcher, &agg_job_tx, jobs, &mut pending_gpu_jobs)?; + } else { + queued_jobs.extend(jobs); + } + deferred_next_index += 1; + } + deferred_processed = true; + } + + if aggregator.is_done() && pending_gpu_jobs == 0 { + tracing::info!( + "Aggregator completed: pending_gpu_jobs=0, queued_jobs={}", + queued_jobs.len() + ); + let result = aggregator.take_final()?; + if let Some(tx) = snark_tx { + tx.send(result.clone()) + .map_err(|_| anyhow!("failed to send aggregate proof to snark"))?; + } + return Ok(result); + } + + let mut scheduled_chunk = false; + while next_chunk_index < chunk_ranges.len() { + let (start_idx, end_idx) = chunk_ranges[next_chunk_index]; + if (start_idx..end_idx).all(|idx| proofs.contains_key(&idx)) { + let mut chunk_proofs = Vec::with_capacity(end_idx - start_idx); + for idx in start_idx..end_idx { + chunk_proofs.push(proofs.remove(&idx).unwrap()); + } + tracing::info!( + "Scheduling aggregation chunk {} (segments {}-{}) allow_agg={}", + next_chunk_index, + start_idx, + end_idx, + allow_agg + ); + let jobs = aggregator.push_normal_chunk( + chunk_proofs, + next_chunk_index == 0, + next_chunk_index, + )?; + if allow_agg { + dispatch_agg_jobs(&dispatcher, &agg_job_tx, jobs, &mut pending_gpu_jobs)?; + } else { + queued_jobs.extend(jobs); + } + next_chunk_index += 1; + scheduled_chunk = true; + } else { + break; + } + } + if scheduled_chunk { + continue; + } + + if root_channel_open { + match proof_rx.recv_timeout(Duration::from_millis(10)) { + Ok(Ok((index, proof))) => { + proofs.insert(index, proof); + remaining_roots.fetch_sub(1, Ordering::Relaxed); + } + Ok(Err(err)) => return Err(err), + Err(mpsc::RecvTimeoutError::Timeout) => {} + Err(mpsc::RecvTimeoutError::Disconnected) => { + root_channel_open = false; + tracing::info!( + "Root channel closed after processing all segments; proofs_len={}", + proofs.len() + ); + } + } + } else if pending_gpu_jobs > 0 { + match agg_job_rx.recv() { + Ok((job_id, result)) => { + pending_gpu_jobs = pending_gpu_jobs.saturating_sub(1); + let followups = match result { + Ok(proof) => aggregator.handle_job_completion(job_id, proof)?, + Err(err) => return Err(err), + }; + tracing::info!( + "Blocking receive completed job {} pending_gpu_jobs={} allow_agg={}", + job_id, + pending_gpu_jobs, + allow_agg + ); + dispatch_agg_jobs(&dispatcher, &agg_job_tx, followups, &mut pending_gpu_jobs)?; + } + Err(_) => { + return Err(anyhow!("aggregation job channel closed")); + } + } + } else { + if next_chunk_index < chunk_ranges.len() { + return Err(anyhow!( + "root prover channel closed before all segments were proven" + )); + } + if !deferred_processed { + continue; + } + } + } +} + +#[derive(Default)] +pub struct SingleNodeProver { + proving_key_paths: String, +} + +impl SingleNodeProver { + pub fn new(proving_key_paths: &str) -> Self { + Self { + proving_key_paths: proving_key_paths.into(), + } + } + + /// returns (total_steps, proof, public_values, vk_bytes) + pub fn prove( + &self, + ctx: &SingleNodeContext, + ) -> anyhow::Result<(u64, Vec, Vec, Vec)> { + if ctx.local_prover_threads > 1 { + #[cfg(feature = "gpu")] + { + self.prove_in_process(ctx) + } + #[cfg(not(feature = "gpu"))] + unimplemented!("multi-provers proving is only supported with GPU feature") + } else { + self.prove_legacy(ctx) + } + } + + #[cfg(feature = "gpu")] + fn prove_in_process( + &self, + ctx: &SingleNodeContext, + ) -> anyhow::Result<(u64, Vec, Vec, Vec)> { + let target_step = Step::from_i32(ctx.target_step) + .ok_or_else(|| anyhow!("unsupported target step: {}", ctx.target_step))?; + + let requested_workers = ctx.local_prover_threads.max(1); + let (gpu_pool, gpu_worker_count) = { + let pool = get_local_provers(); + let total = pool.len(); + if total == 0 { + return Err(anyhow!("no local GPU provers detected")); + } + let workers = requested_workers.min(total); + let pool = GpuJobPool::new(pool, workers)?; + (pool, workers) + }; + let gpu_dispatcher_main = gpu_pool.dispatcher(); + let remaining_roots = Arc::new(AtomicUsize::new(0)); + let (segment_tx, segment_rx) = mpsc::channel::<(usize, ExecutionRecord)>(); + let (proof_tx, proof_rx) = mpsc::channel::)>>(); + let (config_tx, config_rx) = mpsc::channel::(); + let (agg_result_tx, agg_result_rx) = mpsc::channel::>>(); + + let (snark_tx, snark_handle) = match target_step { + Step::InSnark => { + let (tx, rx) = mpsc::channel::>(); + let proving_key_paths = self.proving_key_paths.clone(); + let proof_id = ctx.proof_id.clone(); + + let handle = std::thread::spawn(move || -> anyhow::Result> { + let agg_receipt = rx + .recv() + .map_err(|_| anyhow!("failed to receive aggregate proof for snark"))?; + let snark_ctx = SnarkContext { + proof_id, + agg_receipt, + from_input: false, + ..Default::default() + }; + let snark_prover = SnarkProver::new(&proving_key_paths); + let (_, proof) = snark_prover.prove(&snark_ctx)?; + Ok(proof) + }); + (Some(tx), Some(handle)) + } + _ => (None, None), + }; + + let dispatcher_for_agg = gpu_dispatcher_main.clone(); + let dispatcher_for_root = gpu_dispatcher_main.clone(); + let remaining_for_agg = Arc::clone(&remaining_roots); + let aggregator_handle = std::thread::spawn(move || { + let result = run_aggregator( + config_rx, + proof_rx, + snark_tx, + dispatcher_for_agg, + remaining_for_agg, + gpu_worker_count, + ); + let _ = agg_result_tx.send(result); + }); + drop(gpu_dispatcher_main); + + let split_ctx = SplitContext { + base_dir: ctx.base_dir.clone(), + program_id: ctx.program_id.clone(), + elf_path: ctx.elf_path.clone(), + elf: ctx.elf.clone(), + block_no: None, + seg_size: ctx.seg_size, + seg_path: String::new(), + public_input_path: String::new(), + private_input_path: ctx.private_input_path.clone(), + private_inputs: ctx.private_inputs.clone(), + output_path: String::new(), + args: String::new(), + receipt_inputs_path: ctx.receipt_inputs_path.clone(), + receipt_inputs: ctx.receipt_inputs.clone(), + }; + + let worker_ctx = ProveContext { + proof_id: ctx.proof_id.clone(), + program_id: ctx.program_id.clone(), + elf_path: ctx.elf_path.clone(), + elf: ctx.elf.clone(), + seg_size: ctx.seg_size, + ..Default::default() + }; + let proof_sender_for_root = proof_tx.clone(); + let remaining_for_root = Arc::clone(&remaining_roots); + let segment_handle = std::thread::spawn(move || -> anyhow::Result<()> { + let template = worker_ctx; + while let Ok((index, record)) = segment_rx.recv() { + let mut ctx = template.clone(); + ctx.index = index; + ctx.segment_bytes.clear(); + ctx.segment_obj = Some(record); + remaining_for_root.fetch_add(1, Ordering::Relaxed); + dispatcher_for_root.submit_root(ctx, proof_sender_for_root.clone())?; + } + Ok(()) + }); + + let executor = Executor::default(); + let (total_steps, total_segments, public_values, deferred_inputs, vk_bytes) = + executor.split_streaming(&split_ctx, segment_tx)?; + + config_tx + .send(AggregatorConfig { + total_segments: total_segments as usize, + deferred_inputs, + vk_bytes: vk_bytes.clone(), + }) + .map_err(|_| anyhow!("aggregator dropped config receiver"))?; + drop(config_tx); + + match segment_handle.join() { + Ok(Ok(())) => {} + Ok(Err(e)) => return Err(e), + Err(join_err) => return Err(anyhow!("segment dispatcher panicked: {:?}", join_err)), + } + drop(proof_tx); + + let aggregated_result = match agg_result_rx.recv() { + Ok(res) => res, + Err(_) => { + let _ = aggregator_handle.join(); + return Err(anyhow!("failed to receive aggregation result")); + } + }; + let agg_receipt = match aggregated_result { + Ok(proof) => proof, + Err(err) => { + let _ = aggregator_handle.join(); + return Err(err); + } + }; + + match aggregator_handle.join() { + Ok(()) => {} + Err(join_err) => { + return Err(anyhow!("aggregator thread panicked: {:?}", join_err)); + } + } + + let aggregated_bytes = agg_receipt; + let final_proof = match snark_handle { + Some(handle) => match handle.join() { + Ok(snark_result) => snark_result?, + Err(join_err) => { + return Err(anyhow!("snark thread panicked: {:?}", join_err)); + } + }, + None => aggregated_bytes, + }; + + Ok((total_steps, final_proof, public_values, vk_bytes)) + } + + fn prove_legacy( + &self, + ctx: &SingleNodeContext, + ) -> anyhow::Result<(u64, Vec, Vec, Vec)> { + let prover = get_prover(); + let mut network_prove = NetworkProve::new(ctx.seg_size); + let opts = network_prove.opts; + let context = network_prove.context_builder.build(); + + let elf_path = ctx.elf_path.clone(); + let elf = file::new(&elf_path).read()?; + + // write input + let encoded_input = file::new(&ctx.private_input_path).read()?; + let inputs_data: Vec> = bincode::deserialize(&encoded_input)?; + inputs_data.into_iter().for_each(|input| { + network_prove.stdin.write_vec(input); + }); + + if !ctx.receipt_inputs_path.is_empty() { + let receipt_datas = std::fs::read(&ctx.receipt_inputs_path)?; + let receipts = bincode::deserialize::>>(&receipt_datas)?; + for receipt in receipts.iter() { + let receipt: ( + ZKMReduceProof, + StarkVerifyingKey, + ) = bincode::deserialize(receipt).map_err(|e| anyhow::anyhow!(e))?; + network_prove.stdin.write_proof(receipt.0, receipt.1); + } + tracing::info!("Write {} receipts", receipts.len()); + } + + // get program from cache or generate new ones + let mut program_cache = PROGRAM_CACHE.lock(); + let program = if let Some(program) = program_cache.cache.get(&ctx.program_id) { + tracing::info!("load program from cache"); + program + } else { + tracing::info!("No program in cache, generate new program"); + let program = prover + .get_program(&elf) + .map_err(|e| anyhow::Error::msg(e.to_string()))?; + program_cache.push(ctx.program_id.clone(), program); + program_cache.cache.get(&ctx.program_id).unwrap() + }; + + // get keys from cache or generate new ones + let device_id = 0; + let entry = { + let mut cache = KEY_CACHE.lock(); + cache.entry(device_id, ctx.program_id.clone()) + }; + let (pk, vk) = entry.get_or_init_with(|| prover.core_prover.setup(program)); + + let core_proof = + prover.prove_core(pk, program.clone(), &network_prove.stdin, opts, context)?; + + let deferred_proofs = network_prove + .stdin + .proofs + .iter() + .map(|(reduce_proof, _)| reduce_proof.clone()) + .collect(); + + let public_values = core_proof.public_values.clone(); + let cycles = core_proof.cycles; + + // Generate the compressed proof. + let reduced_proof = prover.compress( + &ZKMVerifyingKey { vk: vk.clone() }, + core_proof, + deferred_proofs, + opts, + )?; + + let proof = match Step::from_i32(ctx.target_step) { + Some(Step::InAgg) => ZKMProof::Compressed(Box::new(reduced_proof)), + Some(Step::InSnark) => { + // generate snark proof + tracing::info!("Generating snark proof for task: {}", ctx.program_id); + let snark_prover = SnarkProver::new(&self.proving_key_paths); + let compress_proof = prover.shrink(reduced_proof, opts)?; + let outer_proof = snark_prover.wrap_bn254(&prover, compress_proof, opts)?; + let groth16_bn254_artifacts = PathBuf::from(&self.proving_key_paths); + let proof = prover.wrap_groth16_bn254(outer_proof, &groth16_bn254_artifacts); + ZKMProof::Groth16(proof) + } + _ => { + unreachable!("Unsupported target step: {}", ctx.target_step); + } + }; + + Ok(( + cycles, + serde_json::to_string(&proof)?.into_bytes(), + public_values.to_vec(), + bincode::serialize(&vk)?, + )) + } +} + +#[cfg(feature = "gpu")] +static LOCAL_PROVERS: OnceLock> = OnceLock::new(); + +#[cfg(feature = "gpu")] +pub fn get_local_provers() -> Arc { + LOCAL_PROVERS + .get_or_init(|| { + let threads = std::env::var("GPU_POOL_THREADS") + .ok() + .and_then(|val| val.parse().ok()) + .unwrap_or(32); + Arc::new(MultiGpuProver::autodetect(Some(threads)).unwrap()) + }) + .clone() +} diff --git a/prover_v2/src/snark_prover.rs b/prover_v2/src/snark_prover.rs index 53702118..311761fe 100644 --- a/prover_v2/src/snark_prover.rs +++ b/prover_v2/src/snark_prover.rs @@ -1,5 +1,5 @@ use crate::contexts::SnarkContext; -use crate::{get_prover, NetworkProve, WRAP_KEYS}; +use crate::{get_prover, NetworkProve, ProverComponents, WRAP_KEYS}; use std::path::PathBuf; use tracing::instrument; use zkm_core_executor::ZKMReduceProof; @@ -9,7 +9,10 @@ use zkm_recursion_circuit::witness::Witnessable; use zkm_recursion_compiler::config::InnerConfig; use zkm_recursion_core::Runtime; use zkm_sdk::ZKMProof; -use zkm_stark::{Challenge, MachineProver, StarkGenericConfig, Val, ZKMProverOpts}; +use zkm_stark::koala_bear_poseidon2::KoalaBearPoseidon2; +use zkm_stark::{ + Challenge, MachineProver, StarkGenericConfig, StarkVerifyingKey, Val, ZKMProverOpts, +}; // It seems we don't need `output_dir`. #[derive(Default)] @@ -24,16 +27,25 @@ impl SnarkProver { } } pub fn prove(&self, ctx: &SnarkContext) -> anyhow::Result<(bool, Vec)> { - let json_str = String::from_utf8_lossy(&ctx.agg_receipt).to_string(); - let proof: ZKMProof = serde_json::from_str(&json_str).expect("could not deserialize proof"); - let reduced_proof = match proof { - ZKMProof::Compressed(proof) => *proof, - _ => unreachable!("unexpected proof"), + let reduced_proof = if ctx.from_input { + let receipt: ( + ZKMReduceProof, + StarkVerifyingKey, + ) = bincode::deserialize(&ctx.agg_receipt).map_err(|e| anyhow::anyhow!(e))?; + + receipt.0 + } else { + let json_str = String::from_utf8_lossy(&ctx.agg_receipt).to_string(); + let proof: ZKMProof = + serde_json::from_str(&json_str).expect("could not deserialize proof"); + match proof { + ZKMProof::Compressed(proof) => *proof, + _ => unreachable!("unexpected proof"), + } }; - let network_prove = NetworkProve::default(); let gnark_proof = self.prove_groth16(reduced_proof, network_prove.opts)?; - + // tracing::info!("snark proof done"); Ok((true, serde_json::to_vec(&gnark_proof)?)) } @@ -45,17 +57,15 @@ impl SnarkProver { let prover = get_prover(); let compress_proof = prover.shrink(reduced_proof, opts)?; let outer_proof = self.wrap_bn254(&prover, compress_proof, opts)?; - let groth16_bn254_artifacts = PathBuf::from(&self.proving_key_paths); let proof = prover.wrap_groth16_bn254(outer_proof, &groth16_bn254_artifacts); - Ok(ZKMProof::Groth16(proof)) } #[instrument(name = "wrap_bn254", level = "info", skip_all)] - fn wrap_bn254( + pub fn wrap_bn254( &self, - prover: &ZKMProver, + prover: &ZKMProver, compressed_proof: ZKMReduceProof, opts: ZKMProverOpts, ) -> Result, ZKMRecursionProverError> { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index fb6c70a9..271800cb 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly-2025-04-10" \ No newline at end of file +channel = "nightly" \ No newline at end of file