diff --git a/.gitmodules b/.gitmodules index 0394c23..7a9a1ba 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,4 +5,4 @@ [submodule "contracts/lib/sp1-contracts"] path = contracts/lib/sp1-contracts url = https://github.com/succinctlabs/sp1-contracts - tag = v1.1.0 + tag = v2.0.0 diff --git a/Cargo.lock b/Cargo.lock index 3f95286..45ffb36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1091,6 +1091,84 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "dashu" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b3e5ac1e23ff1995ef05b912e2b012a8784506987a2651552db2c73fb3d7e0" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-macros", + "dashu-ratio", + "rustversion", +] + +[[package]] +name = "dashu-base" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b80bf6b85aa68c58ffea2ddb040109943049ce3fbdf4385d0380aef08ef289" + +[[package]] +name = "dashu-float" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85078445a8dbd2e1bd21f04a816f352db8d333643f0c9b78ca7c3d1df71063e7" +dependencies = [ + "dashu-base", + "dashu-int", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-int" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee99d08031ca34a4d044efbbb21dff9b8c54bb9d8c82a189187c0651ffdb9fbf" +dependencies = [ + "cfg-if", + "dashu-base", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93381c3ef6366766f6e9ed9cf09e4ef9dec69499baf04f0c60e70d653cf0ab10" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-ratio", + "paste", + "proc-macro2", + "quote", + "rustversion", +] + +[[package]] +name = "dashu-ratio" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e33b04dd7ce1ccf8a02a69d3419e354f2bbfdf4eb911a0b7465487248764c9" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "num-modular", + "num-order", + "rustversion", +] + [[package]] name = "der" version = "0.7.9" @@ -1273,6 +1351,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1857,8 +1956,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -2752,6 +2853,21 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-rational" version = "0.4.2" @@ -4266,18 +4382,18 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -4502,21 +4618,60 @@ dependencies = [ [[package]] name = "sp1-build" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260c285956e8205d332c9a5acbd828462399b04caf72d0620718a20447bac91d" +checksum = "8216e07a9c463c6ee091cdc817cfc10c25446cfd4d020812818177e0a3d1c943" dependencies = [ "anyhow", "cargo_metadata", + "chrono", "clap", "dirs", ] [[package]] -name = "sp1-core" -version = "1.1.0" +name = "sp1-core-executor" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e916b2084e5de5e45c1dc3244dc212af9c8334dda3246acde7fc6e5ab4a7fc1" +checksum = "9855631556145c827f959527a2f60cb2c6ededfb42afcee49e41dab5f507ce7b" +dependencies = [ + "bincode", + "bytemuck", + "elf", + "enum-map", + "eyre", + "generic-array 1.1.0", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "log", + "nohash-hasher", + "num", + "p3-field", + "p3-keccak-air", + "p3-maybe-rayon", + "rand", + "rrs-succinct", + "serde", + "serde_with", + "sp1-curves", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "strum", + "strum_macros", + "thiserror", + "tiny-keccak", + "tracing", + "typenum", + "vec_map", +] + +[[package]] +name = "sp1-core-machine" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d9c51416ef52b258fa637538c02a2ac06ecaeec79d075c620013a77f035dee" dependencies = [ "anyhow", "arrayref", @@ -4561,8 +4716,11 @@ dependencies = [ "serde_with", "size", "snowbridge-amcl", + "sp1-core-executor", + "sp1-curves", "sp1-derive", "sp1-primitives", + "sp1-stark", "static_assertions", "strum", "strum_macros", @@ -4575,11 +4733,32 @@ dependencies = [ "web-time", ] +[[package]] +name = "sp1-curves" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c33d4d3f5e3590cc8c8d8a3d074097020bc0be0b9dd35fe43e04c586440c85" +dependencies = [ + "curve25519-dalek", + "dashu", + "elliptic-curve", + "generic-array 1.1.0", + "itertools 0.13.0", + "k256", + "num", + "p3-field", + "serde", + "snowbridge-amcl", + "sp1-primitives", + "sp1-stark", + "typenum", +] + [[package]] name = "sp1-derive" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dbc1d9a05a0e83f548907d50539e5e59873bbf6a82793ce87a195345ca7ddf9" +checksum = "3e33825340e1b21b37a29f5304fbd18a1c7c97ba1376fa35b7c017fd95dd627e" dependencies = [ "proc-macro2", "quote", @@ -4588,32 +4767,32 @@ dependencies = [ [[package]] name = "sp1-helper" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dce2545791b5c0c2e65f81eb76d74d51804cbbe758643978dc0bbcdbbaa127" +checksum = "7f08124c62d09764810783355cff518477e3f36c8e83343623859afeca6f3eeb" dependencies = [ - "cargo_metadata", - "chrono", "sp1-build", ] [[package]] name = "sp1-lib" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de4c2cc40e1019faac8cdbe61172c7be09960cfe240c712be46df3795c53fce8" +checksum = "413956de14568d7fb462213b9505ad4607d75c875301b9eca567cfb2e58eaac1" dependencies = [ "anyhow", "bincode", "cfg-if", + "hex", "serde", + "snowbridge-amcl", ] [[package]] name = "sp1-primitives" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb04c7a047b000dbab6b6e143f10e79a2cc5294d98fed74dc5dc11d374cef297" +checksum = "efbeba375fe59917f162f1808c280d2e39e4698dc7eeac83936b6e70c2f8dbbc" dependencies = [ "itertools 0.13.0", "lazy_static", @@ -4625,9 +4804,9 @@ dependencies = [ [[package]] name = "sp1-prover" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906ed35cdb4d24050b1d00aa51abfdb986883c5280ca6b34b1cd50e673cfad02" +checksum = "166e9f9fd29ecdfd4fd452d49052abdfbe735317f00016e94fde8410f90b4134" dependencies = [ "anyhow", "bincode", @@ -4647,13 +4826,15 @@ dependencies = [ "serde", "serde_json", "serial_test", - "sp1-core", + "sp1-core-executor", + "sp1-core-machine", "sp1-primitives", "sp1-recursion-circuit", "sp1-recursion-compiler", "sp1-recursion-core", "sp1-recursion-gnark-ffi", "sp1-recursion-program", + "sp1-stark", "subtle-encoding", "tempfile", "thiserror", @@ -4663,9 +4844,9 @@ dependencies = [ [[package]] name = "sp1-recursion-circuit" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a620b1c84ea7776deebf9eed2a5310c040f1b5b1db0709a2b36b86516f743d" +checksum = "a3ccdda16cd078f32c6707212b8e8f3e423992eeff6ace898d3e15bf94e78a16" dependencies = [ "bincode", "itertools 0.13.0", @@ -4678,18 +4859,19 @@ dependencies = [ "p3-matrix", "p3-util", "serde", - "sp1-core", + "sp1-core-machine", "sp1-recursion-compiler", "sp1-recursion-core", "sp1-recursion-derive", "sp1-recursion-program", + "sp1-stark", ] [[package]] name = "sp1-recursion-compiler" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5ef5565d25bf41f00280f0e09ab27cd39b8c8986af12c083e85a4061a49621" +checksum = "ae17b6c8506b3521e78450cf28f76c2426b5b2f132bb89660d3d61eb155439c4" dependencies = [ "backtrace", "itertools 0.13.0", @@ -4703,19 +4885,23 @@ dependencies = [ "p3-poseidon2", "p3-symmetric", "p3-util", + "rayon", "serde", - "sp1-core", + "sp1-core-machine", "sp1-primitives", "sp1-recursion-core", + "sp1-recursion-core-v2", "sp1-recursion-derive", + "sp1-stark", "tracing", + "vec_map", ] [[package]] name = "sp1-recursion-core" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5785177a892714601fd2f3e5e79af43d222bdedc415fb7cbdd52c9b1ee4dc3e2" +checksum = "8414c3d16cd2fedd293989cef601915d4e1efab662e3a08923606970dc8ae7e6" dependencies = [ "arrayref", "backtrace", @@ -4739,19 +4925,62 @@ dependencies = [ "p3-util", "serde", "serde_with", - "sp1-core", + "sp1-core-executor", + "sp1-core-machine", "sp1-derive", "sp1-primitives", + "sp1-stark", "static_assertions", "tracing", "zkhash", ] +[[package]] +name = "sp1-recursion-core-v2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0a2af67ca6f7db964b7f1ffdb48f6e26f10e3cc027a11bdd17b224f8747650" +dependencies = [ + "arrayref", + "backtrace", + "ff 0.13.0", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num_cpus", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "serde", + "serde_with", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-recursion-core", + "sp1-stark", + "static_assertions", + "thiserror", + "tracing", + "vec_map", + "zkhash", +] + [[package]] name = "sp1-recursion-derive" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5970fa689c5b3e41d2ea4a81f9207594b9befc2ba5ad9d8727b6bdbc7ba054e" +checksum = "4921db3912a60ee3896242ce336203066377e6eddd1c26d099e8bf6b9c470a21" dependencies = [ "proc-macro2", "quote", @@ -4760,9 +4989,9 @@ dependencies = [ [[package]] name = "sp1-recursion-gnark-ffi" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aacdfec9e2895f0166125b89f3f058a25cdbbdce300839a46b240d3bafbac13" +checksum = "718b2e92bfd3ce91fcef2ac0b3a8d31746dbc3ad4071f3bec45aa2e5e025adb1" dependencies = [ "anyhow", "bincode", @@ -4779,16 +5008,17 @@ dependencies = [ "serde", "serde_json", "sha2", - "sp1-core", + "sp1-core-machine", "sp1-recursion-compiler", + "sp1-stark", "tempfile", ] [[package]] name = "sp1-recursion-program" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b570d8e40b8faad877e7c8604de8bc51f61dbee8ee7e0efe3ae7610585e69c" +checksum = "676661b42f5d55c64932ad400ec920bd8b8098b1500b13c483a541bf3b396dd1" dependencies = [ "itertools 0.13.0", "p3-air", @@ -4806,32 +5036,35 @@ dependencies = [ "p3-util", "rand", "serde", - "sp1-core", + "sp1-core-executor", + "sp1-core-machine", "sp1-primitives", "sp1-recursion-compiler", "sp1-recursion-core", + "sp1-stark", "stacker", "tracing", ] [[package]] name = "sp1-sdk" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924c2ba6d0a522b17f29368f6db8ebd1bf2a424eb4d6e67308f1be4df9d860c" +checksum = "2b289585392a3639f6541bce32dd89e03e7893f42e9b9bcf6bee7d54183d5e05" dependencies = [ "alloy-sol-types", "anyhow", "async-trait", - "axum", "bincode", "cfg-if", "dirs", "ethers", "futures", + "getrandom", "hashbrown 0.14.5", "hex", "indicatif", + "itertools 0.13.0", "log", "num-bigint 0.4.6", "p3-baby-bear", @@ -4845,8 +5078,10 @@ dependencies = [ "serde", "serde_json", "sha2", - "sp1-core", + "sp1-core-executor", + "sp1-core-machine", "sp1-prover", + "sp1-stark", "strum", "strum_macros", "sysinfo", @@ -4858,11 +5093,43 @@ dependencies = [ "vergen", ] +[[package]] +name = "sp1-stark" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4048fc99a6c1123f5040b5ade1ae2839ca1be421e4c427fc7d1fd9bbf6e174f5" +dependencies = [ + "arrayref", + "getrandom", + "hashbrown 0.14.5", + "itertools 0.13.0", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rayon-scan", + "serde", + "sp1-derive", + "sp1-primitives", + "sysinfo", + "tracing", +] + [[package]] name = "sp1-zkvm" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b4490136e03f6fe931dc49559574bb6dbf5e6a86cae1f60dc3842d2b79905ed" +checksum = "66c525f67cfd3f65950f01c713a72c41a5d44d289155644c8ace4ec264098039" dependencies = [ "bincode", "cfg-if", @@ -5523,6 +5790,15 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +dependencies = [ + "serde", +] + [[package]] name = "vergen" version = "8.3.2" diff --git a/README.md b/README.md index 70bb484..e60f8af 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,22 @@ that can generate a proof of any RISC-V program. ## Requirements - [Rust](https://rustup.rs/) -- [SP1](https://succinctlabs.github.io/sp1/getting-started/install.html) +- [SP1](https://docs.succinct.xyz/getting-started/install.html) ## Running the Project -There are three main ways to run this project: execute a program, generate a core proof, and +There are four main ways to run this project: build a program, execute a program, generate a core proof, and generate an EVM-compatible proof. +### Build the Program + +To build the program, run the following command: + +```sh +cd program +cargo prove build +``` + ### Execute the Program To run the program without generating a proof: @@ -33,19 +42,25 @@ cd script cargo run --release -- --prove ``` -### Generate an EVM-Compatible (PLONK) Proof +### Generate an EVM-Compatible Proof > [!WARNING] -> You will need at least 128GB RAM to generate the PLONK proof. +> You will need at least 128GB RAM to generate a Groth16 or PLONK proof. -To generate a PLONK proof that is small enough to be verified on-chain and verifiable by the EVM: +To generate a proof that is small enough to be verified on-chain and verifiable by the EVM: ```sh cd script -cargo run --release --bin evm +cargo run --release --bin evm -- --system groth16 +``` + +this will generate a Groth16 proof. If you want to generate a PLONK proof, run the following command: + +```sh +cargo run --release --bin evm -- --system plonk ``` -This command also generates a fixture that can be used to test the verification of SP1 zkVM proofs +These commands will also generate fixtures that can be used to test the verification of SP1 zkVM proofs inside Solidity. ### Retrieve the Verification Key @@ -53,7 +68,7 @@ inside Solidity. To retrieve your `programVKey` for your on-chain contract, run the following command: ```sh -cargo run --release --bin vkey +cargo prove vkey --elf elf/riscv32im-succinct-zkvm-elf ``` ## Using the Prover Network diff --git a/contracts/lib/sp1-contracts b/contracts/lib/sp1-contracts index 2fcbf92..af1ae09 160000 --- a/contracts/lib/sp1-contracts +++ b/contracts/lib/sp1-contracts @@ -1 +1 @@ -Subproject commit 2fcbf9257330ebe13df4cccd475b642812c03944 +Subproject commit af1ae093ef8a8f68b022aa8f0f7ad9ffd94aa6fb diff --git a/contracts/src/fixtures/fixture.json b/contracts/src/fixtures/fixture.json deleted file mode 100644 index 4c31d5e..0000000 --- a/contracts/src/fixtures/fixture.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "a": 6765, - "b": 10946, - "n": 20, - "vkey": "0x00b84bc28cca2115d6299b70825d7ec6117deb3981d1bbf21c3113f92dc18eb5", - "publicValues": "0x00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000001a6d0000000000000000000000000000000000000000000000000000000000002ac2", - "proof": "0xc430ff7f260ec07d5bc7aaa7f40ecce2529a1f7517a232cb6dfe71bda5205e79fb0e090e2cf5eb678d03adfef43dec7f919076dd47548321bf853fbe0451fea804169dca04309e083f8ded64c40c4fe018d25495fcadca19e2e3625c5e35c3ac89c71a3f2400618aec42ea7edfd3be3925791298e8b6e803c2e003cbab5259a1a63b2821136de9de013dcaf524aeca92bd77f3463e7925fa7050d02a77f5e8172da74f4a0b3bcb86fed554d084af9c1599f961ba65b4dd60bd02299d11f1b6956d5a403124c78bbed2d3d0c5af2acc79c57a8d9b6e4bb8226abd04ce096050d696fd93f01b26b5a1114ec1c5317c6caca14cc580358ead30bf53234fa5ed3de8023c98e019b9517c2e18ea6c3553a4d8b54a59651897d4bf1afcb73101a5a7295c5e90450ba2f0f71cfd1bb9e910bb97bb56f77118d3732623d8cb9ee792d38b10b080582f7ae4493c42f544af098f40d0948db857731513430f253c8a88f74098e03ffd1a524331e0801cd942b0744ad5f61531203356967e5eeceef0fe47cabcb5bbdb125c57ccfb010e06e9d7e739ddd1810ba61e3aedd7572653829ef3802c5516e921d2db577f969ba667098a71fd398e177ca2513a822a312dcbb9df393fa5572e1c42b34da0b1dd884825474a41940dacc91914a0cf183b55b738be434e744c912560828cbc15f863b35bea8c4a49d14da6f12d8422baa64b5a8b82aea3a6303c12e6782b64aaca45330f1040cc5e0f7bba4036fb5edeab2fddb7d1ab66cd44772a21cd24aab969c3ff1d1a0fcd42befd27d0f26380bfbe968a32b6ca718b75a020908705cf0be21ebb1d9ac5598e0b3eace0b4e43fb6ae8bfb752b7c951a467e1038671e1623d30955d3ad265dcfa28e71fa8739d27c083a0220dd7754acaa730f7b332c26c93cebc0651401459936e2ddbd0b086e67bdca6d6806c581c4458c2831023d95cfd5206c9d51902baff1db01f40ed1e53379c58fd9918b8b4b93240193ec7199608ab490c21208f919cb405a595f9e9a55a950d2aae6b09fe72875256e39a0cc9ea354cbd9b1bb829aca36fc28b7a5d55fc06c9d8f00e693b704292736f75b7556844eb7b96b67cce1f30434aeb2634b0bc36b33be8ba877bbf3a32a6630bd5d99ba8bd21eb9eaf0ea792340e1c8788ba2338725c27cef5a042a0918b200389157bc1352975661991d719f73785015f178f38bb6ec9d7dfb4cb0f7" -} \ No newline at end of file diff --git a/contracts/src/fixtures/groth16-fixture.json b/contracts/src/fixtures/groth16-fixture.json new file mode 100644 index 0000000..fd07864 --- /dev/null +++ b/contracts/src/fixtures/groth16-fixture.json @@ -0,0 +1,8 @@ +{ + "a": 6765, + "b": 10946, + "n": 20, + "vkey": "0x00a22fd3af2b4ec77de39ec50023cf6c2b64984d0156a3df1984262984ef71bf", + "publicValues": "0x00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000001a6d0000000000000000000000000000000000000000000000000000000000002ac2", + "proof": "0x6a2906ac23e4480564d34dfcf7005e26d0cc0d530a1b5029dfc2152f14b97841cbcb738a03a407d4104ced929ce6474501da24e7e1e5267ea0e1b2ace137c28a053febcf1fa039f5f964c2ed7f82ca582574f761af8c2541a6991d85190450c02131539f03747b06260cd8bff401728a923fc6f980c7fa8bed4a9de3c9821f62328c243e003d00cd3b8eb153f1df4e5e9f7fbfa9b81ac4f03d3bbbfdb8204ec9e25b520016d69ba1c93b90d86da73111123388195d65ed14c8241cf8a4390c416bdabffd165b92debad53ca3db689e06e533131364e1d9652aba537d689321fac966d32e1d2e7714067217b2cd5a3d1df81ece476eec70bf682164102de5e8d652221d3d" +} \ No newline at end of file diff --git a/contracts/src/fixtures/plonk-fixture.json b/contracts/src/fixtures/plonk-fixture.json new file mode 100644 index 0000000..0d381e7 --- /dev/null +++ b/contracts/src/fixtures/plonk-fixture.json @@ -0,0 +1,8 @@ +{ + "a": 6765, + "b": 10946, + "n": 20, + "vkey": "0x00a22fd3af2b4ec77de39ec50023cf6c2b64984d0156a3df1984262984ef71bf", + "publicValues": "0x00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000001a6d0000000000000000000000000000000000000000000000000000000000002ac2", + "proof": "0x4aca240a10e48d547d454301bd5384e07852d60e6ba0f115f65a60f4443c4cee1348b695086b30d01c43bbd73a4026a1e2085b206e16f2e996ea101e35e116501fbe8c70003cef43831a390fc7d551058c6b186bb29597eb5d4981d72453a1c48c9ef3b90f1571cc98e55ebac36e5fecb14f7840419de70cd9a4c5c9692ab35b7222203c0f146200c674ffde1bb21feded6250d54d1bbbae633d1c4d070ce21384187ee60e87d43ed7a580181615ca48a5dfa0704ed429f690e0cb8f4382a16fc911d24623dc90465ed642716ffcb0cd53ff149273f5c511129f029f4072371572cf3bcc1e53ace42dbd6890319597f31401c96287eac3300c5930cfc150e9d81bf1ee740e5b7e8ed8e8e592d9f779f35e2be0208e209ff9b728ff3825b1a9b7aef826a525f9d755f96ec2e68a88b4da246b425ebd4af4c3041ea12c5e4c44ed9e83a4ad069f674517a08ec7bcda9c7672978a2fd056956c5f48e9b8f348028335aee6db1c105a306b0d03f309f406ceb824c72133f186a615849b950ab9baec61bff812034bb448565d0b789adeaaead1e5c07b9224d081a9c42dbe3bf0d66889dda3d11fc11c3465d952f797cf9a26341edbfb868de65bb51cc3e4445ca084e120c4b406f30b78f720ff785e6592ad218f71b4382cd6cfbb4d653a64efea019e5c705e1e15f9034b85b02b5c65d5c4a79143982b596bb1dc49d2799c581906686042780ca366da2fed051649bfa7fd0a350bd5953db403e2b638d992288cf2df85adba29442fd8f5fe7db31bd22002ba1e9bf59d5fe848dc66242191c070ddc1ba6e9d16affcb406d1b765024293ee018e48a79b81dc26c3219a7c76a91071fc1abb67096561ba7cb68c5c7f0eb82c3aed59c413abb7cad01a2ad2c6a3cbc87700f01716ecb7c7b42f6d5cb2dd20c5ec528236fa0220500e07daf5138a8ede04ee206f02912f9571ef693a699811a9bcbe544a5ab6e97e61dcff677e631f50126868460715fda230220afce3ca030a8b561a0863d2a1e926f8b07c4846e858690f593a1713eb06cf21f1a3962ab2a9086c4d8761dcf0d8c2c7dcbc35ade5b7be2848ff1861e824799ace0e4ea39031ff336e2005373d35a9549e5d9cc4191f337f407f0fc4ce65a7484686747f6de7914eef3bdca97cf4ca0013c3af4097e7d768146a1bfa12db65d818ecae20612f5e14d71f608bd19da830794b7ca09ff5e00b0722" +} \ No newline at end of file diff --git a/contracts/test/Fibonacci.t.sol b/contracts/test/Fibonacci.t.sol index bcbcf40..9e065f1 100644 --- a/contracts/test/Fibonacci.t.sol +++ b/contracts/test/Fibonacci.t.sol @@ -23,7 +23,7 @@ contract FibonacciTest is Test { function loadFixture() public view returns (SP1ProofFixtureJson memory) { string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/src/fixtures/fixture.json"); + string memory path = string.concat(root, "/src/fixtures/plonk-fixture.json"); string memory json = vm.readFile(path); bytes memory jsonBytes = json.parseRaw("."); return abi.decode(jsonBytes, (SP1ProofFixtureJson)); diff --git a/elf/riscv32im-succinct-zkvm-elf b/elf/riscv32im-succinct-zkvm-elf index c55acc1..92b2fb3 100755 Binary files a/elf/riscv32im-succinct-zkvm-elf and b/elf/riscv32im-succinct-zkvm-elf differ diff --git a/program/Cargo.toml b/program/Cargo.toml index 1ca3335..bcdccd9 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -5,5 +5,5 @@ edition = "2021" [dependencies] alloy-sol-types = { workspace = true } -sp1-zkvm = "1.1.0" -fibonacci-lib = { path = "../lib" } \ No newline at end of file +sp1-zkvm = "2.0.0" +fibonacci-lib = { path = "../lib" } diff --git a/script/Cargo.toml b/script/Cargo.toml index dcc126b..58b7e81 100644 --- a/script/Cargo.toml +++ b/script/Cargo.toml @@ -12,12 +12,8 @@ path = "src/bin/main.rs" name = "evm" path = "src/bin/evm.rs" -[[bin]] -name = "vkey" -path = "src/bin/vkey.rs" - [dependencies] -sp1-sdk = "1.1.0" +sp1-sdk = "2.0.0" serde_json = { version = "1.0", default-features = false, features = ["alloc"] } serde = { version = "1.0", default-features = false, features = ["derive"] } clap = { version = "4.0", features = ["derive", "env"] } @@ -27,4 +23,4 @@ alloy-sol-types = { workspace = true } fibonacci-lib = { path = "../lib" } [build-dependencies] -sp1-helper = "1.1.0" +sp1-helper = "2.0.0" diff --git a/script/src/bin/evm.rs b/script/src/bin/evm.rs index 7a8977e..f694f61 100644 --- a/script/src/bin/evm.rs +++ b/script/src/bin/evm.rs @@ -3,11 +3,15 @@ //! //! You can run this script using the following command: //! ```shell -//! RUST_LOG=info cargo run --release --bin evm +//! RUST_LOG=info cargo run --release --bin evm -- --system groth16 +//! ``` +//! or +//! ```shell +//! RUST_LOG=info cargo run --release --bin evm -- --system plonk //! ``` use alloy_sol_types::SolType; -use clap::Parser; +use clap::{Parser, ValueEnum}; use fibonacci_lib::PublicValuesStruct; use serde::{Deserialize, Serialize}; use sp1_sdk::{HashableKey, ProverClient, SP1ProofWithPublicValues, SP1Stdin, SP1VerifyingKey}; @@ -22,6 +26,15 @@ pub const FIBONACCI_ELF: &[u8] = include_bytes!("../../../elf/riscv32im-succinct struct EVMArgs { #[clap(long, default_value = "20")] n: u32, + #[clap(long, value_enum, default_value = "groth16")] + system: ProofSystem, +} + +/// Enum representing the available proof systems +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)] +enum ProofSystem { + Plonk, + Groth16, } /// A fixture that can be used to test the verification of SP1 zkVM proofs inside Solidity. @@ -54,19 +67,24 @@ fn main() { stdin.write(&args.n); println!("n: {}", args.n); + println!("Proof System: {:?}", args.system); - // Generate the proof. - let proof = client - .prove(&pk, stdin) - .plonk() - .run() - .expect("failed to generate proof"); + // Generate the proof based on the selected proof system. + let proof = match args.system { + ProofSystem::Plonk => client.prove(&pk, stdin).plonk().run(), + ProofSystem::Groth16 => client.prove(&pk, stdin).groth16().run(), + } + .expect("failed to generate proof"); - create_plonk_fixture(&proof, &vk); + create_proof_fixture(&proof, &vk, args.system); } /// Create a fixture for the given proof. -fn create_plonk_fixture(proof: &SP1ProofWithPublicValues, vk: &SP1VerifyingKey) { +fn create_proof_fixture( + proof: &SP1ProofWithPublicValues, + vk: &SP1VerifyingKey, + system: ProofSystem, +) { // Deserialize the public values. let bytes = proof.public_values.as_slice(); let PublicValuesStruct { n, a, b } = PublicValuesStruct::abi_decode(bytes, false).unwrap(); @@ -101,7 +119,7 @@ fn create_plonk_fixture(proof: &SP1ProofWithPublicValues, vk: &SP1VerifyingKey) let fixture_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../contracts/src/fixtures"); std::fs::create_dir_all(&fixture_path).expect("failed to create fixture path"); std::fs::write( - fixture_path.join("fixture.json"), + fixture_path.join(format!("{:?}-fixture.json", system).to_lowercase()), serde_json::to_string_pretty(&fixture).unwrap(), ) .expect("failed to write fixture"); diff --git a/script/src/bin/vkey.rs b/script/src/bin/vkey.rs deleted file mode 100644 index 0993301..0000000 --- a/script/src/bin/vkey.rs +++ /dev/null @@ -1,27 +0,0 @@ -//! A script to print the program verification key. -//! -//! You can run this script using the following command: -//! ```shell -//! RUST_LOG=info cargo run --bin vkey --release -//! ``` - -use sp1_sdk::{HashableKey, ProverClient}; - -/// The ELF (executable and linkable format) file for the Succinct RISC-V zkVM. -/// -/// This file is generated by running `cargo prove build` inside the `program` directory. -pub const FIBONACCI_ELF: &[u8] = include_bytes!("../../../elf/riscv32im-succinct-zkvm-elf"); - -fn main() { - // Setup the logger. - sp1_sdk::utils::setup_logger(); - - // Setup the prover client. - let client = ProverClient::new(); - - // Setup the program. - let (_, vk) = client.setup(FIBONACCI_ELF); - - // Print the verification key. - println!("Program Verification Key: {}", vk.bytes32()); -}