From cb43fd74b24fad8ed24a4885499159de3680c89f Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 28 Mar 2024 16:24:59 -0700 Subject: [PATCH] feat: sp1-sdk, remote prover (#370) Co-authored-by: mattstam --- Cargo.lock | 679 ++++++- Cargo.toml | 7 +- cli/Cargo.toml | 3 +- cli/src/assets/script/Cargo.toml | 2 +- cli/src/assets/script/main.rs | 2 +- cli/src/commands/prove.rs | 5 +- core/src/lib.rs | 5 + eval/Cargo.toml | 1 + eval/src/main.rs | 5 +- .../program/elf/riscv32im-succinct-zkvm-elf | Bin 1962032 -> 1962188 bytes examples/chess/script/Cargo.lock | 1384 +++++++++++++- examples/chess/script/Cargo.toml | 2 +- examples/chess/script/src/main.rs | 2 +- examples/cycle-tracking/script/Cargo.toml | 2 +- examples/cycle-tracking/script/src/main.rs | 2 +- examples/ed25519/script/Cargo.toml | 2 +- examples/ed25519/script/src/main.rs | 2 +- .../fibonacci-benchmark/script/Cargo.toml | 2 +- .../fibonacci-benchmark/script/src/main.rs | 2 +- examples/fibonacci-io/script/Cargo.toml | 2 +- examples/fibonacci-io/script/src/main.rs | 2 +- .../program/elf/riscv32im-succinct-zkvm-elf | Bin 83404 -> 83476 bytes examples/fibonacci/script/Cargo.lock | 1696 ++++++++++++++--- examples/fibonacci/script/Cargo.toml | 3 +- examples/fibonacci/script/src/main.rs | 2 +- examples/io/script/Cargo.toml | 2 +- examples/io/script/src/main.rs | 2 +- examples/is-prime/script/src/main.rs | 2 +- examples/json/script/Cargo.toml | 2 +- examples/json/script/src/main.rs | 2 +- examples/regex/script/Cargo.toml | 2 +- examples/regex/script/src/main.rs | 2 +- examples/rsa/script/Cargo.toml | 2 +- examples/rsa/script/src/main.rs | 2 +- examples/ssz-withdrawals/script/Cargo.toml | 2 +- examples/ssz-withdrawals/script/src/main.rs | 2 +- .../tendermint-benchmark/script/src/main.rs | 2 +- examples/tendermint/script/src/main.rs | 2 +- recursion/program/Cargo.toml | 1 + recursion/program/src/constraints.rs | 2 +- recursion/program/src/stark.rs | 2 +- sdk/Cargo.toml | 32 + sdk/src/client.rs | 113 ++ sdk/src/io.rs | 166 ++ sdk/src/lib.rs | 194 ++ sdk/src/proto/prover.rs | 187 ++ sdk/src/util.rs | 74 + 47 files changed, 4256 insertions(+), 355 deletions(-) create mode 100644 sdk/Cargo.toml create mode 100644 sdk/src/client.rs create mode 100644 sdk/src/io.rs create mode 100644 sdk/src/lib.rs create mode 100644 sdk/src/proto/prover.rs create mode 100644 sdk/src/util.rs diff --git a/Cargo.lock b/Cargo.lock index f9f61f5c4c..8e31f76d7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -218,12 +218,78 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-trait" +version = "0.1.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "autocfg" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +[[package]] +name = "axum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.2.0", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -753,6 +819,12 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + [[package]] name = "der" version = "0.7.8" @@ -896,6 +968,18 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -998,6 +1082,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1186,7 +1285,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", "indexmap 2.2.6", "slab", "tokio", @@ -1267,6 +1385,51 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091a6fbccf4860009355e3efc52ff4acf37a63489aad7435372d44ceeb6fbbcf" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b8f021164e6a984c9030023544c57789c51760065cd510572fedcfb04164e8" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "hmac" version = "0.12.1" @@ -1276,6 +1439,17 @@ dependencies = [ "digest", ] +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + [[package]] name = "http" version = "0.2.12" @@ -1287,6 +1461,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1294,7 +1479,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -1320,9 +1528,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -1334,6 +1542,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.3", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1341,13 +1569,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.28", "rustls", "tokio", "tokio-rustls", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.28", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite", + "socket2", + "tokio", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -1377,6 +1634,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.5.0" @@ -1417,10 +1684,44 @@ checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" dependencies = [ "console", "lazy_static", - "number_prefix", + "number_prefix 0.3.0", "regex", ] +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix 0.4.0", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -1582,6 +1883,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -1604,6 +1911,21 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "matchers" version = "0.1.0" @@ -1613,6 +1935,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.2" @@ -1631,6 +1959,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1651,6 +1989,24 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -1807,6 +2163,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.32.2" @@ -1828,6 +2190,50 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -2177,6 +2583,26 @@ dependencies = [ "indexmap 2.2.6", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -2239,6 +2665,12 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "powerfmt" version = "0.2.0" @@ -2270,6 +2702,44 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.35" @@ -2410,15 +2880,19 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.25", + "hickory-resolver", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", "log", "mime", + "mime_guess", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -2430,6 +2904,7 @@ dependencies = [ "sync_wrapper", "system-configuration", "tokio", + "tokio-native-tls", "tokio-rustls", "tokio-util", "tower-service", @@ -2442,6 +2917,31 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest-middleware" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +dependencies = [ + "anyhow", + "async-trait", + "http 0.2.12", + "reqwest", + "serde", + "task-local-extensions", + "thiserror", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -2557,6 +3057,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2587,6 +3096,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.22" @@ -2627,6 +3159,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2787,12 +3329,13 @@ dependencies = [ "flate2", "futures-util", "hex", - "indicatif", + "indicatif 0.15.0", "rand", "reqwest", "serde", "serde_json", "sp1-core", + "sp1-sdk", "tar", "target-lexicon", "tokio", @@ -2882,6 +3425,7 @@ dependencies = [ "csv", "serde", "sp1-core", + "sp1-sdk", ] [[package]] @@ -3006,6 +3550,34 @@ dependencies = [ "sp1-core", "sp1-recursion-compiler", "sp1-recursion-core", + "sp1-sdk", +] + +[[package]] +name = "sp1-sdk" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "bincode", + "futures", + "hex", + "indicatif 0.17.8", + "log", + "p3-commit", + "p3-field", + "p3-matrix", + "prost", + "prost-types", + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "sp1-core", + "tokio", + "tracing", + "twirp", ] [[package]] @@ -3159,6 +3731,15 @@ version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "tempfile" version = "3.10.1" @@ -3298,6 +3879,16 @@ dependencies = [ "syn 2.0.55", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.24.1" @@ -3339,6 +3930,28 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -3351,6 +3964,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3425,12 +4039,43 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "twirp" +version = "0.3.0" +source = "git+https://github.com/github/twirp-rs.git#6f90763c9bbea7529ab6a54edcf923ae2611cc69" +dependencies = [ + "async-trait", + "axum", + "bytes", + "futures", + "http 1.1.0", + "http-body-util", + "hyper 1.2.0", + "prost", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "url", +] + [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -3471,7 +4116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna", + "idna 0.5.0", "percent-encoding", ] @@ -3632,6 +4277,12 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 26eb4feb5b..da10c3ee89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,16 @@ [workspace] members = [ - "core", "cli", + "core", "derive", - "zkvm/*", - "helper", "eval", + "helper", "recursion/core", "recursion/compiler", "recursion/circuit", "recursion/program", + "sdk", + "zkvm/*", ] exclude = ["examples/target"] resolver = "2" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index a2b91c37f9..44177efd44 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,7 +12,8 @@ vergen = { version = "8", default-features = false, features = ["build", "git", anyhow = { version = "1.0.79", features = ["backtrace"] } cargo_metadata = "0.18.1" clap = { version = "4.4.15", features = ["derive", "env"] } -sp1-core = { path = "../core", features = ["perf"] } +sp1-core = { path = "../core" } +sp1-sdk = { path = "../sdk" } reqwest = { version = "0.11.3", features = ["stream", "json", "rustls-tls"], default-features = false } futures-util = "0.3.14" indicatif = "0.15.0" diff --git a/cli/src/assets/script/Cargo.toml b/cli/src/assets/script/Cargo.toml index f170a33024..a398fc3887 100644 --- a/cli/src/assets/script/Cargo.toml +++ b/cli/src/assets/script/Cargo.toml @@ -5,7 +5,7 @@ name = "unnamed-script" edition = "2021" [dependencies] -sp1-core = { git = "https://github.com/succinctlabs/sp1.git" } +sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git" } [build-dependencies] sp1-helper = { git = "https://github.com/succinctlabs/sp1.git" } \ No newline at end of file diff --git a/cli/src/assets/script/main.rs b/cli/src/assets/script/main.rs index c17cf26354..8389236a6f 100644 --- a/cli/src/assets/script/main.rs +++ b/cli/src/assets/script/main.rs @@ -1,6 +1,6 @@ //! A simple script to generate and verify the proof of a given program. -use sp1_core::{SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{SP1Prover, SP1Stdin, SP1Verifier}; const ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/cli/src/commands/prove.rs b/cli/src/commands/prove.rs index f1e39f2717..a338bbbaf6 100644 --- a/cli/src/commands/prove.rs +++ b/cli/src/commands/prove.rs @@ -1,10 +1,7 @@ use anstyle::*; use anyhow::Result; use clap::Parser; -use sp1_core::{ - utils::{self}, - SP1Prover, SP1Stdin, -}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin}; use std::time::Instant; use std::{env, fs::File, io::Read, path::PathBuf, str::FromStr}; diff --git a/core/src/lib.rs b/core/src/lib.rs index 1b7e5034eb..fb0c0c08ab 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -9,6 +9,7 @@ clippy::unnecessary_unwrap, clippy::default_constructed_unit_structs, clippy::box_default, + deprecated, incomplete_features )] #![feature(generic_const_exprs)] @@ -20,6 +21,7 @@ pub mod alu; pub mod bytes; pub mod cpu; pub mod disassembler; +#[deprecated(note = "Import from sp1_sdk instead of sp1_core")] pub mod io; pub mod lookup; pub mod memory; @@ -43,13 +45,16 @@ use std::fs; use utils::{prove_core, run_and_prove, BabyBearPoseidon2}; /// A prover that can prove RISCV ELFs. +#[deprecated(note = "Import from sp1_sdk instead of sp1_core")] pub struct SP1Prover; /// A verifier that can verify proofs generated by `SP1Prover`. +#[deprecated(note = "Import from sp1_sdk instead of sp1_core")] pub struct SP1Verifier; /// A proof of a RISCV ELF execution with given inputs and outputs. #[derive(Serialize, Deserialize)] +#[deprecated(note = "Import from sp1_sdk instead of sp1_core")] pub struct SP1ProofWithIO { #[serde(with = "proof_serde")] pub proof: Proof, diff --git a/eval/Cargo.toml b/eval/Cargo.toml index b63a385a05..0d19b92417 100644 --- a/eval/Cargo.toml +++ b/eval/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] sp1-core = { path = "../core" } +sp1-sdk = { path = "../sdk" } clap = { version = "4.4.0", features = ["derive"] } csv = "1.3.0" serde = "1.0.196" diff --git a/eval/src/main.rs b/eval/src/main.rs index 8e50e10fcb..1f098a0570 100644 --- a/eval/src/main.rs +++ b/eval/src/main.rs @@ -2,8 +2,9 @@ use clap::{command, Parser}; use csv::WriterBuilder; use serde::Serialize; use sp1_core::runtime::{Program, Runtime}; -use sp1_core::utils::{get_cycles, prove_core, BabyBearBlake3, BabyBearKeccak, BabyBearPoseidon2}; -use sp1_core::{SP1ProofWithIO, SP1Stdin, SP1Stdout, SP1Verifier}; +use sp1_core::utils::{get_cycles, prove_core}; +use sp1_sdk::utils::{BabyBearBlake3, BabyBearKeccak, BabyBearPoseidon2}; +use sp1_sdk::{SP1ProofWithIO, SP1Stdin, SP1Stdout, SP1Verifier}; use std::fmt; use std::fs::OpenOptions; use std::io; diff --git a/examples/chess/program/elf/riscv32im-succinct-zkvm-elf b/examples/chess/program/elf/riscv32im-succinct-zkvm-elf index 95df2caaadc21649b7143bc9d4c4725d0c376185..6ad17bf9a5ec7a9f1153a44a62f0b18de29ccf4e 100755 GIT binary patch delta 53401 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 OURzfD$NRpr|NaX<{mjq+ delta 53287 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 diff --git a/examples/fibonacci/script/Cargo.lock b/examples/fibonacci/script/Cargo.lock index 9db0f016a1..fbb17bba2c 100644 --- a/examples/fibonacci/script/Cargo.lock +++ b/examples/fibonacci/script/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "once_cell", @@ -22,9 +31,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -61,9 +70,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -94,7 +103,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -104,14 +113,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "arrayref" @@ -125,11 +134,92 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-trait" +version = "0.1.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "axum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.2.0", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] [[package]] name = "base16ct" @@ -160,15 +250,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -184,9 +274,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -212,9 +302,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" + +[[package]] +name = "bytes" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "camino" @@ -227,9 +323,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -250,12 +346,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -265,22 +358,22 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] name = "clap" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -288,9 +381,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.0" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -300,14 +393,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -322,6 +415,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -334,6 +440,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -435,7 +551,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -459,7 +575,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -470,7 +586,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -486,6 +602,12 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + [[package]] name = "der" version = "0.7.8" @@ -570,6 +692,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -583,14 +732,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "ff" @@ -613,8 +762,9 @@ checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" name = "fibonacci-script" version = "0.1.0" dependencies = [ - "sp1-core", + "bincode", "sp1-helper", + "sp1-sdk", ] [[package]] @@ -639,6 +789,30 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "funty" version = "2.0.0" @@ -693,6 +867,17 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "futures-sink" version = "0.3.30" @@ -714,6 +899,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -753,6 +939,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "group" version = "0.13.0" @@ -764,6 +956,44 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -786,11 +1016,17 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -798,6 +1034,51 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091a6fbccf4860009355e3efc52ff4acf37a63489aad7435372d44ceeb6fbbcf" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b8f021164e6a984c9030023544c57789c51760065cd510572fedcfb04164e8" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "hmac" version = "0.12.1" @@ -808,106 +1089,332 @@ dependencies = [ ] [[package]] -name = "iana-time-zone" -version = "0.1.60" +name = "hostname" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", + "libc", + "match_cfg", + "winapi", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "http" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "cc", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "http" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] [[package]] -name = "indexmap" -version = "1.9.3" +name = "http-body" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "bytes", + "http 0.2.12", + "pin-project-lite", ] [[package]] -name = "indexmap" -version = "2.2.3" +name = "http-body" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ - "equivalent", - "hashbrown 0.14.3", - "serde", + "bytes", + "http 1.1.0", ] [[package]] -name = "itertools" -version = "0.11.0" +name = "http-body-util" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ - "either", + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", ] [[package]] -name = "itertools" -version = "0.12.1" +name = "httparse" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] -name = "itoa" -version = "1.0.10" +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "js-sys" -version = "0.3.68" +name = "hyper" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ - "wasm-bindgen", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", ] [[package]] -name = "k256" -version = "0.13.3" +name = "hyper" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.3", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.28", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.28", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite", + "socket2", + "tokio", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" @@ -923,6 +1430,12 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -941,9 +1454,24 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matchers" @@ -954,11 +1482,33 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] [[package]] name = "miniz_oxide" @@ -969,6 +1519,35 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -1097,12 +1676,71 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -1112,7 +1750,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "p3-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-field", "p3-matrix", @@ -1121,7 +1759,7 @@ dependencies = [ [[package]] name = "p3-baby-bear" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "num-bigint", "p3-field", @@ -1135,7 +1773,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "blake3", "p3-symmetric", @@ -1144,7 +1782,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -1156,7 +1794,7 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -1169,7 +1807,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-field", "p3-matrix", @@ -1181,7 +1819,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "num-bigint", @@ -1194,7 +1832,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "p3-challenger", @@ -1212,7 +1850,7 @@ dependencies = [ [[package]] name = "p3-goldilocks" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "num-bigint", "p3-dft", @@ -1228,7 +1866,7 @@ dependencies = [ [[package]] name = "p3-interpolation" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-field", "p3-matrix", @@ -1238,7 +1876,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-symmetric", "tiny-keccak", @@ -1247,7 +1885,7 @@ dependencies = [ [[package]] name = "p3-keccak-air" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-air", "p3-field", @@ -1259,7 +1897,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "p3-field", @@ -1273,7 +1911,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "rayon", ] @@ -1281,7 +1919,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.11.0", "p3-dft", @@ -1295,7 +1933,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "p3-commit", @@ -1311,7 +1949,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "p3-field", "p3-symmetric", @@ -1321,7 +1959,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "p3-field", @@ -1331,7 +1969,7 @@ dependencies = [ [[package]] name = "p3-uni-stark" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "itertools 0.12.1", "p3-air", @@ -1349,7 +1987,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#7b5b8a69f633bc61c530f3722701e5f701b11963" +source = "git+https://github.com/Plonky3/Plonky3.git?branch=sp1#683ca1a9e083729c015b981c035af7428a0d85c6" dependencies = [ "serde", ] @@ -1383,6 +2021,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "petgraph" version = "0.6.4" @@ -1390,7 +2034,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.3", + "indexmap 2.2.6", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", ] [[package]] @@ -1415,11 +2079,23 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "platforms" -version = "3.3.0" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" + +[[package]] +name = "portable-atomic" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "powerfmt" @@ -1445,13 +2121,51 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.35" @@ -1499,9 +2213,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -1523,19 +2237,19 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags 1.2.1", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -1549,13 +2263,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -1566,9 +2280,80 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.25", + "hickory-resolver", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "reqwest-middleware" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +dependencies = [ + "anyhow", + "async-trait", + "http 0.2.12", + "reqwest", + "serde", + "task-local-extensions", + "thiserror", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] [[package]] name = "rfc6979" @@ -1580,6 +2365,21 @@ dependencies = [ "subtle", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rrs-lib" version = "0.1.0" @@ -1590,26 +2390,63 @@ dependencies = [ "paste", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "semver", + "base64", ] [[package]] -name = "rustix" -version = "0.38.31" +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "bitflags 2.4.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", + "ring", + "untrusted", ] [[package]] @@ -1620,9 +2457,18 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] [[package]] name = "scopeguard" @@ -1630,6 +2476,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sec1" version = "0.7.3" @@ -1644,57 +2500,102 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_with" -version = "3.6.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.3", + "indexmap 2.2.6", "serde", "serde_derive", "serde_json", @@ -1704,14 +2605,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.6.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -1736,7 +2637,7 @@ checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -1759,6 +2660,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -1786,9 +2696,19 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] [[package]] name = "sp1-core" @@ -1883,6 +2803,33 @@ dependencies = [ "serde", ] +[[package]] +name = "sp1-sdk" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "bincode", + "futures", + "hex", + "indicatif", + "log", + "p3-commit", + "p3-field", + "p3-matrix", + "prost", + "prost-types", + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "sp1-core", + "tokio", + "tracing", + "twirp", +] + [[package]] name = "sp1-zkvm" version = "0.1.0" @@ -1897,6 +2844,12 @@ dependencies = [ "sp1-precompiles", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.7.3" @@ -1931,11 +2884,11 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -1957,58 +2910,94 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -2054,6 +3043,85 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + [[package]] name = "toml_datetime" version = "0.6.5" @@ -2066,17 +3134,46 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "tracing" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2090,7 +3187,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -2145,18 +3242,93 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "twirp" +version = "0.3.0" +source = "git+https://github.com/github/twirp-rs.git#6f90763c9bbea7529ab6a54edcf923ae2611cc69" +dependencies = [ + "async-trait", + "axum", + "bytes", + "futures", + "http 1.1.0", + "http-body-util", + "hyper 1.2.0", + "prost", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "url", +] + [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna 0.5.0", + "percent-encoding", +] + [[package]] name = "utf8parse" version = "0.2.1" @@ -2169,12 +3341,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2183,9 +3370,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2193,24 +3380,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2218,22 +3417,44 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" [[package]] name = "winapi" @@ -2263,7 +3484,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -2272,7 +3502,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -2292,17 +3522,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -2313,9 +3543,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -2325,9 +3555,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -2337,9 +3567,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -2349,9 +3579,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -2361,9 +3591,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -2373,9 +3603,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -2385,9 +3615,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" @@ -2398,6 +3628,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wyz" version = "0.5.1" @@ -2424,7 +3664,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] diff --git a/examples/fibonacci/script/Cargo.toml b/examples/fibonacci/script/Cargo.toml index 8acc4357e2..fd57271ce3 100644 --- a/examples/fibonacci/script/Cargo.toml +++ b/examples/fibonacci/script/Cargo.toml @@ -5,7 +5,8 @@ name = "fibonacci-script" edition = "2021" [dependencies] -sp1-core = { path = "../../../core" } +bincode = "1.3.3" +sp1-sdk = { path = "../../../sdk" } [build-dependencies] sp1-helper = { path = "../../../helper" } diff --git a/examples/fibonacci/script/src/main.rs b/examples/fibonacci/script/src/main.rs index fd654e33b9..7bedfa59f0 100644 --- a/examples/fibonacci/script/src/main.rs +++ b/examples/fibonacci/script/src/main.rs @@ -1,4 +1,4 @@ -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1ProofWithIO, SP1Prover, SP1Stdin, SP1Verifier}; /// The ELF we want to execute inside the zkVM. const ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/io/script/Cargo.toml b/examples/io/script/Cargo.toml index 00104a2029..241e3da49f 100644 --- a/examples/io/script/Cargo.toml +++ b/examples/io/script/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] serde = { version = "1.0.196", features = ["derive"] } -sp1-core = { path = "../../../core" } +sp1-sdk = { path = "../../../sdk" } [build-dependencies] sp1-helper = { path = "../../../helper" } diff --git a/examples/io/script/src/main.rs b/examples/io/script/src/main.rs index 89ce6c9bdb..f5c7b47265 100644 --- a/examples/io/script/src/main.rs +++ b/examples/io/script/src/main.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; /// The ELF we want to execute inside the zkVM. const ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/is-prime/script/src/main.rs b/examples/is-prime/script/src/main.rs index c89eecf920..a905ed4987 100644 --- a/examples/is-prime/script/src/main.rs +++ b/examples/is-prime/script/src/main.rs @@ -1,5 +1,5 @@ //! A program that takes a number `n` as input, and writes if `n` is prime as an output. -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; const ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/json/script/Cargo.toml b/examples/json/script/Cargo.toml index 322a0007a1..143e95fc4d 100644 --- a/examples/json/script/Cargo.toml +++ b/examples/json/script/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] serde = "1.0.197" serde_json = "1.0.114" -sp1-core = { path = "../../../core" } +sp1-sdk = { path = "../../../sdk" } lib = { path = "../lib" } [build-dependencies] diff --git a/examples/json/script/src/main.rs b/examples/json/script/src/main.rs index 89e27602de..2f1a1067fc 100644 --- a/examples/json/script/src/main.rs +++ b/examples/json/script/src/main.rs @@ -1,7 +1,7 @@ //! A simple script to generate and verify the proof of a given program. use lib::{Account, Transaction}; -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; const JSON_ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/regex/script/Cargo.toml b/examples/regex/script/Cargo.toml index bce961a526..138e9bee39 100644 --- a/examples/regex/script/Cargo.toml +++ b/examples/regex/script/Cargo.toml @@ -5,7 +5,7 @@ name = "regex-script" edition = "2021" [dependencies] -sp1-core = { path = "../../../core" } +sp1-sdk = { path = "../../../sdk" } [build-dependencies] sp1-helper = { path = "../../../helper" } diff --git a/examples/regex/script/src/main.rs b/examples/regex/script/src/main.rs index 759725865a..7bdf5b941b 100644 --- a/examples/regex/script/src/main.rs +++ b/examples/regex/script/src/main.rs @@ -1,4 +1,4 @@ -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; /// The ELF we want to execute inside the zkVM. const REGEX_IO_ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/rsa/script/Cargo.toml b/examples/rsa/script/Cargo.toml index 54d0c17776..6cd805b36d 100644 --- a/examples/rsa/script/Cargo.toml +++ b/examples/rsa/script/Cargo.toml @@ -5,7 +5,7 @@ name = "rsa-script" edition = "2021" [dependencies] -sp1-core = { path = "../../../core" } +sp1-sdk = { path = "../../../sdk" } [build-dependencies] sp1-helper = { path = "../../../helper" } diff --git a/examples/rsa/script/src/main.rs b/examples/rsa/script/src/main.rs index cbfafec7c4..8499b779a7 100644 --- a/examples/rsa/script/src/main.rs +++ b/examples/rsa/script/src/main.rs @@ -1,4 +1,4 @@ -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; /// The ELF we want to execute inside the zkVM. const REGEX_IO_ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/ssz-withdrawals/script/Cargo.toml b/examples/ssz-withdrawals/script/Cargo.toml index fbe64d7b9a..0c1e0889c6 100644 --- a/examples/ssz-withdrawals/script/Cargo.toml +++ b/examples/ssz-withdrawals/script/Cargo.toml @@ -5,7 +5,7 @@ name = "ssz-withdrawals-script" edition = "2021" [dependencies] -sp1-core = { path = "../../../core" } +sp1-sdk = { path = "../../../sdk" } [build-dependencies] sp1-helper = { path = "../../../helper" } diff --git a/examples/ssz-withdrawals/script/src/main.rs b/examples/ssz-withdrawals/script/src/main.rs index 62f2fb4a96..f7138b9f36 100644 --- a/examples/ssz-withdrawals/script/src/main.rs +++ b/examples/ssz-withdrawals/script/src/main.rs @@ -1,4 +1,4 @@ -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; const ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/tendermint-benchmark/script/src/main.rs b/examples/tendermint-benchmark/script/src/main.rs index 7c6608b6fa..1ef9e03504 100644 --- a/examples/tendermint-benchmark/script/src/main.rs +++ b/examples/tendermint-benchmark/script/src/main.rs @@ -1,4 +1,4 @@ -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; const ED25519_ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); diff --git a/examples/tendermint/script/src/main.rs b/examples/tendermint/script/src/main.rs index 392b31bcfd..04d4ee01c9 100644 --- a/examples/tendermint/script/src/main.rs +++ b/examples/tendermint/script/src/main.rs @@ -1,5 +1,5 @@ use reqwest::Client; -use sp1_core::{utils, SP1Prover, SP1Stdin, SP1Verifier}; +use sp1_sdk::{utils, SP1Prover, SP1Stdin, SP1Verifier}; use crate::util::fetch_latest_commit; use crate::util::fetch_light_block; diff --git a/recursion/program/Cargo.toml b/recursion/program/Cargo.toml index 066e8a7694..e6f58d831e 100644 --- a/recursion/program/Cargo.toml +++ b/recursion/program/Cargo.toml @@ -15,6 +15,7 @@ p3-util = { workspace = true } sp1-recursion-core = { path = "../core" } sp1-recursion-compiler = { path = "../compiler" } sp1-core = { path = "../../core" } +sp1-sdk = { path = "../../sdk" } itertools = "0.12.1" serde = { version = "1.0.197", features = ["derive"] } p3-symmetric = { workspace = true } diff --git a/recursion/program/src/constraints.rs b/recursion/program/src/constraints.rs index ef829760bf..185b41e41f 100644 --- a/recursion/program/src/constraints.rs +++ b/recursion/program/src/constraints.rs @@ -161,9 +161,9 @@ mod tests { ShardMainData, ShardProof, StarkGenericConfig, Verifier, }, utils::BabyBearPoseidon2, - SP1Prover, SP1Stdin, }; use sp1_recursion_core::runtime::Runtime; + use sp1_sdk::{SP1Prover, SP1Stdin}; use p3_challenger::{CanObserve, FieldChallenger}; use p3_field::PrimeField32; diff --git a/recursion/program/src/stark.rs b/recursion/program/src/stark.rs index 060c4865fc..fa789c6350 100644 --- a/recursion/program/src/stark.rs +++ b/recursion/program/src/stark.rs @@ -206,13 +206,13 @@ pub(crate) mod tests { air::MachineAir, stark::{MachineStark, RiscvAir, ShardCommitment, ShardProof, StarkGenericConfig}, utils::BabyBearPoseidon2, - SP1Prover, SP1Stdin, }; use sp1_recursion_compiler::{ asm::{AsmConfig, VmBuilder}, ir::{Builder, Config, ExtConst, Usize}, }; use sp1_recursion_core::runtime::{Runtime, DIGEST_SIZE}; + use sp1_sdk::{SP1Prover, SP1Stdin}; use crate::{ challenger::DuplexChallengerVariable, diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml new file mode 100644 index 0000000000..9af9144059 --- /dev/null +++ b/sdk/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "sp1-sdk" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +prost = "0.12" +prost-types = "0.12" +serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.114" +twirp = { git = "https://github.com/github/twirp-rs.git" } +async-trait = "0.1.77" +reqwest-middleware = "0.2.4" +reqwest = { version = "0.11.25", features = ["rustls-tls", "trust-dns"] } +anyhow = "1.0.80" +sp1-core = { path = "../core" } +futures = "0.3.30" +bincode = "1.3.3" +tokio = { version = "1.36.0", features = ["full"] } +p3-matrix = { workspace = true } +p3-commit = { workspace = true } +p3-field = { workspace = true } +indicatif = "0.17.8" +tracing = "0.1.40" +hex = "0.4.3" +log = "0.4.21" +axum = "=0.7.4" + +[features] +neon = ["sp1-core/neon"] diff --git a/sdk/src/client.rs b/sdk/src/client.rs new file mode 100644 index 0000000000..88a6adfe8e --- /dev/null +++ b/sdk/src/client.rs @@ -0,0 +1,113 @@ +use std::{env, time::Duration}; + +use anyhow::{Ok, Result}; +use futures::future::join_all; +use reqwest::{ + header::{HeaderMap, HeaderValue}, + Client as HttpClient, Url, +}; +use reqwest_middleware::ClientWithMiddleware as HttpClientWithMiddleware; +use serde::{de::DeserializeOwned, Serialize}; +use sp1_core::stark::StarkGenericConfig; +use twirp::Client as TwirpClient; + +use crate::{ + proto::prover::{ + CreateProofRequest, GetProofStatusRequest, GetProofStatusResponse, ProofStatus, + Sp1ProverServiceClient, SubmitProofRequest, + }, + SP1ProofWithIO, +}; + +pub struct SP1ProverServiceClient { + pub rpc: TwirpClient, + pub http: HttpClientWithMiddleware, +} + +const DEFAULT_PROVER_NETWORK_RPC: &str = "https://rpc.succinct.xyz/"; + +impl SP1ProverServiceClient { + pub fn with_token(access_token: String) -> Self { + let rpc_url = env::var("PROVER_NETWORK_RPC") + .unwrap_or_else(|_| DEFAULT_PROVER_NETWORK_RPC.to_string()); + Self::with_url(access_token, rpc_url) + } + + pub fn with_url(access_token: String, rpc_url: String) -> Self { + let mut headers = HeaderMap::new(); + headers.insert( + "Authorization", + HeaderValue::from_str(&format!("Bearer {}", access_token)).unwrap(), + ); + let twirp_http_client = HttpClient::builder() + .pool_max_idle_per_host(0) + .pool_idle_timeout(Duration::from_secs(240)) + .default_headers(headers) + .build() + .unwrap(); + + let rpc = + TwirpClient::new(Url::parse(&rpc_url).unwrap(), twirp_http_client, vec![]).unwrap(); + + let http_client = HttpClient::builder() + .pool_max_idle_per_host(0) + .pool_idle_timeout(Duration::from_secs(240)) + .build() + .unwrap(); + Self { + rpc, + http: http_client.into(), + } + } + + async fn upload_file(&self, url: &str, data: Vec) -> Result<()> { + self.http.put(url).body(data).send().await?; + Ok(()) + } + + pub async fn create_proof(&self, elf: &[u8], stdin: &[u8]) -> Result { + let res = self.rpc.create_proof(CreateProofRequest {}).await?; + + let program_bytes = bincode::serialize(elf)?; + let stdin_bytes = bincode::serialize(stdin)?; + let program_promise = self.upload_file(&res.program_put_url, program_bytes); + let stdin_promise = self.upload_file(&res.stdin_put_url, stdin_bytes); + let v = vec![program_promise, stdin_promise]; + let mut results = join_all(v).await; + results.pop().expect("Failed to upload stdin")?; + results.pop().expect("Failed to upload program")?; + + self.rpc + .submit_proof(SubmitProofRequest { id: res.id.clone() }) + .await?; + + Ok(res.id) + } + + pub async fn get_proof_status( + &self, + proof_id: &str, + ) -> Result<(GetProofStatusResponse, Option>)> { + let res = self + .rpc + .get_proof_status(GetProofStatusRequest { + id: proof_id.to_string(), + }) + .await?; + + let result = if res.status() == ProofStatus::Succeeded { + let proof = self + .http + .get(res.result_get_url.clone()) + .send() + .await? + .bytes() + .await?; + Some(bincode::deserialize(&proof).expect("Failed to deserialize proof")) + } else { + None + }; + + Ok((res, result)) + } +} diff --git a/sdk/src/io.rs b/sdk/src/io.rs new file mode 100644 index 0000000000..5b5ccd7ef4 --- /dev/null +++ b/sdk/src/io.rs @@ -0,0 +1,166 @@ +use serde::{de::DeserializeOwned, Deserialize, Serialize}; + +use sp1_core::utils::Buffer; + +/// Standard input for the prover. +#[derive(Serialize, Deserialize)] +pub struct SP1Stdin { + pub buffer: Buffer, +} + +/// Standard output for the prover. +#[derive(Serialize, Deserialize)] +pub struct SP1Stdout { + pub buffer: Buffer, +} + +impl Default for SP1Stdin { + fn default() -> Self { + Self::new() + } +} + +impl SP1Stdin { + /// Create a new `SP1Stdin`. + pub fn new() -> Self { + Self { + buffer: Buffer::new(), + } + } + + /// Create a `SP1Stdin` from a slice of bytes. + pub fn from(data: &[u8]) -> Self { + Self { + buffer: Buffer::from(data), + } + } + + /// Read a value from the buffer. + pub fn read(&mut self) -> T { + self.buffer.read() + } + + /// Read a slice of bytes from the buffer. + pub fn read_slice(&mut self, slice: &mut [u8]) { + self.buffer.read_slice(slice); + } + + /// Write a value to the buffer. + pub fn write(&mut self, data: &T) { + self.buffer.write(data); + } + + /// Write a slice of bytes to the buffer. + pub fn write_slice(&mut self, slice: &[u8]) { + self.buffer.write_slice(slice); + } +} + +impl Default for SP1Stdout { + fn default() -> Self { + Self::new() + } +} + +impl SP1Stdout { + /// Create a new `SP1Stdout`. + pub fn new() -> Self { + Self { + buffer: Buffer::new(), + } + } + + /// Create a `SP1Stdout` from a slice of bytes. + pub fn from(data: &[u8]) -> Self { + Self { + buffer: Buffer::from(data), + } + } + + /// Read a value from the buffer. + pub fn read(&mut self) -> T { + self.buffer.read() + } + + /// Read a slice of bytes from the buffer. + pub fn read_slice(&mut self, slice: &mut [u8]) { + self.buffer.read_slice(slice); + } + + /// Write a value to the buffer. + pub fn write(&mut self, data: &T) { + self.buffer.write(data); + } + + /// Write a slice of bytes to the buffer. + pub fn write_slice(&mut self, slice: &[u8]) { + self.buffer.write_slice(slice); + } +} + +pub mod proof_serde { + use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize}; + use sp1_core::stark::{Proof, StarkGenericConfig}; + + pub fn serialize( + proof: &Proof, + serializer: S, + ) -> Result + where + S: serde::Serializer, + { + if serializer.is_human_readable() { + let bytes = bincode::serialize(proof).unwrap(); + let hex_bytes = hex::encode(bytes); + serializer.serialize_str(&hex_bytes) + } else { + proof.serialize(serializer) + } + } + + pub fn deserialize<'de, D, SC: StarkGenericConfig + DeserializeOwned>( + deserializer: D, + ) -> Result, D::Error> + where + D: Deserializer<'de>, + { + if deserializer.is_human_readable() { + let hex_bytes = String::deserialize(deserializer).unwrap(); + let bytes = hex::decode(hex_bytes).unwrap(); + let proof = bincode::deserialize(&bytes).map_err(serde::de::Error::custom)?; + Ok(proof) + } else { + Proof::::deserialize(deserializer) + } + } + + #[cfg(test)] + mod tests { + use crate::{SP1ProofWithIO, SP1Prover, SP1Stdin, SP1Verifier}; + + pub const FIBONACCI_IO_ELF: &[u8] = + include_bytes!("../../examples/fibonacci-io/program/elf/riscv32im-succinct-zkvm-elf"); + + /// Tests serialization with a human-readable encoding + #[test] + fn test_json_roundtrip() { + let mut stdin = SP1Stdin::new(); + stdin.write(&3u32); + let proof = SP1Prover::prove(FIBONACCI_IO_ELF, stdin).unwrap(); + let json = serde_json::to_string(&proof).unwrap(); + let output = serde_json::from_str::>(&json).unwrap(); + SP1Verifier::verify(FIBONACCI_IO_ELF, &output).unwrap(); + } + + /// Tests serialization with a binary encoding + #[test] + fn test_bincode_roundtrip() { + let mut stdin = SP1Stdin::new(); + stdin.write(&3u32); + let proof = SP1Prover::prove(FIBONACCI_IO_ELF, stdin).unwrap(); + let serialized = bincode::serialize(&proof).unwrap(); + let output = bincode::deserialize::>(&serialized).unwrap(); + SP1Verifier::verify(FIBONACCI_IO_ELF, &output).unwrap(); + } + } +} diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs new file mode 100644 index 0000000000..ed06f58de4 --- /dev/null +++ b/sdk/src/lib.rs @@ -0,0 +1,194 @@ +#![allow(incomplete_features)] +#![feature(generic_const_exprs)] +pub mod proto { + #[rustfmt::skip] + #[allow(clippy::all)] + pub mod prover; +} +pub mod client; +mod io; +mod util; +pub mod utils { + pub use sp1_core::utils::{ + setup_logger, setup_tracer, BabyBearBlake3, BabyBearKeccak, BabyBearPoseidon2, + }; +} +pub use crate::io::*; +use proto::prover::ProofStatus; +use utils::*; + +use crate::client::SP1ProverServiceClient; +use anyhow::{Ok, Result}; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; +use sp1_core::runtime::{Program, Runtime}; +use sp1_core::stark::{Com, PcsProverData, RiscvAir}; +use sp1_core::stark::{ + OpeningProof, ProgramVerificationError, Proof, ShardMainData, StarkGenericConfig, +}; +use sp1_core::utils::run_and_prove; +use std::fs; +use std::time::Duration; +use tokio::time::sleep; +use util::StageProgressBar; + +/// A prover that can prove RISCV ELFs. +pub struct SP1Prover; + +/// A verifier that can verify proofs generated by `SP1Prover`. +pub struct SP1Verifier; + +/// A proof of a RISCV ELF execution with given inputs and outputs. +#[derive(Serialize, Deserialize)] +pub struct SP1ProofWithIO { + #[serde(with = "proof_serde")] + pub proof: Proof, + pub stdin: SP1Stdin, + pub stdout: SP1Stdout, +} + +impl SP1Prover { + /// Executes the elf with the given inputs and returns the output. + pub fn execute(elf: &[u8], stdin: SP1Stdin) -> Result { + let program = Program::from(elf); + let mut runtime = Runtime::new(program); + runtime.write_stdin_slice(&stdin.buffer.data); + runtime.run(); + Ok(SP1Stdout::from(&runtime.state.output_stream)) + } + + /// Generate a proof for the execution of the ELF with the given public inputs. + pub fn prove(elf: &[u8], stdin: SP1Stdin) -> Result> { + Self::prove_with_config(elf, stdin, BabyBearPoseidon2::new()) + } + + async fn prove_remote( + elf: &[u8], + stdin: SP1Stdin, + ) -> Result> + where + SC: StarkGenericConfig, + SC::Challenger: Clone, + OpeningProof: Send + Sync, + Com: Send + Sync, + PcsProverData: Send + Sync, + ShardMainData: Serialize + DeserializeOwned, + SC::Val: p3_field::PrimeField32, + { + let access_token = std::env::var("PROVER_NETWORK_ACCESS_TOKEN").unwrap(); + let client = SP1ProverServiceClient::with_token(access_token); + let id = client.create_proof(elf, &stdin.buffer.data).await?; + + let mut pb = StageProgressBar::new(); + loop { + let status = client.get_proof_status(&id).await; + match status { + std::result::Result::Ok(status) => { + if status.0.status() == ProofStatus::Failed { + pb.finish(); + return Err(anyhow::anyhow!("Proof failed")); + } + if let Some(result) = status.1 { + println!("Proof succeeded\n\n"); + pb.finish(); + return Ok(result); + } + pb.update( + status.0.stage, + status.0.total_stages, + &status.0.stage_name, + status.0.stage_progress.map(|p| (p, status.0.stage_total())), + ); + } + Err(e) => { + pb.finish(); + return Err(e); + } + } + sleep(Duration::from_secs(1)).await; + } + } + + /// Generate a proof for the execution of the ELF with the given public inputs and a custom config. + pub fn prove_with_config( + elf: &[u8], + stdin: SP1Stdin, + config: SC, + ) -> Result> + where + SC: StarkGenericConfig, + SC::Challenger: Clone, + OpeningProof: Send + Sync, + Com: Send + Sync, + PcsProverData: Send + Sync, + ShardMainData: Serialize + DeserializeOwned, + SC::Val: p3_field::PrimeField32, + { + if std::env::var("PROVER_NETWORK_ACCESS_TOKEN").is_ok() { + log::info!("PROVER_NETWORK_ACCESS_TOKEN is set, proving remotely"); + match tokio::runtime::Handle::try_current() { + std::result::Result::Ok(handle) => { + tokio::task::block_in_place(|| handle.block_on(Self::prove_remote(elf, stdin))) + } + Err(_) => { + // Handle case where there is no current Tokio runtime + let rt = tokio::runtime::Runtime::new() + .expect("Failed to create a new Tokio runtime"); + rt.handle().block_on(Self::prove_remote(elf, stdin)) + } + } + } else { + let program = Program::from(elf); + let (proof, stdout_vec) = run_and_prove(program, &stdin.buffer.data, config); + let stdout = SP1Stdout::from(&stdout_vec); + Ok(SP1ProofWithIO { + proof, + stdin, + stdout, + }) + } + } +} + +impl SP1Verifier { + /// Verify a proof generated by `SP1Prover`. + #[allow(unused_variables)] + pub fn verify( + elf: &[u8], + proof: &SP1ProofWithIO, + ) -> Result<(), ProgramVerificationError> { + Self::verify_with_config(elf, proof, BabyBearPoseidon2::new()) + } + + /// Verify a proof generated by `SP1Prover` with a custom config. + #[allow(unused_variables)] + pub fn verify_with_config( + elf: &[u8], + proof: &SP1ProofWithIO, + config: SC, + ) -> Result<(), ProgramVerificationError> + where + SC: StarkGenericConfig, + SC::Challenger: Clone, + OpeningProof: Send + Sync, + Com: Send + Sync, + PcsProverData: Send + Sync, + ShardMainData: Serialize + DeserializeOwned, + SC::Val: p3_field::PrimeField32, + { + let mut challenger = config.challenger(); + let machine = RiscvAir::machine(config); + + let (_, vk) = machine.setup(&Program::from(elf)); + machine.verify(&vk, &proof.proof, &mut challenger) + } +} + +impl SP1ProofWithIO { + /// Saves the proof as a JSON to the given path. + pub fn save(&self, path: &str) -> Result<()> { + let data = serde_json::to_string(self).unwrap(); + fs::write(path, data).unwrap(); + Ok(()) + } +} diff --git a/sdk/src/proto/prover.rs b/sdk/src/proto/prover.rs new file mode 100644 index 0000000000..bfb63e13f7 --- /dev/null +++ b/sdk/src/proto/prover.rs @@ -0,0 +1,187 @@ +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CreateProofRequest {} +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CreateProofResponse { + #[prost(string, tag = "1")] + pub id: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub program_put_url: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub stdin_put_url: ::prost::alloc::string::String, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SubmitProofRequest { + #[prost(string, tag = "1")] + pub id: ::prost::alloc::string::String, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SubmitProofResponse {} +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetProofStatusRequest { + #[prost(string, tag = "1")] + pub id: ::prost::alloc::string::String, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetProofStatusResponse { + #[prost(enumeration = "ProofStatus", tag = "1")] + pub status: i32, + #[prost(string, tag = "2")] + pub result_get_url: ::prost::alloc::string::String, + #[prost(uint32, tag = "3")] + pub stage: u32, + #[prost(uint32, tag = "4")] + pub total_stages: u32, + #[prost(string, tag = "5")] + pub stage_name: ::prost::alloc::string::String, + #[prost(uint32, optional, tag = "6")] + pub stage_progress: ::core::option::Option, + #[prost(uint32, optional, tag = "7")] + pub stage_total: ::core::option::Option, +} +#[derive( + serde::Serialize, + serde::Deserialize, + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration, +)] +#[repr(i32)] +pub enum ProofStatus { + UnspecifiedStatus = 0, + Created = 1, + Pending = 2, + Running = 3, + Succeeded = 4, + Failed = 5, +} +impl ProofStatus { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + ProofStatus::UnspecifiedStatus => "UNSPECIFIED_STATUS", + ProofStatus::Created => "CREATED", + ProofStatus::Pending => "PENDING", + ProofStatus::Running => "RUNNING", + ProofStatus::Succeeded => "SUCCEEDED", + ProofStatus::Failed => "FAILED", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "UNSPECIFIED_STATUS" => Some(Self::UnspecifiedStatus), + "CREATED" => Some(Self::Created), + "PENDING" => Some(Self::Pending), + "RUNNING" => Some(Self::Running), + "SUCCEEDED" => Some(Self::Succeeded), + "FAILED" => Some(Self::Failed), + _ => None, + } + } +} +pub const SERVICE_FQN: &str = "/prover.SP1ProverService"; +#[twirp::async_trait::async_trait] +pub trait Sp1ProverService { + async fn create_proof( + &self, + ctx: twirp::Context, + req: CreateProofRequest, + ) -> Result; + async fn submit_proof( + &self, + ctx: twirp::Context, + req: SubmitProofRequest, + ) -> Result; + async fn get_proof_status( + &self, + ctx: twirp::Context, + req: GetProofStatusRequest, + ) -> Result; +} +pub fn router(api: std::sync::Arc) -> twirp::Router +where + T: Sp1ProverService + Send + Sync + 'static, +{ + twirp::details::TwirpRouterBuilder::new(api) + .route( + "/CreateProof", + |api: std::sync::Arc, ctx: twirp::Context, req: CreateProofRequest| async move { + api.create_proof(ctx, req).await + }, + ) + .route( + "/SubmitProof", + |api: std::sync::Arc, ctx: twirp::Context, req: SubmitProofRequest| async move { + api.submit_proof(ctx, req).await + }, + ) + .route( + "/GetProofStatus", + |api: std::sync::Arc, ctx: twirp::Context, req: GetProofStatusRequest| async move { + api.get_proof_status(ctx, req).await + }, + ) + .build() +} +#[twirp::async_trait::async_trait] +pub trait Sp1ProverServiceClient: Send + Sync + std::fmt::Debug { + async fn create_proof( + &self, + req: CreateProofRequest, + ) -> Result; + async fn submit_proof( + &self, + req: SubmitProofRequest, + ) -> Result; + async fn get_proof_status( + &self, + req: GetProofStatusRequest, + ) -> Result; +} +#[twirp::async_trait::async_trait] +impl Sp1ProverServiceClient for twirp::client::Client { + async fn create_proof( + &self, + req: CreateProofRequest, + ) -> Result { + let url = self.base_url.join("prover.SP1ProverService/CreateProof")?; + self.request(url, req).await + } + async fn submit_proof( + &self, + req: SubmitProofRequest, + ) -> Result { + let url = self.base_url.join("prover.SP1ProverService/SubmitProof")?; + self.request(url, req).await + } + async fn get_proof_status( + &self, + req: GetProofStatusRequest, + ) -> Result { + let url = self + .base_url + .join("prover.SP1ProverService/GetProofStatus")?; + self.request(url, req).await + } +} diff --git a/sdk/src/util.rs b/sdk/src/util.rs new file mode 100644 index 0000000000..76d9389034 --- /dev/null +++ b/sdk/src/util.rs @@ -0,0 +1,74 @@ +use std::time::Duration; + +use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; + +pub struct StageProgressBar { + pb: ProgressBar, + current_stage: u32, + current_stage_name: String, + total_stages: String, +} + +impl StageProgressBar { + pub fn new() -> Self { + let pb = ProgressBar::new(1); + pb.set_style( + ProgressStyle::default_bar() + .template("{msg}\n{spinner:.green}") + .unwrap() + .progress_chars("#>-") + .tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"), + ); + pb.enable_steady_tick(Duration::from_millis(50)); + + let mp = MultiProgress::new(); + let pb = mp.add(pb); + + Self { + pb, + current_stage: 0, + current_stage_name: "Starting".to_string(), + total_stages: "?".to_string(), + } + } + + pub fn update( + &mut self, + stage: u32, + total_stages: u32, + stage_name: &str, + stage_progress: Option<(u32, u32)>, + ) { + if stage > self.current_stage { + self.pb.set_position(0); + self.pb.reset_eta(); + } + if let Some(progress) = stage_progress { + self.pb.set_position(progress.0.into()); + self.pb.set_length(progress.1.into()); + self.pb.set_style( + ProgressStyle::with_template("\n{msg}\n{spinner:.green} [{elapsed}] [{wide_bar:.cyan/blue}] {pos}/{len} (eta {eta})") + .unwrap() + .progress_chars("#>-") + .tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"), + ); + } else { + self.pb.set_style( + ProgressStyle::with_template("\n{msg}\n{spinner:.green} [{elapsed}]") + .unwrap() + .progress_chars("#>-") + .tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"), + ); + } + + self.current_stage = stage; + self.total_stages = total_stages.to_string(); + self.current_stage_name = stage_name.to_string(); + self.pb + .set_message(format!("[{}/{}] {}", stage, total_stages, stage_name)); + } + + pub fn finish(&mut self) { + self.pb.finish_and_clear(); + } +}