From 72707d17c77f20836054e5cf11cd34978ce15f08 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 17 Sep 2024 11:48:52 +0200 Subject: [PATCH] feat(sp1): Integrating SP1 program into prism-main (#119) * using sp1 proofs * fix: started to replace borsh with bincode serialization, verify commitment consistency in SP1 proofs and FinalizedEpoch * fix: clippy * fix: add --release flag to yml * bet * fix: commit to prev commitment in proof to compare equality of used commitments * plonk feature * serialization --------- Co-authored-by: sebasti810 --- .github/workflows/ci.yml | 4 +- Cargo.lock | 3804 ++++++++++++++++++-- Cargo.toml | 15 +- crates/common/Cargo.toml | 2 +- crates/common/src/hashchain.rs | 5 +- crates/common/src/operation.rs | 7 +- crates/common/src/tree.rs | 126 +- crates/groth16/src/lib.rs | 9 +- crates/prism/Cargo.toml | 7 + crates/prism/src/da/celestia.rs | 11 +- crates/prism/src/da/mod.rs | 11 +- crates/prism/src/main.rs | 2 + crates/prism/src/node_types/lightclient.rs | 93 +- crates/prism/src/node_types/sequencer.rs | 78 +- crates/prism/src/storage.rs | 12 +- crates/sp1/src/main.rs | 2 + elf/riscv32im-succinct-zkvm-elf | Bin 0 -> 370596 bytes 17 files changed, 3725 insertions(+), 463 deletions(-) create mode 100755 elf/riscv32im-succinct-zkvm-elf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e64521..95b5c6d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,10 +74,10 @@ jobs: run: cargo clippy --all-targets --all-features -- -D warnings - name: Build project - run: cargo build --verbose + run: cargo build --verbose --release - name: Run tests - run: cargo test --verbose + run: cargo test --verbose --release - name: Install cargo-audit run: cargo install cargo-audit diff --git a/Cargo.lock b/Cargo.lock index 3ceb371..fe09a95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,16 @@ # It is not intended for manual editing. version = 3 +[[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 = "abomonation" version = "0.7.3" @@ -101,6 +111,34 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "alloy-primitives" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + [[package]] name = "alloy-rlp" version = "0.3.8" @@ -111,12 +149,95 @@ dependencies = [ "bytes", ] +[[package]] +name = "alloy-sol-macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.5.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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 = "anes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[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.15" @@ -187,10 +308,10 @@ dependencies = [ "cfg-if", "derive_more", "digest 0.10.7", - "ff", + "ff 0.13.0", "generic-array 1.1.0", "getrandom", - "group", + "group 0.13.0", "grumpkin-msm", "halo2curves", "itertools 0.13.0", @@ -199,8 +320,8 @@ dependencies = [ "num-integer", "num-traits", "once_cell", - "pairing", - "pasta_curves", + "pairing 0.23.0", + "pasta_curves 0.5.1", "proptest", "rand", "rand_chacha", @@ -373,6 +494,23 @@ dependencies = [ "syn 2.0.77", ] +[[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 = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "auto_impl" version = "1.2.0" @@ -397,13 +535,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.3.4", "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +dependencies = [ + "async-trait", + "axum-core 0.4.3", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-util", "itoa", "matchit", "memchr", @@ -415,11 +586,12 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -431,12 +603,33 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper 0.1.2", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -451,6 +644,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", + "serde", "windows-targets 0.52.6", ] @@ -460,6 +654,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" +[[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" @@ -509,12 +709,12 @@ dependencies = [ "blake2s_simd", "byteorder", "crossbeam-channel", - "ff", - "group", + "ff 0.13.0", + "group 0.13.0", "lazy_static", "log", "num_cpus", - "pairing", + "pairing 0.23.0", "rand_core", "rayon", "subtle", @@ -528,7 +728,7 @@ checksum = "9ae286c2cb403324ab644c7cc68dceb25fe52ca9429908a726d7ed272c1edf7b" dependencies = [ "bellpepper-core", "byteorder", - "ff", + "ff 0.13.0", ] [[package]] @@ -538,7 +738,7 @@ source = "git+https://github.com/lurk-lab/bellpepper?branch=dev#d0225bf6cb2bb9ab dependencies = [ "bellpepper-core", "byteorder", - "ff", + "ff 0.13.0", "itertools 0.12.1", ] @@ -550,7 +750,7 @@ checksum = "1d8abb418570756396d722841b19edfec21d4e89e1cf8990610663040ecb1aea" dependencies = [ "blake2s_simd", "byteorder", - "ff", + "ff 0.13.0", "serde", "thiserror", ] @@ -564,6 +764,29 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.77", + "which", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -648,6 +871,7 @@ dependencies = [ "cc", "cfg-if", "constant_time_eq", + "rayon-core", ] [[package]] @@ -680,15 +904,28 @@ dependencies = [ "thiserror", ] +[[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", + "subtle", +] + [[package]] name = "bls12_381" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" dependencies = [ - "ff", - "group", - "pairing", + "ff 0.13.0", + "group 0.13.0", + "pairing 0.23.0", "rand_core", "subtle", ] @@ -713,9 +950,9 @@ checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" dependencies = [ "blst", "byte-slice-cast", - "ff", - "group", - "pairing", + "ff 0.13.0", + "group 0.13.0", + "pairing 0.23.0", "rand_core", "serde", "subtle", @@ -751,6 +988,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ + "sha2 0.10.8", "tinyvec", ] @@ -766,6 +1004,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +[[package]] +name = "bytemuck" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" + [[package]] name = "byteorder" version = "1.5.0" @@ -781,6 +1025,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +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.23", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cast" version = "0.3.0" @@ -793,6 +1069,8 @@ version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -818,7 +1096,7 @@ checksum = "c891b0371a6ae5a37650f1806221185cad25a1e19a11031707b6239ac720f0df" dependencies = [ "async-trait", "celestia-types", - "http", + "http 0.2.12", "jsonrpsee", "serde", "thiserror", @@ -900,6 +1178,15 @@ dependencies = [ "thiserror", ] +[[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.0" @@ -912,6 +1199,19 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + [[package]] name = "ciborium" version = "0.2.2" @@ -961,6 +1261,17 @@ dependencies = [ "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.17" @@ -1002,48 +1313,132 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] -name = "colorchoice" -version = "1.0.2" +name = "cobs" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] -name = "combine" -version = "4.6.7" +name = "coins-bip32" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ - "bytes", - "memchr", + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2 0.10.8", + "thiserror", ] [[package]] -name = "config" -version = "0.14.0" +name = "coins-bip39" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "async-trait", - "convert_case 0.6.0", - "json5", - "lazy_static", - "nom", - "pathdiff", - "ron", - "rust-ini", - "serde", - "serde_json", - "toml", - "yaml-rust", + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand", + "sha2 0.10.8", + "thiserror", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "coins-core" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest 0.10.7", + "generic-array 0.14.7", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2 0.10.8", + "sha3", + "thiserror", +] + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "config" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" +dependencies = [ + "async-trait", + "convert_case 0.6.0", + "json5", + "lazy_static", + "nom", + "pathdiff", + "ron", + "rust-ini", + "serde", + "serde_json", + "toml", + "yaml-rust", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "const-hex" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] name = "const-random" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1223,6 +1618,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[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", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -1283,6 +1690,41 @@ dependencies = [ "zeroize", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.77", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.77", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -1296,6 +1738,84 @@ dependencies = [ "parking_lot_core", ] +[[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.6.0" @@ -1339,6 +1859,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -1381,6 +1902,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", + "const-oid", "crypto-common", "subtle", ] @@ -1447,6 +1969,32 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -1491,6 +2039,76 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff 0.13.0", + "generic-array 0.14.7", + "group 0.13.0", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +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", + "rlp", + "serde", + "sha3", + "zeroize", +] + [[package]] name = "enum_dispatch" version = "0.3.13" @@ -1533,26 +2151,290 @@ dependencies = [ ] [[package]] -name = "event-listener" -version = "2.5.3" +name = "eth-keystore" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand", + "scrypt", + "serde", + "serde_json", + "sha2 0.10.8", + "sha3", + "thiserror", + "uuid", +] [[package]] -name = "eyre" -version = "0.6.12" +name = "ethabi" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "indenter", + "ethereum-types", + "hex", "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", ] [[package]] -name = "fastrand" -version = "2.1.1" +name = "ethbloom" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +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-middleware", + "ethers-providers", + "ethers-signers", +] + +[[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", +] + +[[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", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "syn 2.0.77", + "toml", + "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.77", +] + +[[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", + "ethabi", + "generic-array 0.14.7", + "k256", + "num_enum 0.7.3", + "once_cell", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.77", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[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-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror", + "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", + "tokio", + "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", + "eth-keystore", + "ethers-core", + "rand", + "sha2 0.10.8", + "thiserror", + "tracing", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fastrlp" @@ -1565,6 +2447,17 @@ dependencies = [ "bytes", ] +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + [[package]] name = "ff" version = "0.13.0" @@ -1644,6 +2537,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1713,6 +2621,27 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "futures-sink" version = "0.3.30" @@ -1730,6 +2659,10 @@ 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" @@ -1740,6 +2673,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -1748,6 +2682,21 @@ dependencies = [ "slab", ] +[[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" @@ -1756,6 +2705,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1764,6 +2714,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" dependencies = [ + "serde", "typenum", ] @@ -1796,19 +2747,56 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +[[package]] +name = "git2" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +dependencies = [ + "bitflags 2.6.0", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[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", + "subtle", +] + [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.0", "rand", "rand_core", "rand_xorshift", @@ -1824,7 +2812,7 @@ dependencies = [ "cc", "getrandom", "halo2curves", - "pasta_curves", + "pasta_curves 0.5.1", "rand", "rand_chacha", "rayon", @@ -1844,8 +2832,27 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", - "indexmap", + "http 0.2.12", + "indexmap 2.5.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", @@ -1862,6 +2869,29 @@ dependencies = [ "crunchy", ] +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core", + "rayon", +] + [[package]] name = "halo2curves" version = "0.6.1" @@ -1869,14 +2899,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" dependencies = [ "blake2b_simd", - "ff", - "group", + "ff 0.13.0", + "group 0.13.0", "hex", "lazy_static", "num-bigint 0.4.6", "num-traits", - "pairing", - "pasta_curves", + "pairing 0.23.0", + "pasta_curves 0.5.1", "paste", "rand", "rand_core", @@ -1889,10 +2919,16 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ "ahash", ] @@ -1901,6 +2937,20 @@ 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 = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] [[package]] name = "heck" @@ -1935,6 +2985,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hkdf" version = "0.12.4" @@ -1973,6 +3029,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1980,7 +3047,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "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.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -2018,9 +3108,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2032,6 +3122,27 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -2039,13 +3150,90 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.30", "log", - "rustls", + "rustls 0.21.12", "rustls-native-certs", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.13", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", ] [[package]] @@ -2067,6 +3255,12 @@ dependencies = [ "sha3", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -2086,6 +3280,24 @@ 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.2" @@ -2110,7 +3322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86e7e0a70243eb602dba292003d26682c23cff528c5b3c06c002d242a26d865" dependencies = [ "anyhow", - "bls12_381", + "bls12_381 0.8.0", "borsh", "hex", "num", @@ -2120,6 +3332,17 @@ dependencies = [ "sha2 0.10.8", ] +[[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.5.0" @@ -2131,6 +3354,19 @@ dependencies = [ "serde", ] +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "informalsystems-pbjson" version = "0.7.0" @@ -2150,6 +3386,21 @@ 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 = "ipnet" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" + [[package]] name = "is-terminal" version = "0.4.13" @@ -2223,6 +3474,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.70" @@ -2264,14 +3524,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c671353e4adf926799107bd7f5724a06b6bc0a333db442a0843c58640bdd0c1" dependencies = [ "futures-util", - "http", + "http 0.2.12", "jsonrpsee-core", "pin-project", "rustls-native-certs", "soketto", "thiserror", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tokio-util", "tracing", "url", @@ -2289,9 +3549,9 @@ dependencies = [ "beef", "futures-timer", "futures-util", - "hyper", + "hyper 0.14.30", "jsonrpsee-types", - "rustc-hash", + "rustc-hash 1.1.0", "serde", "serde_json", "thiserror", @@ -2306,8 +3566,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c7b9f95208927653e7965a98525e7fc641781cab89f0e27c43fa2974405683" dependencies = [ "async-trait", - "hyper", - "hyper-rustls", + "hyper 0.14.30", + "hyper-rustls 0.24.2", "jsonrpsee-core", "jsonrpsee-types", "serde", @@ -2352,13 +3612,55 @@ version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d06eeabbb55f0af8405288390a358ebcceb6e79e1390741e6f152309c4d6076" dependencies = [ - "http", + "http 0.2.12", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", "url", ] +[[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 0.7.1", + "ff 0.12.1", + "group 0.12.1", + "rand_core", + "subtle", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.8", + "signature", +] + [[package]] name = "keccak" version = "0.1.5" @@ -2368,6 +3670,16 @@ 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 = "keyring" version = "3.2.1" @@ -2397,9 +3709,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin", + "spin 0.9.8", ] +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "leopard-codec" version = "0.1.0" @@ -2417,6 +3735,28 @@ version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libm" version = "0.2.8" @@ -2448,6 +3788,18 @@ dependencies = [ "libc", ] +[[package]] +name = "libz-sys" +version = "1.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2476,6 +3828,15 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchit" version = "0.7.3" @@ -2488,6 +3849,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memuse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" + [[package]] name = "mime" version = "0.3.17" @@ -2610,6 +3977,23 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "neptune" version = "13.0.0" @@ -2622,9 +4006,9 @@ dependencies = [ "blake2s_simd", "blstrs", "byteorder", - "ff", + "ff 0.13.0", "generic-array 0.14.7", - "pasta_curves", + "pasta_curves 0.5.1", "serde", "trait-set", ] @@ -2639,6 +4023,12 @@ dependencies = [ "sha2 0.10.8", ] +[[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" @@ -2650,15 +4040,34 @@ dependencies = [ ] [[package]] -name = "num" -version = "0.4.3" +name = "ntapi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ - "num-bigint 0.4.6", - "num-complex", - "num-integer", - "num-iter", + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[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", ] @@ -2732,6 +4141,21 @@ dependencies = [ "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" @@ -2763,6 +4187,48 @@ dependencies = [ "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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive 0.7.3", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -2772,6 +4238,12 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.36.4" @@ -2787,6 +4259,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "oneshot" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" + [[package]] name = "oorandom" version = "11.1.4" @@ -2799,12 +4277,75 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[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" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -2822,195 +4363,540 @@ dependencies = [ ] [[package]] -name = "pairing" -version = "0.23.0" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p3-air" +version = "0.1.3-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e909ef66fa5d77ff0fd3cb5af4b33b27fa6fb68d02b9b1e70edbc29383e565" dependencies = [ - "group", + "p3-field", + "p3-matrix", ] [[package]] -name = "parity-scale-codec" -version = "3.6.12" +name = "p3-baby-bear" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "46965470aac1cddfe52f535424b59d52f2fffef0fdeb9dbed19da39b1d8f048a" dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", + "num-bigint 0.4.6", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand", "serde", ] [[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" +name = "p3-blake3" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "36ef32d6ea21dd5cf9fec8a31bf0c64e6ceee8901dbf50966b83a443093c2aba" dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 1.0.109", + "blake3", + "p3-symmetric", ] [[package]] -name = "parking_lot" -version = "0.12.3" +name = "p3-bn254-fr" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "7e3edfca6be3b3109adf8e3330baec30c3fc5f9f4d63d27aaec1b471ca51ed67" dependencies = [ - "lock_api", - "parking_lot_core", + "ff 0.13.0", + "num-bigint 0.4.6", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "rand", + "serde", ] [[package]] -name = "parking_lot_core" -version = "0.9.10" +name = "p3-challenger" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "a6662ea899a5d848b60c699944491d72757873b5e1fd46798e4712f90a03a4e9" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "tracing", ] [[package]] -name = "pasta_curves" -version = "0.5.1" +name = "p3-commit" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +checksum = "fc3563918b5cc44ef5280bf9b51753e70dc78802de25e3fb81ed6c94617ccb6e" dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "rand", + "itertools 0.12.1", + "p3-challenger", + "p3-field", + "p3-matrix", + "p3-util", "serde", - "static_assertions", - "subtle", ] [[package]] -name = "paste" -version = "1.0.15" +name = "p3-dft" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "510095701819d83c9509fe825bbf1ebfe50426ae75149df5fe1dcfd18261323a" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] [[package]] -name = "pathdiff" -version = "0.2.1" +name = "p3-field" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "61f1977a0a65789f719aa824119c332c4676b000bdbfe94d312fb6244a70d601" +dependencies = [ + "itertools 0.12.1", + "num-bigint 0.4.6", + "num-traits", + "p3-util", + "rand", + "serde", +] [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "p3-fri" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "c22ddb958f200d9289cc73ff68847b0167ca0c14557b791dd9e318f98c2d1b28" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-interpolation", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] [[package]] -name = "pest" -version = "2.7.12" +name = "p3-interpolation" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" +checksum = "d032cda212f6b408d7d5b0b9a8270a9455acb93742fe55a0880d82be8e90e500" dependencies = [ - "memchr", - "thiserror", - "ucd-trie", + "p3-field", + "p3-matrix", + "p3-util", ] [[package]] -name = "pest_derive" -version = "2.7.12" +name = "p3-keccak" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" +checksum = "7c56abdd5a8a780049d2f8e92cea1df57b55a2ef50a40d1103f2732f7a00e4b1" dependencies = [ - "pest", - "pest_generator", + "p3-symmetric", + "tiny-keccak", ] [[package]] -name = "pest_generator" -version = "2.7.12" +name = "p3-keccak-air" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" +checksum = "e8398f1694ccc38513df0b8cab5f9ef7325423f27cd9e4fa20bdc77d5079cf1b" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.77", + "p3-air", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", + "tracing-forest", + "tracing-subscriber", ] [[package]] -name = "pest_meta" -version = "2.7.12" +name = "p3-matrix" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" +checksum = "d548ee0b834f8e2ebc5037073acd101a3b0ca41a2d1d28a15ba0ccd9059495b0" dependencies = [ - "once_cell", - "pest", - "sha2 0.10.8", + "itertools 0.12.1", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", ] [[package]] -name = "petgraph" -version = "0.6.5" +name = "p3-maybe-rayon" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "55f5575d3d61bedb3e05681abb0f36b8bb339d65aa395d50756bfa64e9cd3f46" dependencies = [ - "fixedbitset", - "indexmap", + "rayon", ] [[package]] -name = "pin-project" -version = "1.1.5" +name = "p3-mds" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "6a6e57ed310d59245f93e24ee805ea7aa16fc9c505551b76a15f5e50f29d177e" dependencies = [ - "pin-project-internal", + "itertools 0.12.1", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand", ] [[package]] -name = "pin-project-internal" -version = "1.1.5" +name = "p3-merkle-tree" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "af46b41cba75d483ec8a553cbab1d2d794935ae3403d75394acfa4fb2c977cce" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "itertools 0.12.1", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", ] [[package]] -name = "pin-project-lite" -version = "0.2.14" +name = "p3-poseidon2" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "adaba6f14c197203530e233badce0ca1126ba3bf3c9ff766505b497bdad0bee1" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", +] [[package]] -name = "pin-utils" -version = "0.1.0" +name = "p3-symmetric" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "57ecc4282566eb14f48be7707f6745c4dff6be664984d59ec0fb1849cd82b5c2" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "serde", +] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "p3-uni-stark" +version = "0.1.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "1af5c038b22b058bf1d49fb1ea3dd6c240a3e46c3278fde5c444e0034f7ffe37" dependencies = [ - "der", - "spki", + "itertools 0.12.1", + "p3-air", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "postcard", + "serde", + "tracing", + "tracing-forest", + "tracing-subscriber", +] + +[[package]] +name = "p3-util" +version = "0.1.3-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79f3fef0e00d9d7246385e758c4cd39b4efcbbcea31752471491ab502631385e" +dependencies = [ + "serde", +] + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "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.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.0", + "group 0.13.0", + "hex", + "lazy_static", + "rand", + "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 = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[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 = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "pest_meta" +version = "2.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.8", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.5.0", +] + +[[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 = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "plotters" version = "0.3.7" @@ -3051,6 +4937,24 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" + +[[package]] +name = "postcard" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3120,6 +5024,9 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", "uint", ] @@ -3128,8 +5035,8 @@ name = "prism-common" version = "0.1.0" dependencies = [ "anyhow", - "blake2", - "bls12_381", + "bincode", + "bls12_381 0.8.0", "borsh", "celestia-types", "hex", @@ -3155,12 +5062,12 @@ version = "0.1.0" dependencies = [ "anyhow", "bellman", - "bls12_381", + "bls12_381 0.8.0", "borsh", "celestia-types", "ed25519", "ed25519-dalek", - "ff", + "ff 0.13.0", "hex", "indexed-merkle-tree", "jmt", @@ -3181,10 +5088,11 @@ dependencies = [ "anyhow", "async-trait", "auto_impl", - "axum", + "axum 0.6.20", "base64 0.22.1", "bellman", - "bls12_381", + "bincode", + "bls12_381 0.8.0", "borsh", "celestia-rpc", "celestia-types", @@ -3195,7 +5103,7 @@ dependencies = [ "dotenvy", "ed25519", "ed25519-dalek", - "ff", + "ff 0.13.0", "hex", "indexed-merkle-tree", "jmt", @@ -3212,6 +5120,7 @@ dependencies = [ "serde_json", "serial_test", "sha2 0.10.8", + "sp1-sdk", "thiserror", "tokio", "toml", @@ -3230,11 +5139,11 @@ dependencies = [ "bellpepper 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "bellpepper-core", "bincode", - "bls12_381", + "bls12_381 0.8.0", "borsh", "celestia-types", "ed25519", - "ff", + "ff 0.13.0", "hex", "indexed-merkle-tree", "itertools 0.13.0", @@ -3322,7 +5231,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax", + "regex-syntax 0.8.4", "rusty-fork", "tempfile", "unarray", @@ -3381,6 +5290,15 @@ dependencies = [ "prost", ] +[[package]] +name = "psm" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" +dependencies = [ + "cc", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -3396,6 +5314,54 @@ dependencies = [ "byteorder", ] +[[package]] +name = "quinn" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.0.0", + "rustls 0.23.13", + "socket2 0.5.7", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand", + "ring 0.17.8", + "rustc-hash 2.0.0", + "rustls 0.23.13", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +dependencies = [ + "libc", + "once_cell", + "socket2 0.5.7", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -3542,8 +5508,17 @@ checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -3554,15 +5529,147 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[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.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.3", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.13", + "rustls-pemfile 2.1.3", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.26.0", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", + "windows-registry", +] + +[[package]] +name = "reqwest-middleware" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +dependencies = [ + "anyhow", + "async-trait", + "http 1.1.0", + "reqwest 0.12.7", + "serde", + "thiserror", + "tower-service", +] + +[[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.8" @@ -3573,8 +5680,8 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin", - "untrusted", + "spin 0.9.8", + "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -3594,9 +5701,21 @@ 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 = "ron" version = "0.8.1" @@ -3609,6 +5728,17 @@ dependencies = [ "serde_derive", ] +[[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 = "ruint" version = "1.12.3" @@ -3696,6 +5826,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -3740,11 +5876,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring", - "rustls-webpki", + "ring 0.17.8", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -3752,7 +5902,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "schannel", "security-framework", ] @@ -3761,19 +5911,46 @@ dependencies = [ name = "rustls-pemfile" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "base64 0.21.7", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "ring", - "untrusted", + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", ] [[package]] @@ -3800,6 +5977,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[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" @@ -3857,14 +6043,26 @@ 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 0.10.8", +] + [[package]] name = "sct" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] @@ -3873,6 +6071,20 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a7b59a5d9b0099720b417b6325d91a52cbf5b3dcb5041d864be53eefa58abc" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -3920,6 +6132,9 @@ name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] [[package]] name = "semver-parser" @@ -3930,6 +6145,18 @@ 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.210" @@ -4022,6 +6249,36 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.5.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "serial_test" version = "3.1.1" @@ -4095,115 +6352,622 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.7", - "keccak", + "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 = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs 4.0.0", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[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", +] + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "thiserror", + "time", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[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.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures", + "httparse", + "log", + "rand", + "sha-1", +] + +[[package]] +name = "sp1-core-executor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fde11e88cf1e7fa272ec3accb643845b1d3a13b9b7840a0357b00acdfdbedf9" +dependencies = [ + "bincode", + "bytemuck", + "elf", + "eyre", + "generic-array 1.1.0", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "log", + "nohash-hasher", + "num", + "p3-field", + "p3-keccak-air", + "p3-maybe-rayon", + "rand", + "rrs-succinct", + "serde", + "serde_with", + "sp1-curves", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "strum", + "strum_macros", + "thiserror", + "tiny-keccak", + "tracing", + "typenum", +] + +[[package]] +name = "sp1-core-machine" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "748ffa83d438905521f389f46fed2de6f3b05b1da2ffc2273194bede11a258fc" +dependencies = [ + "anyhow", + "arrayref", + "bincode", + "blake3", + "bytemuck", + "cfg-if", + "curve25519-dalek", + "elf", + "elliptic-curve", + "generic-array 1.1.0", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "k256", + "log", + "nohash-hasher", + "num", + "num-bigint 0.4.6", + "num_cpus", + "p3-air", + "p3-baby-bear", + "p3-blake3", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-keccak", + "p3-keccak-air", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rand", + "rayon-scan", + "rrs-succinct", + "serde", + "serde_with", + "size", + "snowbridge-amcl", + "sp1-core-executor", + "sp1-curves", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "static_assertions", + "strum", + "strum_macros", + "tempfile", + "thiserror", + "tracing", + "tracing-forest", + "tracing-subscriber", + "typenum", + "web-time", +] + +[[package]] +name = "sp1-curves" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c19d1e60fdd17ec53b8453d7634ed3a136800151412c8d9873944f782c4bc89" +dependencies = [ + "curve25519-dalek", + "dashu", + "elliptic-curve", + "generic-array 1.1.0", + "itertools 0.13.0", + "k256", + "num", + "p3-field", + "serde", + "snowbridge-amcl", + "sp1-primitives", + "sp1-stark", + "typenum", +] + +[[package]] +name = "sp1-derive" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d06fdae1dc74a9085b155d12180825653e530983262b8ad2e57fe15551d17a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "shellexpand" -version = "2.1.2" +name = "sp1-lib" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +checksum = "bea7811abd2d3a991007fcb284f41152840b8388c171288d0c52c6793956609c" dependencies = [ - "dirs 4.0.0", + "anyhow", + "bincode", + "cfg-if", + "hex", + "serde", + "snowbridge-amcl", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "sp1-primitives" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "d13f9b8ac43071ecfe5980a135cbcecb26ecad243165adce8de5aa3746a2af59" +dependencies = [ + "itertools 0.13.0", + "lazy_static", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", +] [[package]] -name = "signal-hook-registry" -version = "1.4.2" +name = "sp1-prover" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "bf5496754989ea23332537094818b4d8bc55e04171fc4f87161493399c2219ad" dependencies = [ - "libc", + "anyhow", + "bincode", + "clap", + "dirs 5.0.1", + "hex", + "itertools 0.13.0", + "num-bigint 0.4.6", + "oneshot", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-field", + "p3-matrix", + "rayon", + "serde", + "serde_json", + "serial_test", + "sp1-core-executor", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-circuit", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-recursion-gnark-ffi", + "sp1-recursion-program", + "sp1-stark", + "subtle-encoding", + "tempfile", + "thiserror", + "tracing", + "tracing-subscriber", ] [[package]] -name = "signature" -version = "2.2.0" +name = "sp1-recursion-circuit" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +checksum = "ab0ee89dd4928419672f046a472b3e0114e405805d96de9f39e4e83d323778ab" dependencies = [ - "rand_core", + "bincode", + "itertools 0.13.0", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-commit", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-util", + "serde", + "sp1-core-machine", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-recursion-derive", + "sp1-recursion-program", + "sp1-stark", ] [[package]] -name = "slab" -version = "0.4.9" +name = "sp1-recursion-compiler" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "d89d0dcf2766edd698ecc336c90d6a228759ee716fc6e24a8e3927210e2536de" dependencies = [ - "autocfg", + "backtrace", + "itertools 0.13.0", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-commit", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "rayon", + "serde", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-core", + "sp1-recursion-core-v2", + "sp1-recursion-derive", + "sp1-stark", + "tracing", + "vec_map", ] [[package]] -name = "smallvec" -version = "1.13.2" +name = "sp1-recursion-core" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "fef244f580afc3c783880cdee7e26c56eb1d3c4522e2c98bd89f79366c3d92a1" +dependencies = [ + "arrayref", + "backtrace", + "ff 0.13.0", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num_cpus", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "serde", + "serde_with", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "static_assertions", + "tracing", + "zkhash", +] [[package]] -name = "snowbridge-amcl" -version = "1.0.2" +name = "sp1-recursion-core-v2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" +checksum = "8d82adbabcf41de013fb7394c06437937fd740c5005e760a215bfc2196f993ae" dependencies = [ - "parity-scale-codec", - "scale-info", + "arrayref", + "backtrace", + "ff 0.13.0", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num_cpus", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "serde", + "serde_with", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-recursion-core", + "sp1-stark", + "static_assertions", + "thiserror", + "tracing", + "vec_map", + "zkhash", ] [[package]] -name = "socket2" -version = "0.4.10" +name = "sp1-recursion-derive" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "168c1e526a6c8b3877f360fae3fb545bdf0ce7e11e77878170775eeb87c9a043" dependencies = [ - "libc", - "winapi", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "socket2" -version = "0.5.7" +name = "sp1-recursion-gnark-ffi" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "1100ea8ab4374397aafb7f89b6d5d60ed8d5040b51f6db22bd3f9807204b13a1" dependencies = [ - "libc", - "windows-sys 0.52.0", + "anyhow", + "bincode", + "bindgen", + "cc", + "cfg-if", + "hex", + "log", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-field", + "p3-symmetric", + "rand", + "serde", + "serde_json", + "sha2 0.10.8", + "sp1-core-machine", + "sp1-recursion-compiler", + "sp1-stark", + "tempfile", ] [[package]] -name = "soketto" -version = "0.7.1" +name = "sp1-recursion-program" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +checksum = "35252bdd8b0bd54f37d1df5ec9ef10de0d301550e6a5fc660de134f1b126da78" dependencies = [ - "base64 0.13.1", - "bytes", - "futures", - "httparse", - "log", + "itertools 0.13.0", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-util", "rand", - "sha-1", + "serde", + "sp1-core-executor", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-stark", + "stacker", + "tracing", ] [[package]] -name = "sp1-lib" +name = "sp1-sdk" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea7811abd2d3a991007fcb284f41152840b8388c171288d0c52c6793956609c" +checksum = "85a21138889b9cbe9b72a652162dad26b904e07dccbbbc10adb4b081abdd4f80" dependencies = [ + "alloy-sol-types", "anyhow", + "async-trait", "bincode", "cfg-if", + "dirs 5.0.1", + "ethers", + "futures", + "getrandom", + "hashbrown 0.14.5", "hex", + "indicatif", + "log", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-commit", + "p3-field", + "p3-fri", + "p3-matrix", + "prost", + "reqwest 0.12.7", + "reqwest-middleware", "serde", - "snowbridge-amcl", + "serde_json", + "sha2 0.10.8", + "sp1-core-executor", + "sp1-core-machine", + "sp1-prover", + "sp1-stark", + "strum", + "strum_macros", + "sysinfo", + "tempfile", + "thiserror", + "tokio", + "tracing", + "twirp-rs", + "vergen", +] + +[[package]] +name = "sp1-stark" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfae288fe87c6c9fe5f15c04ad38605f2e8e27f86d1e4228359e36a20f003c68" +dependencies = [ + "arrayref", + "getrandom", + "hashbrown 0.14.5", + "itertools 0.13.0", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rayon-scan", + "serde", + "sp1-derive", + "sp1-primitives", + "tracing", ] [[package]] @@ -4224,6 +6988,12 @@ dependencies = [ "sp1-lib", ] +[[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" @@ -4250,6 +7020,19 @@ dependencies = [ "which", ] +[[package]] +name = "stacker" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -4262,6 +7045,28 @@ 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.77", +] + [[package]] name = "subtle" version = "2.6.1" @@ -4269,59 +7074,137 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "subtle-encoding" -version = "0.5.1" +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[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.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" dependencies = [ - "zeroize", + "futures-core", ] [[package]] -name = "subtle-ng" -version = "2.5.0" +name = "sysinfo" +version = "0.30.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows", +] [[package]] -name = "syn" -version = "1.0.109" +name = "system-configuration" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys 0.5.0", ] [[package]] -name = "syn" -version = "2.0.77" +name = "system-configuration" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "system-configuration-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.77", + "core-foundation-sys", + "libc", ] [[package]] -name = "sync_wrapper" -version = "0.1.2" +name = "system-configuration-sys" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] name = "tap" @@ -4377,6 +7260,16 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -4482,13 +7375,34 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.13", + "rustls-pki-types", "tokio", ] @@ -4533,7 +7447,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.5.0", "toml_datetime", "winnow 0.5.40", ] @@ -4544,7 +7458,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", @@ -4577,8 +7491,8 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "http-range-header", "pin-project-lite", "tower-layer", @@ -4627,6 +7541,59 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 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", + "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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -4646,6 +7613,29 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "twirp-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa3161d8eee0abcad4e762f4215381a430cc1281870d575b0f1e4fbfc74b8ce" +dependencies = [ + "async-trait", + "axum 0.7.5", + "bytes", + "futures", + "http 1.1.0", + "http-body-util", + "hyper 1.4.1", + "prost", + "reqwest 0.12.7", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "url", +] + [[package]] name = "typenum" version = "1.17.0" @@ -4712,6 +7702,12 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + [[package]] name = "unicode-xid" version = "0.2.5" @@ -4740,6 +7736,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" +[[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" @@ -4769,7 +7771,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82b1bc5417102a73e8464c686eef947bdfb99fcdfc0a4f228e81afa9526470a" dependencies = [ - "indexmap", + "indexmap 2.5.0", "serde", "serde_json", "utoipa-gen", @@ -4794,7 +7796,7 @@ version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84614caa239fb25b2bb373a52859ffd94605ceb256eeb1d63436325cf81e3653" dependencies = [ - "axum", + "axum 0.6.20", "mime_guess", "regex", "rust-embed", @@ -4804,12 +7806,34 @@ dependencies = [ "zip", ] +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + [[package]] name = "valuable" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[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" + [[package]] name = "vergen" version = "8.3.2" @@ -4818,6 +7842,7 @@ checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" dependencies = [ "anyhow", "cfg-if", + "git2", "rustversion", "time", ] @@ -4888,6 +7913,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.93" @@ -4917,6 +7954,19 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +[[package]] +name = "wasm-streams" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.70" @@ -4927,6 +7977,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "which" version = "4.4.2" @@ -4970,6 +8039,55 @@ 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", + "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-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5136,6 +8254,35 @@ 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 = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wyz" version = "0.5.1" @@ -5206,3 +8353,30 @@ dependencies = [ "crossbeam-utils", "flate2", ] + +[[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 0.7.1", + "byteorder", + "cfg-if", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand", + "serde", + "sha2 0.10.8", + "sha3", + "subtle", +] diff --git a/Cargo.toml b/Cargo.toml index 0eeb2a3..655de03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,29 +65,26 @@ keystore-rs = "0.1.0" toml = "0.8.14" dirs = "5.0.1" anyhow = "1.0.44" -jmt = { version = "0.10.0", features = ["mocks"] } +jmt = { git = "https://github.com/deltadevsde/jmt", branch = "rehashing-circuit", features = [ + "mocks", +] } bellpepper-core = { version = "0.4.0", default-features = false } bellpepper = "0.4.1" -itertools = "0.13.0" # zip_eq -arecibo = "0.2.0" +itertools = "0.13.0" # zip_eq +arecibo = { git = "https://github.com/deltadevsde/arecibo" } sha2 = "0.10.8" auto_impl = "1.2.0" bincode = "1.3.3" -blake2 = "0.10.6" sp1-zkvm = { version = "1.2.0" } +sp1-sdk = { version = "1.2.0" } prism-common = { path = "crates/common" } prism-nova = { path = "crates/nova" } prism-errors = { path = "crates/errors" } prism-main = { path = "crates/prism" } prism-groth16 = { path = "crates/groth16" } -sp1-helper = "1.2.0" [patch.crates-io] sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", package = "sha2", branch = "patch-sha2-v0.10.8" } -arecibo = { git = "https://github.com/deltadevsde/arecibo" } -jmt = { git = "https://github.com/deltadevsde/jmt", branch = "rehashing-circuit", features = [ - "mocks", -] } # [workspace.dev-dependencies] # serial_test = "3.1.1" diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index b1d85b9..0858070 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -14,5 +14,5 @@ jmt.workspace = true serde.workspace = true hex.workspace = true sha2.workspace = true -blake2.workspace = true celestia-types.workspace = true +bincode.workspace = true diff --git a/crates/common/src/hashchain.rs b/crates/common/src/hashchain.rs index 9b96c6b..0f1e56d 100644 --- a/crates/common/src/hashchain.rs +++ b/crates/common/src/hashchain.rs @@ -1,5 +1,4 @@ use anyhow::{bail, Result}; -use borsh::{BorshDeserialize, BorshSerialize}; use jmt::KeyHash; use serde::{Deserialize, Serialize}; use std::ops::{Deref, DerefMut}; @@ -9,7 +8,7 @@ use crate::{ tree::{hash, Digest, Hasher}, }; -#[derive(Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, Debug, PartialEq)] +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] pub struct Hashchain { pub id: String, pub entries: Vec, @@ -131,7 +130,7 @@ impl Hashchain { } } -#[derive(Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, Debug, PartialEq)] +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] // A [`HashchainEntry`] represents a single entry in an account's hashchain. // The value in the leaf of the corresponding account's node in the IMT is the hash of the last node in the hashchain. pub struct HashchainEntry { diff --git a/crates/common/src/operation.rs b/crates/common/src/operation.rs index f0ecad5..d55d787 100644 --- a/crates/common/src/operation.rs +++ b/crates/common/src/operation.rs @@ -1,10 +1,9 @@ use anyhow::{Context, Result}; -use borsh::{BorshDeserialize, BorshSerialize}; use celestia_types::Blob; use serde::{Deserialize, Serialize}; use std::fmt::Display; -#[derive(Clone, BorshDeserialize, BorshSerialize, Serialize, Deserialize, Debug, PartialEq)] +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] // An [`Operation`] represents a state transition in the system. // In a blockchain analogy, this would be the full set of our transaction types. pub enum Operation { @@ -26,7 +25,7 @@ pub enum Operation { }, } -#[derive(Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, Debug, PartialEq)] +#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] // An [`AccountSource`] represents the source of an account. See adr-002 for more information. pub enum AccountSource { SignedBySequencer { signature: String }, @@ -61,7 +60,7 @@ impl TryFrom<&Blob> for Operation { type Error = anyhow::Error; fn try_from(value: &Blob) -> Result { - borsh::from_slice::(&value.data) + bincode::deserialize(&value.data) .context(format!("Failed to decode blob into Operation: {value:?}")) } } diff --git a/crates/common/src/tree.rs b/crates/common/src/tree.rs index f38588e..cc7018b 100644 --- a/crates/common/src/tree.rs +++ b/crates/common/src/tree.rs @@ -1,12 +1,12 @@ use anyhow::{anyhow, bail, Context, Result}; +use bincode; use bls12_381::Scalar; -use borsh::{from_slice, to_vec, BorshDeserialize, BorshSerialize}; use jmt::{ proof::{SparseMerkleProof, UpdateMerkleProof}, storage::{NodeBatch, TreeReader, TreeUpdateBatch, TreeWriter}, JellyfishMerkleTree, KeyHash, RootHash, SimpleHasher, }; -use serde::{Deserialize, Serialize}; +use serde::{ser::SerializeTupleStruct, Deserialize, Serialize}; use std::sync::Arc; use crate::hashchain::Hashchain; @@ -14,11 +14,65 @@ use crate::hashchain::Hashchain; pub const SPARSE_MERKLE_PLACEHOLDER_HASH: Digest = Digest::new(*b"SPARSE_MERKLE_PLACEHOLDER_HASH__"); -pub type Hasher = blake2::Blake2s256; +#[derive(Debug, Clone, Default)] +pub struct Hasher(sha2::Sha256); -#[derive( - Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize, PartialEq, Eq, Copy, -)] +impl Serialize for Hasher { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_tuple_struct("Sha256Wrapper", 0)?.end() + } +} + +impl<'de> Deserialize<'de> for Hasher { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct Sha256WrapperVisitor; + + impl<'de> serde::de::Visitor<'de> for Sha256WrapperVisitor { + type Value = Hasher; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a Sha256Wrapper") + } + + fn visit_seq(self, _seq: A) -> Result + where + A: serde::de::SeqAccess<'de>, + { + Ok(Hasher::default()) + } + } + + deserializer.deserialize_tuple_struct("Sha256Wrapper", 0, Sha256WrapperVisitor) + } +} + +impl SimpleHasher for Hasher { + fn new() -> Self { + Self(sha2::Sha256::new()) + } + + fn update(&mut self, data: &[u8]) { + self.0.update(data); + } + + fn finalize(self) -> [u8; 32] { + self.0.finalize() + } +} + +pub fn hash(data: &[u8]) -> Digest { + let mut hasher = Hasher::new(); + hasher.update(data); + Digest(hasher.finalize()) +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Copy)] pub struct Digest([u8; 32]); impl Digest { @@ -97,12 +151,6 @@ impl Digest { } } -pub fn hash(data: &[u8]) -> Digest { - let mut hasher = blake2::Blake2s256::new(); - hasher.update(data); - Digest(hasher.finalize()) -} - #[derive(Serialize, Deserialize)] pub struct Batch { pub prev_root: Digest, @@ -111,49 +159,13 @@ pub struct Batch { pub proofs: Vec, } -impl Serialize for Proof { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let bytes = borsh::to_vec(self).map_err(serde::ser::Error::custom)?; - serializer.serialize_bytes(&bytes) - } -} - -impl<'de> Deserialize<'de> for Proof { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - struct ProofVisitor; - - impl<'de> serde::de::Visitor<'de> for ProofVisitor { - type Value = Proof; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("a byte array containing Borsh-serialized Proof") - } - - fn visit_bytes(self, v: &[u8]) -> Result - where - E: serde::de::Error, - { - Proof::try_from_slice(v).map_err(serde::de::Error::custom) - } - } - - deserializer.deserialize_bytes(ProofVisitor) - } -} - -#[derive(BorshSerialize, BorshDeserialize, Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum Proof { Update(UpdateProof), Insert(InsertProof), } -#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct NonMembershipProof { pub root: Digest, pub proof: SparseMerkleProof, @@ -166,7 +178,7 @@ impl NonMembershipProof { } } -#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct InsertProof { pub non_membership_proof: NonMembershipProof, @@ -181,7 +193,7 @@ impl InsertProof { .verify() .context("Invalid NonMembershipProof")?; - let value = to_vec(&self.value).unwrap(); + let value = bincode::serialize(&self.value).unwrap(); self.membership_proof.clone().verify_existence( self.new_root.into(), @@ -193,7 +205,7 @@ impl InsertProof { } } -#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct UpdateProof { pub old_root: RootHash, pub new_root: RootHash, @@ -206,7 +218,7 @@ pub struct UpdateProof { impl UpdateProof { pub fn verify(&self) -> Result<()> { - let new_value = to_vec(&self.new_value).unwrap(); + let new_value = bincode::serialize(&self.new_value).unwrap(); self.proof.clone().verify_update( self.old_root, @@ -278,11 +290,12 @@ where } fn serialize_value(value: &Hashchain) -> Result> { - to_vec(value).map_err(|e| anyhow!("Failed to serialize value: {}", e)) + bincode::serialize(value).map_err(|e| anyhow!("Failed to serialize value: {}", e)) } fn deserialize_value(bytes: &[u8]) -> Result { - from_slice::(bytes).map_err(|e| anyhow!("Failed to deserialize value: {}", e)) + bincode::deserialize::(bytes) + .map_err(|e| anyhow!("Failed to deserialize value: {}", e)) } } @@ -294,7 +307,6 @@ where let serialized_value = Self::serialize_value(&value)?; let old_root = self.get_current_root()?; - println!("key: {:?}", key); let (old_value, non_membership_merkle_proof) = self.jmt.get_with_proof(key, self.epoch)?; let non_membership_proof = NonMembershipProof { diff --git a/crates/groth16/src/lib.rs b/crates/groth16/src/lib.rs index 9dec6d3..13adb53 100644 --- a/crates/groth16/src/lib.rs +++ b/crates/groth16/src/lib.rs @@ -1,7 +1,6 @@ use anyhow::{anyhow, Context, Result}; use bellman::{groth16, Circuit, ConstraintSystem, SynthesisError}; use bls12_381::{Bls12, G1Affine, G2Affine, Scalar}; -use borsh::{BorshDeserialize, BorshSerialize}; use prism_errors::{GeneralError, PrismError}; use std::fmt; @@ -38,11 +37,11 @@ impl Circuit for ProofVariantCircuit { } /// G1 represents a compressed [`bls12_381::G1Affine`] -#[derive(BorshSerialize, BorshDeserialize, Clone)] +#[derive(Clone)] pub struct G1([u8; 48]); /// G2 represents a compressed [`bls12_381::G2Affine`] -#[derive(BorshSerialize, BorshDeserialize, Clone)] +#[derive(Clone)] pub struct G2([u8; 96]); // Debug impls for the Affines print their hex representation @@ -84,7 +83,7 @@ impl TryFrom for bls12_381::G2Affine { } } -#[derive(Clone, BorshSerialize, BorshDeserialize, Debug)] +#[derive(Clone, Debug)] pub struct Bls12Proof { pub a: G1, pub b: G2, @@ -113,7 +112,7 @@ impl From> for Bls12Proof { } } -#[derive(Clone, BorshSerialize, BorshDeserialize, Debug)] +#[derive(Clone, Debug)] pub struct VerifyingKey { pub alpha_g1: G1, pub beta_g1: G1, diff --git a/crates/prism/Cargo.toml b/crates/prism/Cargo.toml index dbc8d2a..6933620 100644 --- a/crates/prism/Cargo.toml +++ b/crates/prism/Cargo.toml @@ -6,6 +6,11 @@ license.workspace = true homepage.workspace = true repository.workspace = true + +[features] +default = [] +plonk = [] + [dependencies] axum = { workspace = true } borsh = { workspace = true } @@ -21,6 +26,7 @@ ed25519 = { workspace = true } base64 = { workspace = true } tokio = { workspace = true } bellman = { workspace = true } +bincode = { workspace = true } bls12_381 = { workspace = true } rand = { workspace = true } hex = { workspace = true } @@ -45,6 +51,7 @@ auto_impl = { workspace = true } prism-common = { workspace = true } prism-errors = { workspace = true } prism-groth16 = { workspace = true } +sp1-sdk = { workspace = true } [dev-dependencies] serial_test = "3.1.1" diff --git a/crates/prism/src/da/celestia.rs b/crates/prism/src/da/celestia.rs index e3d7734..bd4e47d 100644 --- a/crates/prism/src/da/celestia.rs +++ b/crates/prism/src/da/celestia.rs @@ -3,13 +3,12 @@ use crate::{ consts::CHANNEL_BUFFER_SIZE, da::{DataAvailabilityLayer, FinalizedEpoch}, }; -use prism_errors::{DataAvailabilityError, GeneralError}; use anyhow::{anyhow, bail, Context, Result}; use async_trait::async_trait; -use borsh::from_slice; use celestia_rpc::{BlobClient, Client, HeaderClient}; use celestia_types::{blob::GasPrice, nmt::Namespace, Blob}; use prism_common::operation::Operation; +use prism_errors::{DataAvailabilityError, GeneralError}; use std::{self, sync::Arc}; use tokio::{ sync::{ @@ -19,11 +18,13 @@ use tokio::{ task::spawn, }; +use bincode; + impl TryFrom<&Blob> for FinalizedEpoch { type Error = anyhow::Error; fn try_from(value: &Blob) -> Result { - from_slice::(&value.data).context(format!( + bincode::deserialize(&value.data).context(format!( "Failed to decode blob into FinalizedEpoch: {value:?}" )) } @@ -140,7 +141,7 @@ impl DataAvailabilityLayer for CelestiaConnection { let blobs: Result, DataAvailabilityError> = epochs .iter() .map(|epoch| { - let data = borsh::to_vec(epoch).map_err(|e| { + let data = bincode::serialize(epoch).map_err(|e| { DataAvailabilityError::GeneralError(GeneralError::ParsingError(format!( "serializing epoch {}: {}", epoch.height, e @@ -199,7 +200,7 @@ impl DataAvailabilityLayer for CelestiaConnection { let blobs: Result, _> = operations .iter() .map(|operation| { - let data = borsh::to_vec(operation) + let data = bincode::serialize(operation) .context(format!("Failed to serialize operation {}", operation)) .map_err(|e| { DataAvailabilityError::GeneralError(GeneralError::ParsingError( diff --git a/crates/prism/src/da/mod.rs b/crates/prism/src/da/mod.rs index 2a279fc..7fc90c8 100644 --- a/crates/prism/src/da/mod.rs +++ b/crates/prism/src/da/mod.rs @@ -1,23 +1,24 @@ use crate::utils::SignedContent; use anyhow::Result; use async_trait::async_trait; -use borsh::{BorshDeserialize, BorshSerialize}; +use bincode; use ed25519::Signature; use prism_common::{operation::Operation, tree::Digest}; use prism_errors::GeneralError; +use serde::{Deserialize, Serialize}; +use sp1_sdk::SP1ProofWithPublicValues; use std::{self, str::FromStr}; pub mod celestia; pub mod memory; // FinalizedEpoch is the data structure that represents the finalized epoch data, and is posted to the DA layer. -#[derive(BorshSerialize, BorshDeserialize, Clone, Debug)] +#[derive(Serialize, Deserialize, Clone, Debug)] pub struct FinalizedEpoch { pub height: u64, pub prev_commitment: Digest, pub current_commitment: Digest, - // pub proof: Bls12Proof, - // pub verifying_key: VerifyingKey, + pub proof: SP1ProofWithPublicValues, pub signature: Option, } @@ -33,7 +34,7 @@ impl SignedContent for FinalizedEpoch { fn get_plaintext(&self) -> Result> { let mut copy = self.clone(); copy.signature = None; - borsh::to_vec(©).map_err(|e| GeneralError::EncodingError(e.to_string()).into()) + bincode::serialize(©).map_err(|e| GeneralError::EncodingError(e.to_string()).into()) } fn get_public_key(&self) -> Result { diff --git a/crates/prism/src/main.rs b/crates/prism/src/main.rs index 7f080e7..67db55a 100644 --- a/crates/prism/src/main.rs +++ b/crates/prism/src/main.rs @@ -18,6 +18,8 @@ use storage::RedisConnection; #[macro_use] extern crate log; +pub const PRISM_ELF: &[u8] = include_bytes!("../../../elf/riscv32im-succinct-zkvm-elf"); + /// The main function that initializes and runs a prism client. #[tokio::main()] async fn main() -> std::io::Result<()> { diff --git a/crates/prism/src/node_types/lightclient.rs b/crates/prism/src/node_types/lightclient.rs index fdbe231..bb2f43d 100644 --- a/crates/prism/src/node_types/lightclient.rs +++ b/crates/prism/src/node_types/lightclient.rs @@ -1,17 +1,22 @@ use crate::cfg::CelestiaConfig; use anyhow::{Context, Result}; use async_trait::async_trait; +use prism_common::tree::Digest; use prism_errors::{DataAvailabilityError, GeneralError}; +use sp1_sdk::{ProverClient, SP1VerifyingKey}; use std::{self, sync::Arc, time::Duration}; use tokio::{task::spawn, time::interval}; use crate::{da::DataAvailabilityLayer, node_types::NodeType, utils::verify_signature}; +pub const PRISM_ELF: &[u8] = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); + pub struct LightClient { pub da: Arc, - // verifying_key is the [`VerifyingKey`] used to verify epochs from the prover/sequencer - pub verifying_key: Option, - start_height: u64, + pub sequencer_pubkey: Option, + pub client: ProverClient, + pub verifying_key: SP1VerifyingKey, + pub start_height: u64, } #[async_trait] @@ -35,11 +40,15 @@ impl LightClient { pub fn new( da: Arc, cfg: CelestiaConfig, - sequencer_pub_key: Option, + sequencer_pubkey: Option, ) -> LightClient { + let client = ProverClient::new(); + let (_, verifying_key) = client.setup(PRISM_ELF); LightClient { da, - verifying_key: sequencer_pub_key, + verifying_key, + client, + sequencer_pubkey, start_height: cfg.start_height, } } @@ -71,33 +80,15 @@ impl LightClient { // todo: verify adjacency to last heights, <- for this we need some sort of storage of epochs for epoch_json in epoch_json_vec { - // let prev_commitment = &epoch_json.prev_commitment; - // let current_commitment = &epoch_json.current_commitment; - - // let proof = match epoch_json.proof.clone().try_into() { - // Ok(proof) => proof, - // Err(e) => { - // error!("failed to deserialize proof, skipping a blob at height {}: {:?}", i, e); - // continue; - // } - // }; - - // TODO(@distractedm1nd): i don't know rust yet but this seems like non-idiomatic rust - - // is there not a Trait that can satisfy these properties for us? - // let verifying_key = match epoch_json.verifying_key.clone().try_into() { - // Ok(vk) => vk, - // Err(e) => { - // error!("failed to deserialize verifying key, skipping a blob at height {}: {:?}", i, e); - // continue; - // } - // }; + let _prev_commitment = &epoch_json.prev_commitment; + let _current_commitment = &epoch_json.current_commitment; // if the user does not add a verifying key, we will not verify the signature, // but only log a warning on startup - if self.verifying_key.is_some() { + if self.sequencer_pubkey.is_some() { match verify_signature( &epoch_json.clone(), - self.verifying_key.clone(), + self.sequencer_pubkey.clone(), ) { Ok(_) => trace!( "valid signature for epoch {}", @@ -109,20 +100,40 @@ impl LightClient { } } - // match validate_epoch( - // prev_commitment, - // current_commitment, - // proof, - // verifying_key, - // ) { - // Ok(_) => { - // info!( - // "zkSNARK for epoch {} was validated successfully", - // epoch_json.height - // ) - // } - // Err(err) => panic!("failed to validate epoch: {:?}", err), - // } + let prev_commitment = &epoch_json.prev_commitment; + let current_commitment = &epoch_json.current_commitment; + + let mut public_values = epoch_json.proof.public_values.clone(); + let proof_prev_commitment: Digest = public_values.read(); + let proof_current_commitment: Digest = public_values.read(); + + if prev_commitment != &proof_prev_commitment + || current_commitment != &proof_current_commitment + { + error!( + "Commitment mismatch: + prev_commitment: {:?}, proof_prev_commitment: {:?}, + current_commitment: {:?}, proof_current_commitment: {:?}", + prev_commitment, + proof_prev_commitment, + current_commitment, + proof_current_commitment + ); + panic!("Commitment mismatch in epoch {}", epoch_json.height); + } + + match self.client.verify(&epoch_json.proof, &self.verifying_key) { + Ok(_) => { + info!( + "zkSNARK for epoch {} was validated successfully", + epoch_json.height + ) + } + Err(err) => panic!( + "failed to validate epoch at height {}: {:?}", + epoch_json.height, err + ), + } } } Err(e) => { diff --git a/crates/prism/src/node_types/sequencer.rs b/crates/prism/src/node_types/sequencer.rs index ffb2518..e81fff8 100644 --- a/crates/prism/src/node_types/sequencer.rs +++ b/crates/prism/src/node_types/sequencer.rs @@ -3,7 +3,7 @@ use async_trait::async_trait; use ed25519::Signature; use ed25519_dalek::{Signer, SigningKey}; use jmt::KeyHash; -use prism_common::tree::{hash, Digest, Hasher, KeyDirectoryTree, Proof, SnarkableTree}; +use prism_common::tree::{hash, Batch, Digest, Hasher, KeyDirectoryTree, Proof, SnarkableTree}; use std::{self, str::FromStr, sync::Arc}; use tokio::{ sync::{ @@ -14,6 +14,8 @@ use tokio::{ time::interval, }; +use sp1_sdk::{ProverClient, SP1ProvingKey, SP1Stdin, SP1VerifyingKey}; + #[cfg(test)] use prism_errors::DataAvailabilityError; @@ -31,6 +33,8 @@ use prism_common::{ }; use prism_errors::{DatabaseError, GeneralError}; +pub const PRISM_ELF: &[u8] = include_bytes!("../../../../elf/riscv32im-succinct-zkvm-elf"); + pub struct Sequencer { pub db: Arc, pub da: Arc, @@ -47,6 +51,10 @@ pub struct Sequencer { // posted to the DA layer. pending_operations: Arc>>, tree: Arc>>>, + prover_client: Arc>, + + proving_key: SP1ProvingKey, + verifying_key: SP1VerifyingKey, epoch_buffer_tx: Arc>, epoch_buffer_rx: Arc>>, @@ -86,13 +94,19 @@ impl Sequencer { // Create the KeyDirectory let tree = Arc::new(Mutex::new(KeyDirectoryTree::new(db.clone()))); + let prover_client = ProverClient::new(); + + let (pk, vk) = prover_client.setup(PRISM_ELF); Ok(Sequencer { db: db.clone(), da, ws: WebServer::new(ws), + proving_key: pk, + verifying_key: vk, key, start_height, + prover_client: Arc::new(Mutex::new(prover_client)), tree, pending_operations: Arc::new(Mutex::new(Vec::new())), epoch_buffer_tx: Arc::new(tx), @@ -305,24 +319,38 @@ impl Sequencer { .set_commitment(&epoch, ¤t_commitment) .context("Failed to add commitment for new epoch")?; - // let batch_circuit = - // BatchMerkleProofCircuit::new(&prev_commitment, ¤t_commitment, proofs) - // .context("Failed to create BatchMerkleProofCircuit")?; - // let (proof, verifying_key) = batch_circuit - // .create_and_verify_snark() - // .context("Failed to create and verify snark")?; + let batch = Batch { + prev_root: prev_commitment, + new_root: current_commitment, + proofs, + }; + + let mut stdin = SP1Stdin::new(); + stdin.write(&batch); + + let client = self.prover_client.lock().await; + + info!("generating proof for epoch height {}", epoch); + #[cfg(not(feature = "plonk"))] + let proof = client.prove(&self.proving_key, stdin).run()?; + + #[cfg(feature = "plonk")] + let proof = client.prove(&self.proving_key, stdin).plonk().run()?; + info!("successfully generated proof for epoch height {}", epoch); + + client.verify(&proof, &self.verifying_key)?; + info!("verified proof for epoch height {}", epoch); let epoch_json = FinalizedEpoch { height: epoch, prev_commitment, current_commitment, - // proof: proof.into(), - // verifying_key: verifying_key.into(), + proof, signature: None, }; let serialized_epoch_json_without_signature = - borsh::to_vec(&epoch_json).context("Failed to serialize epoch json")?; + bincode::serialize(&epoch_json).context("Failed to serialize epoch json")?; let signature = self .key .sign(serialized_epoch_json_without_signature.as_slice()) @@ -653,6 +681,36 @@ mod tests { assert_eq!(epoch2.prev_commitment, epoch1.current_commitment); } + #[tokio::test] + #[serial] + async fn test_commitment_verification() { + let sequencer = create_test_sequencer().await; + + // First epoch + let operations1 = vec![ + create_new_account_operation( + "user1@example.com".to_string(), + "value1".to_string(), + sequencer.key.clone(), + ) + .operation, + ]; + let epoch1 = sequencer.finalize_epoch(operations1).await.unwrap(); + + let mut public_values = epoch1.proof.public_values.clone(); + let proof_prev_commitment: Digest = public_values.read(); + let proof_current_commitment: Digest = public_values.read(); + + assert_eq!( + &epoch1.prev_commitment, &proof_prev_commitment, + "Previous commitment mismatch" + ); + assert_eq!( + &epoch1.current_commitment, &proof_current_commitment, + "Current commitment mismatch" + ); + } + #[tokio::test] #[serial] async fn test_process_operation_add() { diff --git a/crates/prism/src/storage.rs b/crates/prism/src/storage.rs index c2d2156..ff465f1 100644 --- a/crates/prism/src/storage.rs +++ b/crates/prism/src/storage.rs @@ -91,9 +91,9 @@ impl RedisConnection { impl TreeReader for RedisConnection { fn get_node_option(&self, node_key: &NodeKey) -> Result> { let mut con = self.lock_connection()?; - let serialized_key = hex::encode(borsh::to_vec(node_key)?); + let serialized_key = hex::encode(bincode::serialize(node_key)?); let node_data: Option> = con.get(format!("node:{}", serialized_key))?; - Ok(node_data.map(|data| borsh::from_slice(&data).unwrap())) + Ok(node_data.map(|data| bincode::deserialize(&data).unwrap())) } fn get_rightmost_leaf(&self) -> Result> { @@ -103,10 +103,10 @@ impl TreeReader for RedisConnection { for key in keys { let node_data: Vec = con.get(&key)?; - let node: Node = borsh::from_slice(&node_data)?; + let node: Node = bincode::deserialize(&node_data)?; if let Node::Leaf(leaf_node) = node { let node_key_bytes = hex::decode(key.strip_prefix("node:").unwrap())?; - let node_key: NodeKey = borsh::from_slice(&node_key_bytes)?; + let node_key: NodeKey = bincode::deserialize(&node_key_bytes)?; if rightmost.is_none() || leaf_node.key_hash() > rightmost.as_ref().unwrap().1.key_hash() { @@ -146,8 +146,8 @@ impl TreeWriter for RedisConnection { let mut pipe = redis::pipe(); for (node_key, node) in node_batch.nodes() { - let serialized_key = hex::encode(borsh::to_vec(node_key)?); - let node_data = borsh::to_vec(node)?; + let serialized_key = hex::encode(bincode::serialize(node_key)?); + let node_data = bincode::serialize(node)?; pipe.set(format!("node:{}", serialized_key), node_data); } diff --git a/crates/sp1/src/main.rs b/crates/sp1/src/main.rs index 29d985c..8526719 100644 --- a/crates/sp1/src/main.rs +++ b/crates/sp1/src/main.rs @@ -7,6 +7,8 @@ pub fn main() { println!("cycle-tracker-start: setup"); let batch = sp1_zkvm::io::read::(); let mut current = batch.prev_root; + sp1_zkvm::io::commit_slice(¤t.to_bytes()); + println!("cycle-tracker-end: setup"); println!("cycle-tracker-start: proof-iteration"); diff --git a/elf/riscv32im-succinct-zkvm-elf b/elf/riscv32im-succinct-zkvm-elf new file mode 100755 index 0000000000000000000000000000000000000000..d5de1531da3aabe2ffc572607a50ac96a68aed44 GIT binary patch literal 370596 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%0D&WU$@F@PH3V2l42Ig-( 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

Yxtps?_@E`s} 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 literal 0 HcmV?d00001