diff --git a/Cargo.lock b/Cargo.lock index 2f120bd4..eb0c060a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -602,7 +602,7 @@ dependencies = [ "futures", "futures-utils-wasm", "lru 0.13.0", - "parking_lot", + "parking_lot 0.12.3", "pin-project", "reqwest", "serde", @@ -1224,6 +1224,20 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-compression" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cf008e5e1a9e9e22a7d3c9a4992e21a350290069e36d8fb72304ed17e8f2d2" +dependencies = [ + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "zstd", + "zstd-safe", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -1494,7 +1508,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags", + "bitflags 2.9.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1523,6 +1537,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.0" @@ -1599,6 +1619,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bstr" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "buildstructor" version = "0.5.4" @@ -1960,6 +1990,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "critical-section" version = "1.2.0" @@ -2084,7 +2123,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.10", ] [[package]] @@ -2596,6 +2635,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "fixed-hash" version = "0.8.0" @@ -2614,6 +2665,16 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2831,7 +2892,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ - "bitflags", + "bitflags 2.9.0", "libc", "libgit2-sys", "log", @@ -2844,6 +2905,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + [[package]] name = "gloo-net" version = "0.6.0" @@ -3338,6 +3412,22 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.9", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -3422,6 +3512,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -3589,7 +3682,7 @@ dependencies = [ "http-body", "http-body-util", "jsonrpsee-types", - "parking_lot", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "rustc-hash 2.1.1", @@ -3813,8 +3906,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags", + "bitflags 2.9.0", "libc", + "redox_syscall 0.5.9", ] [[package]] @@ -3841,6 +3935,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + [[package]] name = "litemap" version = "0.7.5" @@ -3942,6 +4042,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -4068,7 +4178,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -4354,7 +4464,7 @@ version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags", + "bitflags 2.9.0", "cfg-if", "foreign-types", "libc", @@ -4757,6 +4867,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -4764,7 +4885,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -4775,7 +4910,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.9", "smallvec", "windows-targets 0.52.6", ] @@ -5097,7 +5232,7 @@ dependencies = [ "fnv", "lazy_static", "memchr", - "parking_lot", + "parking_lot 0.12.3", "protobuf", "thiserror 1.0.69", ] @@ -5154,7 +5289,7 @@ checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", - "bitflags", + "bitflags 2.9.0", "lazy_static", "num-traits", "rand 0.8.5", @@ -5280,6 +5415,7 @@ dependencies = [ "prover-engine", "prover-logger", "serde", + "sindri", "sp1-prover", "sp1-sdk", "thiserror 2.0.11", @@ -5492,13 +5628,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] @@ -5568,6 +5713,7 @@ version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ + "async-compression", "base64", "bytes", "encoding_rs", @@ -5585,6 +5731,7 @@ dependencies = [ "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", @@ -5628,6 +5775,28 @@ dependencies = [ "tower-service", ] +[[package]] +name = "reqwest-retry" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c73e4195a6bfbcb174b790d9b3407ab90646976c55de58a6515da25d851178" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "getrandom 0.2.15", + "http", + "hyper", + "parking_lot 0.11.2", + "reqwest", + "reqwest-middleware", + "retry-policies", + "thiserror 1.0.69", + "tokio", + "tracing", + "wasm-timer", +] + [[package]] name = "reth-chainspec" version = "1.2.0" @@ -6073,6 +6242,15 @@ dependencies = [ "zstd", ] +[[package]] +name = "retry-policies" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5875471e6cab2871bc150ecb8c727db5113c9338cc3354dc5ee3425b6aa40a1c" +dependencies = [ + "rand 0.8.5", +] + [[package]] name = "revm" version = "19.5.0" @@ -6129,7 +6307,7 @@ dependencies = [ "alloy-eip7702", "alloy-primitives", "auto_impl", - "bitflags", + "bitflags 2.9.0", "bitvec", "c-kzg", "cfg-if", @@ -6183,6 +6361,28 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rolling-file" version = "0.2.0" @@ -6420,10 +6620,23 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] @@ -6651,7 +6864,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -6665,7 +6878,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -6764,6 +6977,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -6834,7 +7058,7 @@ dependencies = [ "futures", "log", "once_cell", - "parking_lot", + "parking_lot 0.12.3", "scc", "serial_test_derive", ] @@ -6942,6 +7166,50 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +[[package]] +name = "sindri" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cec007e10040e581e2b07a0596bed34b716ca28a28e68d5b1c94a4583ab64824" +dependencies = [ + "async-compression", + "async-trait", + "base64", + "flate2", + "http", + "ignore", + "rand 0.8.5", + "regex", + "reqwest", + "reqwest-middleware", + "reqwest-retry", + "rmp-serde", + "serde_json", + "sindri-openapi", + "sp1-sdk", + "tar", + "tokio", + "tokio-util", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "sindri-openapi" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2689041201888d3421dae969322a23ecd907f64640d1631e2abccf6d13f7a9d" +dependencies = [ + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "serde_repr", + "serde_with", + "url", + "uuid", +] + [[package]] name = "size" version = "0.4.1" @@ -7722,7 +7990,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.9.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7743,6 +8011,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "tempfile" version = "3.17.1" @@ -7753,7 +8032,7 @@ dependencies = [ "fastrand", "getrandom 0.3.1", "once_cell", - "rustix", + "rustix 0.38.44", "windows-sys 0.59.0", ] @@ -7930,7 +8209,7 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot", + "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", "socket2", @@ -8409,6 +8688,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.17" @@ -8475,6 +8760,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.1", + "serde", +] + [[package]] name = "valuable" version = "0.1.1" @@ -8668,6 +8963,21 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wasmtimer" version = "0.4.1" @@ -8676,7 +8986,7 @@ checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" dependencies = [ "futures", "js-sys", - "parking_lot", + "parking_lot 0.12.3", "pin-utils", "slab", "wasm-bindgen", @@ -8975,7 +9285,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] @@ -9018,6 +9328,16 @@ dependencies = [ "tap", ] +[[package]] +name = "xattr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +dependencies = [ + "libc", + "rustix 1.0.2", +] + [[package]] name = "yansi" version = "1.0.1" diff --git a/Cargo.toml b/Cargo.toml index ed00aa4a..14834292 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,6 +94,7 @@ rstest = "0.22.0" test-log = "0.2.16" # SP1 dependencies +sindri = { version = "0.2.2", features = ["sp1-v4"] } sp1-core-machine = "=4.1.2" sp1-sdk = "=4.1.2" sp1-prover = "=4.1.2" diff --git a/Makefile.elf.toml b/Makefile.elf.toml index 596c7766..6757847d 100644 --- a/Makefile.elf.toml +++ b/Makefile.elf.toml @@ -36,6 +36,34 @@ args = [ "-vv", ] +[tasks.install-sindri-cli] +description = "Install Sindri CLI" +command = "cargo" +args = [ + "install", + "sindri-cli@0.2.2" + "--force", + "--locked" +] + +[tasks.ap-elf-sindri-upload] +description = "Upload ELF file to Sindri" +dependencies = [ + "ap-elf", + "install-sindri-cli" +] +cwd = "crates/aggchain-proof-program" +command = "cargo" +args = [ + "sindri", + "deploy", + ".", + "--api-key", + "${SINDRI_API_KEY}", + #"--tags", + #"${SINDRI_PROJECT_TAG}", +] + [tasks.sp1-toolchain-shell] description = "Drop into an interactive shell in sp1 build environment image" dependencies = ["sp1-toolchain-image"] diff --git a/crates/aggchain-proof-program/sindri.json b/crates/aggchain-proof-program/sindri.json new file mode 100644 index 00000000..ca7ac09c --- /dev/null +++ b/crates/aggchain-proof-program/sindri.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://sindri.app/api/v1/sindri-manifest-schema.json", + "name": "pessimistic-proof", + "circuitType": "sp1", + "provingScheme": "plonk", + "sp1Version": "4.0.0", + "elfPath": "elf/riscv32im-succinct-zkvm-elf" + } diff --git a/crates/prover-config/src/lib.rs b/crates/prover-config/src/lib.rs index 522a37f9..9542cab6 100644 --- a/crates/prover-config/src/lib.rs +++ b/crates/prover-config/src/lib.rs @@ -12,6 +12,7 @@ pub enum ProverType { CpuProver(CpuProverConfig), GpuProver(GpuProverConfig), MockProver(MockProverConfig), + SindriProver(SindriProverConfig), } impl Default for ProverType { @@ -156,6 +157,45 @@ impl Default for MockProverConfig { } } +#[serde_as] +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +#[serde(rename_all = "kebab-case")] +pub struct SindriProverConfig { + #[serde_as(as = "Option")] + pub proving_request_timeout: Option, + + #[serde(default = "default_network_proving_timeout")] + #[serde(with = "crate::with::HumanDuration")] + pub proving_timeout: Duration, + + #[serde(default = "default_sindri_project_name")] + pub project_name: String, + + #[serde(default = "default_sindri_project_tag")] + pub project_tag: String, +} + +impl SindriProverConfig { + // This constant represents the number of second added to the proving_timeout + pub const DEFAULT_PROVING_TIMEOUT_PADDING: Duration = Duration::from_secs(1); + + pub fn get_proving_request_timeout(&self) -> Duration { + self.proving_request_timeout + .unwrap_or_else(|| self.proving_timeout + Self::DEFAULT_PROVING_TIMEOUT_PADDING) + } +} + +impl Default for SindriProverConfig { + fn default() -> Self { + Self { + proving_request_timeout: None, + proving_timeout: default_network_proving_timeout(), + project_name: default_sindri_project_name(), + project_tag: default_sindri_project_tag(), + } + } +} + pub const fn default_max_concurrency_limit() -> usize { 100 } @@ -167,3 +207,11 @@ const fn default_local_proving_timeout() -> Duration { const fn default_network_proving_timeout() -> Duration { Duration::from_secs(60 * 5) } + +fn default_sindri_project_name() -> String { + "pessimistic-proof".to_string() +} + +fn default_sindri_project_tag() -> String { + "latest".to_string() +} diff --git a/crates/prover-config/tests/fixtures/validate_config/prover_config_sindri_prover.toml b/crates/prover-config/tests/fixtures/validate_config/prover_config_sindri_prover.toml new file mode 100644 index 00000000..ed3fae52 --- /dev/null +++ b/crates/prover-config/tests/fixtures/validate_config/prover_config_sindri_prover.toml @@ -0,0 +1,6 @@ + +[primary-prover.sindri-prover] +proving-request-timeout = "5m" +proving-timeout = "10m" +project-name = "pessimistic-proof" +project-tag = "latest" diff --git a/crates/prover-config/tests/validate_deserialize.rs b/crates/prover-config/tests/validate_deserialize.rs index 73aaf81d..f62dbc0d 100644 --- a/crates/prover-config/tests/validate_deserialize.rs +++ b/crates/prover-config/tests/validate_deserialize.rs @@ -1,5 +1,7 @@ use pretty_assertions::assert_eq; -use prover_config::{CpuProverConfig, MockProverConfig, NetworkProverConfig, ProverType}; +use prover_config::{ + CpuProverConfig, MockProverConfig, NetworkProverConfig, ProverType, SindriProverConfig, +}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] @@ -75,3 +77,19 @@ fn mock_prover() { }) ); } + +#[test] +fn sindri_prover() { + let input = "./tests/fixtures/validate_config/prover_config_sindri_prover.toml"; + let config: TestConfig = toml::from_str(&std::fs::read_to_string(input).unwrap()).unwrap(); + + assert_eq!( + config.primary_prover, + ProverType::SindriProver(SindriProverConfig { + proving_request_timeout: Some(std::time::Duration::from_secs(300)), + proving_timeout: std::time::Duration::from_secs(600), + project_name: "pessimistic-proof".to_string(), + project_tag: "latest".to_string(), + }) + ); +} diff --git a/crates/prover-executor/Cargo.toml b/crates/prover-executor/Cargo.toml index e9b03e97..d8573adf 100644 --- a/crates/prover-executor/Cargo.toml +++ b/crates/prover-executor/Cargo.toml @@ -26,6 +26,7 @@ prover-engine.workspace = true prover-logger.workspace = true prover-config.workspace = true +sindri = { workspace = true, features = ["sp1-v4"] } sp1-sdk = { workspace = true, features = ["native-gnark"] } sp1-prover = { workspace = true, features = ["native-gnark"] } diff --git a/crates/prover-executor/src/lib.rs b/crates/prover-executor/src/lib.rs index a8dbb4a7..02a4b05e 100644 --- a/crates/prover-executor/src/lib.rs +++ b/crates/prover-executor/src/lib.rs @@ -6,8 +6,10 @@ use std::{ }; pub use error::Error; +use error::ProofVerificationError; use futures::{Future, TryFutureExt}; use prover_config::ProverType; +use sindri::{client::SindriClient, integrations::sp1_v4::SP1ProofInfo, JobStatus, ProofInput}; use sp1_sdk::{ network::{prover::NetworkProver, FulfillmentStrategy}, CpuProver, Prover, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1Stdin, @@ -137,6 +139,22 @@ impl Executor { ) } ProverType::GpuProver(_) => todo!(), + ProverType::SindriProver(sindri_prover_config) => { + debug!("Creating Sindri prover executor..."); + let mut sindri_client = SindriClient::default(); + sindri_client.polling_options.timeout = Some(sindri_prover_config.proving_timeout); + let verification_key = Self::get_vkey(program); + Self::build_network_service( + sindri_prover_config.get_proving_request_timeout(), + SindriExecutor { + prover: Arc::new(sindri_client), + verification_key, + timeout: sindri_prover_config.proving_timeout, + project_name: sindri_prover_config.project_name.clone(), + project_tag: sindri_prover_config.project_tag.clone(), + }, + ) + } } } @@ -293,3 +311,83 @@ impl Service for NetworkExecutor { Box::pin(fut) } } + +#[derive(Clone)] +struct SindriExecutor { + prover: Arc, + verification_key: SP1VerifyingKey, + timeout: Duration, + project_name: String, + project_tag: String, +} + +impl Service for SindriExecutor { + type Response = Response; + + type Error = Error; + + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Request) -> Self::Future { + let prover = self.prover.clone(); + let stdin = req.stdin; + let verification_key = self.verification_key.clone(); + let timeout = self.timeout; + let project_name = self.project_name.clone(); + let project_tag = self.project_tag.clone(); + + debug!("Proving with network prover with timeout: {:?}", timeout); + let fut = async move { + debug!("Starting the proving of the requested MultiBatchHeader"); + + // Convert Sp1Stdin type to the Sindri client's ProofInput type + let proof_input = ProofInput::try_from(stdin) + .map_err(|error| Error::ProverFailed(error.to_string()))?; + + // Submit the proof request, and poll until the job is completed or a + // timeout occurs. The Sindri client was passed the timeout parameter + // upon creation + let proof_response = prover + .prove_circuit( + &format!("{}:{}", project_name, project_tag), + proof_input, + None, + None, + None, + ) + .await + .map_err(|error| Error::ProverFailed(error.to_string()))?; + + // If the Sindri job completed with an error, retrieve the error message + if proof_response.status == JobStatus::Failed { + return Err(Error::ProverFailed( + proof_response.error.flatten().unwrap_or( + "Sindri job was marked as failed. No error message was provided." + .to_string(), + ), + )); + } + + // Convert the proof response to a SP1 proof with public values + let proof = proof_response + .to_sp1_proof_with_public() + .map_err(|error| Error::ProverFailed(error.to_string()))?; + + debug!("Proving completed. Verifying the proof..."); + proof_response + .verify_sp1_proof_locally(&verification_key) + .map_err(|error| { + Error::ProofVerificationFailed(ProofVerificationError::Plonk(error.to_string())) + })?; + + debug!("Proof verification completed successfully"); + Ok(Response { proof }) + }; + + Box::pin(fut) + } +}