From e9cdb1795de03c588df55e52bda611be7a540946 Mon Sep 17 00:00:00 2001 From: Han Date: Wed, 29 Oct 2025 07:11:11 +0800 Subject: [PATCH] Update Jolt to `v0.3.0-alpha` (#181) --- .github/workflows/test-zkvm-jolt.yml | 2 +- .github/workflows/test-zkvm-zisk.yml | 1 - .github/workflows/test-zkvm.yml | 9 - .gitignore | 3 +- Cargo.lock | 658 ++++++++---------- Cargo.toml | 15 +- crates/dockerized/compiler/src/main.rs | 4 +- crates/dockerized/dockerized/src/lib.rs | 10 + crates/zkvm/airbender/src/lib.rs | 1 - crates/zkvm/jolt/Cargo.toml | 7 +- crates/zkvm/jolt/src/client.rs | 123 ++++ crates/zkvm/jolt/src/compiler.rs | 8 +- .../{rust_rv32ima.rs => rust_rv64imac.rs} | 27 +- .../template.ld | 9 +- ...tomized.rs => rust_rv64imac_customized.rs} | 30 +- crates/zkvm/jolt/src/error.rs | 6 +- crates/zkvm/jolt/src/jolt_methods.rs | 88 --- crates/zkvm/jolt/src/lib.rs | 153 ++-- docker/jolt/Dockerfile.base | 3 + scripts/sdk_installers/install_jolt_sdk.sh | 4 +- tests/jolt/basic/Cargo.toml | 11 +- tests/jolt/basic/src/lib.rs | 15 - tests/jolt/basic/src/main.rs | 34 +- tests/jolt/stock_nightly_no_std/Cargo.toml | 6 +- tests/jolt/stock_nightly_no_std/src/main.rs | 9 +- 25 files changed, 634 insertions(+), 602 deletions(-) create mode 100644 crates/zkvm/jolt/src/client.rs rename crates/zkvm/jolt/src/compiler/{rust_rv32ima.rs => rust_rv64imac.rs} (67%) rename crates/zkvm/jolt/src/compiler/{rust_rv32ima => rust_rv64imac}/template.ld (54%) rename crates/zkvm/jolt/src/compiler/{rust_rv32ima_customized.rs => rust_rv64imac_customized.rs} (63%) delete mode 100644 crates/zkvm/jolt/src/jolt_methods.rs delete mode 100644 tests/jolt/basic/src/lib.rs diff --git a/.github/workflows/test-zkvm-jolt.yml b/.github/workflows/test-zkvm-jolt.yml index 717abc3..e253686 100644 --- a/.github/workflows/test-zkvm-jolt.yml +++ b/.github/workflows/test-zkvm-jolt.yml @@ -14,4 +14,4 @@ jobs: packages: write with: zkvm: jolt - toolchain: 1.86.0 + toolchain: 1.88.0 diff --git a/.github/workflows/test-zkvm-zisk.yml b/.github/workflows/test-zkvm-zisk.yml index d459da3..107d96c 100644 --- a/.github/workflows/test-zkvm-zisk.yml +++ b/.github/workflows/test-zkvm-zisk.yml @@ -15,5 +15,4 @@ jobs: with: zkvm: zisk toolchain: 1.86.0 - free_up_disk_space: true skip_prove_test: true diff --git a/.github/workflows/test-zkvm.yml b/.github/workflows/test-zkvm.yml index 1269fb0..0fe0575 100644 --- a/.github/workflows/test-zkvm.yml +++ b/.github/workflows/test-zkvm.yml @@ -12,11 +12,6 @@ on: required: false type: string default: 1.86.0 - free_up_disk_space: - description: 'Whether free up disk space or not' - required: false - type: boolean - default: false # Remove when we use larger runners, currently only needed to skip for zisk skip_prove_test: description: 'Whether to skip prove test and ere-dockerized test or not' @@ -47,7 +42,6 @@ jobs: uses: actions/checkout@v4 - name: Free up disk space - if: ${{ inputs.free_up_disk_space }} run: bash .github/scripts/free-up-disk-space.sh - name: Set up Docker Buildx @@ -151,7 +145,6 @@ jobs: uses: actions/checkout@v4 - name: Free up disk space - if: ${{ inputs.free_up_disk_space }} run: bash .github/scripts/free-up-disk-space.sh - name: Cache dependencies @@ -201,7 +194,6 @@ jobs: uses: actions/checkout@v4 - name: Free up disk space - if: ${{ inputs.free_up_disk_space }} run: bash .github/scripts/free-up-disk-space.sh - name: Cache dependencies @@ -249,7 +241,6 @@ jobs: uses: actions/checkout@v4 - name: Free up disk space - if: ${{ inputs.free_up_disk_space }} run: bash .github/scripts/free-up-disk-space.sh - name: Install protoc diff --git a/.gitignore b/.gitignore index 3b7d6ad..b3d2c7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target -notes.md \ No newline at end of file +notes.md +dory_srs_*_variables.srs \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 7a87539..fe75ad7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -54,6 +54,22 @@ dependencies = [ "typed-arena", ] +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "cpp_demangle", + "fallible-iterator", + "gimli 0.32.3", + "memmap2", + "object 0.37.3", + "rustc-demangle", + "smallvec", + "typed-arena", +] + [[package]] name = "adler2" version = "2.0.0" @@ -94,6 +110,25 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocative" +version = "0.3.4" +source = "git+https://github.com/facebookexperimental/allocative?rev=85b773d85d526d068ce94724ff7a7b81203fc95e#85b773d85d526d068ce94724ff7a7b81203fc95e" +dependencies = [ + "allocative_derive", + "ctor 0.1.26", +] + +[[package]] +name = "allocative_derive" +version = "0.3.3" +source = "git+https://github.com/facebookexperimental/allocative?rev=85b773d85d526d068ce94724ff7a7b81203fc95e#85b773d85d526d068ce94724ff7a7b81203fc95e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -107,7 +142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2179ba839ac532f50279f5da2a6c5047f791f03f6f808b4dfab11327b97902f" dependencies = [ "alloy-eips 0.14.0", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 0.14.0", "alloy-trie", @@ -130,7 +165,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad451f9a70c341d951bca4e811d74dbe1e193897acd17e9dbac1353698cc430b" dependencies = [ "alloy-eips 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 1.0.9", "alloy-trie", @@ -155,7 +190,7 @@ checksum = "aec6f67bdc62aa277e0ec13c1b1fb396c8a62b65c8e9bd8c1d3583cc6d1a8dd3" dependencies = [ "alloy-consensus 0.14.0", "alloy-eips 0.14.0", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 0.14.0", "serde", @@ -169,7 +204,7 @@ checksum = "142daffb15d5be1a2b20d2cd540edbcef03037b55d4ff69dc06beb4d06286dba" dependencies = [ "alloy-consensus 1.0.9", "alloy-eips 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 1.0.9", "serde", @@ -181,7 +216,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "crc", "serde", @@ -194,7 +229,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "serde", ] @@ -205,7 +240,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "serde", "thiserror 2.0.12", @@ -220,7 +255,7 @@ dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 0.14.0", "auto_impl", @@ -240,7 +275,7 @@ dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 1.0.9", "auto_impl", @@ -257,7 +292,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0068ae277f5ee3153a95eaea8ff10e188ed8ccde9b7f9926305415a2c0ab2442" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-sol-type-parser", "serde", "serde_json", @@ -269,8 +304,8 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3994ab6ff6bdeb5aebe65381a8f6a47534789817570111555e8ac413e242ce06" dependencies = [ - "alloy-primitives 1.1.0", - "alloy-sol-types 1.1.0", + "alloy-primitives", + "alloy-sol-types", "serde", "serde_json", "thiserror 2.0.12", @@ -283,8 +318,8 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc08b31ebf9273839bd9a01f9333cbb7a3abb4e820c312ade349dd18bdc79581" dependencies = [ - "alloy-primitives 1.1.0", - "alloy-sol-types 1.1.0", + "alloy-primitives", + "alloy-sol-types", "serde", "serde_json", "thiserror 2.0.12", @@ -302,12 +337,12 @@ dependencies = [ "alloy-eips 0.14.0", "alloy-json-rpc 0.14.0", "alloy-network-primitives 0.14.0", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rpc-types-any 0.14.0", "alloy-rpc-types-eth 0.14.0", "alloy-serde 0.14.0", "alloy-signer 0.14.0", - "alloy-sol-types 1.1.0", + "alloy-sol-types", "async-trait", "auto_impl", "derive_more 2.0.1", @@ -328,12 +363,12 @@ dependencies = [ "alloy-eips 1.0.9", "alloy-json-rpc 1.0.9", "alloy-network-primitives 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rpc-types-any 1.0.19", "alloy-rpc-types-eth 1.0.9", "alloy-serde 1.0.9", "alloy-signer 1.0.9", - "alloy-sol-types 1.1.0", + "alloy-sol-types", "async-trait", "auto_impl", "derive_more 2.0.1", @@ -351,7 +386,7 @@ checksum = "498f2ee2eef38a6db0fc810c7bf7daebdf5f2fa8d04adb8bd53e54e91ddbdea3" dependencies = [ "alloy-consensus 0.14.0", "alloy-eips 0.14.0", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-serde 0.14.0", "serde", ] @@ -364,33 +399,11 @@ checksum = "c7162ff7be8649c0c391f4e248d1273e85c62076703a1f3ec7daf76b283d886d" dependencies = [ "alloy-consensus 1.0.9", "alloy-eips 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-serde 1.0.9", "serde", ] -[[package]] -name = "alloy-primitives" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 0.99.20", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - [[package]] name = "alloy-primitives" version = "1.1.0" @@ -472,10 +485,10 @@ dependencies = [ "alloy-consensus-any 0.14.0", "alloy-eips 0.14.0", "alloy-network-primitives 0.14.0", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 0.14.0", - "alloy-sol-types 1.1.0", + "alloy-sol-types", "itertools 0.14.0", "serde", "serde_json", @@ -492,10 +505,10 @@ dependencies = [ "alloy-consensus-any 1.0.9", "alloy-eips 1.0.9", "alloy-network-primitives 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "alloy-serde 1.0.9", - "alloy-sol-types 1.1.0", + "alloy-sol-types", "itertools 0.14.0", "serde", "serde_json", @@ -508,7 +521,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4dba6ff08916bc0a9cbba121ce21f67c0b554c39cf174bc7b9df6c651bd3c3b" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "serde", "serde_json", ] @@ -519,7 +532,7 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "730e8f2edf2fc224cabd1c25d090e1655fa6137b2e409f92e5eec735903f1507" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "serde", "serde_json", ] @@ -530,7 +543,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c580da7f00f3999e44e327223044d6732358627f93043e22d92c583f6583556" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "async-trait", "auto_impl", "either", @@ -545,7 +558,7 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b0d2428445ec13edc711909e023d7779618504c4800be055a5b940025dbafe3" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "async-trait", "auto_impl", "either", @@ -562,7 +575,7 @@ checksum = "6be3d371299b62eac5aa459fa58e8d1c761aabdc637573ae258ab744457fcc88" dependencies = [ "alloy-consensus 1.0.9", "alloy-network 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-signer 1.0.9", "async-trait", "aws-sdk-kms", @@ -580,7 +593,7 @@ checksum = "a00f0f07862bd8f6bc66c953660693c5903062c2c9d308485b2a6eee411089e7" dependencies = [ "alloy-consensus 0.14.0", "alloy-network 0.14.0", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-signer 0.14.0", "async-trait", "k256", @@ -596,7 +609,7 @@ checksum = "e14fe6fedb7fe6e0dfae47fe020684f1d8e063274ef14bca387ddb7a6efa8ec1" dependencies = [ "alloy-consensus 1.0.9", "alloy-network 1.0.9", - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-signer 1.0.9", "async-trait", "k256", @@ -604,59 +617,27 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "alloy-sol-macro" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" -dependencies = [ - "alloy-sol-macro-expander 0.7.7", - "alloy-sol-macro-input 0.7.7", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "alloy-sol-macro" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aedac07a10d4c2027817a43cc1f038313fc53c7ac866f7363239971fd01f9f18" dependencies = [ - "alloy-sol-macro-expander 1.3.0", - "alloy-sol-macro-input 1.3.0", + "alloy-sol-macro-expander", + "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", "syn 2.0.101", ] -[[package]] -name = "alloy-sol-macro-expander" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" -dependencies = [ - "alloy-sol-macro-input 0.7.7", - "const-hex", - "heck 0.5.0", - "indexmap 2.10.0", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity 0.7.7", - "tiny-keccak", -] - [[package]] name = "alloy-sol-macro-expander" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24f9a598f010f048d8b8226492b6401104f5a5c1273c2869b72af29b48bb4ba9" dependencies = [ - "alloy-sol-macro-input 1.3.0", + "alloy-sol-macro-input", "const-hex", "heck 0.5.0", "indexmap 2.10.0", @@ -664,25 +645,10 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", - "syn-solidity 1.3.0", + "syn-solidity", "tiny-keccak", ] -[[package]] -name = "alloy-sol-macro-input" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" -dependencies = [ - "const-hex", - "dunce", - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.101", - "syn-solidity 0.7.7", -] - [[package]] name = "alloy-sol-macro-input" version = "1.3.0" @@ -696,7 +662,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.101", - "syn-solidity 1.3.0", + "syn-solidity", ] [[package]] @@ -709,18 +675,6 @@ dependencies = [ "winnow 0.7.10", ] -[[package]] -name = "alloy-sol-types" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" -dependencies = [ - "alloy-primitives 0.7.7", - "alloy-sol-macro 0.7.7", - "const-hex", - "serde", -] - [[package]] name = "alloy-sol-types" version = "1.1.0" @@ -728,8 +682,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5460a975434ae594fe2b91586253c1beb404353b78f0a55bf124abcd79557b15" dependencies = [ "alloy-json-abi", - "alloy-primitives 1.1.0", - "alloy-sol-macro 1.3.0", + "alloy-primitives", + "alloy-sol-macro", "const-hex", "serde", ] @@ -740,7 +694,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-rlp", "arrayvec", "derive_more 2.0.1", @@ -890,11 +844,11 @@ dependencies = [ [[package]] name = "ark-ec" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ "ahash", "ark-ff 0.5.0", - "ark-poly 0.5.0 (git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64)", + "ark-poly 0.5.0 (git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions)", "ark-serialize 0.5.0", "ark-std 0.5.0", "educe 0.6.0", @@ -949,8 +903,9 @@ dependencies = [ [[package]] name = "ark-ff" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ + "allocative", "ark-ff-asm 0.5.0", "ark-ff-macros 0.5.0", "ark-serialize 0.5.0", @@ -989,7 +944,7 @@ dependencies = [ [[package]] name = "ark-ff-asm" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ "quote", "syn 2.0.101", @@ -1023,7 +978,7 @@ dependencies = [ [[package]] name = "ark-ff-macros" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ "num-bigint 0.4.6", "num-traits", @@ -1065,7 +1020,7 @@ dependencies = [ [[package]] name = "ark-poly" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ "ahash", "ark-ff 0.5.0", @@ -1129,9 +1084,9 @@ dependencies = [ [[package]] name = "ark-serialize" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ - "ark-serialize-derive 0.5.0 (git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64)", + "ark-serialize-derive 0.5.0 (git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions)", "ark-std 0.5.0", "arrayvec", "digest 0.10.7", @@ -1153,7 +1108,7 @@ dependencies = [ [[package]] name = "ark-serialize-derive" version = "0.5.0" -source = "git+https://github.com/a16z/arkworks-algebra?branch=v0.5.0-optimize-mul-u64#4ae5018533f1e757bb321e21927c8bbbf8c27ffc" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" dependencies = [ "proc-macro2", "quote", @@ -1994,7 +1949,7 @@ dependencies = [ "bitflags 2.9.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.11.0", "lazy_static", "lazycell", "log", @@ -2017,7 +1972,7 @@ dependencies = [ "bitflags 2.9.0", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools 0.11.0", "log", "prettyplease 0.2.32", "proc-macro2", @@ -2627,14 +2582,16 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "common" version = "0.2.0" -source = "git+https://github.com/a16z/jolt.git?rev=55b9830a3944dde55d33a55c42522b81dd49f87a#55b9830a3944dde55d33a55c42522b81dd49f87a" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" dependencies = [ "ark-serialize 0.5.0", + "derive_more 2.0.1", "serde", "serde_json", "strum 0.26.3", "strum_macros 0.26.4", "syn 1.0.109", + "tracing", ] [[package]] @@ -2982,6 +2939,26 @@ dependencies = [ "memchr", ] +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.101", +] + [[package]] name = "ctr" version = "0.9.2" @@ -3461,6 +3438,28 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" +[[package]] +name = "dory" +version = "1.0.0" +source = "git+https://github.com/spaceandtimefdn/sxt-dory?branch=feat%2Ffewer-reductions#cfd4e8540c13f6b7e98c83a4af79b0df4a0f6f69" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "bincode 1.3.3", + "blake2", + "digest 0.10.7", + "jolt-optimizations", + "rand_chacha 0.3.1", + "rayon", + "serde", + "thiserror 2.0.12", + "tracing", + "tracing-subscriber 0.3.20", +] + [[package]] name = "downcast-rs" version = "1.2.1" @@ -3781,7 +3780,7 @@ dependencies = [ "ere-zisk", "ere-zkvm-interface", "serde", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -3819,7 +3818,8 @@ dependencies = [ "ere-compile-utils", "ere-test-utils", "ere-zkvm-interface", - "jolt", + "jolt-core", + "jolt-sdk", "tempfile", "thiserror 2.0.12", ] @@ -3945,7 +3945,7 @@ dependencies = [ "tokio", "tower-http", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "twirp", "twirp-build", ] @@ -4827,17 +4827,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -4898,6 +4887,16 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +dependencies = [ + "fallible-iterator", + "stable_deref_trait", +] + [[package]] name = "git2" version = "0.19.0" @@ -5919,31 +5918,12 @@ dependencies = [ "libc", ] -[[package]] -name = "jolt" -version = "0.1.0" -source = "git+https://github.com/a16z/jolt.git?rev=55b9830a3944dde55d33a55c42522b81dd49f87a#55b9830a3944dde55d33a55c42522b81dd49f87a" -dependencies = [ - "clap", - "common", - "eyre", - "jolt-core", - "jolt-sdk", - "rand 0.8.5", - "rmp-serde", - "serde", - "syn 1.0.109", - "sysinfo", - "toml_edit 0.22.27", -] - [[package]] name = "jolt-core" version = "0.1.0" -source = "git+https://github.com/a16z/jolt.git?rev=55b9830a3944dde55d33a55c42522b81dd49f87a#55b9830a3944dde55d33a55c42522b81dd49f87a" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" dependencies = [ - "alloy-primitives 0.7.7", - "alloy-sol-types 0.7.7", + "allocative", "anyhow", "ark-bn254", "ark-ec", @@ -5952,16 +5932,20 @@ dependencies = [ "ark-serialize-derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "ark-std 0.5.0", "bincode 1.3.3", - "bytemuck", + "blake2", "clap", "common", + "derive_more 2.0.1", "dirs 5.0.1", - "enum_dispatch", + "dory", "eyre", "fixedbitset 0.5.7", - "getrandom 0.2.16", "indicatif", "itertools 0.10.5", + "jolt-inlines-keccak256", + "jolt-inlines-sha2", + "jolt-optimizations", + "jolt-platform", "lazy_static", "memory-stats", "num", @@ -5971,7 +5955,7 @@ dependencies = [ "once_cell", "paste", "postcard", - "rand 0.7.3", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", "rand_distr", @@ -5981,25 +5965,72 @@ dependencies = [ "sha3", "strum 0.26.3", "strum_macros 0.26.4", - "sys-info", "target-lexicon", "thiserror 1.0.69", "tokio", "tracer", "tracing", "tracing-chrome", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", +] + +[[package]] +name = "jolt-inlines-keccak256" +version = "0.1.0" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" +dependencies = [ + "ctor 0.2.9", + "tracer", + "tracing", +] + +[[package]] +name = "jolt-inlines-sha2" +version = "0.1.0" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" +dependencies = [ + "ctor 0.2.9", + "tracer", + "tracing", +] + +[[package]] +name = "jolt-optimizations" +version = "0.5.0" +source = "git+https://github.com/a16z/arkworks-algebra?branch=feat%2Ffewer-reductions#ad2e2866e87c513353838b911ca502f4aa1500e5" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "num-bigint 0.4.6", + "num-integer", + "num-rational", + "num-traits", + "rayon", +] + +[[package]] +name = "jolt-platform" +version = "0.1.0" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" +dependencies = [ + "getrandom 0.2.16", + "getrandom 0.3.3", + "rand 0.8.5", ] [[package]] name = "jolt-sdk" version = "0.1.0" -source = "git+https://github.com/a16z/jolt.git?rev=55b9830a3944dde55d33a55c42522b81dd49f87a#55b9830a3944dde55d33a55c42522b81dd49f87a" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" dependencies = [ "ark-bn254", "ark-ec", "common", "jolt-core", + "jolt-platform", "jolt-sdk-macros", "postcard", "tracer", @@ -6008,7 +6039,7 @@ dependencies = [ [[package]] name = "jolt-sdk-macros" version = "0.1.0" -source = "git+https://github.com/a16z/jolt.git?rev=55b9830a3944dde55d33a55c42522b81dd49f87a#55b9830a3944dde55d33a55c42522b81dd49f87a" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" dependencies = [ "common", "proc-macro2", @@ -6101,7 +6132,7 @@ dependencies = [ "lalrpop-util 0.20.2", "petgraph 0.6.5", "regex", - "regex-syntax 0.8.5", + "regex-syntax", "string_cache", "term 0.7.0", "tiny-keccak", @@ -6122,7 +6153,7 @@ dependencies = [ "lalrpop-util 0.22.2", "petgraph 0.7.1", "regex", - "regex-syntax 0.8.5", + "regex-syntax", "sha3", "string_cache", "term 1.2.0", @@ -6136,7 +6167,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.9", + "regex-automata", ] [[package]] @@ -6332,7 +6363,7 @@ dependencies = [ "generator", "scoped-tls", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -6457,11 +6488,11 @@ checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -6578,7 +6609,7 @@ dependencies = [ "once_cell", "tracing", "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -7024,7 +7055,7 @@ dependencies = [ "thiserror 2.0.12", "tiny-keccak", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "tracing-test", "variant_count", ] @@ -7127,12 +7158,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -7444,6 +7474,17 @@ dependencies = [ "ruzstd 0.7.3", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "flate2", + "memchr", + "ruzstd 0.8.1", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -7480,9 +7521,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ "bitflags 2.9.0", "cfg-if", @@ -7512,9 +7553,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -8449,7 +8490,7 @@ dependencies = [ "toml 0.8.23", "tracing", "tracing-forest", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "zkhash 0.2.0 (git+https://github.com/HorizenLabs/poseidon2.git?rev=bb476b9)", ] @@ -8488,12 +8529,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owo-colors" version = "4.2.2" @@ -10111,7 +10146,7 @@ dependencies = [ "tiny-keccak", "tracing", "tracing-forest", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "typenum", "vec_map", "zkhash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -10331,30 +10366,6 @@ dependencies = [ "toml_edit 0.22.27", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -10400,7 +10411,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -10466,9 +10477,9 @@ checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", "heck 0.4.1", - "itertools 0.10.5", + "itertools 0.11.0", "log", - "multimap 0.8.3", + "multimap 0.10.1", "once_cell", "petgraph 0.6.5", "prettyplease 0.2.32", @@ -10485,7 +10496,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "itertools 0.14.0", "log", "multimap 0.10.1", @@ -10519,7 +10530,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.101", @@ -10723,19 +10734,6 @@ dependencies = [ "nibble_vec", ] -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -10759,16 +10757,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - [[package]] name = "rand_chacha" version = "0.3.1" @@ -10789,15 +10777,6 @@ dependencies = [ "rand_core 0.9.3", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -10827,15 +10806,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - [[package]] name = "rand_xorshift" version = "0.3.0" @@ -10883,9 +10853,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -10893,9 +10863,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -10973,17 +10943,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -10994,7 +10955,7 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] @@ -11003,12 +10964,6 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -11583,7 +11538,7 @@ dependencies = [ "field", "inferno", "memmap2", - "object 0.36.7", + "object 0.35.0", "poseidon2", "rand 0.9.2", "ringbuffer", @@ -11613,28 +11568,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "rmp" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - [[package]] name = "rrs-lib" version = "0.1.0" @@ -11937,7 +11870,7 @@ checksum = "5174a470eeb535a721ae9fdd6e291c2411a906b96592182d05217591d5c5cf7b" dependencies = [ "byteorder", "derive_more 0.99.20", - "twox-hash", + "twox-hash 1.6.3", ] [[package]] @@ -11946,7 +11879,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" dependencies = [ - "twox-hash", + "twox-hash 1.6.3", +] + +[[package]] +name = "ruzstd" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640bec8aad418d7d03c72ea2de10d5c646a598f9883c7babc160d91e3c1b26c" +dependencies = [ + "twox-hash 2.1.2", ] [[package]] @@ -12705,7 +12647,7 @@ dependencies = [ "thiserror 1.0.69", "tracing", "tracing-forest", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "typenum", "web-time", ] @@ -12821,7 +12763,7 @@ dependencies = [ "thiserror 1.0.69", "tracing", "tracing-appender", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12966,11 +12908,11 @@ version = "5.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ed77ad8133ef4d915ad55ce700b53cd32a72fc3829ae4ad0fdf4db1982c983a" dependencies = [ - "alloy-primitives 1.1.0", + "alloy-primitives", "alloy-signer 1.0.9", "alloy-signer-aws", "alloy-signer-local 1.0.9", - "alloy-sol-types 1.1.0", + "alloy-sol-types", "anyhow", "async-trait", "aws-config", @@ -13367,18 +13309,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn-solidity" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "syn-solidity" version = "1.3.0" @@ -13417,16 +13347,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "sys-info" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "sysinfo" version = "0.30.13" @@ -14100,14 +14020,26 @@ dependencies = [ [[package]] name = "tracer" version = "0.2.0" -source = "git+https://github.com/a16z/jolt.git?rev=55b9830a3944dde55d33a55c42522b81dd49f87a#55b9830a3944dde55d33a55c42522b81dd49f87a" +source = "git+https://github.com/a16z/jolt.git?tag=v0.3.0-alpha#5101ad2143039de6f279613810414c3d071d1f8f" dependencies = [ + "addr2line 0.25.1", + "ark-serialize 0.5.0", "clap", "common", + "derive_more 2.0.1", "fnv", + "itertools 0.10.5", + "jolt-platform", + "lazy_static", "object 0.36.7", + "paste", + "postcard", + "serde", + "serde_json", + "strum 0.26.3", + "strum_macros 0.26.4", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -14131,7 +14063,7 @@ dependencies = [ "crossbeam-channel", "thiserror 1.0.69", "time", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -14153,7 +14085,7 @@ checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" dependencies = [ "serde_json", "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -14176,7 +14108,7 @@ dependencies = [ "smallvec", "thiserror 1.0.69", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -14211,14 +14143,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -14234,7 +14166,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" dependencies = [ "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "tracing-test-macro", ] @@ -14378,6 +14310,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + [[package]] name = "type-map" version = "0.5.1" @@ -14716,12 +14654,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -15732,7 +15664,7 @@ dependencies = [ "thiserror 1.0.69", "tiny-keccak", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "typenum", "vec_map", "zkm-curves", @@ -15782,7 +15714,7 @@ dependencies = [ "tiny-keccak", "tracing", "tracing-forest", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "typenum", "web-time", "zkm-core-executor", @@ -15882,7 +15814,7 @@ dependencies = [ "thiserror 1.0.69", "tracing", "tracing-appender", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "zkm-core-executor", "zkm-core-machine", "zkm-primitives", @@ -16024,7 +15956,7 @@ source = "git+https://github.com/ProjectZKM/Ziren.git?tag=v1.1.4#30749a49a6bb7b5 dependencies = [ "alloy-signer 0.14.0", "alloy-signer-local 0.14.0", - "alloy-sol-types 1.1.0", + "alloy-sol-types", "anyhow", "async-trait", "bincode 1.3.3", @@ -16100,7 +16032,7 @@ dependencies = [ "sysinfo", "tracing", "tracing-forest", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "zkm-derive", "zkm-primitives", "zkm-zkvm", diff --git a/Cargo.toml b/Cargo.toml index 6a22d49..634d2eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,9 +68,10 @@ twirp-build = "0.9.0" airbender_execution_utils = { git = "https://github.com/matter-labs/zksync-airbender", package = "execution_utils", tag = "v0.5.0" } # Jolt dependencies -ark-serialize = "0.5.0" -common = { git = "https://github.com/a16z/jolt.git", rev = "55b9830a3944dde55d33a55c42522b81dd49f87a" } -jolt = { git = "https://github.com/a16z/jolt.git", rev = "55b9830a3944dde55d33a55c42522b81dd49f87a" } +jolt-ark-serialize = { git = "https://github.com/a16z/arkworks-algebra", package = "ark-serialize", branch = "feat/fewer-reductions" } +jolt-common = { git = "https://github.com/a16z/jolt.git", package = "common", tag = "v0.3.0-alpha" } +jolt-core = { git = "https://github.com/a16z/jolt.git", tag = "v0.3.0-alpha" } +jolt-sdk = { git = "https://github.com/a16z/jolt.git", tag = "v0.3.0-alpha" } # Miden dependencies miden-assembly = { git = "https://github.com/0xPolygonMiden/miden-vm.git", tag = "v0.17.1" } @@ -137,6 +138,8 @@ opt-level = 3 [patch.crates-io] # These patches are only needed by Jolt -ark-ff = { git = "https://github.com/a16z/arkworks-algebra", branch = "v0.5.0-optimize-mul-u64" } -ark-ec = { git = "https://github.com/a16z/arkworks-algebra", branch = "v0.5.0-optimize-mul-u64" } -ark-serialize = { git = "https://github.com/a16z/arkworks-algebra", branch = "v0.5.0-optimize-mul-u64" } +ark-ff = { git = "https://github.com/a16z/arkworks-algebra", branch = "feat/fewer-reductions" } +ark-ec = { git = "https://github.com/a16z/arkworks-algebra", branch = "feat/fewer-reductions" } +jolt-optimizations = { git = "https://github.com/a16z/arkworks-algebra", branch = "feat/fewer-reductions" } +ark-serialize = { git = "https://github.com/a16z/arkworks-algebra", branch = "feat/fewer-reductions" } +allocative = { git = "https://github.com/facebookexperimental/allocative", rev = "85b773d85d526d068ce94724ff7a7b81203fc95e" } diff --git a/crates/dockerized/compiler/src/main.rs b/crates/dockerized/compiler/src/main.rs index 0963812..eebc313 100644 --- a/crates/dockerized/compiler/src/main.rs +++ b/crates/dockerized/compiler/src/main.rs @@ -56,9 +56,9 @@ fn compile(guest_path: PathBuf) -> Result { #[cfg(feature = "jolt")] let result = if use_stock_rust() { - ere_jolt::compiler::RustRv32ima.compile(&guest_path) + ere_jolt::compiler::RustRv64imac.compile(&guest_path) } else { - ere_jolt::compiler::RustRv32imaCustomized.compile(&guest_path) + ere_jolt::compiler::RustRv64imacCustomized.compile(&guest_path) }; #[cfg(feature = "miden")] diff --git a/crates/dockerized/dockerized/src/lib.rs b/crates/dockerized/dockerized/src/lib.rs index 5048656..2b5eeb6 100644 --- a/crates/dockerized/dockerized/src/lib.rs +++ b/crates/dockerized/dockerized/src/lib.rs @@ -654,6 +654,16 @@ mod test { mod jolt { test_compile!(Jolt, "basic"); + test_execute!( + Jolt, + BasicProgramInput::valid(), + [Vec::new(), BasicProgramInput::invalid().serialized_input()] + ); + test_prove!( + Jolt, + BasicProgramInput::valid(), + [Vec::new(), BasicProgramInput::invalid().serialized_input()] + ); } mod miden { diff --git a/crates/zkvm/airbender/src/lib.rs b/crates/zkvm/airbender/src/lib.rs index 14b7ab5..9477d7f 100644 --- a/crates/zkvm/airbender/src/lib.rs +++ b/crates/zkvm/airbender/src/lib.rs @@ -146,7 +146,6 @@ mod tests { let zkvm = EreAirbender::new(program, ProverResourceType::Cpu).unwrap(); let test_case = BasicProgramInput::valid().into_output_sha256(); - run_zkvm_execute(&zkvm, &test_case); run_zkvm_prove(&zkvm, &test_case); } diff --git a/crates/zkvm/jolt/Cargo.toml b/crates/zkvm/jolt/Cargo.toml index 964ac65..37828b6 100644 --- a/crates/zkvm/jolt/Cargo.toml +++ b/crates/zkvm/jolt/Cargo.toml @@ -11,9 +11,10 @@ tempfile.workspace = true thiserror.workspace = true # Jolt dependencies -ark-serialize = { workspace = true, features = ["derive"] } -common.workspace = true -jolt = { workspace = true, features = ["host"] } +jolt-ark-serialize = { workspace = true, features = ["derive"] } +jolt-common.workspace = true +jolt-core.workspace = true +jolt-sdk = { workspace = true, features = ["host"] } # Local dependencies ere-compile-utils.workspace = true diff --git a/crates/zkvm/jolt/src/client.rs b/crates/zkvm/jolt/src/client.rs new file mode 100644 index 0000000..4bb3496 --- /dev/null +++ b/crates/zkvm/jolt/src/client.rs @@ -0,0 +1,123 @@ +use crate::error::JoltError; +use ere_zkvm_interface::{CommonError, PublicValues}; +use jolt_ark_serialize::{self as ark_serialize, CanonicalDeserialize, CanonicalSerialize}; +use jolt_common::constants::{ + DEFAULT_MAX_INPUT_SIZE, DEFAULT_MAX_OUTPUT_SIZE, DEFAULT_MAX_TRACE_LENGTH, DEFAULT_MEMORY_SIZE, + DEFAULT_STACK_SIZE, +}; +use jolt_core::{ + poly::commitment::commitment_scheme::CommitmentScheme, transcripts::Blake2bTranscript as FS, + utils::math::Math, zkvm::witness::DTH_ROOT_OF_K, +}; +use jolt_sdk::{ + F, Jolt, JoltDevice, JoltProverPreprocessing, JoltRV64IMAC, JoltVerifierPreprocessing, + MemoryConfig, MemoryLayout, PCS, + guest::program::{decode, trace}, + postcard, +}; + +#[derive(CanonicalSerialize, CanonicalDeserialize)] +pub struct JoltProof { + proof: jolt_sdk::JoltProof, + // FIXME: Remove `inputs` when Jolt supports proving with private input. + // Issue for tracking: https://github.com/eth-act/ere/issues/4. + inputs: Vec, + outputs: Vec, +} + +pub struct JoltSdk { + elf: Vec, + memory_config: MemoryConfig, + pk: JoltProverPreprocessing, + vk: JoltVerifierPreprocessing, +} + +impl JoltSdk { + pub fn new(elf: &[u8]) -> Self { + let (bytecode, memory_init, program_size) = decode(elf); + let memory_config = MemoryConfig { + max_input_size: DEFAULT_MAX_INPUT_SIZE, + max_output_size: DEFAULT_MAX_OUTPUT_SIZE, + stack_size: DEFAULT_STACK_SIZE, + memory_size: DEFAULT_MEMORY_SIZE, + program_size: Some(program_size), + }; + let memory_layout = MemoryLayout::new(&memory_config); + let max_trace_length = DEFAULT_MAX_TRACE_LENGTH as usize; + let pk = { + // FIXME: Use public trusted setup or switch to other transparent PCS. + let max_trace_length = max_trace_length.next_power_of_two(); + let generators = PCS::setup_prover(DTH_ROOT_OF_K.log_2() + max_trace_length.log_2()); + + let shared = JoltRV64IMAC::shared_preprocess(bytecode, memory_layout, memory_init); + + JoltProverPreprocessing { generators, shared } + }; + let vk = JoltVerifierPreprocessing::from(&pk); + Self { + elf: elf.to_vec(), + memory_config, + pk, + vk, + } + } + + pub fn execute(&self, input: &[u8]) -> Result<(PublicValues, u64), JoltError> { + let (cycles, _, io) = trace( + &self.elf, + None, + &serialize_input(input)?, + &self.memory_config, + ); + if io.panic { + return Err(JoltError::ExecutionPanic); + } + let public_values = deserialize_output(&io.outputs)?; + Ok((public_values, cycles.len() as _)) + } + + pub fn prove(&self, input: &[u8]) -> Result<(PublicValues, JoltProof), JoltError> { + let (proof, io, _) = JoltRV64IMAC::prove(&self.pk, &self.elf, &serialize_input(input)?); + if io.panic { + return Err(JoltError::ExecutionPanic); + } + let public_values = deserialize_output(&io.outputs)?; + let proof = JoltProof { + proof, + inputs: io.inputs, + outputs: io.outputs, + }; + Ok((public_values, proof)) + } + + pub fn verify(&self, proof: JoltProof) -> Result { + JoltRV64IMAC::verify( + &self.vk, + proof.proof, + JoltDevice { + inputs: proof.inputs.clone(), + outputs: proof.outputs.clone(), + panic: false, + memory_layout: MemoryLayout::new(&self.memory_config), + }, + None, + )?; + let public_values = deserialize_output(&proof.outputs)?; + Ok(public_values) + } +} + +fn serialize_input(bytes: &[u8]) -> Result, JoltError> { + Ok(postcard::to_stdvec(bytes) + .map_err(|err| CommonError::serialize("input", "postcard", err))?) +} + +fn deserialize_output(output: &[u8]) -> Result, JoltError> { + Ok(if output.is_empty() { + Vec::new() + } else { + postcard::take_from_bytes(output) + .map_err(|err| CommonError::deserialize("output", "postcard", err))? + .0 + }) +} diff --git a/crates/zkvm/jolt/src/compiler.rs b/crates/zkvm/jolt/src/compiler.rs index dbcf7a1..f24c7ed 100644 --- a/crates/zkvm/jolt/src/compiler.rs +++ b/crates/zkvm/jolt/src/compiler.rs @@ -1,7 +1,7 @@ -mod rust_rv32ima; -mod rust_rv32ima_customized; +mod rust_rv64imac; +mod rust_rv64imac_customized; -pub use rust_rv32ima::RustRv32ima; -pub use rust_rv32ima_customized::RustRv32imaCustomized; +pub use rust_rv64imac::RustRv64imac; +pub use rust_rv64imac_customized::RustRv64imacCustomized; pub type JoltProgram = Vec; diff --git a/crates/zkvm/jolt/src/compiler/rust_rv32ima.rs b/crates/zkvm/jolt/src/compiler/rust_rv64imac.rs similarity index 67% rename from crates/zkvm/jolt/src/compiler/rust_rv32ima.rs rename to crates/zkvm/jolt/src/compiler/rust_rv64imac.rs index 6f899bc..1833ac0 100644 --- a/crates/zkvm/jolt/src/compiler/rust_rv32ima.rs +++ b/crates/zkvm/jolt/src/compiler/rust_rv64imac.rs @@ -1,10 +1,13 @@ use crate::{compiler::JoltProgram, error::CompileError}; use ere_compile_utils::CargoBuildCmd; use ere_zkvm_interface::Compiler; +use jolt_common::constants::{ + DEFAULT_MEMORY_SIZE, DEFAULT_STACK_SIZE, EMULATOR_MEMORY_CAPACITY, STACK_CANARY_SIZE, +}; use std::{env, path::Path}; -const TARGET_TRIPLE: &str = "riscv32ima-unknown-none-elf"; -// According to https://github.com/a16z/jolt/blob/55b9830a3944dde55d33a55c42522b81dd49f87a/jolt-core/src/host/mod.rs#L95 +const TARGET_TRIPLE: &str = "riscv64imac-unknown-none-elf"; +// According to https://github.com/a16z/jolt/blob/v0.3.0-alpha/jolt-core/src/host/program.rs#L82 const RUSTFLAGS: &[&str] = &[ "-C", "passes=lower-atomic", @@ -14,6 +17,8 @@ const RUSTFLAGS: &[&str] = &[ "strip=symbols", "-C", "opt-level=z", + "--cfg", + "getrandom_backend=\"custom\"", ]; const CARGO_BUILD_OPTIONS: &[&str] = &[ "--features", @@ -22,20 +27,20 @@ const CARGO_BUILD_OPTIONS: &[&str] = &[ "-Zbuild-std=core,alloc", ]; -const DEFAULT_MEMORY_SIZE: u64 = 10 * 1024 * 1024; -const DEFAULT_STACK_SIZE: u64 = 4096; -const LINKER_SCRIPT_TEMPLATE: &str = include_str!("rust_rv32ima/template.ld"); +const LINKER_SCRIPT_TEMPLATE: &str = include_str!("rust_rv64imac/template.ld"); fn make_linker_script() -> String { LINKER_SCRIPT_TEMPLATE + .replace("{EMULATOR_MEMORY}", &EMULATOR_MEMORY_CAPACITY.to_string()) + .replace("{STACK_CANARY}", &STACK_CANARY_SIZE.to_string()) .replace("{MEMORY_SIZE}", &DEFAULT_MEMORY_SIZE.to_string()) .replace("{STACK_SIZE}", &DEFAULT_STACK_SIZE.to_string()) } -/// Compiler for Rust guest program to RV32IMA architecture. -pub struct RustRv32ima; +/// Compiler for Rust guest program to RV64IMAC architecture. +pub struct RustRv64imac; -impl Compiler for RustRv32ima { +impl Compiler for RustRv64imac { type Error = CompileError; type Program = JoltProgram; @@ -54,21 +59,21 @@ impl Compiler for RustRv32ima { #[cfg(test)] mod tests { - use crate::{EreJolt, compiler::RustRv32ima}; + use crate::{EreJolt, compiler::RustRv64imac}; use ere_test_utils::host::testing_guest_directory; use ere_zkvm_interface::{Compiler, ProverResourceType, zkVM}; #[test] fn test_compile() { let guest_directory = testing_guest_directory("jolt", "stock_nightly_no_std"); - let elf = RustRv32ima.compile(&guest_directory).unwrap(); + let elf = RustRv64imac.compile(&guest_directory).unwrap(); assert!(!elf.is_empty(), "ELF bytes should not be empty."); } #[test] fn test_execute() { let guest_directory = testing_guest_directory("jolt", "stock_nightly_no_std"); - let program = RustRv32ima.compile(&guest_directory).unwrap(); + let program = RustRv64imac.compile(&guest_directory).unwrap(); let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); zkvm.execute(&[]).unwrap(); diff --git a/crates/zkvm/jolt/src/compiler/rust_rv32ima/template.ld b/crates/zkvm/jolt/src/compiler/rust_rv64imac/template.ld similarity index 54% rename from crates/zkvm/jolt/src/compiler/rust_rv32ima/template.ld rename to crates/zkvm/jolt/src/compiler/rust_rv64imac/template.ld index 77d4fec..712af9c 100644 --- a/crates/zkvm/jolt/src/compiler/rust_rv32ima/template.ld +++ b/crates/zkvm/jolt/src/compiler/rust_rv64imac/template.ld @@ -1,5 +1,7 @@ +/* Copied from https://github.com/a16z/jolt/blob/v0.3.0-alpha/jolt-core/src/host/mod.rs#L28 */ + MEMORY { - program (rwx) : ORIGIN = 0x80000000, LENGTH = {MEMORY_SIZE} + program (rwx) : ORIGIN = 0x80000000, LENGTH = {EMULATOR_MEMORY} } SECTIONS { @@ -15,13 +17,16 @@ SECTIONS { *(.data) } > program - .bss : { + .bss (NOLOAD) : { *(.bss) } > program . = ALIGN(8); + _STACK_END = .; + . = . + {STACK_CANARY}; . = . + {STACK_SIZE}; _STACK_PTR = .; + . = ALIGN(8); _HEAP_PTR = .; } diff --git a/crates/zkvm/jolt/src/compiler/rust_rv32ima_customized.rs b/crates/zkvm/jolt/src/compiler/rust_rv64imac_customized.rs similarity index 63% rename from crates/zkvm/jolt/src/compiler/rust_rv32ima_customized.rs rename to crates/zkvm/jolt/src/compiler/rust_rv64imac_customized.rs index 4dcf1c8..98b8b03 100644 --- a/crates/zkvm/jolt/src/compiler/rust_rv32ima_customized.rs +++ b/crates/zkvm/jolt/src/compiler/rust_rv64imac_customized.rs @@ -1,14 +1,15 @@ use crate::{compiler::JoltProgram, error::CompileError}; use ere_compile_utils::{CommonError, cargo_metadata}; use ere_zkvm_interface::Compiler; -use jolt::host::DEFAULT_TARGET_DIR; +use jolt_sdk::host::Program; use std::{env::set_current_dir, fs, path::Path}; +use tempfile::tempdir; -/// Compiler for Rust guest program to RV32IMA architecture, using customized +/// Compiler for Rust guest program to RV64IMAC architecture, using customized /// Rust toolchain of Jolt. -pub struct RustRv32imaCustomized; +pub struct RustRv64imacCustomized; -impl Compiler for RustRv32imaCustomized { +impl Compiler for RustRv64imacCustomized { type Error = CompileError; type Program = JoltProgram; @@ -23,11 +24,13 @@ impl Compiler for RustRv32imaCustomized { let metadata = cargo_metadata(guest_directory)?; let package_name = &metadata.root_package().unwrap().name; + let tempdir = tempdir().map_err(CommonError::tempdir)?; + // Note that if this fails, it will panic, hence we need to catch it. let elf_path = std::panic::catch_unwind(|| { - let mut program = jolt::host::Program::new(package_name); + let mut program = Program::new(package_name); program.set_std(true); - program.build(DEFAULT_TARGET_DIR); + program.build(&tempdir.path().to_string_lossy()); program.elf.unwrap() }) .map_err(|_| CompileError::BuildFailed)?; @@ -41,23 +44,14 @@ impl Compiler for RustRv32imaCustomized { #[cfg(test)] mod tests { - use crate::{EreJolt, compiler::RustRv32imaCustomized}; + use crate::compiler::RustRv64imacCustomized; use ere_test_utils::host::testing_guest_directory; - use ere_zkvm_interface::{Compiler, ProverResourceType, zkVM}; + use ere_zkvm_interface::Compiler; #[test] fn test_compile() { let guest_directory = testing_guest_directory("jolt", "basic"); - let elf = RustRv32imaCustomized.compile(&guest_directory).unwrap(); + let elf = RustRv64imacCustomized.compile(&guest_directory).unwrap(); assert!(!elf.is_empty(), "ELF bytes should not be empty."); } - - #[test] - fn test_execute() { - let guest_directory = testing_guest_directory("jolt", "basic"); - let program = RustRv32imaCustomized.compile(&guest_directory).unwrap(); - let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); - - zkvm.execute(&[]).unwrap(); - } } diff --git a/crates/zkvm/jolt/src/error.rs b/crates/zkvm/jolt/src/error.rs index f2341d0..4d5858f 100644 --- a/crates/zkvm/jolt/src/error.rs +++ b/crates/zkvm/jolt/src/error.rs @@ -1,5 +1,5 @@ use ere_compile_utils::CommonError; -use jolt::jolt_core::utils::errors::ProofVerifyError; +use jolt_core::utils::errors::ProofVerifyError; use std::{io, path::PathBuf}; use thiserror::Error; @@ -24,6 +24,10 @@ pub enum JoltError { #[error(transparent)] CommonError(#[from] ere_zkvm_interface::CommonError), + // Execute + #[error("Execution panics")] + ExecutionPanic, + // Verify #[error("Failed to verify proof: {0}")] VerifyProofFailed(#[from] ProofVerifyError), diff --git a/crates/zkvm/jolt/src/jolt_methods.rs b/crates/zkvm/jolt/src/jolt_methods.rs deleted file mode 100644 index 68bbe03..0000000 --- a/crates/zkvm/jolt/src/jolt_methods.rs +++ /dev/null @@ -1,88 +0,0 @@ -use crate::{EreJoltProof, error::JoltError}; -use common::constants::{DEFAULT_MAX_BYTECODE_SIZE, DEFAULT_MAX_TRACE_LENGTH, DEFAULT_MEMORY_SIZE}; -use jolt::{ - Jolt, JoltHyperKZGProof, JoltProverPreprocessing, JoltVerifierPreprocessing, MemoryConfig, - MemoryLayout, RV32IJoltVM, tracer::JoltDevice, -}; - -pub fn preprocess_prover( - program: &jolt::host::Program, -) -> JoltProverPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript> { - let (bytecode, memory_init) = program.decode(); - let memory_layout = MemoryLayout::new(&MemoryConfig::default()); - let preprocessing: JoltProverPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript> = - RV32IJoltVM::prover_preprocess( - bytecode, - memory_layout, - memory_init, - DEFAULT_MAX_BYTECODE_SIZE as usize, - DEFAULT_MEMORY_SIZE as usize, - DEFAULT_MAX_TRACE_LENGTH as usize, - ); - preprocessing -} - -pub fn preprocess_verifier( - program: &jolt::host::Program, -) -> JoltVerifierPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript> { - let (bytecode, memory_init) = program.decode(); - let memory_layout = MemoryLayout::new(&MemoryConfig::default()); - let preprocessing: JoltVerifierPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript> = - RV32IJoltVM::verifier_preprocess( - bytecode, - memory_layout, - memory_init, - DEFAULT_MAX_BYTECODE_SIZE as usize, - DEFAULT_MEMORY_SIZE as usize, - DEFAULT_MAX_TRACE_LENGTH as usize, - ); - preprocessing -} - -pub fn prove_generic( - program: &jolt::host::Program, - preprocessing: JoltProverPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript>, - _input: &[u8], -) -> EreJoltProof { - let mut program = program.clone(); - - // TODO: Check how to pass private input to jolt, issue for tracking: - // https://github.com/a16z/jolt/issues/371. - let input_bytes = Vec::new(); - - let (io_device, trace) = program.trace(&input_bytes); - - let (jolt_proof, jolt_commitments, io_device, _) = - RV32IJoltVM::prove(io_device, trace, preprocessing); - - EreJoltProof { - proof: JoltHyperKZGProof { - proof: jolt_proof, - commitments: jolt_commitments, - }, - public_outputs: io_device.outputs, - } -} - -pub fn verify_generic( - proof: EreJoltProof, - preprocessing: JoltVerifierPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript>, -) -> Result<(), JoltError> { - let mut io_device = JoltDevice::new(&MemoryConfig { - max_input_size: preprocessing.memory_layout.max_input_size, - max_output_size: preprocessing.memory_layout.max_output_size, - stack_size: preprocessing.memory_layout.stack_size, - memory_size: preprocessing.memory_layout.memory_size, - }); - io_device.outputs = proof.public_outputs; - - RV32IJoltVM::verify( - preprocessing, - proof.proof.proof, - proof.proof.commitments, - io_device, - None, - )?; - - Ok(()) -} diff --git a/crates/zkvm/jolt/src/lib.rs b/crates/zkvm/jolt/src/lib.rs index 2e49d8e..fedb8f0 100644 --- a/crates/zkvm/jolt/src/lib.rs +++ b/crates/zkvm/jolt/src/lib.rs @@ -1,36 +1,26 @@ #![cfg_attr(not(test), warn(unused_crate_dependencies))] use crate::{ + client::{JoltProof, JoltSdk}, compiler::JoltProgram, error::JoltError, - jolt_methods::{preprocess_prover, preprocess_verifier, prove_generic, verify_generic}, }; use anyhow::bail; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use ere_zkvm_interface::{ CommonError, ProgramExecutionReport, ProgramProvingReport, Proof, ProofKind, ProverResourceType, PublicValues, zkVM, }; -use jolt::{JoltHyperKZGProof, JoltProverPreprocessing, JoltVerifierPreprocessing}; -use std::{env, fs, io::Cursor}; -use tempfile::TempDir; +use jolt_ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use std::{env, io::Cursor, time::Instant}; include!(concat!(env!("OUT_DIR"), "/name_and_sdk_version.rs")); +mod client; pub mod compiler; pub mod error; -mod jolt_methods; - -#[derive(CanonicalSerialize, CanonicalDeserialize)] -pub struct EreJoltProof { - proof: JoltHyperKZGProof, - public_outputs: Vec, -} pub struct EreJolt { - elf: JoltProgram, - prover_preprocessing: JoltProverPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript>, - verifier_preprocessing: JoltVerifierPreprocessing<4, jolt::F, jolt::PCS, jolt::ProofTranscript>, + sdk: JoltSdk, _resource: ProverResourceType, } @@ -39,31 +29,28 @@ impl EreJolt { if !matches!(resource, ProverResourceType::Cpu) { panic!("Network or GPU proving not yet implemented for Miden. Use CPU resource type."); } - let (_tempdir, program) = program(&elf)?; - let prover_preprocessing = preprocess_prover(&program); - let verifier_preprocessing = preprocess_verifier(&program); + let sdk = JoltSdk::new(&elf); Ok(EreJolt { - elf, - prover_preprocessing, - verifier_preprocessing, + sdk, _resource: resource, }) } } impl zkVM for EreJolt { - fn execute(&self, _input: &[u8]) -> anyhow::Result<(PublicValues, ProgramExecutionReport)> { - let (_tempdir, program) = program(&self.elf)?; + fn execute(&self, input: &[u8]) -> anyhow::Result<(PublicValues, ProgramExecutionReport)> { + let start = Instant::now(); + let (public_values, total_num_cycles) = self.sdk.execute(input)?; + let execution_duration = start.elapsed(); - // TODO: Check how to pass private input to jolt, issue for tracking: - // https://github.com/a16z/jolt/issues/371. - let summary = program.clone().trace_analyze::(&[]); - let trace_len = summary.trace_len(); - - // TODO: Public values - let public_values = Vec::new(); - - Ok((public_values, ProgramExecutionReport::new(trace_len as u64))) + Ok(( + public_values, + ProgramExecutionReport { + total_num_cycles, + execution_duration, + ..Default::default() + }, + )) } fn prove( @@ -77,25 +64,19 @@ impl zkVM for EreJolt { [ProofKind::Compressed] )) } - - let (_tempdir, program) = program(&self.elf)?; - - let now = std::time::Instant::now(); - let proof = prove_generic(&program, self.prover_preprocessing.clone(), input); - let elapsed = now.elapsed(); + let start = Instant::now(); + let (public_values, proof) = self.sdk.prove(input)?; + let proving_time = start.elapsed(); let mut proof_bytes = Vec::new(); proof .serialize_compressed(&mut proof_bytes) .map_err(|err| CommonError::serialize("proof", "jolt", err))?; - // TODO: Public values - let public_values = Vec::new(); - Ok(( public_values, Proof::Compressed(proof_bytes), - ProgramProvingReport::new(elapsed), + ProgramProvingReport::new(proving_time), )) } @@ -107,13 +88,10 @@ impl zkVM for EreJolt { )) }; - let proof = EreJoltProof::deserialize_compressed(&mut Cursor::new(proof)) + let proof = JoltProof::deserialize_compressed(&mut Cursor::new(proof)) .map_err(|err| CommonError::deserialize("proof", "jolt", err))?; - verify_generic(proof, self.verifier_preprocessing.clone())?; - - // TODO: Public values - let public_values = Vec::new(); + let public_values = self.sdk.verify(proof)?; Ok(public_values) } @@ -127,15 +105,74 @@ impl zkVM for EreJolt { } } -/// Create `jolt::host::Program` by storing the compiled `elf` to a temporary -/// file, and set the elf path for `program`, so methods like `decode`, `trace` -/// and `trace_analyze` that depend on elf path will work. -pub fn program(elf: &[u8]) -> Result<(TempDir, jolt::host::Program), JoltError> { - let tempdir = TempDir::new().map_err(CommonError::tempdir)?; - let elf_path = tempdir.path().join("guest.elf"); - fs::write(&elf_path, elf).map_err(|err| CommonError::write_file("elf", &elf_path, err))?; - // Set a dummy package name because we don't need to compile anymore. - let mut program = jolt::host::Program::new(""); - program.elf = Some(elf_path); - Ok((tempdir, program)) +#[cfg(test)] +mod tests { + use crate::{ + EreJolt, + compiler::{JoltProgram, RustRv64imacCustomized}, + }; + use ere_test_utils::{ + host::{TestCase, run_zkvm_execute, run_zkvm_prove, testing_guest_directory}, + program::basic::BasicProgramInput, + }; + use ere_zkvm_interface::{Compiler, ProofKind, ProverResourceType, zkVM}; + use std::sync::{Mutex, OnceLock}; + + /// While proving, Jolt uses global static variables to store some + /// parameters, that might cause panics if we prove concurrently, so we put + /// a lock here for the test to work without the need to set test threads. + static PROVE_LOCK: Mutex<()> = Mutex::new(()); + + fn basic_program() -> JoltProgram { + static PROGRAM: OnceLock = OnceLock::new(); + PROGRAM + .get_or_init(|| { + RustRv64imacCustomized + .compile(&testing_guest_directory("jolt", "basic")) + .unwrap() + }) + .clone() + } + + #[test] + fn test_execute() { + let program = basic_program(); + let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); + + let test_case = BasicProgramInput::valid(); + run_zkvm_execute(&zkvm, &test_case); + } + + #[test] + fn test_execute_invalid_input() { + let program = basic_program(); + let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); + + for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + zkvm.execute(&input).unwrap_err(); + } + } + + #[test] + fn test_prove() { + let program = basic_program(); + let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); + + let _guard = PROVE_LOCK.lock().unwrap(); + + let test_case = BasicProgramInput::valid(); + run_zkvm_prove(&zkvm, &test_case); + } + + #[test] + fn test_prove_invalid_input() { + let program = basic_program(); + let zkvm = EreJolt::new(program, ProverResourceType::Cpu).unwrap(); + + let _guard = PROVE_LOCK.lock().unwrap(); + + for input in [Vec::new(), BasicProgramInput::invalid().serialized_input()] { + zkvm.prove(&input, ProofKind::default()).unwrap_err(); + } + } } diff --git a/docker/jolt/Dockerfile.base b/docker/jolt/Dockerfile.base index 52eb723..95735c5 100644 --- a/docker/jolt/Dockerfile.base +++ b/docker/jolt/Dockerfile.base @@ -5,6 +5,9 @@ FROM $BASE_IMAGE # The ere-base image provides Rust, Cargo (with a default nightly), and common tools. # We operate as root for SDK installation. +# Set default toolchain to 1.88.0 +RUN rustup default 1.88.0 + # Copy the Jolt SDK (CLI) installer script from the workspace context COPY --chmod=755 scripts/sdk_installers/install_jolt_sdk.sh /tmp/install_jolt_sdk.sh diff --git a/scripts/sdk_installers/install_jolt_sdk.sh b/scripts/sdk_installers/install_jolt_sdk.sh index cffea7e..ebf2d6b 100755 --- a/scripts/sdk_installers/install_jolt_sdk.sh +++ b/scripts/sdk_installers/install_jolt_sdk.sh @@ -28,13 +28,13 @@ ensure_tool_installed "rustup" "to manage Rust toolchains (though Jolt uses defa ensure_tool_installed "git" "to install Jolt from a git repository" ensure_tool_installed "cargo" "to build and install Rust packages" -JOLT_REVISION="55b9830a3944dde55d33a55c42522b81dd49f87a" +JOLT_VERSION_TAG="v0.3.0-alpha" # Install Jolt CLI using cargo install with +nightly # This installs the 'jolt' binary directly to $HOME/.cargo/bin # The ere-base image should have a compatible default nightly toolchain. echo "Installing Jolt CLI from GitHub repository (a16z/jolt)..." -cargo +nightly install --git https://github.com/a16z/jolt --force --bins jolt --rev "$JOLT_REVISION" +cargo +nightly install --git https://github.com/a16z/jolt --force --bins jolt --tag "$JOLT_VERSION_TAG" # Install Jolt's toolchain jolt install-toolchain diff --git a/tests/jolt/basic/Cargo.toml b/tests/jolt/basic/Cargo.toml index d650ddc..84a908f 100644 --- a/tests/jolt/basic/Cargo.toml +++ b/tests/jolt/basic/Cargo.toml @@ -1,12 +1,13 @@ [package] -name = "guest" +name = "ere-jolt-guest" version = "0.1.0" edition = "2021" +[dependencies] +jolt = { git = "https://github.com/a16z/jolt", package = "jolt-sdk", tag = "v0.3.0-alpha" } +ere-test-utils = { path = "../../../crates/test-utils" } + [features] guest = [] -[dependencies] -jolt = { package = "jolt-sdk", git = "https://github.com/a16z/jolt", rev = "55b9830a3944dde55d33a55c42522b81dd49f87a" } - -[workspace] \ No newline at end of file +[workspace] diff --git a/tests/jolt/basic/src/lib.rs b/tests/jolt/basic/src/lib.rs deleted file mode 100644 index b356010..0000000 --- a/tests/jolt/basic/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -#![cfg_attr(feature = "guest", no_std)] - -#[jolt::provable] -fn fib(n: u32) -> u128 { - let mut a: u128 = 0; - let mut b: u128 = 1; - let mut sum: u128; - for _ in 1..n { - sum = a + b; - a = b; - b = sum; - } - - b -} diff --git a/tests/jolt/basic/src/main.rs b/tests/jolt/basic/src/main.rs index 000ac87..16ce4bf 100644 --- a/tests/jolt/basic/src/main.rs +++ b/tests/jolt/basic/src/main.rs @@ -1,5 +1,33 @@ -#![cfg_attr(feature = "guest", no_std)] +#![no_std] #![no_main] -#[allow(unused_imports)] -use guest::*; +extern crate alloc; + +use alloc::vec::Vec; +use core::mem; +use ere_test_utils::{ + guest::Platform, + program::{basic::BasicProgram, Program}, +}; + +static mut INPUT: Vec = Vec::new(); +static mut OUTPUT: Vec = Vec::new(); + +struct JoltPlatform; + +impl Platform for JoltPlatform { + fn read_input() -> Vec { + unsafe { mem::take(&mut INPUT) } + } + + fn write_output(output: &[u8]) { + unsafe { mem::replace(&mut OUTPUT, output.to_vec()) }; + } +} + +#[jolt::provable(guest_only)] +fn main(input: Vec) -> Vec { + unsafe { mem::replace(&mut INPUT, input) }; + BasicProgram::run::(); + unsafe { mem::take(&mut OUTPUT) } +} diff --git a/tests/jolt/stock_nightly_no_std/Cargo.toml b/tests/jolt/stock_nightly_no_std/Cargo.toml index be88fd1..4d1bd16 100644 --- a/tests/jolt/stock_nightly_no_std/Cargo.toml +++ b/tests/jolt/stock_nightly_no_std/Cargo.toml @@ -2,10 +2,10 @@ name = "addition_no_std" edition = "2021" +[dependencies] +jolt = { git = "https://github.com/a16z/jolt", package = "jolt-sdk", tag = "v0.3.0-alpha" } + [features] guest = [] -[dependencies] -jolt-sdk = { git = "https://github.com/a16z/jolt", rev = "55b9830a3944dde55d33a55c42522b81dd49f87a" } - [workspace] diff --git a/tests/jolt/stock_nightly_no_std/src/main.rs b/tests/jolt/stock_nightly_no_std/src/main.rs index 5937d09..7ea18ea 100644 --- a/tests/jolt/stock_nightly_no_std/src/main.rs +++ b/tests/jolt/stock_nightly_no_std/src/main.rs @@ -1,14 +1,13 @@ -#![cfg_attr(feature = "guest", no_std)] +#![no_std] #![no_main] extern crate alloc; use alloc::vec::Vec; -use core::sync::atomic::Ordering; use core::sync::atomic::AtomicU16; -use jolt_sdk as jolt; +use core::sync::atomic::Ordering; -#[jolt::provable] -fn foo() { +#[jolt::provable(guest_only)] +fn main() { let a: AtomicU16 = core::hint::black_box(AtomicU16::new(5)); let b: AtomicU16 = core::hint::black_box(AtomicU16::new(7));