From 172106608ac6839d80d9c4e31443c319c685c953 Mon Sep 17 00:00:00 2001 From: umadayal Date: Wed, 29 Jan 2025 14:18:20 -0800 Subject: [PATCH] perf(prover): powers of alpha (#2000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: nhtyy Co-authored-by: Yuwen Zhang Co-authored-by: jtguibas Co-authored-by: Ratan Kaliani Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: rkm0959 Co-authored-by: Aurélien <3535019+leruaa@users.noreply.github.com> Co-authored-by: Matthias Seitz Co-authored-by: srdtrk <59252793+srdtrk@users.noreply.github.com> Co-authored-by: Matt Stam Co-authored-by: Ivan Mikushin Co-authored-by: Abishek Bashyal Co-authored-by: DevOrbitlabs Co-authored-by: Gengar Co-authored-by: crStiv Co-authored-by: Chris T. --- Cargo.lock | 264 +++++---- audits/sp1-v4.md | 2 +- crates/core/machine/src/utils/test.rs | 7 +- crates/recursion/circuit/Cargo.toml | 1 + crates/stark/src/folder.rs | 16 +- crates/stark/src/lookup/debug.rs | 3 +- crates/stark/src/machine.rs | 434 ++++++++------- crates/stark/src/permutation.rs | 42 ++ crates/stark/src/prover.rs | 18 +- crates/stark/src/quotient.rs | 5 +- examples/Cargo.lock | 656 ++++++++++++----------- examples/elf/riscv32im-succinct-zkvm-elf | Bin 145784 -> 111928 bytes patch-testing/Cargo.lock | 1 + 13 files changed, 824 insertions(+), 625 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3078c9e8c..a5a44722f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 [[package]] name = "addchain" @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788bb18e8f61d5d9340b52143f27771daf7e1dccbaf2741621d2493f9debf52e" +checksum = "ec878088ec6283ce1e90d280316aadd3d6ce3de06ff63d68953c855e7e447e92" dependencies = [ "alloy-rlp", "bytes 1.9.0", @@ -246,7 +246,7 @@ dependencies = [ "derive_more", "foldhash", "hashbrown 0.15.2", - "indexmap 2.7.0", + "indexmap 2.7.1", "itoa", "k256", "keccak-asm", @@ -262,9 +262,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" dependencies = [ "proc-macro2", "quote", @@ -356,9 +356,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07b74d48661ab2e4b50bb5950d74dbff5e61dd8ed03bb822281b706d54ebacb" +checksum = "8d039d267aa5cbb7732fa6ce1fd9b5e9e29368f580f80ba9d7a8450c794de4b2" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -370,14 +370,14 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19cc9c7f20b90f9be1a8f71a3d8e283a43745137b0837b1a1cb13159d37cad72" +checksum = "620ae5eee30ee7216a38027dec34e0585c55099f827f92f50d11e3d2d3a4a954" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.7.0", + "indexmap 2.7.1", "proc-macro-error2", "proc-macro2", "quote", @@ -388,9 +388,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713b7e6dfe1cb2f55c80fb05fd22ed085a1b4e48217611365ed0ae598a74c6ac" +checksum = "ad9f7d057e00f8c5994e4ff4492b76532c51ead39353aa2ed63f8c50c0f4d52e" dependencies = [ "const-hex", "dunce", @@ -403,9 +403,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b478bc9c0c4737a04cd976accde4df7eba0bdc0d90ad6ff43d58bc93cf79c1" +checksum = "c1382302752cd751efd275f4d6ef65877ddf61e0e6f5ac84ef4302b79a33a31a" dependencies = [ "alloy-primitives", "alloy-sol-macro", @@ -499,11 +499,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -962,9 +963,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ "proc-macro2", "quote", @@ -1144,9 +1145,9 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "bitvec" @@ -1238,9 +1239,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-slice-cast" @@ -1330,7 +1331,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_json", "thiserror 1.0.69", @@ -1350,7 +1351,7 @@ checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" dependencies = [ "clap", "heck 0.4.1", - "indexmap 2.7.0", + "indexmap 2.7.1", "log", "proc-macro2", "quote", @@ -1363,9 +1364,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.9" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "jobserver", "libc", @@ -1454,9 +1455,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -1464,9 +1465,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -1551,6 +1552,26 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1602,9 +1623,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1693,9 +1714,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -2566,6 +2587,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "ghash" version = "0.3.1" @@ -2680,7 +2713,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.2.0", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -2903,9 +2936,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -2915,9 +2948,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes 1.9.0", "futures-channel", @@ -3206,9 +3239,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -3217,9 +3250,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", @@ -3245,19 +3278,19 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3502,9 +3535,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" dependencies = [ "value-bag", ] @@ -3569,9 +3602,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -3595,9 +3628,9 @@ checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -3851,9 +3884,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" dependencies = [ "bitflags", "cfg-if", @@ -3877,9 +3910,9 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" @@ -4176,28 +4209,30 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "b91c2d9a6a6004e205b7e881856fb1a0f5022d382acc2c01b52185f7b6f65997" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "77555fd9d578b6470470463fded832619a5fec5ad6cbc551fe4d7507ce50cd3a" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.96", ] [[package]] @@ -4304,7 +4339,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.0", + "indexmap 2.7.1", ] [[package]] @@ -5019,9 +5054,9 @@ dependencies = [ [[package]] name = "rug" -version = "1.26.1" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ae2c1089ec0575193eb9222881310cc1ed8bce3646ef8b81b44b518595b79d" +checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" dependencies = [ "az", "gmp-mpfr-sys", @@ -5109,14 +5144,14 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.24", + "semver 1.0.25", ] [[package]] name = "rustix" -version = "0.38.43" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", "errno", @@ -5176,9 +5211,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -5214,9 +5249,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -5381,9 +5416,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" dependencies = [ "serde", ] @@ -5425,9 +5460,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -5926,22 +5961,22 @@ dependencies = [ [[package]] name = "sp1-lib" -version = "4.0.0-rc.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2592b08337e63a52e2a7bad6ee2ca9b81fcae4c6f684b2db145d24a5e290d08f" +version = "4.0.1" dependencies = [ "bincode", "serde", - "sp1-primitives 4.0.0-rc.10", + "sp1-primitives 4.0.1", ] [[package]] name = "sp1-lib" version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac3d3deeed25e9cad80e4275faf5954aa63f213ed3422f0e098dd2d0c1b0c0e" dependencies = [ "bincode", "serde", - "sp1-primitives 4.0.1", + "sp1-primitives 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5966,9 +6001,7 @@ dependencies = [ [[package]] name = "sp1-primitives" -version = "4.0.0-rc.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be5929843ba7cb9930fb8f1fe4f76e12baa9f6e92e9ea02feff351a0fb0df12" +version = "4.0.1" dependencies = [ "bincode", "hex", @@ -5985,6 +6018,8 @@ dependencies = [ [[package]] name = "sp1-primitives" version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b25a09b455dfae9c688da05718b205e8bd4afab36cd912d54639f5d4035815" dependencies = [ "bincode", "hex", @@ -6060,6 +6095,7 @@ dependencies = [ "p3-merkle-tree", "p3-poseidon2", "p3-symmetric", + "p3-uni-stark", "p3-util", "rand 0.8.5", "rayon", @@ -6469,7 +6505,7 @@ dependencies = [ "num-bigint 0.4.6", "rand 0.8.5", "rustc-hex", - "sp1-lib 4.0.0-rc.10", + "sp1-lib 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6538,9 +6574,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e89d8bf2768d277f40573c83a02a099e96d96dd3104e13ea676194e61ac4b0" +checksum = "b84e4d83a0a6704561302b917a932484e1cae2d8c6354c64be8b7bac1c1fe057" dependencies = [ "paste", "proc-macro2", @@ -6618,13 +6654,13 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand 2.3.0", - "getrandom 0.2.15", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -6946,7 +6982,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "toml_datetime", "winnow 0.5.40", ] @@ -6957,11 +6993,11 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.24", + "winnow 0.6.25", ] [[package]] @@ -7245,9 +7281,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-linebreak" @@ -7333,15 +7369,15 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b913a3b5fe84142e269d63cc62b64319ccaf89b748fc31fe025177f767a756c4" +checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" @@ -7429,6 +7465,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -7800,13 +7845,22 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.24" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +checksum = "ad699df48212c6cc6eb4435f35500ac6fd3b9913324f938aea302022ce19d310" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" diff --git a/audits/sp1-v4.md b/audits/sp1-v4.md index 3a826d4d4..2f9f93a5e 100644 --- a/audits/sp1-v4.md +++ b/audits/sp1-v4.md @@ -98,7 +98,7 @@ builder The global interaction system works as follows. Each chip that needs to send a global interaction, first sends an interaction with `InteractionKind::Global` locally. Then, the `GlobalChip` receives these local interactions with `InteractionKind::Global`, then converts these messages into digests and accumulates them, making the results global. -However, while these informations are sent locally with `InteractionKind::Global`, there are actually two different "actual" `InteractionKind`s - `Memory` and `Syscall`. +However, while these information are sent locally with `InteractionKind::Global`, there are actually two different "actual" `InteractionKind`s - `Memory` and `Syscall`. The vulnerability was in that the actual underlying `InteractionKind` was not sent as a part of the local interaction between the chips and `GlobalChip`. Therefore, a "memory" interaction could be regarded as "syscall" interaction, and vice versa. diff --git a/crates/core/machine/src/utils/test.rs b/crates/core/machine/src/utils/test.rs index 5f527e143..7c1e35a9b 100644 --- a/crates/core/machine/src/utils/test.rs +++ b/crates/core/machine/src/utils/test.rs @@ -1,6 +1,7 @@ use p3_air::Air; use p3_baby_bear::BabyBear; use p3_matrix::dense::RowMajorMatrix; +use p3_uni_stark::SymbolicAirBuilder; use serde::{de::DeserializeOwned, Serialize}; use sp1_core_executor::{ExecutionRecord, Executor, Program, SP1Context}; use sp1_primitives::io::SP1PublicValues; @@ -128,7 +129,8 @@ where A: MachineAir + Air>> + for<'a> Air> - + for<'a> Air, SC::Challenge>>, + + for<'a> Air, SC::Challenge>> + + Air>, A::Record: MachineRecord, SC: StarkGenericConfig, SC::Val: p3_field::PrimeField32, @@ -169,7 +171,8 @@ where + for<'a> Air> + Air>> + for<'a> Air> - + for<'a> Air, SC::Challenge>>, + + for<'a> Air, SC::Challenge>> + + Air>, A::Record: MachineRecord, SC: StarkGenericConfig, SC::Val: p3_field::PrimeField32, diff --git a/crates/recursion/circuit/Cargo.toml b/crates/recursion/circuit/Cargo.toml index 6b640fb60..620c64259 100644 --- a/crates/recursion/circuit/Cargo.toml +++ b/crates/recursion/circuit/Cargo.toml @@ -21,6 +21,7 @@ p3-challenger = { workspace = true } p3-dft = { workspace = true } p3-bn254-fr = { workspace = true } p3-baby-bear = { workspace = true } +p3-uni-stark = { workspace = true } sp1-core-machine = { workspace = true } sp1-core-executor = { workspace = true } diff --git a/crates/stark/src/folder.rs b/crates/stark/src/folder.rs index e64b9318d..45b256fe3 100644 --- a/crates/stark/src/folder.rs +++ b/crates/stark/src/folder.rs @@ -40,12 +40,14 @@ pub struct ProverConstraintFolder<'a, SC: StarkGenericConfig> { pub is_last_row: PackedVal, /// The selector for the transition. pub is_transition: PackedVal, - /// The constraint folding challenge. - pub alpha: SC::Challenge, + /// The powers of the constraint folding challenge. + pub powers_of_alpha: &'a Vec, /// The accumulator for the constraint folding. pub accumulator: PackedChallenge, /// The public values. pub public_values: &'a [Val], + /// The constraint index. + pub constraint_index: usize, } impl<'a, SC: StarkGenericConfig> AirBuilder for ProverConstraintFolder<'a, SC> { @@ -77,8 +79,9 @@ impl<'a, SC: StarkGenericConfig> AirBuilder for ProverConstraintFolder<'a, SC> { fn assert_zero>(&mut self, x: I) { let x: PackedVal = x.into(); - self.accumulator *= PackedChallenge::::from_f(self.alpha); - self.accumulator += x; + self.accumulator += + PackedChallenge::::from_f(self.powers_of_alpha[self.constraint_index]) * x; + self.constraint_index += 1; } } @@ -94,8 +97,9 @@ impl ExtensionBuilder for ProverConstraintFolder<'_, SC> I: Into, { let x: PackedChallenge = x.into(); - self.accumulator *= PackedChallenge::::from_f(self.alpha); - self.accumulator += x; + self.accumulator += + PackedChallenge::::from_f(self.powers_of_alpha[self.constraint_index]) * x; + self.constraint_index += 1; } } diff --git a/crates/stark/src/lookup/debug.rs b/crates/stark/src/lookup/debug.rs index df8e5f13c..f48a38fb4 100644 --- a/crates/stark/src/lookup/debug.rs +++ b/crates/stark/src/lookup/debug.rs @@ -1,8 +1,7 @@ -use std::collections::BTreeMap; - use p3_baby_bear::BabyBear; use p3_field::{AbstractField, Field, PrimeField32, PrimeField64}; use p3_matrix::Matrix; +use std::collections::BTreeMap; use super::InteractionKind; use crate::{ diff --git a/crates/stark/src/machine.rs b/crates/stark/src/machine.rs index 3f6c28150..f339f60a9 100644 --- a/crates/stark/src/machine.rs +++ b/crates/stark/src/machine.rs @@ -1,5 +1,6 @@ use crate::{ septic_curve::SepticCurve, septic_digest::SepticDigest, septic_extension::SepticExtension, + PROOF_MAX_NUM_PVS, }; use hashbrown::HashMap; use itertools::Itertools; @@ -9,11 +10,13 @@ use p3_commit::Pcs; use p3_field::{AbstractExtensionField, AbstractField, Field, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Dimensions, Matrix}; use p3_maybe_rayon::prelude::*; +use p3_uni_stark::{get_symbolic_constraints, SymbolicAirBuilder}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{cmp::Reverse, env, fmt::Debug, iter::once, time::Instant}; use tracing::instrument; use super::{debug_constraints, Dom}; +use crate::count_permutation_constraints; use crate::{ air::{InteractionScope, MachineAir, MachineProgram}, lookup::{debug_interactions_with_all_chips, InteractionKind}, @@ -73,6 +76,8 @@ pub struct StarkProvingKey { pub chip_ordering: HashMap, /// The preprocessed chip local only information. pub local_only: Vec, + /// The number of total constraints for each chip. + pub constraints_map: HashMap, } impl StarkProvingKey { @@ -123,6 +128,25 @@ impl Debug for StarkVerifyingKey { } impl>> StarkMachine { + /// Returns an iterator over the chips in the machine that are included in the given shard. + pub fn shard_chips_ordered<'a, 'b>( + &'a self, + chip_ordering: &'b HashMap, + ) -> impl Iterator> + where + 'a: 'b, + { + self.chips + .iter() + .filter(|chip| chip_ordering.contains_key(&chip.name())) + .sorted_by_key(|chip| chip_ordering.get(&chip.name())) + } + + /// Returns the config of the machine. + pub const fn config(&self) -> &SC { + &self.config + } + /// Get an array containing a `ChipRef` for all the chips of this RISC-V STARK machine. pub fn chips(&self) -> &[MachineChip] { &self.chips @@ -133,21 +157,6 @@ impl>> StarkMachine { self.num_pv_elts } - /// Returns whether the machine contains a global bus. - pub const fn contains_global_bus(&self) -> bool { - self.contains_global_bus - } - - /// Returns the id of all chips in the machine that have preprocessed columns. - pub fn preprocessed_chip_ids(&self) -> Vec { - self.chips - .iter() - .enumerate() - .filter(|(_, chip)| chip.preprocessed_width() > 0) - .map(|(i, _)| i) - .collect() - } - /// Returns an iterator over the chips in the machine that are included in the given shard. pub fn shard_chips<'a, 'b>( &'a self, @@ -159,18 +168,169 @@ impl>> StarkMachine { self.chips.iter().filter(|chip| chip.included(shard)) } - /// Returns an iterator over the chips in the machine that are included in the given shard. - pub fn shard_chips_ordered<'a, 'b>( - &'a self, - chip_ordering: &'b HashMap, - ) -> impl Iterator> - where - 'a: 'b, + /// Debugs the constraints of the given records. + #[instrument("debug constraints", level = "debug", skip_all)] + pub fn debug_constraints( + &self, + pk: &StarkProvingKey, + records: Vec, + challenger: &mut SC::Challenger, + ) where + SC::Val: PrimeField32, + A: for<'a> Air, SC::Challenge>>, { + tracing::debug!("checking constraints for each shard"); + + // Obtain the challenges used for the global permutation argument. + let mut permutation_challenges: Vec = Vec::new(); + for _ in 0..2 { + permutation_challenges.push(challenger.sample_ext_element()); + } + + let mut global_cumulative_sums = Vec::new(); + global_cumulative_sums.push(pk.initial_global_cumulative_sum); + + for shard in records.iter() { + // Filter the chips based on what is used. + let chips = self.shard_chips(shard).collect::>(); + + // Generate the main trace for each chip. + let pre_traces = chips + .iter() + .map(|chip| pk.chip_ordering.get(&chip.name()).map(|index| &pk.traces[*index])) + .collect::>(); + let mut traces = chips + .par_iter() + .map(|chip| chip.generate_trace(shard, &mut A::Record::default())) + .zip(pre_traces) + .collect::>(); + + // Generate the permutation traces. + let mut permutation_traces = Vec::with_capacity(chips.len()); + let mut chip_cumulative_sums = Vec::with_capacity(chips.len()); + tracing::debug_span!("generate permutation traces").in_scope(|| { + chips + .par_iter() + .zip(traces.par_iter_mut()) + .map(|(chip, (main_trace, pre_trace))| { + let (trace, local_sum) = chip.generate_permutation_trace( + *pre_trace, + main_trace, + &permutation_challenges, + ); + let global_sum = if chip.commit_scope() == InteractionScope::Local { + SepticDigest::>::zero() + } else { + let main_trace_size = main_trace.height() * main_trace.width(); + let last_row = + &main_trace.values[main_trace_size - 14..main_trace_size]; + SepticDigest(SepticCurve { + x: SepticExtension::>::from_base_fn(|i| last_row[i]), + y: SepticExtension::>::from_base_fn(|i| last_row[i + 7]), + }) + }; + (trace, (global_sum, local_sum)) + }) + .unzip_into_vecs(&mut permutation_traces, &mut chip_cumulative_sums); + }); + + let global_cumulative_sum = + chip_cumulative_sums.iter().map(|sums| sums.0).sum::>>(); + global_cumulative_sums.push(global_cumulative_sum); + + let local_cumulative_sum = + chip_cumulative_sums.iter().map(|sums| sums.1).sum::(); + + if !local_cumulative_sum.is_zero() { + tracing::warn!("Local cumulative sum is not zero"); + tracing::debug_span!("debug local interactions").in_scope(|| { + debug_interactions_with_all_chips::( + self, + pk, + &[shard.clone()], + InteractionKind::all_kinds(), + InteractionScope::Local, + ) + }); + panic!("Local cumulative sum is not zero"); + } + + // Compute some statistics. + for i in 0..chips.len() { + let trace_width = traces[i].0.width(); + let pre_width = traces[i].1.map_or(0, p3_matrix::Matrix::width); + let permutation_width = permutation_traces[i].width() + * >::D; + let total_width = trace_width + pre_width + permutation_width; + tracing::debug!( + "{:<11} | Main Cols = {:<5} | Pre Cols = {:<5} | Perm Cols = {:<5} | Rows = {:<10} | Cells = {:<10}", + chips[i].name(), + trace_width, + pre_width, + permutation_width, + traces[i].0.height(), + total_width * traces[i].0.height(), + ); + } + + if env::var("SKIP_CONSTRAINTS").is_err() { + tracing::info_span!("debug constraints").in_scope(|| { + for i in 0..chips.len() { + let preprocessed_trace = + pk.chip_ordering.get(&chips[i].name()).map(|index| &pk.traces[*index]); + debug_constraints::( + chips[i], + preprocessed_trace, + &traces[i].0, + &permutation_traces[i], + &permutation_challenges, + &shard.public_values(), + &chip_cumulative_sums[i].1, + &chip_cumulative_sums[i].0, + ); + } + }); + } + } + + tracing::info!("Constraints verified successfully"); + + let global_cumulative_sum: SepticDigest> = + global_cumulative_sums.iter().copied().sum(); + + // If the global cumulative sum is not zero, debug the interactions. + if !global_cumulative_sum.is_zero() { + tracing::warn!("Global cumulative sum is not zero"); + tracing::debug_span!("debug global interactions").in_scope(|| { + debug_interactions_with_all_chips::( + self, + pk, + &records, + InteractionKind::all_kinds(), + InteractionScope::Global, + ) + }); + panic!("Global cumulative sum is not zero"); + } + } +} + +impl> + Air>>> + StarkMachine +{ + /// Returns whether the machine contains a global bus. + pub const fn contains_global_bus(&self) -> bool { + self.contains_global_bus + } + + /// Returns the id of all chips in the machine that have preprocessed columns. + pub fn preprocessed_chip_ids(&self) -> Vec { self.chips .iter() - .filter(|chip| chip_ordering.contains_key(&chip.name())) - .sorted_by_key(|chip| chip_ordering.get(&chip.name())) + .enumerate() + .filter(|(_, chip)| chip.preprocessed_width() > 0) + .map(|(i, _)| i) + .collect() } /// Returns the indices of the chips in the machine that are included in the given shard. @@ -185,30 +345,54 @@ impl>> StarkMachine { initial_global_cumulative_sum: SepticDigest>, ) -> (StarkProvingKey, StarkVerifyingKey) { let parent_span = tracing::debug_span!("generate preprocessed traces"); - let mut named_preprocessed_traces = parent_span.in_scope(|| { - self.chips() - .par_iter() - .filter_map(|chip| { - let chip_name = chip.name(); - let begin = Instant::now(); - let prep_trace = chip.generate_preprocessed_trace(program); - tracing::debug!( - parent: &parent_span, - "generated preprocessed trace for chip {} in {:?}", - chip_name, - begin.elapsed() - ); - // Assert that the chip width data is correct. - let expected_width = prep_trace.as_ref().map_or(0, p3_matrix::Matrix::width); - assert_eq!( - expected_width, - chip.preprocessed_width(), - "Incorrect number of preprocessed columns for chip {chip_name}" - ); - prep_trace.map(move |t| (chip_name, chip.local_only(), t)) - }) - .collect::>() - }); + let (named_preprocessed_traces, num_constraints): (Vec<_>, Vec<_>) = + parent_span.in_scope(|| { + self.chips() + .par_iter() + .map(|chip| { + let chip_name = chip.name(); + let begin = Instant::now(); + let prep_trace = chip.generate_preprocessed_trace(program); + tracing::debug!( + parent: &parent_span, + "generated preprocessed trace for chip {} in {:?}", + chip_name, + begin.elapsed() + ); + // Assert that the chip width data is correct. + let expected_width = + prep_trace.as_ref().map_or(0, p3_matrix::Matrix::width); + assert_eq!( + expected_width, + chip.preprocessed_width(), + "Incorrect number of preprocessed columns for chip {chip_name}" + ); + + // Count the number of constraints. + let num_main_constraints = get_symbolic_constraints( + &chip.air, + chip.preprocessed_width(), + PROOF_MAX_NUM_PVS, + ) + .len(); + + let num_permutation_constraints = count_permutation_constraints( + &chip.sends, + &chip.receives, + chip.logup_batch_size(), + chip.air.commit_scope(), + ); + + ( + prep_trace.map(move |t| (chip.name(), chip.local_only(), t)), + (chip_name, num_main_constraints + num_permutation_constraints), + ) + }) + .unzip() + }); + + let mut named_preprocessed_traces = + named_preprocessed_traces.into_iter().flatten().collect::>(); // Order the chips and traces by trace size (biggest first), and get the ordering map. named_preprocessed_traces @@ -239,6 +423,8 @@ impl>> StarkMachine { .map(|(_, local_only, _)| local_only.to_owned()) .collect::>(); + let constraints_map: HashMap<_, _> = num_constraints.into_iter().collect(); + // Get the preprocessed traces let traces = named_preprocessed_traces.into_iter().map(|(_, _, trace)| trace).collect::>(); @@ -254,6 +440,7 @@ impl>> StarkMachine { data, chip_ordering: chip_ordering.clone(), local_only, + constraints_map, }, StarkVerifyingKey { commit, @@ -307,11 +494,6 @@ impl>> StarkMachine { }); } - /// Returns the config of the machine. - pub const fn config(&self) -> &SC { - &self.config - } - /// Verify that a proof is complete and valid given a verifying key and a claimed digest. #[instrument("verify", level = "info", skip_all)] #[allow(clippy::match_bool)] @@ -374,152 +556,6 @@ impl>> StarkMachine { Ok(()) }) } - - /// Debugs the constraints of the given records. - #[instrument("debug constraints", level = "debug", skip_all)] - pub fn debug_constraints( - &self, - pk: &StarkProvingKey, - records: Vec, - challenger: &mut SC::Challenger, - ) where - SC::Val: PrimeField32, - A: for<'a> Air, SC::Challenge>>, - { - tracing::debug!("checking constraints for each shard"); - - // Obtain the challenges used for the global permutation argument. - let mut permutation_challenges: Vec = Vec::new(); - for _ in 0..2 { - permutation_challenges.push(challenger.sample_ext_element()); - } - - let mut global_cumulative_sums = Vec::new(); - global_cumulative_sums.push(pk.initial_global_cumulative_sum); - - for shard in records.iter() { - // Filter the chips based on what is used. - let chips = self.shard_chips(shard).collect::>(); - - // Generate the main trace for each chip. - let pre_traces = chips - .iter() - .map(|chip| pk.chip_ordering.get(&chip.name()).map(|index| &pk.traces[*index])) - .collect::>(); - let mut traces = chips - .par_iter() - .map(|chip| chip.generate_trace(shard, &mut A::Record::default())) - .zip(pre_traces) - .collect::>(); - - // Generate the permutation traces. - let mut permutation_traces = Vec::with_capacity(chips.len()); - let mut chip_cumulative_sums = Vec::with_capacity(chips.len()); - tracing::debug_span!("generate permutation traces").in_scope(|| { - chips - .par_iter() - .zip(traces.par_iter_mut()) - .map(|(chip, (main_trace, pre_trace))| { - let (trace, local_sum) = chip.generate_permutation_trace( - *pre_trace, - main_trace, - &permutation_challenges, - ); - let global_sum = if chip.commit_scope() == InteractionScope::Local { - SepticDigest::>::zero() - } else { - let main_trace_size = main_trace.height() * main_trace.width(); - let last_row = - &main_trace.values[main_trace_size - 14..main_trace_size]; - SepticDigest(SepticCurve { - x: SepticExtension::>::from_base_fn(|i| last_row[i]), - y: SepticExtension::>::from_base_fn(|i| last_row[i + 7]), - }) - }; - (trace, (global_sum, local_sum)) - }) - .unzip_into_vecs(&mut permutation_traces, &mut chip_cumulative_sums); - }); - - let global_cumulative_sum = - chip_cumulative_sums.iter().map(|sums| sums.0).sum::>>(); - global_cumulative_sums.push(global_cumulative_sum); - - let local_cumulative_sum = - chip_cumulative_sums.iter().map(|sums| sums.1).sum::(); - - if !local_cumulative_sum.is_zero() { - tracing::warn!("Local cumulative sum is not zero"); - tracing::debug_span!("debug local interactions").in_scope(|| { - debug_interactions_with_all_chips::( - self, - pk, - &[shard.clone()], - InteractionKind::all_kinds(), - InteractionScope::Local, - ) - }); - panic!("Local cumulative sum is not zero"); - } - - // Compute some statistics. - for i in 0..chips.len() { - let trace_width = traces[i].0.width(); - let pre_width = traces[i].1.map_or(0, p3_matrix::Matrix::width); - let permutation_width = permutation_traces[i].width() - * >::D; - let total_width = trace_width + pre_width + permutation_width; - tracing::debug!( - "{:<11} | Main Cols = {:<5} | Pre Cols = {:<5} | Perm Cols = {:<5} | Rows = {:<10} | Cells = {:<10}", - chips[i].name(), - trace_width, - pre_width, - permutation_width, - traces[i].0.height(), - total_width * traces[i].0.height(), - ); - } - - if env::var("SKIP_CONSTRAINTS").is_err() { - tracing::info_span!("debug constraints").in_scope(|| { - for i in 0..chips.len() { - let preprocessed_trace = - pk.chip_ordering.get(&chips[i].name()).map(|index| &pk.traces[*index]); - debug_constraints::( - chips[i], - preprocessed_trace, - &traces[i].0, - &permutation_traces[i], - &permutation_challenges, - &shard.public_values(), - &chip_cumulative_sums[i].1, - &chip_cumulative_sums[i].0, - ); - } - }); - } - } - - tracing::info!("Constraints verified successfully"); - - let global_cumulative_sum: SepticDigest> = - global_cumulative_sums.iter().copied().sum(); - - // If the global cumulative sum is not zero, debug the interactions. - if !global_cumulative_sum.is_zero() { - tracing::warn!("Global cumulative sum is not zero"); - tracing::debug_span!("debug global interactions").in_scope(|| { - debug_interactions_with_all_chips::( - self, - pk, - &records, - InteractionKind::all_kinds(), - InteractionScope::Global, - ) - }); - panic!("Global cumulative sum is not zero"); - } - } } /// Errors that can occur during machine verification. diff --git a/crates/stark/src/permutation.rs b/crates/stark/src/permutation.rs index 949cd8059..6936aede1 100644 --- a/crates/stark/src/permutation.rs +++ b/crates/stark/src/permutation.rs @@ -349,3 +349,45 @@ pub fn eval_permutation_constraints<'a, F, AB>( } } } + +/// Counts the number of permutation constraints for the given chip. +/// +/// IMPORTANT: This function must be manually updated if any changes are made to +/// `eval_permutation_constraints`. The current count includes: +/// - For local interactions: `local_permutation_trace_width(sends.len() + receives.len(), batch_size)` + 3 local cumulative sum constraints. +/// - For global scope: 14 additional constraints for the global cumulative sum. +pub fn count_permutation_constraints( + sends: &[Interaction], + receives: &[Interaction], + batch_size: usize, + commit_scope: InteractionScope, +) -> usize { + let mut count = 0; + + let empty = vec![]; + let (scoped_sends, scoped_receives) = scoped_interactions(sends, receives); + let local_sends = scoped_sends.get(&InteractionScope::Local).unwrap_or(&empty); + let local_receives = scoped_receives.get(&InteractionScope::Local).unwrap_or(&empty); + + let num_local_interactions = local_sends.len() + local_receives.len(); + + if num_local_interactions > 0 { + let local_permutation_width = + local_permutation_trace_width(num_local_interactions, batch_size); + // We loop over (local_permutation_width - 1) iterations with one assert per iteration. + count += local_permutation_width - 1; + + // One assert that cumulative sum is initialized to `phi_local` on the first row. + // Two asserts that the cumulative sum is constrained to `phi_next - phi_local` on the transition + // rows. + count += 3; + } + + // If the chip's scope is `InteractionScope::Global`, 14 asserts that + // the last row's final 14 columns is equal to the global cumulative sum. + if commit_scope == InteractionScope::Global { + count += 14; + } + + count +} diff --git a/crates/stark/src/prover.rs b/crates/stark/src/prover.rs index b47bff7d4..d56acd498 100644 --- a/crates/stark/src/prover.rs +++ b/crates/stark/src/prover.rs @@ -10,6 +10,7 @@ use p3_commit::{Pcs, PolynomialSpace}; use p3_field::{AbstractExtensionField, AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::*; +use p3_uni_stark::SymbolicAirBuilder; use p3_util::log2_strict_usize; use serde::{de::DeserializeOwned, Serialize}; use std::{cmp::Reverse, error::Error, time::Instant}; @@ -194,7 +195,8 @@ where A: MachineAir + for<'a> Air> + Air>> - + for<'a> Air>, + + for<'a> Air> + + for<'a> Air>>, A::Record: MachineRecord, SC::Val: PrimeField32, Com: Send + Sync, @@ -423,6 +425,18 @@ where let permutation_trace_on_quotient_domains = pcs .get_evaluations_on_domain(&permutation_data, i, *quotient_domain) .to_row_major_matrix(); + + let chip_num_constraints = + pk.constraints_map.get(&chips[i].name()).unwrap(); + + // Calculate powers of alpha for constraint evaluation: + // 1. Generate sequence [α⁰, α¹, ..., α^(n-1)] where n = chip_num_constraints. + // 2. Reverse to [α^(n-1), ..., α¹, α⁰] to align with Horner's method in the verifier. + let powers_of_alpha = + alpha.powers().take(*chip_num_constraints).collect::>(); + let mut powers_of_alpha_rev = powers_of_alpha.clone(); + powers_of_alpha_rev.reverse(); + quotient_values( chips[i], &local_cumulative_sums[i], @@ -433,7 +447,7 @@ where main_trace_on_quotient_domains, permutation_trace_on_quotient_domains, &packed_perm_challenges, - alpha, + &powers_of_alpha_rev, &data.public_values, ) }) diff --git a/crates/stark/src/quotient.rs b/crates/stark/src/quotient.rs index 8d014b77e..0b6cb7e4d 100644 --- a/crates/stark/src/quotient.rs +++ b/crates/stark/src/quotient.rs @@ -26,7 +26,7 @@ pub fn quotient_values( main_trace_on_quotient_domain: Mat, permutation_trace_on_quotient_domain: Mat, perm_challenges: &[PackedChallenge], - alpha: SC::Challenge, + powers_of_alpha: &Vec, public_values: &[Val], ) -> Vec where @@ -149,9 +149,10 @@ where is_first_row, is_last_row, is_transition, - alpha, + powers_of_alpha, accumulator, public_values, + constraint_index: 0, }; chip.eval(&mut folder); diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 01108bcef..eee06a09a 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 [[package]] name = "addchain" @@ -74,11 +74,11 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.1.51" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e0f0136c085132939da6b753452ebed4efaa73fe523bb855b10c199c2ebfaf" +checksum = "4ab9d1367c6ffb90c93fb4a9a4989530aa85112438c6f73a734067255d348469" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "num_enum 0.7.3", "serde", @@ -92,7 +92,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" dependencies = [ "alloy-eips 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.3.6", "c-kzg", @@ -106,10 +106,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" dependencies = [ "alloy-eips 0.8.3", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.8.3", - "alloy-trie 0.7.7", + "alloy-trie 0.7.8", "auto_impl", "c-kzg", "derive_more 1.0.0", @@ -124,7 +124,7 @@ checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" dependencies = [ "alloy-consensus 0.8.3", "alloy-eips 0.8.3", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.8.3", "serde", @@ -136,7 +136,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "serde", ] @@ -147,7 +147,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "k256", "serde", @@ -159,7 +159,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "derive_more 1.0.0", "serde", @@ -173,7 +173,7 @@ checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" dependencies = [ "alloy-eip2930", "alloy-eip7702 0.1.1", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.3.6", "c-kzg", @@ -191,7 +191,7 @@ checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ "alloy-eip2930", "alloy-eip7702 0.4.2", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.8.3", "c-kzg", @@ -207,18 +207,18 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-serde 0.3.6", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" +checksum = "24acd2f5ba97c7a320e67217274bc81fe3c3174b8e6144ec875d9d54e760e278" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-sol-type-parser", "serde", "serde_json", @@ -230,11 +230,11 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-sol-types", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", "tracing", ] @@ -249,7 +249,7 @@ dependencies = [ "alloy-eips 0.8.3", "alloy-json-rpc", "alloy-network-primitives 0.8.3", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rpc-types-any", "alloy-rpc-types-eth 0.8.3", "alloy-serde 0.8.3", @@ -260,7 +260,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] @@ -270,7 +270,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" dependencies = [ "alloy-eips 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-serde 0.3.6", "serde", ] @@ -283,7 +283,7 @@ checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" dependencies = [ "alloy-consensus 0.8.3", "alloy-eips 0.8.3", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-serde 0.8.3", "serde", ] @@ -312,9 +312,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" +checksum = "ec878088ec6283ce1e90d280316aadd3d6ce3de06ff63d68953c855e7e447e92" dependencies = [ "alloy-rlp", "bytes", @@ -322,10 +322,9 @@ dependencies = [ "const-hex", "derive_more 1.0.0", "foldhash", - "getrandom", + "getrandom 0.2.15", "hashbrown 0.15.2", - "hex-literal", - "indexmap 2.7.0", + "indexmap 2.7.1", "itoa", "k256", "keccak-asm", @@ -341,9 +340,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" dependencies = [ "alloy-rlp-derive", "arrayvec 0.7.6", @@ -352,13 +351,13 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -392,7 +391,7 @@ dependencies = [ "alloy-consensus 0.3.6", "alloy-eips 0.3.6", "alloy-network-primitives 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.3.6", "alloy-sol-types", @@ -414,7 +413,7 @@ dependencies = [ "alloy-consensus-any", "alloy-eips 0.8.3", "alloy-network-primitives 0.8.3", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.8.3", "alloy-sol-types", @@ -430,7 +429,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "serde", "serde_json", ] @@ -441,7 +440,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "serde", "serde_json", ] @@ -452,12 +451,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "async-trait", "auto_impl", "elliptic-curve", "k256", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] @@ -468,79 +467,79 @@ checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" dependencies = [ "alloy-consensus 0.8.3", "alloy-network", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-signer", "async-trait", "k256", "rand 0.8.5", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] name = "alloy-sol-macro" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" +checksum = "8d039d267aa5cbb7732fa6ce1fd9b5e9e29368f580f80ba9d7a8450c794de4b2" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" +checksum = "620ae5eee30ee7216a38027dec34e0585c55099f827f92f50d11e3d2d3a4a954" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.7.0", + "indexmap 2.7.1", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" +checksum = "ad9f7d057e00f8c5994e4ff4492b76532c51ead39353aa2ed63f8c50c0f4d52e" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" +checksum = "74e60b084fe1aef8acecda2743ff2d93c18ff3eb67a2d3b12f62582a1e66ef5e" dependencies = [ "serde", - "winnow 0.6.20", + "winnow 0.6.25", ] [[package]] name = "alloy-sol-types" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" +checksum = "c1382302752cd751efd275f4d6ef65877ddf61e0e6f5ac84ef4302b79a33a31a" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-sol-macro", "const-hex", "serde", @@ -552,7 +551,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a46c9c4fdccda7982e7928904bd85fe235a0404ee3d7e197fff13d61eac8b4f" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "derive_more 1.0.0", "hashbrown 0.14.5", @@ -564,15 +563,15 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e428104b2445a4f929030891b3dbf8c94433a8349ba6480946bf6af7975c2f6" +checksum = "6917c79e837aa7b77b7a6dae9f89cbe15313ac161c4d3cfaf8909ef21f3d22d8" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "arrayvec 0.7.6", "derive_more 1.0.0", - "nybbles 0.3.0", + "nybbles 0.3.4", "serde", "smallvec", "tracing", @@ -643,11 +642,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -821,18 +821,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -853,13 +853,13 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -930,7 +930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom", + "getrandom 0.2.15", "instant", "pin-project-lite", "rand 0.8.5", @@ -1009,7 +1009,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1029,9 +1029,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" dependencies = [ "serde", ] @@ -1129,7 +1129,7 @@ dependencies = [ "group 0.13.0", "pairing 0.23.0", "rand_core 0.6.4", - "sp1-lib 4.0.0", + "sp1-lib", "subtle", ] @@ -1164,9 +1164,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-slice-cast" @@ -1191,7 +1191,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1250,7 +1250,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_json", "thiserror 1.0.69", @@ -1264,22 +1264,22 @@ checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" dependencies = [ "clap", "heck 0.4.1", - "indexmap 2.7.0", + "indexmap 2.7.1", "log", "proc-macro2", "quote", "serde", "serde_json", - "syn 2.0.93", + "syn 2.0.96", "tempfile", "toml", ] [[package]] name = "cc" -version = "1.2.6" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "jobserver", "libc", @@ -1361,9 +1361,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -1371,9 +1371,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -1383,14 +1383,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1449,6 +1449,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1488,9 +1508,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1552,9 +1572,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -1607,7 +1627,7 @@ dependencies = [ "cfg-if", "digest 0.9.0", "rand_core 0.6.4", - "sp1-lib 4.0.0", + "sp1-lib", "subtle-ng", "zeroize", ] @@ -1649,7 +1669,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1660,7 +1680,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1794,7 +1814,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1815,7 +1835,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "unicode-xid", ] @@ -1869,7 +1889,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -1916,7 +1936,7 @@ dependencies = [ "hex-literal", "rfc6979", "signature", - "sp1-lib 4.0.0", + "sp1-lib", "spki 0.7.3", ] @@ -2027,7 +2047,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -2038,7 +2058,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -2266,7 +2286,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -2341,10 +2361,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gimli" version = "0.31.1" @@ -2421,7 +2453,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -2564,9 +2596,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -2576,9 +2608,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2783,7 +2815,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -2830,7 +2862,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -2852,9 +2884,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2863,9 +2895,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", @@ -2902,9 +2934,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-prime-program" @@ -2971,9 +3003,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -3054,9 +3086,9 @@ dependencies = [ [[package]] name = "kzg-rs" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850eb19206463a61bede4f7b7e6b21731807137619044b1f3c287ebcfe2b3b0" +checksum = "08151404e9f89dfc6149ccb2d3e03f2c4ec4f253b721770975da1a1644c6b79f" dependencies = [ "ff 0.13.0", "hex", @@ -3120,9 +3152,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.20" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" dependencies = [ "cc", "libc", @@ -3138,9 +3170,9 @@ checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -3160,9 +3192,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "lru" @@ -3214,9 +3246,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -3228,7 +3260,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3381,7 +3413,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -3488,7 +3520,7 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -3521,9 +3553,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a62e678a89501192cc5ebf47dcbc656b608ae5e1c61c9251fe35230f119fe3" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" dependencies = [ "const-hex", "serde", @@ -3553,7 +3585,7 @@ checksum = "21aad1fbf80d2bcd7406880efc7ba109365f44bbb72896758ddcbfa46bf1592c" dependencies = [ "alloy-consensus 0.3.6", "alloy-eips 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-serde 0.3.6", "derive_more 1.0.0", @@ -3569,7 +3601,7 @@ checksum = "e281fbfc2198b7c0c16457d6524f83d192662bc9f3df70f24c3038d4521616df" dependencies = [ "alloy-eips 0.3.6", "alloy-network-primitives 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rpc-types-eth 0.3.6", "alloy-serde 0.3.6", "cfg-if", @@ -3587,9 +3619,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "option-ext" @@ -3883,28 +3915,30 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "b91c2d9a6a6004e205b7e881856fb1a0f5022d382acc2c01b52185f7b6f65997" dependencies = [ "arrayvec 0.7.6", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "77555fd9d578b6470470463fded832619a5fec5ad6cbc551fe4d7507ce50cd3a" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.96", ] [[package]] @@ -4003,35 +4037,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 2.0.9", + "thiserror 2.0.11", "ucd-trie", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -4111,12 +4145,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -4177,14 +4211,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -4236,10 +4270,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -4252,7 +4286,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -4283,7 +4317,7 @@ dependencies = [ "rustc-hash 2.1.0", "rustls", "socket2", - "thiserror 2.0.9", + "thiserror 2.0.11", "tokio", "tracing", ] @@ -4295,14 +4329,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", - "getrandom", + "getrandom 0.2.15", "rand 0.8.5", "ring", "rustc-hash 2.1.0", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.9", + "thiserror 2.0.11", "tinyvec", "tracing", "web-time", @@ -4393,7 +4427,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -4467,7 +4501,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -4534,9 +4568,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.11" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe060fe50f524be480214aba758c71f99f90ee8c83c5a36b5e9e1d568eb4eb3" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -4612,7 +4646,7 @@ dependencies = [ "alloy-chains", "alloy-eips 0.3.6", "alloy-genesis", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-trie 0.5.3", "auto_impl", "derive_more 1.0.0", @@ -4634,7 +4668,7 @@ dependencies = [ "alloy-consensus 0.3.6", "alloy-eips 0.3.6", "alloy-genesis", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-trie 0.5.3", "bytes", "modular-bitfield", @@ -4650,7 +4684,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -4716,7 +4750,7 @@ version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ "alloy-chains", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "auto_impl", "crc", @@ -4789,7 +4823,7 @@ version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ "alloy-eips 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "derive_more 1.0.0", "nybbles 0.2.1", @@ -4826,7 +4860,7 @@ name = "reth-network-peers" version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "enr", "serde_with", @@ -4840,7 +4874,7 @@ version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ "alloy-chains", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "derive_more 1.0.0", "once_cell", "reth-chainspec", @@ -4869,7 +4903,7 @@ dependencies = [ "alloy-consensus 0.3.6", "alloy-eips 0.3.6", "alloy-genesis", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-rpc-types", "alloy-serde 0.3.6", @@ -4898,7 +4932,7 @@ dependencies = [ "alloy-consensus 0.3.6", "alloy-eips 0.3.6", "alloy-genesis", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-rpc-types-eth 0.3.6", "byteorder", @@ -4916,7 +4950,7 @@ name = "reth-prune-types" version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "bytes", "derive_more 1.0.0", "modular-bitfield", @@ -4945,7 +4979,7 @@ name = "reth-stages-types" version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "bytes", "modular-bitfield", "reth-codecs", @@ -4958,7 +4992,7 @@ name = "reth-static-file-types" version = "1.0.6" source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374182a43a3602aaa953d37aa9217b" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "derive_more 1.0.0", "serde", "strum", @@ -5017,7 +5051,7 @@ source = "git+https://github.com/sp1-patches/reth?tag=rsp-20240830#260c7ed2c9374 dependencies = [ "alloy-consensus 0.3.6", "alloy-genesis", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-trie 0.5.3", "bytes", @@ -5082,7 +5116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" dependencies = [ "alloy-eips 0.3.6", - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "auto_impl", "bitflags", "bitvec", @@ -5113,7 +5147,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -5153,9 +5187,9 @@ dependencies = [ [[package]] name = "roaring" -version = "0.10.9" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41589aba99537475bf697f2118357cad1c31590c5a1b9f6d9fc4ad6d07503661" +checksum = "a652edd001c53df0b3f96a36a8dc93fce6866988efc16808235653c6bcac8bf2" dependencies = [ "bytemuck", "byteorder", @@ -5235,7 +5269,7 @@ name = "rsp-client-executor" version = "0.1.0" source = "git+https://github.com/succinctlabs/rsp/?rev=3647076#3647076da6580e30384dd911a3fc50d4bcdb5bc1" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "eyre", "futures", @@ -5268,7 +5302,7 @@ name = "rsp-mpt" version = "0.1.0" source = "git+https://github.com/succinctlabs/rsp/?rev=3647076#3647076da6580e30384dd911a3fc50d4bcdb5bc1" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-rlp", "alloy-rpc-types", "anyhow", @@ -5318,7 +5352,7 @@ dependencies = [ name = "rsp-script" version = "0.1.0" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "bincode", "clap", "rsp-client-executor", @@ -5410,14 +5444,14 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.24", + "semver 1.0.25", ] [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", "errno", @@ -5428,9 +5462,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "log", "once_cell", @@ -5464,9 +5498,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -5502,9 +5536,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "scale-info" @@ -5527,7 +5561,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -5595,9 +5629,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ "bitflags", "core-foundation", @@ -5608,9 +5642,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -5627,9 +5661,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" dependencies = [ "serde", ] @@ -5679,16 +5713,16 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "itoa", "memchr", "ryu", @@ -5713,7 +5747,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -5747,7 +5781,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_derive", "serde_json", @@ -5764,7 +5798,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -5789,7 +5823,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -5926,7 +5960,7 @@ dependencies = [ [[package]] name = "sp1-build" -version = "4.0.0" +version = "4.0.1" dependencies = [ "anyhow", "cargo_metadata", @@ -5937,7 +5971,7 @@ dependencies = [ [[package]] name = "sp1-core-executor" -version = "4.0.0" +version = "4.0.1" dependencies = [ "bincode", "bytemuck", @@ -5974,7 +6008,7 @@ dependencies = [ [[package]] name = "sp1-core-machine" -version = "4.0.0" +version = "4.0.1" dependencies = [ "bincode", "cbindgen", @@ -6029,7 +6063,7 @@ dependencies = [ [[package]] name = "sp1-cuda" -version = "4.0.0" +version = "4.0.1" dependencies = [ "bincode", "ctrlc", @@ -6044,7 +6078,7 @@ dependencies = [ [[package]] name = "sp1-curves" -version = "4.0.0" +version = "4.0.1" dependencies = [ "cfg-if", "dashu", @@ -6064,7 +6098,7 @@ dependencies = [ [[package]] name = "sp1-derive" -version = "4.0.0" +version = "4.0.1" dependencies = [ "quote", "syn 1.0.109", @@ -6072,21 +6106,7 @@ dependencies = [ [[package]] name = "sp1-lib" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea7811abd2d3a991007fcb284f41152840b8388c171288d0c52c6793956609c" -dependencies = [ - "anyhow", - "bincode", - "cfg-if", - "hex", - "serde", - "snowbridge-amcl", -] - -[[package]] -name = "sp1-lib" -version = "4.0.0" +version = "4.0.1" dependencies = [ "bincode", "serde", @@ -6095,7 +6115,7 @@ dependencies = [ [[package]] name = "sp1-primitives" -version = "4.0.0" +version = "4.0.1" dependencies = [ "bincode", "hex", @@ -6111,7 +6131,7 @@ dependencies = [ [[package]] name = "sp1-prover" -version = "4.0.0" +version = "4.0.1" dependencies = [ "anyhow", "bincode", @@ -6152,7 +6172,7 @@ dependencies = [ [[package]] name = "sp1-recursion-circuit" -version = "4.0.0" +version = "4.0.1" dependencies = [ "hashbrown 0.14.5", "itertools 0.13.0", @@ -6167,6 +6187,7 @@ dependencies = [ "p3-fri", "p3-matrix", "p3-symmetric", + "p3-uni-stark", "p3-util", "rand 0.8.5", "rayon", @@ -6184,7 +6205,7 @@ dependencies = [ [[package]] name = "sp1-recursion-compiler" -version = "4.0.0" +version = "4.0.1" dependencies = [ "backtrace", "itertools 0.13.0", @@ -6204,7 +6225,7 @@ dependencies = [ [[package]] name = "sp1-recursion-core" -version = "4.0.0" +version = "4.0.1" dependencies = [ "backtrace", "cbindgen", @@ -6245,7 +6266,7 @@ dependencies = [ [[package]] name = "sp1-recursion-derive" -version = "4.0.0" +version = "4.0.1" dependencies = [ "quote", "syn 1.0.109", @@ -6253,7 +6274,7 @@ dependencies = [ [[package]] name = "sp1-recursion-gnark-ffi" -version = "4.0.0" +version = "4.0.1" dependencies = [ "anyhow", "bincode", @@ -6277,9 +6298,9 @@ dependencies = [ [[package]] name = "sp1-sdk" -version = "4.0.0" +version = "4.0.1" dependencies = [ - "alloy-primitives 0.8.15", + "alloy-primitives 0.8.19", "alloy-signer", "alloy-signer-local", "alloy-sol-types", @@ -6323,7 +6344,7 @@ dependencies = [ [[package]] name = "sp1-stark" -version = "4.0.0" +version = "4.0.1" dependencies = [ "arrayref", "hashbrown 0.14.5", @@ -6356,45 +6377,45 @@ dependencies = [ [[package]] name = "sp1-verifier" -version = "4.0.0" +version = "4.0.1" dependencies = [ "hex", "lazy_static", "sha2 0.10.8", "substrate-bn-succinct", - "thiserror 2.0.9", + "thiserror 2.0.11", ] [[package]] name = "sp1-zkvm" -version = "4.0.0" +version = "4.0.1" dependencies = [ "cfg-if", "critical-section", "embedded-alloc", - "getrandom", + "getrandom 0.2.15", "lazy_static", "libm", "p3-baby-bear", "p3-field", "rand 0.8.5", "sha2 0.10.8", - "sp1-lib 4.0.0", + "sp1-lib", "sp1-primitives", ] [[package]] name = "sp1_bls12_381" -version = "0.8.0" +version = "0.8.0-sp1-4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27c4b8901334dc09099dd82f80a72ddfc76b0046f4b342584c808f1931bed5a" +checksum = "260e07035fec67f2018dbb70359bed671582160bbcb2419deb812e583c8c975a" dependencies = [ "cfg-if", "ff 0.13.0", "group 0.13.0", "pairing 0.23.0", "rand_core 0.6.4", - "sp1-lib 1.2.0", + "sp1-lib", "subtle", ] @@ -6511,7 +6532,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -6539,7 +6560,7 @@ dependencies = [ "num-bigint 0.4.6", "rand 0.8.5", "rustc-hex", - "sp1-lib 4.0.0", + "sp1-lib", ] [[package]] @@ -6556,7 +6577,7 @@ dependencies = [ "num-bigint 0.4.6", "rand 0.8.5", "rustc-hex", - "sp1-lib 4.0.0", + "sp1-lib", ] [[package]] @@ -6606,9 +6627,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.93" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -6617,14 +6638,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" +checksum = "b84e4d83a0a6704561302b917a932484e1cae2d8c6354c64be8b7bac1c1fe057" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -6656,7 +6677,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -6682,12 +6703,13 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -6784,11 +6806,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.11", ] [[package]] @@ -6799,18 +6821,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -6921,9 +6943,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -6939,13 +6961,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -7009,7 +7031,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "toml_datetime", "winnow 0.5.40", ] @@ -7020,11 +7042,11 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.20", + "winnow 0.6.25", ] [[package]] @@ -7140,7 +7162,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -7255,9 +7277,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-segmentation" @@ -7320,9 +7342,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -7382,36 +7404,46 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -7422,9 +7454,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7432,22 +7464,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -7464,9 +7499,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -7721,13 +7756,22 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "ad699df48212c6cc6eb4435f35500ac6fd3b9913324f938aea302022ce19d310" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" @@ -7769,7 +7813,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "synstructure 0.13.1", ] @@ -7791,7 +7835,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -7811,7 +7855,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", "synstructure 0.13.1", ] @@ -7832,7 +7876,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] @@ -7854,7 +7898,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.93", + "syn 2.0.96", ] [[package]] diff --git a/examples/elf/riscv32im-succinct-zkvm-elf b/examples/elf/riscv32im-succinct-zkvm-elf index dbd4cfab994c920e538d9c66156ee5d554547c41..4eb342cd6fb583589dc1de6c1ed5679b6e701f0c 100755 GIT binary patch literal 111928 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

W2IPFxR8`9T)mQ4Lns-y9S)ao9S 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

G?mR_+Y5uC-zLn>myLwq~->Nm| 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