diff --git a/.github/workflows/test-nexus-docker.yml b/.github/workflows/test-nexus-docker.yml new file mode 100644 index 0000000..26281ec --- /dev/null +++ b/.github/workflows/test-nexus-docker.yml @@ -0,0 +1,33 @@ +name: Test Nexus (Docker) + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + test-nexus-via-docker-build: + name: Build Nexus Docker Image + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build ere-base image + run: | + docker build \ + --tag ere-base:latest \ + --file docker/base/Dockerfile.base . + + - name: Build ere-builder-nexus image + run: | + docker build \ + --tag ere-builder-nexus:latest \ + --file docker/nexus/Dockerfile . diff --git a/Cargo.lock b/Cargo.lock index acb213f..fc0a325 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -338,7 +338,7 @@ dependencies = [ "ark-poly 0.5.0 (git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64)", "ark-serialize 0.5.0", "ark-std 0.5.0", - "educe", + "educe 0.6.0", "fnv", "hashbrown 0.15.3", "itertools 0.13.0", @@ -398,7 +398,7 @@ dependencies = [ "ark-std 0.5.0", "arrayvec", "digest 0.10.7", - "educe", + "educe 0.6.0", "itertools 0.13.0", "num-bigint 0.4.6", "num-traits", @@ -498,7 +498,7 @@ dependencies = [ "ark-ff 0.5.0", "ark-serialize 0.5.0", "ark-std 0.5.0", - "educe", + "educe 0.6.0", "fnv", "hashbrown 0.15.3", ] @@ -512,7 +512,7 @@ dependencies = [ "ark-ff 0.5.0", "ark-serialize 0.5.0", "ark-std 0.5.0", - "educe", + "educe 0.6.0", "fnv", "hashbrown 0.15.3", ] @@ -527,7 +527,7 @@ dependencies = [ "ark-ff 0.5.0", "ark-relations", "ark-std 0.5.0", - "educe", + "educe 0.6.0", "num-bigint 0.4.6", "num-integer", "num-traits", @@ -836,6 +836,18 @@ version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +[[package]] +name = "bigdecimal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "bincode" version = "1.3.3" @@ -1144,7 +1156,7 @@ dependencies = [ "serde-untagged", "serde-value", "thiserror 1.0.69", - "toml", + "toml 0.8.22", "unicode-xid", "url", ] @@ -1208,7 +1220,7 @@ dependencies = [ "serde_json", "syn 2.0.101", "tempfile", - "toml", + "toml 0.8.22", ] [[package]] @@ -1396,6 +1408,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1538,6 +1559,16 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +[[package]] +name = "crypto" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf1e6e5492f8f0830c37f301f6349e0dac8b2466e4fe89eef90e9eef906cd046" +dependencies = [ + "crypto-common", + "digest 0.10.7", +] + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -1587,7 +1618,7 @@ version = "3.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" dependencies = [ - "nix", + "nix 0.30.1", "windows-sys 0.59.0", ] @@ -1790,6 +1821,15 @@ dependencies = [ "rustversion", ] +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + [[package]] name = "der" version = "0.7.10" @@ -1892,7 +1932,7 @@ version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version 0.4.1", @@ -2060,6 +2100,18 @@ dependencies = [ "spki", ] +[[package]] +name = "educe" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4bd92664bf78c4d3dba9b7cdafce6fa15b13ed3ed16175218196942e99168a8" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "educe" version = "0.6.0" @@ -2240,7 +2292,21 @@ dependencies = [ "jolt-core", "jolt-sdk", "thiserror 2.0.12", - "toml", + "toml 0.8.22", + "zkvm-interface", +] + +[[package]] +name = "ere-nexus" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "build-utils", + "nexus-sdk", + "thiserror 2.0.12", + "toml 0.9.2", + "tracing", "zkvm-interface", ] @@ -2282,7 +2348,6 @@ dependencies = [ "serde_json", "tempfile", "thiserror 2.0.12", - "toml", "zkvm-interface", ] @@ -2310,7 +2375,7 @@ dependencies = [ "serde", "tempfile", "thiserror 2.0.12", - "toml", + "toml 0.8.22", "tracing", "zkvm-interface", ] @@ -2434,6 +2499,18 @@ dependencies = [ "glob", ] +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi", +] + [[package]] name = "fixed-hash" version = "0.8.0" @@ -2446,6 +2523,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "fixedbitset" version = "0.5.7" @@ -2891,7 +2974,7 @@ dependencies = [ "rand_core 0.6.4", "rayon", "serde", - "serde_arrays", + "serde_arrays 0.1.0", "sha2", "static_assertions", "subtle", @@ -2920,7 +3003,7 @@ dependencies = [ "rand_core 0.6.4", "rayon", "serde", - "serde_arrays", + "serde_arrays 0.1.0", "sha2", "static_assertions", "subtle", @@ -2948,7 +3031,7 @@ dependencies = [ "rand_core 0.6.4", "rayon", "serde", - "serde_arrays", + "serde_arrays 0.1.0", "sha2", "static_assertions", "subtle", @@ -3598,7 +3681,7 @@ dependencies = [ "dirs", "enum_dispatch", "eyre", - "fixedbitset", + "fixedbitset 0.5.7", "getrandom 0.2.16", "indicatif", "itertools 0.10.5", @@ -4103,6 +4186,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + [[package]] name = "native-tls" version = "0.2.14" @@ -4136,6 +4225,139 @@ dependencies = [ "rayon", ] +[[package]] +name = "nexus-common" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "rrs-lib 0.1.0 (git+https://github.com/GregAC/rrs/)", + "serde", + "thiserror 2.0.12", + "variant_count", +] + +[[package]] +name = "nexus-core" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "nexus-vm", + "nexus-vm-prover", +] + +[[package]] +name = "nexus-precompile-macros" +version = "0.1.0" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "nexus-common", + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.101", +] + +[[package]] +name = "nexus-precompiles" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "nexus-common", + "nexus-precompile-macros", +] + +[[package]] +name = "nexus-profiler" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "pprof", +] + +[[package]] +name = "nexus-sdk" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "crypto", + "crypto-common", + "nexus-common", + "nexus-core", + "nexus-sdk-macros", + "postcard", + "serde", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "nexus-sdk-macros" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "nexus-profiler", + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nexus-vm" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "elf", + "itertools 0.14.0", + "nexus-common", + "nexus-precompiles", + "num-derive", + "num-traits", + "once_cell", + "rangemap", + "rrs-lib 0.1.0 (git+https://github.com/GregAC/rrs/)", + "rustc-hash 2.1.1", + "serde", + "serde_arrays 0.2.0", + "tempfile", + "thiserror 2.0.12", + "tiny-keccak", + "tracing", + "tracing-subscriber 0.3.19", + "tracing-test", + "variant_count", +] + +[[package]] +name = "nexus-vm-prover" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "impl-trait-for-tuples", + "itertools 0.13.0", + "nexus-common", + "nexus-vm", + "nexus-vm-prover-macros", + "num-traits", + "rayon", + "serde", + "stwo-prover", + "tiny-keccak", +] + +[[package]] +name = "nexus-vm-prover-macros" +version = "0.3.4" +source = "git+https://github.com/nexus-xyz/nexus-zkvm.git?tag=0.3.4#8eb6cb423073ca308d64d9fec21a3bfa59b6e4ea" +dependencies = [ + "convert_case 0.7.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "nibble_vec" version = "0.1.0" @@ -4145,6 +4367,17 @@ dependencies = [ "smallvec", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + [[package]] name = "nix" version = "0.30.1" @@ -4549,7 +4782,7 @@ dependencies = [ "openvm-instructions-derive", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum", ] @@ -4600,7 +4833,7 @@ dependencies = [ "openvm-rv32im-transpiler", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum", ] @@ -4782,7 +5015,7 @@ dependencies = [ "openvm-instructions-derive", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum", ] @@ -4857,7 +5090,7 @@ dependencies = [ "openvm-keccak256-guest", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum", ] @@ -5040,7 +5273,7 @@ dependencies = [ "openvm-pairing-guest", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum", ] @@ -5134,7 +5367,7 @@ dependencies = [ "openvm-rv32im-guest", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "strum", "tracing", @@ -5244,7 +5477,7 @@ dependencies = [ "openvm-sha256-guest", "openvm-stark-backend", "openvm-transpiler", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum", ] @@ -5302,7 +5535,7 @@ dependencies = [ "serde", "serde_json", "static_assertions", - "toml", + "toml 0.8.22", "tracing", "tracing-forest", "tracing-subscriber 0.3.19", @@ -5319,7 +5552,7 @@ dependencies = [ "openvm-instructions", "openvm-platform", "openvm-stark-backend", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.69", ] @@ -6442,6 +6675,16 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.9.0", +] + [[package]] name = "pico-derive" version = "0.1.0" @@ -6677,6 +6920,30 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "pprof" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5c97c51bd34c7e742402e216abdeb44d415fbe6ae41d56b114723e953711cb" +dependencies = [ + "backtrace", + "cfg-if", + "findshlibs", + "libc", + "log", + "nix 0.26.4", + "once_cell", + "parking_lot", + "prost 0.12.6", + "prost-build", + "prost-derive 0.12.6", + "sha2", + "smallvec", + "symbolic-demangle", + "tempfile", + "thiserror 1.0.69", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -6810,6 +7077,16 @@ dependencies = [ "unarray", ] +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive 0.12.6", +] + [[package]] name = "prost" version = "0.13.5" @@ -6817,7 +7094,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost 0.12.6", + "prost-types", + "regex", + "syn 2.0.101", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -6833,6 +7144,15 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost 0.12.6", +] + [[package]] name = "puffin" version = "0.19.1" @@ -7087,6 +7407,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" +dependencies = [ + "serde", +] + [[package]] name = "raw-cpuid" version = "11.5.0" @@ -7589,7 +7918,7 @@ dependencies = [ "lazy-regex", "num-bigint 0.4.6", "num-traits", - "prost", + "prost 0.13.5", "rand 0.8.5", "rayon", "risc0-binfmt", @@ -7602,7 +7931,7 @@ dependencies = [ "risc0-zkos-v1compat", "risc0-zkp", "risc0-zkvm-platform", - "rrs-lib", + "rrs-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle", "rzup", "semver 1.0.26", @@ -7670,6 +7999,16 @@ dependencies = [ "paste", ] +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "git+https://github.com/GregAC/rrs/#b23afc16b4e6a1fb5c4a73eb1e337e9400816507" +dependencies = [ + "downcast-rs", + "num_enum", + "paste", +] + [[package]] name = "rrs-succinct" version = "0.1.0" @@ -7896,7 +8235,7 @@ dependencies = [ "strum", "tempfile", "thiserror 2.0.12", - "toml", + "toml 0.8.22", "yaml-rust2", ] @@ -8080,6 +8419,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_arrays" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a16b99c5ea4fe3daccd14853ad260ec00ea043b2708d1fd1da3106dcd8d9df" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.219" @@ -8122,6 +8470,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -8475,7 +8832,7 @@ checksum = "d2c81ab46ba84d41e471351329a69ac43be7da1aa701ed29c70048c83c0fe28c" dependencies = [ "bincode", "ctrlc", - "prost", + "prost 0.13.5", "serde", "sp1-core-machine", "sp1-prover", @@ -8523,7 +8880,7 @@ dependencies = [ "anyhow", "clap", "tempfile", - "toml", + "toml 0.8.22", "tracing", ] @@ -8751,7 +9108,7 @@ dependencies = [ "p3-baby-bear 0.2.3-succinct", "p3-field 0.2.3-succinct", "p3-fri 0.2.3-succinct", - "prost", + "prost 0.13.5", "reqwest", "reqwest-middleware", "serde", @@ -8853,6 +9210,60 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "starknet-crypto" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2c30c01e8eb0fc913c4ee3cf676389fffc1d1182bfe5bb9670e4e72e968064" +dependencies = [ + "crypto-bigint", + "hex", + "hmac", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "rfc6979", + "sha2", + "starknet-crypto-codegen", + "starknet-curve", + "starknet-ff", + "zeroize", +] + +[[package]] +name = "starknet-crypto-codegen" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" +dependencies = [ + "starknet-curve", + "starknet-ff", + "syn 2.0.101", +] + +[[package]] +name = "starknet-curve" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c383518bb312751e4be80f53e8644034aa99a0afb29d7ac41b89a997db875b" +dependencies = [ + "starknet-ff", +] + +[[package]] +name = "starknet-ff" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abf1b44ec5b18d87c1ae5f54590ca9d0699ef4dd5b2ffa66fc97f24613ec585" +dependencies = [ + "ark-ff 0.4.2", + "bigdecimal", + "crypto-bigint", + "getrandom 0.2.16", + "hex", + "serde", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -8893,6 +9304,27 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "stwo-prover" +version = "0.1.1" +source = "git+https://github.com/starkware-libs/stwo?rev=61d1f6b#61d1f6bf6d2913e6951b837526c2ce1f7f661414" +dependencies = [ + "blake2", + "blake3", + "bytemuck", + "cfg-if", + "educe 0.5.11", + "hex", + "itertools 0.12.1", + "num-traits", + "rand 0.8.5", + "serde", + "starknet-crypto", + "starknet-ff", + "thiserror 1.0.69", + "tracing", +] + [[package]] name = "subenum" version = "1.1.2" @@ -8911,6 +9343,29 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "symbolic-common" +version = "12.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c5199e46f23c77c611aa2a383b2f72721dfee4fb2bf85979eea1e0f26ba6e35" +dependencies = [ + "debugid", + "memmap2", + "stable_deref_trait", + "uuid", +] + +[[package]] +name = "symbolic-demangle" +version = "12.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa3c03956e32254f74e461a330b9522a2689686d80481708fb2014780d8d3959" +dependencies = [ + "cpp_demangle", + "rustc-demangle", + "symbolic-common", +] + [[package]] name = "syn" version = "1.0.109" @@ -9284,11 +9739,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.9", "toml_edit 0.22.26", ] +[[package]] +name = "toml" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +dependencies = [ + "indexmap 2.9.0", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow 0.7.10", +] + [[package]] name = "toml_datetime" version = "0.6.9" @@ -9298,6 +9768,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.19.15" @@ -9305,7 +9784,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.9.0", - "toml_datetime", + "toml_datetime 0.6.9", "winnow 0.5.40", ] @@ -9317,18 +9796,33 @@ checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.9", "toml_write", "winnow 0.7.10", ] +[[package]] +name = "toml_parser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +dependencies = [ + "winnow 0.7.10", +] + [[package]] name = "toml_write" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tonic" version = "0.12.3" @@ -9349,7 +9843,7 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "prost", + "prost 0.13.5", "rustls-native-certs", "rustls-pemfile", "socket2", @@ -9528,6 +10022,27 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracing-test" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" +dependencies = [ + "tracing-core", + "tracing-subscriber 0.3.19", + "tracing-test-macro", +] + +[[package]] +name = "tracing-test-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" +dependencies = [ + "quote", + "syn 2.0.101", +] + [[package]] name = "transpose" version = "0.2.3" @@ -9556,7 +10071,7 @@ dependencies = [ "http", "http-body-util", "hyper", - "prost", + "prost 0.13.5", "reqwest", "serde", "serde_json", @@ -9642,6 +10157,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.2.0" @@ -9693,12 +10214,35 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "rand 0.9.1", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "variant_count" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1935e10c6f04d22688d07c0790f2fc0e1b1c5c2c55bc0cc87ed67656e587dd8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index d7e1a5d..fb02bab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,16 @@ [workspace] members = [ "crates/build-utils", - # zkVM interface - "crates/zkvm-interface", # zkVMs - "crates/ere-sp1", - "crates/ere-risczero", + "crates/ere-jolt", + "crates/ere-nexus", "crates/ere-openvm", "crates/ere-pico", - "crates/ere-jolt", + "crates/ere-risczero", + "crates/ere-sp1", "crates/ere-zisk", + # zkVM interface + "crates/zkvm-interface", # Guest compilers "docker/sp1", diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0c5c6d9 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +# Heavily inspired by Reth: https://github.com/paradigmxyz/reth/blob/4c39b98b621c53524c6533a9c7b52fc42c25abd6/Makefile +.DEFAULT_GOAL := help + +##@ Help +.PHONY: help +help: # Display this help. + @awk 'BEGIN {FS = ":.*#"; printf "Usage:\n make \033[34m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?#/ { printf " \033[34m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(MAKEFILE_LIST) + +##@ Build +.PHONY: build +build: # Build the Ream binary into `target` directory. + @cargo build --verbose --release + + +##@ Lint +.PHONY: clean +clean: # Run `cargo clean`. + @cargo clean + +.PHONY: lint pr +lint: # Run `clippy` and `rustfmt`. + cargo +nightly fmt --all + cargo clippy --all --all-targets --no-deps -- --deny warnings + + # clippy for bls with supranational feature + cargo clippy --all-targets --no-deps -- --deny warnings + + # cargo sort + cargo sort --grouped diff --git a/README.md b/README.md index 7c02a07..3c62bcf 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ - Jolt - Pico - Zisk +- Nexus ## Quick Start diff --git a/crates/ere-jolt/src/lib.rs b/crates/ere-jolt/src/lib.rs index 506fb6b..83c9e0a 100644 --- a/crates/ere-jolt/src/lib.rs +++ b/crates/ere-jolt/src/lib.rs @@ -153,7 +153,7 @@ mod tests { let test_guest_path = get_compile_test_guest_program_path(); let program = JOLT_TARGET::compile(&test_guest_path, Path::new("")).unwrap(); let mut inputs = Input::new(); - inputs.write(1 as u32); + inputs.write(1_u32); let zkvm = EreJolt::new(program, ProverResourceType::Cpu); let _execution = zkvm.execute(&inputs).unwrap(); diff --git a/crates/ere-nexus/Cargo.toml b/crates/ere-nexus/Cargo.toml new file mode 100644 index 0000000..96048c3 --- /dev/null +++ b/crates/ere-nexus/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "ere-nexus" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +zkvm-interface = { workspace = true } + +nexus-sdk = { git = "https://github.com/nexus-xyz/nexus-zkvm.git", tag = "0.3.4", version = "0.3.4" } + +thiserror = "2" +bincode = "1.3" +tracing = "0.1" +toml = { version = "0.9.2", features = ["parse", "display", "serde"] } + +[dev-dependencies] +anyhow = "1.0" + +[build-dependencies] +build-utils.workspace = true + + +[lints] +workspace = true diff --git a/crates/ere-nexus/build.rs b/crates/ere-nexus/build.rs new file mode 100644 index 0000000..7ed85da --- /dev/null +++ b/crates/ere-nexus/build.rs @@ -0,0 +1,5 @@ +use build_utils::detect_and_generate_name_and_sdk_version; + +fn main() { + detect_and_generate_name_and_sdk_version("nexus", "nexus-sdk"); +} diff --git a/crates/ere-nexus/src/error.rs b/crates/ere-nexus/src/error.rs new file mode 100644 index 0000000..a287f7a --- /dev/null +++ b/crates/ere-nexus/src/error.rs @@ -0,0 +1,51 @@ +use std::path::PathBuf; +use thiserror::Error; +use zkvm_interface::zkVMError; + +impl From for zkVMError { + fn from(value: NexusError) -> Self { + zkVMError::Other(Box::new(value)) + } +} + +#[derive(Debug, Error)] +pub enum NexusError { + #[error(transparent)] + Compile(#[from] CompileError), + + #[error(transparent)] + Prove(#[from] ProveError), + + #[error(transparent)] + Verify(#[from] VerifyError), + + /// Guest program directory does not exist. + #[error("guest program directory not found: {0}")] + PathNotFound(PathBuf), + + /// Expected ELF file was not produced. + #[error("ELF file not found at {0}")] + ElfNotFound(PathBuf), +} + +#[derive(Debug, Error)] +pub enum CompileError { + #[error("nexus execution failed: {0}")] + Client(#[source] Box), +} + +#[derive(Debug, Error)] +pub enum ProveError { + #[error("nexus execution failed: {0}")] + Client(#[source] Box), + #[error("Serialising proof with `bincode` failed: {0}")] + Bincode(#[from] bincode::Error), +} + +#[derive(Debug, Error)] +pub enum VerifyError { + #[error("nexus verification failed: {0}")] + Client(#[source] Box), + #[error("Deserialising proof failed: {0}")] + Bincode(#[from] bincode::Error), +} diff --git a/crates/ere-nexus/src/lib.rs b/crates/ere-nexus/src/lib.rs new file mode 100644 index 0000000..4c06660 --- /dev/null +++ b/crates/ere-nexus/src/lib.rs @@ -0,0 +1,219 @@ +#![allow(clippy::uninlined_format_args)] +use std::path::{Path, PathBuf}; +use std::time::Instant; + +use nexus_sdk::compile::cargo::CargoPackager; +use nexus_sdk::compile::{Compile, Compiler as NexusCompiler}; +use nexus_sdk::stwo::seq::{Proof, Stwo}; +use nexus_sdk::{Local, Prover, Verifiable}; +use tracing::info; +use zkvm_interface::{ + Compiler, Input, ProgramExecutionReport, ProgramProvingReport, ProverResourceType, zkVM, + zkVMError, +}; + +include!(concat!(env!("OUT_DIR"), "/name_and_sdk_version.rs")); + +mod error; +pub(crate) mod utils; + +use crate::error::ProveError; +use crate::utils::get_cargo_package_name; +use error::{CompileError, NexusError, VerifyError}; + +#[allow(non_camel_case_types)] +pub struct NEXUS_TARGET; + +impl Compiler for NEXUS_TARGET { + type Error = NexusError; + + type Program = PathBuf; + + fn compile( + workspace_directory: &Path, + guest_relative: &Path, + ) -> Result { + let guest_path = workspace_directory.join(guest_relative); + + // 1. Check guest path + if !guest_path.exists() { + return Err(NexusError::PathNotFound(guest_path.to_path_buf())); + } + std::env::set_current_dir(&guest_path).map_err(|e| CompileError::Client(e.into()))?; + + let package_name = get_cargo_package_name(&guest_path) + .ok_or(CompileError::Client(Box::from(format!( + "Failed to get guest package name, where guest path: {:?}", + guest_path + )))) + .map_err(|e| CompileError::Client(e.into()))?; + let mut prover_compiler = NexusCompiler::::new(&package_name); + let elf_path = prover_compiler + .build() + .map_err(|e| CompileError::Client(e.into()))?; + + Ok(elf_path) + } +} + +pub struct EreNexus { + program: ::Program, +} + +impl EreNexus { + pub fn new( + program: ::Program, + _resource_type: ProverResourceType, + ) -> Self { + Self { program } + } +} +impl zkVM for EreNexus { + fn execute(&self, inputs: &Input) -> Result { + let start = Instant::now(); + + // let mut public_input = vec![]; + let mut private_input = vec![]; + for input in inputs.iter() { + private_input.extend( + input + .as_bytes() + .map_err(|err| NexusError::Prove(ProveError::Client(err))) + .map_err(zkVMError::from)?, + ); + } + // TODO: Doesn't catch execute for guest in nexus. so only left some dummy code(parse input) here. + // Besides, public input is not supported yet, so we just pass an empty tuple + + Ok(ProgramExecutionReport { + execution_duration: start.elapsed(), + ..Default::default() + }) + } + + fn prove( + &self, + inputs: &Input, + ) -> Result<(Vec, zkvm_interface::ProgramProvingReport), zkVMError> { + let prover: Stwo = Stwo::new_from_file(&self.program.to_string_lossy().to_string()) + .map_err(|e| NexusError::Prove(ProveError::Client(e.into()))) + .map_err(zkVMError::from)?; + + // One convention that may be useful for simplifying the design is that all inputs to the vm are private and all outputs are public. + // If an input should be public, then it could just be returned from the function. + // let mut public_input = vec![]; + let mut private_input = vec![]; + for input in inputs.iter() { + private_input.extend( + input + .as_bytes() + .map_err(|err| NexusError::Prove(ProveError::Client(err))) + .map_err(zkVMError::from)?, + ); + } + + let now = Instant::now(); + let (_view, proof) = prover + .prove_with_input(&private_input, &()) + .map_err(|e| NexusError::Prove(ProveError::Client(e.into()))) + .map_err(zkVMError::from)?; + let elapsed = now.elapsed(); + + let bytes = bincode::serialize(&proof) + .map_err(|err| NexusError::Prove(ProveError::Bincode(err)))?; + + Ok((bytes, ProgramProvingReport::new(elapsed))) + } + + fn verify(&self, proof: &[u8]) -> Result<(), zkVMError> { + info!("Verifying proof..."); + + let proof: Proof = bincode::deserialize(proof) + .map_err(|err| NexusError::Verify(VerifyError::Bincode(err)))?; + + let prover: Stwo = Stwo::new_from_file(&self.program.to_string_lossy().to_string()) + .map_err(|e| NexusError::Prove(ProveError::Client(e.into()))) + .map_err(zkVMError::from)?; + let elf = prover.elf.clone(); // save elf for use with verification + #[rustfmt::skip] + proof + .verify_expected::<(), ()>( + &(), // no public input + nexus_sdk::KnownExitCodes::ExitSuccess as u32, + &(), // no public output + &elf, // expected elf (program binary) + &[], // no associated data, + ) + .map_err(|e| NexusError::Verify(VerifyError::Client(e.into()))) + .map_err(zkVMError::from)?; + + info!("Verify Succeeded!"); + Ok(()) + } + + fn name(&self) -> &'static str { + NAME + } + + fn sdk_version(&self) -> &'static str { + SDK_VERSION + } +} + +#[cfg(test)] +mod tests { + use zkvm_interface::Compiler; + + use crate::NEXUS_TARGET; + + use super::*; + use std::path::PathBuf; + + fn get_test_guest_program_path() -> PathBuf { + let workspace_dir = env!("CARGO_WORKSPACE_DIR"); + PathBuf::from(workspace_dir) + .join("tests") + .join("nexus") + .join("guest") + .canonicalize() + .expect("Failed to find or canonicalize test guest program at /tests/compile/nexus") + } + + #[test] + fn test_compile() -> anyhow::Result<()> { + let test_guest_path = get_test_guest_program_path(); + let elf_path = NEXUS_TARGET::compile(&test_guest_path, Path::new(""))?; + let prover: Stwo = Stwo::new_from_file(&elf_path.to_string_lossy().to_string())?; + let elf = prover.elf.clone(); + assert!( + !elf.instructions.is_empty(), + "ELF bytes should not be empty." + ); + Ok(()) + } + + #[test] + fn test_execute() { + let test_guest_path = get_test_guest_program_path(); + let elf = + NEXUS_TARGET::compile(&test_guest_path, Path::new("")).expect("compilation failed"); + let mut input = Input::new(); + input.write(10u64); + + let zkvm = EreNexus::new(elf, ProverResourceType::Cpu); + zkvm.execute(&input).unwrap(); + } + + #[test] + fn test_prove_verify() -> anyhow::Result<()> { + let test_guest_path = get_test_guest_program_path(); + let elf = NEXUS_TARGET::compile(&test_guest_path, Path::new(""))?; + let mut input = Input::new(); + input.write(10u64); + + let zkvm = EreNexus::new(elf, ProverResourceType::Cpu); + let (proof, _) = zkvm.prove(&input).unwrap(); + zkvm.verify(&proof).expect("proof should verify"); + Ok(()) + } +} diff --git a/crates/ere-nexus/src/utils.rs b/crates/ere-nexus/src/utils.rs new file mode 100644 index 0000000..16f26c4 --- /dev/null +++ b/crates/ere-nexus/src/utils.rs @@ -0,0 +1,13 @@ +use std::fs; +use toml::Table; + +pub fn get_cargo_package_name(crate_path: &std::path::Path) -> Option { + let cargo_contents = fs::read_to_string(crate_path.join("Cargo.toml")).ok()?; + let cargo_toml: Table = toml::from_str(&cargo_contents).ok()?; + + cargo_toml + .get("package")? + .get("name")? + .as_str() + .map(|s| s.to_string()) +} diff --git a/crates/ere-pico/src/lib.rs b/crates/ere-pico/src/lib.rs index af550fc..740b617 100644 --- a/crates/ere-pico/src/lib.rs +++ b/crates/ere-pico/src/lib.rs @@ -161,7 +161,7 @@ mod tests { "Attempting to find test guest program at: {}", path.display() ); - println!("Workspace dir is: {}", workspace_dir); + println!("Workspace dir is: {workspace_dir}"); path.canonicalize() .expect("Failed to find or canonicalize test guest program at /tests/pico/compile/basic/app") @@ -176,11 +176,8 @@ mod tests { Ok(elf_bytes) => { assert!(!elf_bytes.is_empty(), "ELF bytes should not be empty."); } - Err(e) => { - panic!( - "compile_sp1_program direct call failed for dedicated guest: {:?}", - e - ); + Err(err) => { + panic!("compile_sp1_program direct call failed for dedicated guest: {err}"); } } } diff --git a/crates/ere-risczero/Cargo.toml b/crates/ere-risczero/Cargo.toml index d5af27b..d3f2485 100644 --- a/crates/ere-risczero/Cargo.toml +++ b/crates/ere-risczero/Cargo.toml @@ -8,8 +8,8 @@ license.workspace = true [dependencies] zkvm-interface = { workspace = true } anyhow = "1.0" #TODO: remove only needed in tests -toml = "0.8" -risc0-zkvm = { version = "^2.3.0", features = ["unstable"] } +#toml = "0.8" +risc0-zkvm = { version = "2.3.0", features = ["unstable"] } borsh = "1.5.7" hex = "*" diff --git a/crates/ere-risczero/src/lib.rs b/crates/ere-risczero/src/lib.rs index 9704b25..be31558 100644 --- a/crates/ere-risczero/src/lib.rs +++ b/crates/ere-risczero/src/lib.rs @@ -102,7 +102,7 @@ impl zkVM for EreRisc0 { env.write(serialize).unwrap(); } InputItem::Bytes(items) => { - env.write_frame(&items); + env.write_frame(items); } } } @@ -121,7 +121,7 @@ impl zkVM for EreRisc0 { fn verify(&self, proof: &[u8]) -> Result<(), zkVMError> { let decoded: Receipt = - borsh::from_slice(&proof).map_err(|err| zkVMError::Other(Box::new(err)))?; + borsh::from_slice(proof).map_err(|err| zkVMError::Other(Box::new(err)))?; decoded .verify(self.program.image_id) @@ -175,7 +175,7 @@ mod prove_tests { let proof_bytes = match zkvm.prove(&input_builder) { Ok((prove_result, _)) => prove_result, Err(err) => { - panic!("Proving error in test: {:?}", err); + panic!("Proving error in test: {err}",); } }; @@ -238,8 +238,8 @@ mod execute_tests { let result = zkvm.execute(&input_builder); - if let Err(e) = &result { - panic!("Execution error: {:?}", e); + if let Err(err) = &result { + panic!("Execution error: {err}"); } } diff --git a/crates/ere-sp1/src/compile.rs b/crates/ere-sp1/src/compile.rs index 5eb583c..55c64bd 100644 --- a/crates/ere-sp1/src/compile.rs +++ b/crates/ere-sp1/src/compile.rs @@ -93,8 +93,8 @@ mod tests { Ok(elf_bytes) => { assert!(!elf_bytes.is_empty(), "ELF bytes should not be empty."); } - Err(e) => { - panic!("compile failed for dedicated guest: {:?}", e); + Err(err) => { + panic!("compile failed for dedicated guest: {err}"); } } } @@ -106,11 +106,8 @@ mod tests { Ok(elf_bytes) => { assert!(!elf_bytes.is_empty(), "ELF bytes should not be empty."); } - Err(e) => { - panic!( - "compile_sp1_program direct call failed for dedicated guest: {:?}", - e - ); + Err(err) => { + panic!("compile_sp1_program direct call failed for dedicated guest: {err}"); } } } diff --git a/crates/ere-sp1/src/lib.rs b/crates/ere-sp1/src/lib.rs index c1d7871..a5786aa 100644 --- a/crates/ere-sp1/src/lib.rs +++ b/crates/ere-sp1/src/lib.rs @@ -264,8 +264,8 @@ mod execute_tests { let result = zkvm.execute(&input_builder); - if let Err(e) = &result { - panic!("Execution error: {:?}", e); + if let Err(err) = &result { + panic!("Execution error: {err}"); } } @@ -325,7 +325,7 @@ mod prove_tests { let proof_bytes = match zkvm.prove(&input_builder) { Ok((prove_result, _)) => prove_result, Err(err) => { - panic!("Proving error in test: {:?}", err); + panic!("Proving error in test: {err}"); } }; @@ -387,7 +387,7 @@ mod prove_tests { prove_result } Err(err) => { - panic!("Network proving error: {:?}", err); + panic!("Network proving error: {err}"); } }; diff --git a/docker/nexus/Dockerfile b/docker/nexus/Dockerfile new file mode 100644 index 0000000..d74b2d5 --- /dev/null +++ b/docker/nexus/Dockerfile @@ -0,0 +1,40 @@ +ARG BASE_IMAGE_TAG=latest +FROM ere-base:${BASE_IMAGE_TAG} + +# The ere-base image provides Rust, Cargo, and common tools. +# We operate as root for SDK installation. + +# Copy the Nexus SDK installer script from the workspace context +COPY scripts/sdk_installers/install_nexus_sdk.sh /tmp/install_nexus_sdk.sh +RUN chmod +x /tmp/install_nexus_sdk.sh + +RUN rustup default nightly-2025-06-05 && \ + rustup target add riscv32i-unknown-none-elf + +# Run the Nexus SDK installation script. +# This script installs the specific Rust toolchain (nightly-2025-06-05) +# and installs cargo-nexus +# The CARGO_HOME from ere-base (e.g., /root/.cargo) will be used, and cargo-nexus will be in its bin. +RUN /tmp/install_nexus_sdk.sh && rm /tmp/install_nexus_sdk.sh # Clean up the script + +# Define the Nexus toolchain for convenience in subsequent commands if needed, though cargo-nexus should use it. +ENV NEXUS_TOOLCHAIN_VERSION="nightly-2025-06-05" + +# Verify Nexus installation +RUN echo "Verifying Nexus installation in Dockerfile (post-script)..." && cargo-nexus --version + +# Copy the entire ere project context +# The WORKDIR is /app from the base image +WORKDIR /app +COPY . . + +# Build +RUN echo "Build tests for ere-nexus library..." && \ + cargo build --tests --release -p ere-nexus + +# Run tests +RUN echo "Running tests for ere-nexus library..." && \ + cargo test --release -p ere-nexus --lib -- --color always && \ + echo "Running Nexus tests Success..." + +CMD ["/bin/bash"] \ No newline at end of file diff --git a/docker/pico/Dockerfile b/docker/pico/Dockerfile index 9e0570f..7e4caa5 100644 --- a/docker/pico/Dockerfile +++ b/docker/pico/Dockerfile @@ -20,7 +20,7 @@ RUN /tmp/install_pico_sdk.sh && rm /tmp/install_pico_sdk.sh # Clean up the scrip ENV PICO_TOOLCHAIN_VERSION="nightly-2024-11-27" # Verify Pico installation -RUN echo "Verifying Risc0 installation in Dockerfile (post-script)..." && cargo "+${PICO_TOOLCHAIN_VERSION}" pico --version +RUN echo "Verifying Pico installation in Dockerfile (post-script)..." && cargo "+${PICO_TOOLCHAIN_VERSION}" pico --version # Copy the entire ere project context # The WORKDIR is /app from the base image diff --git a/scripts/sdk_installers/install_nexus_sdk.sh b/scripts/sdk_installers/install_nexus_sdk.sh new file mode 100755 index 0000000..4ee581f --- /dev/null +++ b/scripts/sdk_installers/install_nexus_sdk.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -e + +# --- Utility functions (duplicated) --- +# Checks if a tool is installed and available in PATH. +is_tool_installed() { + command -v "$1" &> /dev/null +} + +# Ensures a tool is installed. Exits with an error if not. +ensure_tool_installed() { + local tool_name="$1" + local purpose_message="$2" + if ! is_tool_installed "${tool_name}"; then + echo "Error: Required tool '${tool_name}' could not be found." >&2 + if [ -n "${purpose_message}" ]; then + echo " It is needed ${purpose_message}." >&2 + fi + echo " Please install it first and ensure it is in your PATH." >&2 + exit 1 + fi +} +# --- End of Utility functions --- + +echo "Installing Nexus Toolchain and SDK using Nexus (prebuilt binaries)..." + +# Prerequisites for Nexus (some of these are for the SDK itself beyond Nexus) +#ensure_tool_installed "curl" "to download the Nexus installer" +#ensure_tool_installed "bash" "to run the Nexus installer" +ensure_tool_installed "rustup" "for managing Rust toolchains" +ensure_tool_installed "cargo" "as cargo-nexus is a cargo subcommand" + +# Step 1: Download and run the toolchain. + +# Verify Nexus installation +echo "Verifying Nexus installation..." + +echo "Checking for RISC-V target..." +if rustup target list | grep -q "riscv32i-unknown-none-elf"; then + echo "RISC-V target 'riscv32i-unknown-none-elf' not found." +else + echo "RISC-V 'riscv32i-unknown-none-elf' not found after installation!" >&2 + echo "Install the RISC-V target:" + rustup target add riscv32i-unknown-none-elf +fi + +echo "Checking for cargo-nexus..." +if cargo --list | grep "nexus"; then + echo "cargo-nexus found." +else + echo "cargo-nexus not found after installation!" >&2 + echo "Install the cargo-nexus:" + cargo install --git https://github.com/nexus-xyz/nexus-zkvm cargo-nexus --tag 'v0.3.4' +fi diff --git a/tests/nexus/guest/.cargo/config.toml b/tests/nexus/guest/.cargo/config.toml new file mode 100644 index 0000000..80e2c50 --- /dev/null +++ b/tests/nexus/guest/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.riscv32i-unknown-none-elf] +rustflags = [ + "-C", "link-arg=-Tlink.x", +] +runner="nexus-run" diff --git a/tests/nexus/guest/Cargo.toml b/tests/nexus/guest/Cargo.toml new file mode 100644 index 0000000..f5d5241 --- /dev/null +++ b/tests/nexus/guest/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "ere-nexus-guest" +version = "0.1.0" +edition = "2024" + +[dependencies] +nexus-rt = { git = "https://github.com/nexus-xyz/nexus-zkvm.git", tag = "0.3.4", version = "0.3.4" } + +# Generated by cargo-nexus, do not remove! +# +[features] +cycles = [] # Enable cycle counting for run command +[workspace] + diff --git a/tests/nexus/guest/src/main.rs b/tests/nexus/guest/src/main.rs new file mode 100644 index 0000000..503bb99 --- /dev/null +++ b/tests/nexus/guest/src/main.rs @@ -0,0 +1,18 @@ +#![cfg_attr(target_arch = "riscv32", no_std, no_main)] + +use nexus_rt::println; + +#[nexus_rt::main] +#[nexus_rt::private_input(x)] +fn main(x: u32) { + println!("Read public input: {}", x); + let res = fibonacci(x); + println!("fib result: {}", res); +} +pub fn fibonacci(n: u32) -> u32 { + match n { + 0 => 1, + 1 => 1, + _ => fibonacci(n - 1) + fibonacci(n - 2), + } +}