From 3edc61e9627339ad8d3a98abb31294932404ce37 Mon Sep 17 00:00:00 2001 From: Champii1 Date: Mon, 22 Jul 2024 15:12:26 +0200 Subject: [PATCH] Distributed prover --- Cargo.lock | 634 +++++++++--------- Cargo.toml | 10 + core/src/utils/mod.rs | 1 + .../utils/prove_distributed/checkpoints.rs | 154 +++++ core/src/utils/prove_distributed/mod.rs | 247 +++++++ .../prove_distributed/processing_thread.rs | 110 +++ sdk/src/distributed/mod.rs | 129 ++++ sdk/src/distributed/worker/error.rs | 24 + sdk/src/distributed/worker/mod.rs | 11 + sdk/src/distributed/worker/pool.rs | 345 ++++++++++ sdk/src/distributed/worker/protocol.rs | 117 ++++ sdk/src/distributed/worker/server.rs | 139 ++++ sdk/src/distributed/worker/socket.rs | 112 ++++ sdk/src/distributed/worker/worker.version | 1 + sdk/src/lib.rs | 30 + sdk/src/provers/mod.rs | 1 + 16 files changed, 1766 insertions(+), 299 deletions(-) create mode 100644 core/src/utils/prove_distributed/checkpoints.rs create mode 100644 core/src/utils/prove_distributed/mod.rs create mode 100644 core/src/utils/prove_distributed/processing_thread.rs create mode 100644 sdk/src/distributed/mod.rs create mode 100644 sdk/src/distributed/worker/error.rs create mode 100644 sdk/src/distributed/worker/mod.rs create mode 100644 sdk/src/distributed/worker/pool.rs create mode 100644 sdk/src/distributed/worker/protocol.rs create mode 100644 sdk/src/distributed/worker/server.rs create mode 100644 sdk/src/distributed/worker/socket.rs create mode 100644 sdk/src/distributed/worker/worker.version diff --git a/Cargo.lock b/Cargo.lock index 9fab59948c..cd2b833cc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,9 +78,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy-primitives" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f783611babedbbe90db3478c120fb5f5daacceffc210b39adc0af4fe0da70bad" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" dependencies = [ "alloy-rlp", "bytes", @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" +checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" dependencies = [ "arrayvec", "bytes", @@ -110,23 +110,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bad41a7c19498e3f6079f7744656328699f8ea3e783bdd10d85788cd439f572" +checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9899da7d011b4fe4c406a524ed3e3f963797dbc93b45479d60341d3a27b252" +checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -135,31 +135,31 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32d595768fdc61331a132b6f65db41afae41b9b97d36c21eb1b955c422a7e60" +checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" dependencies = [ "const-hex", "dunce", "heck", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", "syn-solidity", ] [[package]] name = "alloy-sol-types" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49042c6d3b66a9fe6b2b5a8bf0d39fc2ae1ee0310a2a26ffedd79fb097878dd" +checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" dependencies = [ "alloy-primitives", "alloy-sol-macro", @@ -199,9 +199,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -214,33 +214,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -381,9 +381,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" @@ -399,7 +399,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -427,7 +427,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -447,9 +447,9 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.1", "hyper-util", "itoa", "matchit", @@ -480,7 +480,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", @@ -558,7 +558,7 @@ version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -571,7 +571,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.67", + "syn 2.0.72", "which", ] @@ -598,9 +598,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -636,16 +636,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "rayon", + "rayon-core", ] [[package]] @@ -706,9 +706,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" dependencies = [ "serde", ] @@ -753,9 +753,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" dependencies = [ "jobserver", "libc", @@ -786,7 +786,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -839,9 +839,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.9" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" +checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3" dependencies = [ "clap_builder", "clap_derive", @@ -849,9 +849,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.9" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" +checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa" dependencies = [ "anstream", "anstyle", @@ -861,21 +861,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.8" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cobs" @@ -937,9 +937,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "console" @@ -1152,14 +1152,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1167,27 +1167,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -1231,7 +1231,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.0", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -1317,9 +1317,9 @@ dependencies = [ [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elf" @@ -1534,7 +1534,7 @@ dependencies = [ "regex", "serde", "serde_json", - "syn 2.0.67", + "syn 2.0.72", "toml", "walkdir", ] @@ -1552,7 +1552,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -1578,7 +1578,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.67", + "syn 2.0.72", "tempfile", "thiserror", "tiny-keccak", @@ -1853,7 +1853,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -1951,11 +1951,11 @@ checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "git2" -version = "0.18.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", "libgit2-sys", "log", @@ -2177,9 +2177,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -2194,7 +2194,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -2212,9 +2212,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -2236,16 +2236,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", "futures-util", "h2 0.4.5", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -2263,7 +2263,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.30", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -2277,9 +2277,9 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.3.1", + "hyper 1.4.1", "hyper-util", - "rustls 0.23.10", + "rustls 0.23.12", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -2295,7 +2295,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.1", "hyper-util", "native-tls", "tokio", @@ -2305,16 +2305,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.3.1", + "http-body 1.0.1", + "hyper 1.4.1", "pin-project-lite", "socket2", "tokio", @@ -2478,9 +2478,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -2517,9 +2517,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -2617,9 +2617,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" -version = "0.16.2+1.7.2" +version = "0.17.0+1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" dependencies = [ "cc", "libc", @@ -2629,12 +2629,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2649,7 +2649,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -2737,13 +2737,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2940,7 +2941,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -2960,9 +2961,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.0" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" dependencies = [ "memchr", ] @@ -2981,9 +2982,9 @@ checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "open-fastrlp" @@ -3012,11 +3013,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -3033,7 +3034,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -3044,9 +3045,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -3073,14 +3074,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45e909ef66fa5d77ff0fd3cb5af4b33b27fa6fb68d02b9b1e70edbc29383e565" dependencies = [ "p3-field", - "p3-matrix", + "p3-matrix 0.1.3-succinct", ] [[package]] name = "p3-baby-bear" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46965470aac1cddfe52f535424b59d52f2fffef0fdeb9dbed19da39b1d8f048a" +version = "0.1.4" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" dependencies = [ "num-bigint 0.4.6", "p3-field", @@ -3118,14 +3118,15 @@ dependencies = [ [[package]] name = "p3-challenger" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6662ea899a5d848b60c699944491d72757873b5e1fd46798e4712f90a03a4e9" +version = "0.1.4" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" dependencies = [ "p3-field", - "p3-maybe-rayon", + "p3-maybe-rayon 0.1.0", "p3-symmetric", - "p3-util", + "p3-util 0.1.0", + "serde", + "serde_with", "tracing", ] @@ -3138,11 +3139,23 @@ dependencies = [ "itertools 0.12.1", "p3-challenger", "p3-field", - "p3-matrix", - "p3-util", + "p3-matrix 0.1.3-succinct", + "p3-util 0.1.3-succinct", "serde", ] +[[package]] +name = "p3-dft" +version = "0.1.0" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" +dependencies = [ + "p3-field", + "p3-matrix 0.1.0", + "p3-maybe-rayon 0.1.0", + "p3-util 0.1.0", + "tracing", +] + [[package]] name = "p3-dft" version = "0.1.3-succinct" @@ -3150,22 +3163,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "510095701819d83c9509fe825bbf1ebfe50426ae75149df5fe1dcfd18261323a" dependencies = [ "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", + "p3-util 0.1.3-succinct", "tracing", ] [[package]] name = "p3-field" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f1977a0a65789f719aa824119c332c4676b000bdbfe94d312fb6244a70d601" +version = "0.1.4" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.6", "num-traits", - "p3-util", + "p3-util 0.1.0", "rand", "serde", ] @@ -3179,12 +3191,12 @@ dependencies = [ "itertools 0.12.1", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", "p3-interpolation", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", + "p3-util 0.1.3-succinct", "serde", "tracing", ] @@ -3196,8 +3208,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d032cda212f6b408d7d5b0b9a8270a9455acb93742fe55a0880d82be8e90e500" dependencies = [ "p3-field", - "p3-matrix", - "p3-util", + "p3-matrix 0.1.3-succinct", + "p3-util 0.1.3-succinct", ] [[package]] @@ -3218,14 +3230,28 @@ checksum = "e8398f1694ccc38513df0b8cab5f9ef7325423f27cd9e4fa20bdc77d5079cf1b" dependencies = [ "p3-air", "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", + "p3-util 0.1.3-succinct", "tracing", "tracing-forest", "tracing-subscriber", ] +[[package]] +name = "p3-matrix" +version = "0.1.0" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "p3-maybe-rayon 0.1.0", + "p3-util 0.1.0", + "rand", + "serde", + "tracing", +] + [[package]] name = "p3-matrix" version = "0.1.3-succinct" @@ -3234,13 +3260,18 @@ checksum = "d548ee0b834f8e2ebc5037073acd101a3b0ca41a2d1d28a15ba0ccd9059495b0" dependencies = [ "itertools 0.12.1", "p3-field", - "p3-maybe-rayon", - "p3-util", + "p3-maybe-rayon 0.1.3-succinct", + "p3-util 0.1.3-succinct", "rand", "serde", "tracing", ] +[[package]] +name = "p3-maybe-rayon" +version = "0.1.0" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" + [[package]] name = "p3-maybe-rayon" version = "0.1.3-succinct" @@ -3252,16 +3283,15 @@ dependencies = [ [[package]] name = "p3-mds" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6e57ed310d59245f93e24ee805ea7aa16fc9c505551b76a15f5e50f29d177e" +version = "0.1.0" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" dependencies = [ "itertools 0.12.1", - "p3-dft", + "p3-dft 0.1.0", "p3-field", - "p3-matrix", + "p3-matrix 0.1.0", "p3-symmetric", - "p3-util", + "p3-util 0.1.0", "rand", ] @@ -3274,32 +3304,32 @@ dependencies = [ "itertools 0.12.1", "p3-commit", "p3-field", - "p3-matrix", - "p3-maybe-rayon", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", "p3-symmetric", - "p3-util", + "p3-util 0.1.3-succinct", "serde", "tracing", ] [[package]] name = "p3-poseidon2" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adaba6f14c197203530e233badce0ca1126ba3bf3c9ff766505b497bdad0bee1" +version = "0.1.4" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" dependencies = [ "gcd", "p3-field", "p3-mds", "p3-symmetric", "rand", + "serde", + "serde_with", ] [[package]] name = "p3-symmetric" -version = "0.1.3-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ecc4282566eb14f48be7707f6745c4dff6be664984d59ec0fb1849cd82b5c2" +version = "0.1.4" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" dependencies = [ "itertools 0.12.1", "p3-field", @@ -3316,11 +3346,11 @@ dependencies = [ "p3-air", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", + "p3-util 0.1.3-succinct", "postcard", "serde", "tracing", @@ -3328,6 +3358,14 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "p3-util" +version = "0.1.0" +source = "git+https://github.com/Champii/Plonky3.git?branch=serde_patch#f69d88073053e4132322cb495314ce859b0f7229" +dependencies = [ + "serde", +] + [[package]] name = "p3-util" version = "0.1.3-succinct" @@ -3392,7 +3430,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3467,9 +3505,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.10" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ "memchr", "thiserror", @@ -3503,7 +3541,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -3564,9 +3602,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" [[package]] name = "postcard" @@ -3598,7 +3636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -3669,13 +3707,13 @@ dependencies = [ [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand", @@ -3707,7 +3745,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -3736,7 +3774,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.10", + "rustls 0.23.12", "thiserror", "tokio", "tracing", @@ -3752,7 +3790,7 @@ dependencies = [ "rand", "ring 0.17.8", "rustc-hash", - "rustls 0.23.10", + "rustls 0.23.12", "slab", "thiserror", "tinyvec", @@ -3761,14 +3799,13 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" dependencies = [ "libc", "once_cell", "socket2", - "tracing", "windows-sys 0.52.0", ] @@ -3857,11 +3894,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -3933,7 +3970,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -3973,9 +4010,9 @@ dependencies = [ "futures-util", "h2 0.4.5", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.1", "hyper-rustls 0.27.2", "hyper-tls", "hyper-util", @@ -3988,7 +4025,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.10", + "rustls 0.23.12", "rustls-pemfile 2.1.2", "rustls-pki-types", "serde", @@ -4179,7 +4216,7 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -4200,14 +4237,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ "once_cell", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.4", + "rustls-webpki 0.102.6", "subtle", "zeroize", ] @@ -4249,9 +4286,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -4326,9 +4363,9 @@ dependencies = [ [[package]] name = "scc" -version = "2.1.1" +version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ad2bbb0ae5100a07b7a6f2ed7ab5fd0045551a4c507989b7a620046ea3efdc" +checksum = "1fadf67e3cf23f8b11a6c8c48a16cb2437381503615acd91094ec7b4686a5a53" dependencies = [ "sdd", ] @@ -4372,9 +4409,9 @@ dependencies = [ [[package]] name = "sdd" -version = "0.2.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84345e4c9bd703274a082fb80caaa99b7612be48dfaa1dd9266577ec412309d" +checksum = "85f05a494052771fc5bd0619742363b5e24e5ad72ab3111ec2e27925b8edc5f3" [[package]] name = "sec1" @@ -4392,11 +4429,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -4405,9 +4442,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -4469,7 +4506,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -4495,9 +4532,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -4541,7 +4578,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -4566,7 +4603,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -4753,18 +4790,18 @@ dependencies = [ "p3-blake3", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", "p3-fri", "p3-keccak", "p3-keccak-air", - "p3-matrix", - "p3-maybe-rayon", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", "p3-merkle-tree", "p3-poseidon2", "p3-symmetric", "p3-uni-stark", - "p3-util", + "p3-util 0.1.3-succinct", "rand", "rayon-scan", "rrs-succinct", @@ -4888,14 +4925,14 @@ dependencies = [ "p3-bn254-fr", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", "p3-fri", - "p3-matrix", + "p3-matrix 0.1.3-succinct", "p3-merkle-tree", "p3-poseidon2", "p3-symmetric", - "p3-util", + "p3-util 0.1.3-succinct", "rand", "serde", "sp1-core", @@ -4918,14 +4955,14 @@ dependencies = [ "p3-bn254-fr", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", "p3-fri", - "p3-matrix", + "p3-matrix 0.1.3-succinct", "p3-merkle-tree", "p3-poseidon2", "p3-symmetric", - "p3-util", + "p3-util 0.1.3-succinct", "rand", "serde", "sp1-core", @@ -4950,15 +4987,15 @@ dependencies = [ "p3-bn254-fr", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", "p3-fri", - "p3-matrix", - "p3-maybe-rayon", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", "p3-merkle-tree", "p3-poseidon2", "p3-symmetric", - "p3-util", + "p3-util 0.1.3-succinct", "rand", "serde", "serde_with", @@ -5021,15 +5058,15 @@ dependencies = [ "p3-baby-bear", "p3-challenger", "p3-commit", - "p3-dft", + "p3-dft 0.1.3-succinct", "p3-field", "p3-fri", - "p3-matrix", - "p3-maybe-rayon", + "p3-matrix 0.1.3-succinct", + "p3-maybe-rayon 0.1.3-succinct", "p3-merkle-tree", "p3-poseidon2", "p3-symmetric", - "p3-util", + "p3-util 0.1.3-succinct", "rand", "serde", "sp1-core", @@ -5062,7 +5099,7 @@ dependencies = [ "p3-commit", "p3-field", "p3-fri", - "p3-matrix", + "p3-matrix 0.1.3-succinct", "prost", "reqwest 0.12.5", "reqwest-middleware", @@ -5167,14 +5204,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] name = "subtle" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0208408ba0c3df17ed26eb06992cb1a1268d41b2c0e12e65203fbe3972cee5" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "subtle-encoding" @@ -5198,9 +5235,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.67" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff8655ed1d86f3af4ee3fd3263786bc14245ad17c4c7e85ba7187fb3ae028c90" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -5209,14 +5246,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d71e19bca02c807c9faa67b5a47673ff231b6e7449b251695188522f1dc44b2" +checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -5293,22 +5330,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -5375,9 +5412,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -5390,32 +5427,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -5444,7 +5480,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.10", + "rustls 0.23.12", "rustls-pki-types", "tokio", ] @@ -5464,21 +5500,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.14", + "toml_edit 0.22.17", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" dependencies = [ "serde", ] @@ -5507,15 +5543,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.14" +version = "0.22.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.13", + "winnow 0.6.16", ] [[package]] @@ -5566,7 +5602,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -5649,7 +5685,7 @@ dependencies = [ "futures", "http 1.1.0", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.1", "prost", "reqwest 0.12.5", "serde", @@ -5776,9 +5812,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "8.3.1" +version = "8.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" +checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" dependencies = [ "anyhow", "cfg-if", @@ -5789,9 +5825,9 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" @@ -5848,7 +5884,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -5882,7 +5918,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5991,7 +6027,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -6000,7 +6036,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -6018,7 +6054,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -6038,18 +6074,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -6060,9 +6096,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6072,9 +6108,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6084,15 +6120,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6102,9 +6138,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6114,9 +6150,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6126,9 +6162,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6138,9 +6174,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -6153,9 +6189,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.13" +version = "0.6.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" dependencies = [ "memchr", ] @@ -6216,22 +6252,22 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] @@ -6251,7 +6287,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.72", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7cab20b422..18cee36a31 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,6 +79,7 @@ p3-uni-stark = "0.1.3-succinct" p3-maybe-rayon = "0.1.3-succinct" p3-bn254-fr = "0.1.3-succinct" + # For local development. # p3-air = { path = "../Plonky3/air" } @@ -101,3 +102,12 @@ p3-bn254-fr = "0.1.3-succinct" # p3-uni-stark = { path = "../Plonky3/uni-stark" } # p3-maybe-rayon = { path = "../Plonky3/maybe-rayon" } # p3-bn254-fr = { path = "../Plonky3/bn254-fr" } + +# Patch Plonky3 for Serialize and Deserialize of DuplexChallenger +[patch.crates-io] +p3-field = { git = "https://github.com/Champii/Plonky3.git", branch = "serde_patch" } +p3-challenger = { git = "https://github.com/Champii/Plonky3.git", branch = "serde_patch" } +p3-poseidon2 = { git = "https://github.com/Champii/Plonky3.git", branch = "serde_patch" } +p3-baby-bear = { git = "https://github.com/Champii/Plonky3.git", branch = "serde_patch" } +p3-symmetric = { git = "https://github.com/Champii/Plonky3.git", branch = "serde_patch" } + diff --git a/core/src/utils/mod.rs b/core/src/utils/mod.rs index d0f9206d3e..0d40f2c376 100644 --- a/core/src/utils/mod.rs +++ b/core/src/utils/mod.rs @@ -6,6 +6,7 @@ mod options; #[cfg(any(test, feature = "programs"))] mod programs; mod prove; +pub mod prove_distributed; mod serde; mod tracer; diff --git a/core/src/utils/prove_distributed/checkpoints.rs b/core/src/utils/prove_distributed/checkpoints.rs new file mode 100644 index 0000000000..cd58ab8949 --- /dev/null +++ b/core/src/utils/prove_distributed/checkpoints.rs @@ -0,0 +1,154 @@ +use std::sync::{mpsc::SyncSender, Arc}; + +pub use crate::{air::PublicValues, runtime::Program, stark::RiscvAir}; + +use crate::{ + runtime::{ExecutionRecord, NoOpSubproofVerifier, Runtime}, + stark::{MachineProver, MachineRecord}, + utils::{baby_bear_poseidon2::Val, BabyBearPoseidon2, SP1CoreOpts}, +}; + +use super::Checkpoint; + +fn trace_checkpoint( + program: Program, + checkpoint: Checkpoint, + opts: SP1CoreOpts, +) -> (Vec, Checkpoint) { + let mut runtime = Runtime::recover(program, checkpoint, opts); + + runtime.subproof_verifier = Arc::new(NoOpSubproofVerifier); + + let (events, _) = + tracing::debug_span!("runtime.trace").in_scope(|| runtime.execute_record().unwrap()); + + let state = runtime.state.clone(); + + (events, state) +} + +pub fn process>>( + prover: &P, + program: &Program, + checkpoint: Checkpoint, + nb_checkpoints: usize, + state: PublicValues, + opts: SP1CoreOpts, + records_tx: SyncSender>, + deferred: &mut ExecutionRecord, + is_deferred: bool, +) { + if is_deferred { + process_deferred(program, checkpoint, state, opts, records_tx, deferred); + } else { + process_regular( + prover, + program, + checkpoint, + nb_checkpoints, + state, + opts, + records_tx, + deferred, + ); + } +} + +fn process_regular>>( + prover: &P, + program: &Program, + mut checkpoint: Checkpoint, + nb_checkpoints: usize, + mut state: PublicValues, + opts: SP1CoreOpts, + records_tx: SyncSender>, + deferred: &mut ExecutionRecord, +) { + tracing::debug_span!("phase 1 record generator").in_scope(|| { + let mut processed_checkpoints = 0; + + while processed_checkpoints < nb_checkpoints { + log::info!( + "Processing checkpoint {}/{}", + processed_checkpoints + 1, + nb_checkpoints + ); + // Trace the checkpoint and reconstruct the execution records. + let (mut records, new_checkpoint) = tracing::debug_span!("trace checkpoint") + .in_scope(|| trace_checkpoint(program.clone(), checkpoint, opts)); + + checkpoint = new_checkpoint; + + // Update the public values & prover state for the shards which contain "cpu events". + for record in records.iter_mut() { + state.shard += 1; + state.execution_shard = record.public_values.execution_shard; + state.start_pc = record.public_values.start_pc; + state.next_pc = record.public_values.next_pc; + record.public_values = state; + } + + // Generate the dependencies. + tracing::debug_span!("generate dependencies") + .in_scope(|| prover.machine().generate_dependencies(&mut records, &opts)); + + // Defer events that are too expensive to include in every shard. + for record in records.iter_mut() { + deferred.append(&mut record.defer()); + } + + // See if any deferred shards are ready to be commited to. + let mut _deferred = deferred.split(false, opts.split_opts); + + // Update the public values & prover state for the shards which do not contain "cpu events" + // before committing to them. + state.execution_shard += 1; + + records_tx.send(records).unwrap(); + + processed_checkpoints += 1; + } + }); +} + +fn process_deferred( + program: &Program, + checkpoint: Checkpoint, + mut state: PublicValues, + opts: SP1CoreOpts, + records_tx: SyncSender>, + deferred: &mut ExecutionRecord, +) { + tracing::debug_span!("phase 1 record generator").in_scope(|| { + // Trace the checkpoint and reconstruct the execution records. + let (mut records, _) = tracing::debug_span!("trace checkpoint") + .in_scope(|| trace_checkpoint(program.clone(), checkpoint, opts)); + + // Update the public values & prover state for the shards which contain "cpu events". + for record in records.iter_mut() { + // state.shard += 1; + state.execution_shard = record.public_values.execution_shard; + state.start_pc = record.public_values.start_pc; + state.next_pc = record.public_values.next_pc; + record.public_values = state; + } + + // See if any deferred shards are ready to be commited to. + let mut deferred = deferred.split(true, opts.split_opts); + + // Update the public values & prover state for the shards which do not contain "cpu events" + // before committing to them. + + for record in deferred.iter_mut() { + state.shard += 1; + state.previous_init_addr_bits = record.public_values.previous_init_addr_bits; + state.last_init_addr_bits = record.public_values.last_init_addr_bits; + state.previous_finalize_addr_bits = record.public_values.previous_finalize_addr_bits; + state.last_finalize_addr_bits = record.public_values.last_finalize_addr_bits; + state.start_pc = state.next_pc; + record.public_values = state; + } + + records_tx.send(deferred).unwrap(); + }); +} diff --git a/core/src/utils/prove_distributed/mod.rs b/core/src/utils/prove_distributed/mod.rs new file mode 100644 index 0000000000..a9d989e869 --- /dev/null +++ b/core/src/utils/prove_distributed/mod.rs @@ -0,0 +1,247 @@ +use p3_challenger::DuplexChallenger; +use p3_symmetric::Hash; + +pub use crate::{air::PublicValues, runtime::Program, stark::RiscvAir}; + +use crate::{ + io::SP1Stdin, + runtime::{ExecutionRecord, ExecutionState, Runtime, SP1Context}, + stark::{ + MachineProver, ShardProof, StarkGenericConfig, StarkMachine, StarkProvingKey, + StarkVerifyingKey, + }, + utils::{ + baby_bear_poseidon2::{Perm, Val}, + BabyBearPoseidon2, SP1CoreOpts, SP1CoreProverError, + }, +}; + +mod checkpoints; +mod processing_thread; + +pub type CoreSC = BabyBearPoseidon2; + +pub type Checkpoint = ExecutionState; +pub type Shard = ExecutionRecord; +pub type ShardsPublicValues = Vec; +pub type Commitments = Vec; +pub type Commitment = Hash; +pub type PartialProofs = Vec>; +pub type Challenger = DuplexChallenger; +pub type Machine = StarkMachine>; +pub type ProvingKey = StarkProvingKey; +pub type VerifyingKey = StarkVerifyingKey; + +// This is the entry point of the orchestrator +// It computes the checkpoints to be sent to the workers +pub fn compute_checkpoints( + stdin: &SP1Stdin, + program: &Program, + nb_workers: usize, + context: SP1Context, +) -> Result< + ( + Vec<(Checkpoint, usize)>, + Checkpoint, // last checlpoint + Vec, + PublicValues, + SP1CoreOpts, + u32, // total nb shards + ), + SP1CoreProverError, +> { + log::info!("Computing checkpoints"); + let opts = SP1CoreOpts::default(); + + // Execute the program. + let mut runtime = Runtime::with_context(program.clone(), opts, context); + runtime.write_vecs(&stdin.buffer); + + for proof in stdin.proofs.iter() { + runtime.write_proof(proof.0.clone(), proof.1.clone()); + } + + let mut checkpoints_states = Vec::new(); + + // Execute the program, saving checkpoints at the start of every `shard_batch_size` cycle range. + let create_checkpoints_span = tracing::debug_span!("create checkpoints").entered(); + + let (total_nb_shards, public_values_stream, public_values) = loop { + // Execute the runtime until we reach a checkpoint. + let (checkpoint, done) = runtime + .execute_state() + .map_err(SP1CoreProverError::ExecutionError)?; + + let mut checkpoint_file = tempfile::tempfile().map_err(SP1CoreProverError::IoError)?; + + checkpoint + .save(&mut checkpoint_file) + .map_err(SP1CoreProverError::IoError)?; + + checkpoints_states.push(checkpoint_file); + + // If we've reached the final checkpoint, break out of the loop. + if done { + break ( + runtime.shard() as usize, + runtime.state.public_values_stream, + runtime + .records + .last() + .expect("at least one record") + .public_values, + ); + } + }; + + create_checkpoints_span.exit(); + + log::info!( + "Nb shards: {}", + checkpoints_states.len() * opts.shard_batch_size + ); + + let nb_checkpoints_per_workers = + (checkpoints_states.len() as f64 / nb_workers as f64).ceil() as usize; + + let last_checkpoint = checkpoints_states + .last() + .map(|file| { + let mut reader = std::io::BufReader::new(file); + + bincode::deserialize_from(&mut reader).expect("failed to deserialize state") + }) + .unwrap(); + + let checkpoints_states = checkpoints_states + .chunks(nb_checkpoints_per_workers) + .map(|files| { + let mut reader = std::io::BufReader::new(&files[0]); + + let checkpoint = + bincode::deserialize_from(&mut reader).expect("failed to deserialize state"); + + (checkpoint, files.len()) + }) + .collect::>(); + + Ok(( + checkpoints_states, + last_checkpoint, + public_values_stream, + public_values, + opts, + total_nb_shards as u32, + )) +} + +// This is the entry point of the worker +// It commits the checkpoints and returns the commitments and the public values of the shards +pub fn commit>>( + prover: &P, + program: &Program, + checkpoint: Checkpoint, + nb_checkpoints: usize, + state: PublicValues, + opts: SP1CoreOpts, + deferred_opt: Option, +) -> Result<(Commitments, Vec, ExecutionRecord), SP1CoreProverError> { + let mut deferred = deferred_opt + .clone() + .unwrap_or_else(|| ExecutionRecord::new(program.clone().into())); + + let scope_span = tracing::Span::current().clone(); + + std::thread::scope(move |s| { + let (records_tx, commitments_handle) = processing_thread::spawn_commit::< + P, + (Commitment, ShardsPublicValues), + >(prover, s, opts, scope_span.clone()); + + checkpoints::process( + prover, + program, + checkpoint, + nb_checkpoints, + state, + opts, + records_tx, + &mut deferred, + deferred_opt.is_some(), + ); + + let result_vec = commitments_handle.join().unwrap(); + let (commitments, shards_public_values) = result_vec.into_iter().unzip(); + + Ok((commitments, shards_public_values, deferred)) + }) +} + +// When every worker has committed the shards, the orchestrator can observe the commitments +pub fn observe_commitments>>( + prover: &P, + vk: &StarkVerifyingKey, + commitments: Commitments, + shards_public_values: Vec, +) -> Challenger { + log::info!("Observing commitments"); + + let mut challenger = prover.machine().config().challenger(); + + vk.observe_into(&mut challenger); + + for (commitment, shard_public_values) in + commitments.into_iter().zip(shards_public_values.iter()) + { + prover.update(&mut challenger, commitment, &shard_public_values); + } + + challenger +} + +// The workers can now prove the shards thanks to the challenger sent by the orchestrator +pub fn prove>>( + prover: &P, + program: &Program, + pk: &StarkProvingKey, + checkpoint: Checkpoint, + nb_checkpoints: usize, + state: PublicValues, + opts: SP1CoreOpts, + challenger: Challenger, + deferred_opt: Option, +) -> Result<(PartialProofs, ExecutionRecord), SP1CoreProverError> { + // Prove the shards. + let mut deferred = deferred_opt + .clone() + .unwrap_or_else(|| ExecutionRecord::new(program.clone().into())); + + let scope_span = tracing::Span::current().clone(); + + std::thread::scope(move |s| { + let (records_tx, shard_proofs_handle) = processing_thread::spawn_prove( + prover, + s, + opts, + scope_span.clone(), + challenger.clone(), + pk, + ); + + checkpoints::process( + prover, + program, + checkpoint, + nb_checkpoints, + state, + opts, + records_tx, + &mut deferred, + deferred_opt.is_some(), + ); + + let shard_proofs = shard_proofs_handle.join().unwrap(); + + Ok((shard_proofs, deferred)) + }) +} diff --git a/core/src/utils/prove_distributed/processing_thread.rs b/core/src/utils/prove_distributed/processing_thread.rs new file mode 100644 index 0000000000..de7878aebd --- /dev/null +++ b/core/src/utils/prove_distributed/processing_thread.rs @@ -0,0 +1,110 @@ +use std::{ + sync::mpsc::{sync_channel, SyncSender}, + thread::ScopedJoinHandle, +}; + +use p3_maybe_rayon::prelude::*; + +pub use crate::stark::RiscvAir; + +use crate::{ + runtime::ExecutionRecord, + stark::{MachineProver, MachineRecord, ShardProof, StarkProvingKey}, + utils::{baby_bear_poseidon2::Val, BabyBearPoseidon2, SP1CoreOpts}, +}; + +use super::{Challenger, Commitment, ShardsPublicValues}; + +fn spawn_thread< + 'scope, + 'env, + P: MachineProver>, + R: Send + 'env, +>( + prover: &'env P, + thread_scope: &'scope std::thread::Scope<'scope, 'env>, + opts: SP1CoreOpts, + scope_span: tracing::Span, + closure: impl Fn(&'env P, &ExecutionRecord) -> R + Send + Sync + 'env, +) -> ( + SyncSender>, + ScopedJoinHandle<'scope, Vec>, +) { + let _span = scope_span.enter(); + + // Spawn a thread for commiting to the shards. + let span = tracing::Span::current().clone(); + + let (records_tx, records_rx) = + sync_channel::>(opts.commit_stream_capacity); + + let commitments_handle = thread_scope.spawn(move || { + let _span = span.enter(); + + let mut res_vec = Vec::new(); + + tracing::debug_span!("phase 1 commiter").in_scope(|| { + for records in records_rx.iter() { + let res: Vec<_> = tracing::debug_span!("batch").in_scope(|| { + let span = tracing::Span::current().clone(); + + records + .par_iter() + .map(|record| { + let _span = span.enter(); + + closure(prover, record) + }) + .collect() + }); + + res_vec.extend(res); + } + }); + + res_vec + }); + + (records_tx, commitments_handle) +} + +pub fn spawn_commit<'scope, 'env, P: MachineProver>, R>( + prover: &'env P, + thread_scope: &'scope std::thread::Scope<'scope, 'env>, + opts: SP1CoreOpts, + scope_span: tracing::Span, +) -> ( + SyncSender>, + ScopedJoinHandle<'scope, Vec<(Commitment, ShardsPublicValues)>>, +) { + spawn_thread(prover, thread_scope, opts, scope_span, |prover, record| { + ( + prover.commit(record), + record.public_values::()[0..prover.machine().num_pv_elts()].to_vec(), + ) + }) +} + +pub fn spawn_prove<'scope, 'env, P: MachineProver>>( + prover: &'env P, + thread_scope: &'scope std::thread::Scope<'scope, 'env>, + opts: SP1CoreOpts, + scope_span: tracing::Span, + challenger: Challenger, + pk: &'env StarkProvingKey, +) -> ( + SyncSender>, + ScopedJoinHandle<'scope, Vec>>, +) { + spawn_thread( + prover, + thread_scope, + opts, + scope_span, + move |prover, record| { + prover + .commit_and_open(&pk, record.clone(), &mut challenger.clone()) + .unwrap() + }, + ) +} diff --git a/sdk/src/distributed/mod.rs b/sdk/src/distributed/mod.rs new file mode 100644 index 0000000000..e365683cdb --- /dev/null +++ b/sdk/src/distributed/mod.rs @@ -0,0 +1,129 @@ +use crate::{ + CoreSC, Prover, SP1Proof, SP1ProofKind, SP1ProofWithPublicValues, SP1PublicValues, SP1Stdin, +}; +use anyhow::Result; +use sp1_core::{ + self, + runtime::{Program, SP1Context}, + stark::RiscvAir, + utils::{ + prove_distributed::{self}, + SP1ProverOpts, + }, +}; +use sp1_prover::{components::DefaultProverComponents, SP1Prover, SP1ProvingKey, SP1VerifyingKey}; + +use crate::install::block_on; + +mod worker; + +pub use worker::{ + serve_worker, RequestData, WorkerEnvelope, WorkerError, WorkerPool, WorkerProtocol, + WorkerRequest, WorkerResponse, WorkerSocket, +}; + +use crate::provers::ProverType; + +pub struct DistributedProver { + local_prover: SP1Prover, +} + +impl DistributedProver { + pub fn new() -> Self { + let local_prover = SP1Prover::new(); + + Self { local_prover } + } + + pub async fn prove_distributed( + &self, + elf: &[u8], + stdin: SP1Stdin, + ) -> Result { + let mut worker_pool = WorkerPool::new().await?; + + let program = Program::from(&elf); + let config = CoreSC::default(); + + let context = sp1_core::runtime::SP1Context::default(); + + let machine = RiscvAir::machine(config.clone()); + let (pk, vk) = machine.setup(&program); + + let ( + checkpoints, + last_checkpoint, + public_values_stream, + public_values, + opts, + total_nb_shards, + ) = prove_distributed::compute_checkpoints(&stdin, &program, worker_pool.len(), context)?; + + let (commitments, shards_public_values) = worker_pool + .commit( + &self.local_prover.core_prover, + &program, + elf, + checkpoints.clone(), + last_checkpoint.clone(), + total_nb_shards, + public_values, + opts, + ) + .await?; + + let challenger = prove_distributed::observe_commitments( + &self.local_prover.core_prover, + &vk, + commitments, + shards_public_values, + ); + + let shard_proofs = worker_pool + .prove( + &self.local_prover.core_prover, + &program, + elf, + &pk, + checkpoints.clone(), + last_checkpoint.clone(), + total_nb_shards, + public_values, + opts, + challenger.clone(), + ) + .await?; + + Ok(SP1ProofWithPublicValues { + proof: SP1Proof::Core(shard_proofs), + stdin, + public_values: SP1PublicValues::from(&public_values_stream), + sp1_version: self.version().to_string(), + }) + } +} + +impl Prover for DistributedProver { + fn id(&self) -> ProverType { + ProverType::Distributed + } + + fn setup(&self, elf: &[u8]) -> (SP1ProvingKey, SP1VerifyingKey) { + self.local_prover.setup(elf) + } + + fn sp1_prover(&self) -> &SP1Prover { + &self.local_prover + } + + fn prove<'a>( + &'a self, + pk: &SP1ProvingKey, + stdin: SP1Stdin, + _opts: SP1ProverOpts, + _context: SP1Context<'a>, + _kind: SP1ProofKind, + ) -> Result { + block_on(self.prove_distributed(&pk.elf, stdin)) + } +} diff --git a/sdk/src/distributed/worker/error.rs b/sdk/src/distributed/worker/error.rs new file mode 100644 index 0000000000..63e0a3286d --- /dev/null +++ b/sdk/src/distributed/worker/error.rs @@ -0,0 +1,24 @@ +use sp1_core::utils::SP1CoreProverError; +use thiserror::Error as ThisError; + +#[derive(ThisError, Debug)] +pub enum WorkerError { + #[error("All workers failed")] + AllWorkersFailed, + #[error("Worker cannot connect")] + CannotConnect, + #[error("Worker request timeout")] + RequestTimeout, + #[error("Worker IO error: {0}")] + IO(#[from] std::io::Error), + #[error("Worker Serde error: {0}")] + Serde(#[from] bincode::Error), + #[error("Worker invalid version")] + InvalidVersion, + #[error("Worker invalid request")] + InvalidRequest, + #[error("Worker invalid response")] + InvalidResponse, + #[error("Worker proof failed: {0}")] + Prove(#[from] SP1CoreProverError), +} diff --git a/sdk/src/distributed/worker/mod.rs b/sdk/src/distributed/worker/mod.rs new file mode 100644 index 0000000000..b425a86ff6 --- /dev/null +++ b/sdk/src/distributed/worker/mod.rs @@ -0,0 +1,11 @@ +mod error; +mod pool; +mod protocol; +mod server; +mod socket; + +pub use error::WorkerError; +pub use pool::WorkerPool; +pub use protocol::{RequestData, WorkerEnvelope, WorkerProtocol, WorkerRequest, WorkerResponse}; +pub use server::serve_worker; +pub use socket::WorkerSocket; diff --git a/sdk/src/distributed/worker/pool.rs b/sdk/src/distributed/worker/pool.rs new file mode 100644 index 0000000000..79767cc975 --- /dev/null +++ b/sdk/src/distributed/worker/pool.rs @@ -0,0 +1,345 @@ +use std::{ + collections::{BTreeMap, VecDeque}, + sync::Arc, + time::Duration, +}; + +use sp1_core::{ + air::PublicValues, + runtime::Program, + stark::{MachineProver, MachineRecord, RiscvAir}, + utils::{ + baby_bear_poseidon2::Val, + prove_distributed::{self, ProvingKey}, + BabyBearPoseidon2, SP1CoreOpts, + }, +}; +use sp1_core::{ + runtime::ExecutionRecord, + utils::prove_distributed::{ + Challenger, Checkpoint, Commitments, PartialProofs, ShardsPublicValues, + }, +}; +use tokio::sync::RwLock; + +use super::{RequestData, WorkerError, WorkerRequest, WorkerResponse, WorkerSocket}; + +pub struct WorkerPool { + workers: BTreeMap>>, +} + +impl WorkerPool { + pub async fn new() -> Result { + let workers = Self::spawn_workers().await?; + + Ok(Self { workers }) + } + + pub async fn commit>>( + &mut self, + prover: &P, + program: &Program, + elf: &[u8], + checkpoints: Vec<(Checkpoint, usize)>, + last_checkpoint: Checkpoint, + total_nb_shards: u32, + public_values: PublicValues, + opts: SP1CoreOpts, + ) -> Result<(Commitments, Vec), WorkerError> { + let nb_checkpoints_per_worker = checkpoints.first().unwrap().1; + + let requests = checkpoints + .into_iter() + .enumerate() + .map(|(i, (checkpoint, nb_checkpoints))| { + let state_shard_start = + (i * nb_checkpoints_per_worker * opts.shard_batch_size) as u32; + + WorkerRequest::Commit(RequestData { + elf: elf.to_vec(), + checkpoint, + nb_checkpoints, + public_values, + shard_batch_size: opts.shard_batch_size, + shard_size: opts.shard_size, + state_shard_start, + }) + }) + .collect(); + + let commitments_response = self.distribute_work(requests).await?; + + let mut commitments_vec = Vec::new(); + let mut shards_public_values_vec = Vec::new(); + let mut deferred = ExecutionRecord::new(program.clone().into()); + + for response in commitments_response { + let WorkerResponse::Commitment { + commitments, + shards_public_values, + deferred: mut deferred_new, + } = response + else { + return Err(WorkerError::InvalidResponse); + }; + + commitments_vec.extend(commitments); + shards_public_values_vec.extend(shards_public_values); + deferred.append(&mut deferred_new); + } + + let mut state = public_values.reset(); + state.shard = total_nb_shards + 1; + + // handle deferred + let (deferred_commitments, deferred_shards_public_values, _) = prove_distributed::commit( + prover, + &program, + last_checkpoint.clone(), + 1, + state, + opts, + Some(deferred), + )?; + + commitments_vec.extend(deferred_commitments); + shards_public_values_vec.extend(deferred_shards_public_values); + + Ok((commitments_vec, shards_public_values_vec)) + } + + pub async fn prove>>( + &mut self, + prover: &P, + program: &Program, + elf: &[u8], + pk: &ProvingKey, + checkpoints: Vec<(Checkpoint, usize)>, + last_checkpoint: Checkpoint, + total_nb_shards: u32, + public_values: PublicValues, + opts: SP1CoreOpts, + challenger: Challenger, + ) -> Result { + let nb_checkpoints_per_worker = checkpoints.first().unwrap().1; + + let requests: Vec<_> = checkpoints + .into_iter() + .enumerate() + .map(|(i, (checkpoint, nb_checkpoints))| { + let state_shard_start = + (i * nb_checkpoints_per_worker * opts.shard_batch_size) as u32; + + WorkerRequest::Prove { + request_data: RequestData { + elf: elf.to_vec(), + checkpoint, + nb_checkpoints, + public_values: public_values.clone(), + shard_batch_size: opts.shard_batch_size, + shard_size: opts.shard_size, + state_shard_start, + }, + challenger: challenger.clone(), + } + }) + .collect(); + + let proofs_response = self.distribute_work(requests).await?; + + let mut proofs = Vec::new(); + + let mut deferred = ExecutionRecord::new(program.clone().into()); + + for response in proofs_response { + let WorkerResponse::Proof(partial_proof, mut deferred_new) = response else { + return Err(WorkerError::InvalidResponse); + }; + + proofs.extend(partial_proof); + deferred.append(&mut deferred_new); + } + + let mut state = public_values.reset(); + state.shard = total_nb_shards + 1; + + // handle deferred + let (deferred_shard_proof, _) = prove_distributed::prove( + prover, + &program, + &pk, + last_checkpoint, + 1, + state, + opts, + challenger, + Some(deferred), + )?; + + proofs.extend(deferred_shard_proof); + + Ok(proofs) + } + + async fn distribute_work( + &mut self, + requests: Vec, + ) -> Result, WorkerError> { + use tokio::task::JoinSet; + + let mut set = JoinSet::new(); + + // Distribute one request to each available workers + for (request_idx, (request, (worker_idx, worker))) in requests + .clone() + .into_iter() + .zip(self.workers.iter()) + .enumerate() + { + let worker = Arc::clone(worker); + let worker_idx = worker_idx.clone(); + + log::info!("Sp1 Distributed: Sending request to worker {}", request_idx); + + set.spawn(async move { + ( + request_idx, + worker_idx, + worker.write().await.request(request).await, + ) + }); + } + + let mut results = Vec::new(); + let mut available_workers = VecDeque::new(); + let mut requests_to_redistribute = VecDeque::new(); + let mut failed_workers = Vec::new(); + + // If there is more requests than workers, we need to redistribute them later + if requests.len() > self.workers.len() { + requests_to_redistribute.extend(self.workers.len()..requests.len()); + } + + while let Some(res) = set.join_next().await { + let (request_idx, worker_idx, out) = res.map_err(|_e| WorkerError::AllWorkersFailed)?; + + match out { + Ok(response) => { + log::info!("Sp1 Distributed: Got response from worker {}", request_idx); + + results.push((request_idx, response)); + + // If there is another task to redistribute, do it right away + if !requests_to_redistribute.is_empty() { + let request_idx = requests_to_redistribute.pop_front().unwrap(); + let request = requests[request_idx].clone(); + let worker = Arc::clone(self.workers.get(&worker_idx).unwrap()); + + log::info!( + "Sp1 Distributed: Redistributing task to worker {}", + worker_idx + ); + + set.spawn(async move { + ( + request_idx, + worker_idx, + worker.write().await.request(request).await, + ) + }); + } else { + available_workers.push_back(worker_idx); + } + } + Err(_e) => { + log::warn!("Sp1 Distributed: Worker {} failed", request_idx); + + failed_workers.push(worker_idx); + + if failed_workers.len() == self.workers.len() { + return Err(WorkerError::AllWorkersFailed); + } + + // If no other workers finished, push back the request to be picked up when a + // worker is available + if available_workers.is_empty() { + requests_to_redistribute.push_back(request_idx); + + continue; + } + + let worker_id = available_workers.pop_front().unwrap(); + let request = requests[request_idx].clone(); + let worker = Arc::clone(self.workers.get(&worker_id).unwrap()); + + log::info!( + "Sp1 Distributed: Redistributing task to worker {}", + worker_id + ); + + set.spawn(async move { + ( + request_idx, + worker_id, + worker.write().await.request(request).await, + ) + }); + } + } + } + + results.sort_by_key(|(i, _)| *i); + + let results = results.into_iter().map(|(_, response)| response).collect(); + + // removing the failed workers from the pool + for worker_id in failed_workers { + self.workers.remove(&worker_id); + } + + Ok(results) + } + + async fn spawn_workers() -> Result>>, WorkerError> { + let ip_list_string = std::fs::read_to_string("distributed.json") + .expect("Sp1 Distributed: Need a `distributed.json` file with a list of IP:PORT"); + + let ip_list: Vec = serde_json::from_str(&ip_list_string).expect( + "Sp1 Distributed: Invalid JSON for `distributed.json`. need an array of IP:PORT", + ); + + let mut workers = BTreeMap::new(); + + // try to connect to each worker to make sure they are reachable + for (i, ip) in ip_list.into_iter().enumerate() { + let Ok(mut worker) = WorkerSocket::connect(&ip).await else { + log::warn!("Sp1 Distributed: Worker at {} is not reachable. Removing from the list for this task", ip); + + continue; + }; + + if let Err(_e) = worker + .request_with_timeout(WorkerRequest::Ping, Duration::from_secs(1)) + .await + { + log::warn!("Sp1 Distributed: Worker at {} is not reachable. Removing from the list for this task", ip); + + continue; + } + + workers.insert(i, Arc::new(RwLock::new(worker))); + } + + if workers.len() == 0 { + log::error!("Sp1 Distributed: No reachable workers found. Aborting..."); + + return Err(WorkerError::AllWorkersFailed); + } + + Ok(workers) + } + + pub fn len(&self) -> usize { + self.workers.len() + } +} diff --git a/sdk/src/distributed/worker/protocol.rs b/sdk/src/distributed/worker/protocol.rs new file mode 100644 index 0000000000..3ede7bf7be --- /dev/null +++ b/sdk/src/distributed/worker/protocol.rs @@ -0,0 +1,117 @@ +use std::fmt::{Display, Formatter}; + +use serde::{Deserialize, Serialize}; +use sp1_core::air::PublicValues; + +use sp1_core::runtime::ExecutionRecord; +use sp1_core::utils::prove_distributed::{ + Challenger, Checkpoint, Commitments, PartialProofs, ShardsPublicValues, +}; + +use super::WorkerError; + +#[derive(Debug, Serialize, Deserialize)] +pub struct WorkerEnvelope { + version: u64, + data: WorkerProtocol, +} + +impl WorkerEnvelope { + pub fn data(self) -> Result { + if self.version != include!("./worker.version") { + return Err(WorkerError::InvalidVersion); + } + + Ok(self.data) + } +} + +impl From for WorkerEnvelope { + fn from(data: WorkerProtocol) -> Self { + WorkerEnvelope { + version: include!("./worker.version"), + data, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum WorkerProtocol { + Request(WorkerRequest), + Response(WorkerResponse), +} + +impl From for WorkerProtocol { + fn from(req: WorkerRequest) -> Self { + WorkerProtocol::Request(req) + } +} + +impl From for WorkerProtocol { + fn from(res: WorkerResponse) -> Self { + WorkerProtocol::Response(res) + } +} + +impl Display for WorkerProtocol { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + WorkerProtocol::Request(req) => write!(f, "Request({req})"), + WorkerProtocol::Response(res) => write!(f, "Response({res})"), + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum WorkerRequest { + Ping, + Commit(RequestData), + Prove { + request_data: RequestData, + challenger: Challenger, + }, +} + +impl Display for WorkerRequest { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + WorkerRequest::Ping => write!(f, "Ping"), + WorkerRequest::Commit(_) => { + write!(f, "Commit") + } + WorkerRequest::Prove { .. } => write!(f, "Prove"), + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RequestData { + pub elf: Vec, + pub checkpoint: Checkpoint, + pub nb_checkpoints: usize, + pub public_values: PublicValues, + pub shard_batch_size: usize, + pub shard_size: usize, + pub state_shard_start: u32, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum WorkerResponse { + Pong, + Commitment { + commitments: Commitments, + shards_public_values: Vec, + deferred: ExecutionRecord, + }, + Proof(PartialProofs, ExecutionRecord), +} + +impl Display for WorkerResponse { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + WorkerResponse::Pong => write!(f, "Pong"), + WorkerResponse::Commitment { .. } => write!(f, "Commit"), + WorkerResponse::Proof(_, _) => write!(f, "Prove"), + } + } +} diff --git a/sdk/src/distributed/worker/server.rs b/sdk/src/distributed/worker/server.rs new file mode 100644 index 0000000000..3c7e784b18 --- /dev/null +++ b/sdk/src/distributed/worker/server.rs @@ -0,0 +1,139 @@ +use super::{ + RequestData, WorkerError, WorkerProtocol, WorkerRequest, WorkerResponse, WorkerSocket, +}; +use sp1_core::utils::{ + prove_distributed::{self, Challenger, CoreSC, Program, RiscvAir}, + SP1CoreOpts, +}; +use sp1_prover::{components::DefaultProverComponents, SP1Prover}; +use tokio::net::TcpListener; +use tracing::{error, info, warn}; + +pub async fn serve_worker(listen_addr: String, orchestrator_addr: String) { + tokio::spawn(listen_worker(listen_addr, orchestrator_addr)); +} + +async fn listen_worker(listen_addr: String, orchestrator_addr: String) { + info!("Listening as a SP1 worker on: {}", listen_addr); + + let listener = TcpListener::bind(listen_addr).await.unwrap(); + + loop { + let Ok((socket, addr)) = listener.accept().await else { + error!("Error while accepting connection from orchestrator: Closing socket"); + + return; + }; + + if addr.ip().to_string() != orchestrator_addr { + warn!("Unauthorized orchestrator connection from: {}", addr); + + continue; + } + + // We purposely don't spawn the task here, as we want to block to limit the number + // of concurrent connections to one. + if let Err(e) = handle_worker_socket(WorkerSocket::from_stream(socket)).await { + error!("Error while handling worker socket: {:?}", e); + } + } +} + +async fn handle_worker_socket(mut socket: WorkerSocket) -> Result<(), WorkerError> { + while let Ok(protocol) = socket.receive().await { + match protocol { + WorkerProtocol::Request(request) => match request { + WorkerRequest::Ping => handle_ping(&mut socket).await?, + WorkerRequest::Commit(request_data) => { + handle_commit(&mut socket, request_data).await? + } + WorkerRequest::Prove { + request_data, + challenger, + } => handle_prove(&mut socket, request_data, challenger).await?, + }, + _ => Err(WorkerError::InvalidRequest)?, + } + } + + Ok(()) +} + +async fn handle_ping(socket: &mut WorkerSocket) -> Result<(), WorkerError> { + socket + .send(WorkerProtocol::Response(WorkerResponse::Pong)) + .await +} + +async fn handle_commit( + socket: &mut WorkerSocket, + request_data: RequestData, +) -> Result<(), WorkerError> { + let program = Program::from(&request_data.elf); + + let prover = SP1Prover::::new(); + + let mut opts = SP1CoreOpts::default(); + opts.shard_batch_size = request_data.shard_batch_size; + opts.shard_size = request_data.shard_size; + + let mut state = request_data.public_values.reset(); + state.shard = request_data.state_shard_start; + + let (commitments, shards_public_values, deferred) = prove_distributed::commit( + &prover.core_prover, + &program, + request_data.checkpoint, + request_data.nb_checkpoints, + state, + opts, + None, + )?; + + socket + .send(WorkerProtocol::Response(WorkerResponse::Commitment { + commitments, + shards_public_values, + deferred, + })) + .await +} + +async fn handle_prove( + socket: &mut WorkerSocket, + request_data: RequestData, + challenger: Challenger, +) -> Result<(), WorkerError> { + let program = Program::from(&request_data.elf); + let config = CoreSC::default(); + + let prover = SP1Prover::::new(); + + let machine = RiscvAir::machine(config.clone()); + let (pk, _vk) = machine.setup(&program); + + let mut opts = SP1CoreOpts::default(); + opts.shard_batch_size = request_data.shard_batch_size; + opts.shard_size = request_data.shard_size; + + let mut state = request_data.public_values.reset(); + state.shard = request_data.state_shard_start; + + let (proof, deferred) = prove_distributed::prove( + &prover.core_prover, + &program, + &pk, + request_data.checkpoint, + request_data.nb_checkpoints, + state, + opts, + challenger, + None, + )?; + + socket + .send(WorkerProtocol::Response(WorkerResponse::Proof( + proof, deferred, + ))) + .await +} diff --git a/sdk/src/distributed/worker/socket.rs b/sdk/src/distributed/worker/socket.rs new file mode 100644 index 0000000000..0ca3acecdd --- /dev/null +++ b/sdk/src/distributed/worker/socket.rs @@ -0,0 +1,112 @@ +use std::time::Duration; + +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::TcpStream, + time::timeout, +}; + +use super::{WorkerEnvelope, WorkerError, WorkerProtocol, WorkerRequest, WorkerResponse}; + +pub struct WorkerSocket { + socket: TcpStream, +} + +impl WorkerSocket { + pub async fn connect(url: &str) -> Result { + let connect_future = TcpStream::connect(url); + + let socket = timeout(Duration::from_secs(1), connect_future) + .await + .map_err(|_| WorkerError::CannotConnect)??; + + Ok(WorkerSocket::from_stream(socket)) + } + + pub fn from_stream(socket: TcpStream) -> Self { + WorkerSocket { socket } + } + + pub async fn send(&mut self, packet: WorkerProtocol) -> Result<(), WorkerError> { + let envelope: WorkerEnvelope = packet.into(); + + let data = bincode::serialize(&envelope)?; + + log::debug!("Sending data with size: {:?}", data.len()); + + self.socket.write_u64(data.len() as u64).await?; + self.socket.write_all(&data).await?; + + Ok(()) + } + + pub async fn receive(&mut self) -> Result { + let data = self.read_data().await?; + + let envelope: WorkerEnvelope = bincode::deserialize(&data)?; + + envelope.data() + } + + async fn read_data(&mut self) -> Result, WorkerError> { + let size = self.socket.read_u64().await? as usize; + + log::debug!("Receiving data with size: {size:?}"); + + let mut data = Vec::new(); + + let mut buf = [0; 1024]; + let mut total_read = 0; + + loop { + match self.socket.read(&mut buf).await { + // socket closed + Ok(n) if n == 0 => { + return Err(WorkerError::IO(std::io::Error::new( + std::io::ErrorKind::UnexpectedEof, + "unexpected EOF", + ))); + } + Ok(n) => { + data.extend_from_slice(&buf[..n]); + + total_read += n; + + if total_read == size { + return Ok(data); + } + + // TODO: handle the case where the data is bigger than expected + } + Err(e) => { + log::error!("failed to read from socket; err = {e:?}"); + + return Err(e.into()); + } + }; + } + } + + pub async fn request(&mut self, request: WorkerRequest) -> Result { + self.send(request.into()).await?; + + let response = self.receive().await?; + + match response { + WorkerProtocol::Response(response) => Ok(response), + _ => Err(WorkerError::InvalidResponse), + } + } + + pub async fn request_with_timeout( + &mut self, + request: WorkerRequest, + duration: Duration, + ) -> Result { + let request_future = self.request(request); + + timeout(duration, request_future) + .await + .map_err(|_| WorkerError::RequestTimeout)? + } +} diff --git a/sdk/src/distributed/worker/worker.version b/sdk/src/distributed/worker/worker.version new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/sdk/src/distributed/worker/worker.version @@ -0,0 +1 @@ +1 diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 8f8b01ecd7..2742c0a933 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -18,6 +18,10 @@ pub mod network; pub use crate::network::prover::NetworkProver; pub mod proof; + +pub mod distributed; +pub use distributed::{serve_worker, DistributedProver}; + pub mod provers; pub mod utils { pub use sp1_core::utils::setup_logger; @@ -51,6 +55,8 @@ impl ProverClient { /// - `local` (default): Uses [LocalProver]. Recommended for proving end-to-end locally. /// - `mock`: Uses [MockProver]. Recommended for testing and development. /// - `network`: Uses [NetworkProver]. Recommended for outsourcing proof generation to an RPC. + /// - `distributed`: Uses [DistributedProver]. Recommended for outsourcing proof generation to + /// multiple workers. /// /// ### Examples /// @@ -72,6 +78,11 @@ impl ProverClient { "local" => Self { prover: Box::new(LocalProver::new()), }, + "distributed" => { + Self { + prover: Box::new(DistributedProver::new()), + } + } "network" => { cfg_if! { if #[cfg(feature = "network")] { @@ -125,6 +136,25 @@ impl ProverClient { } } + /// Creates a new [ProverClient] with the distributed prover. + /// + /// Recommended for outsourcing proof generation to multiple workers. You can also use + /// [ProverClient::new] to set the prover to `distributed` with the `SP1_PROVER` enviroment + /// variable. + /// + /// ### Examples + /// + /// ```no_run + /// use sp1_sdk::ProverClient; + /// + /// let client = ProverClient::distributed(); + /// ``` + pub fn distributed() -> Self { + Self { + prover: Box::new(DistributedProver::new()), + } + } + /// Creates a new [ProverClient] with the network prover. /// /// Recommended for outsourcing proof generation to an RPC. You can also use [ProverClient::new] diff --git a/sdk/src/provers/mod.rs b/sdk/src/provers/mod.rs index 75acc8e488..320f4bfe9d 100644 --- a/sdk/src/provers/mod.rs +++ b/sdk/src/provers/mod.rs @@ -29,6 +29,7 @@ pub enum ProverType { Local, Mock, Network, + Distributed, } #[derive(Error, Debug)]