From 132c210d5e2672ad235c0de3ef9b8a6d47f9a7d3 Mon Sep 17 00:00:00 2001 From: Matt Stam <15695189+mattstam@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:02:41 -0700 Subject: [PATCH] Revert "feat: v1.2.0 (#27)" This reverts commit b82ae07e8b342dddf068f86bbdfc68f933d4a3c9. --- .gitmodules | 2 +- Cargo.lock | 338 +++----------------- README.md | 31 +- contracts/src/fixtures/fixture.json | 8 + contracts/src/fixtures/groth16-fixture.json | 8 - contracts/src/fixtures/plonk-fixture.json | 8 - contracts/test/Fibonacci.t.sol | 2 +- elf/riscv32im-succinct-zkvm-elf | Bin 119856 -> 119888 bytes program/Cargo.toml | 4 +- script/Cargo.toml | 8 +- script/src/bin/evm.rs | 40 +-- script/src/bin/vkey.rs | 27 ++ 12 files changed, 109 insertions(+), 367 deletions(-) create mode 100644 contracts/src/fixtures/fixture.json delete mode 100644 contracts/src/fixtures/groth16-fixture.json delete mode 100644 contracts/src/fixtures/plonk-fixture.json create mode 100644 script/src/bin/vkey.rs diff --git a/.gitmodules b/.gitmodules index 60b2db1..0394c23 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.2.0 + tag = v1.1.0 diff --git a/Cargo.lock b/Cargo.lock index 831e351..3f95286 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1091,84 +1091,6 @@ 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" @@ -1935,10 +1857,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -2832,21 +2752,6 @@ 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" @@ -4361,18 +4266,18 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", @@ -4597,58 +4502,21 @@ dependencies = [ [[package]] name = "sp1-build" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae094a567949cc3bbcdb265e45591cf7ac7185f121f6f29ac64a44acb00220e" +checksum = "260c285956e8205d332c9a5acbd828462399b04caf72d0620718a20447bac91d" dependencies = [ "anyhow", "cargo_metadata", - "chrono", "clap", "dirs", ] [[package]] -name = "sp1-core-executor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fde11e88cf1e7fa272ec3accb643845b1d3a13b9b7840a0357b00acdfdbedf9" -dependencies = [ - "bincode", - "bytemuck", - "elf", - "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", -] - -[[package]] -name = "sp1-core-machine" -version = "1.2.0" +name = "sp1-core" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "748ffa83d438905521f389f46fed2de6f3b05b1da2ffc2273194bede11a258fc" +checksum = "2e916b2084e5de5e45c1dc3244dc212af9c8334dda3246acde7fc6e5ab4a7fc1" dependencies = [ "anyhow", "arrayref", @@ -4693,11 +4561,8 @@ dependencies = [ "serde_with", "size", "snowbridge-amcl", - "sp1-core-executor", - "sp1-curves", "sp1-derive", "sp1-primitives", - "sp1-stark", "static_assertions", "strum", "strum_macros", @@ -4710,32 +4575,11 @@ dependencies = [ "web-time", ] -[[package]] -name = "sp1-curves" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c19d1e60fdd17ec53b8453d7634ed3a136800151412c8d9873944f782c4bc89" -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.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d06fdae1dc74a9085b155d12180825653e530983262b8ad2e57fe15551d17a" +checksum = "8dbc1d9a05a0e83f548907d50539e5e59873bbf6a82793ce87a195345ca7ddf9" dependencies = [ "proc-macro2", "quote", @@ -4744,32 +4588,32 @@ dependencies = [ [[package]] name = "sp1-helper" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a17502b73973fedac4ea0d20fbaf33663a0cd0cfc4a6c36a3d095634bec941a" +checksum = "71dce2545791b5c0c2e65f81eb76d74d51804cbbe758643978dc0bbcdbbaa127" dependencies = [ + "cargo_metadata", + "chrono", "sp1-build", ] [[package]] name = "sp1-lib" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea7811abd2d3a991007fcb284f41152840b8388c171288d0c52c6793956609c" +checksum = "de4c2cc40e1019faac8cdbe61172c7be09960cfe240c712be46df3795c53fce8" dependencies = [ "anyhow", "bincode", "cfg-if", - "hex", "serde", - "snowbridge-amcl", ] [[package]] name = "sp1-primitives" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d13f9b8ac43071ecfe5980a135cbcecb26ecad243165adce8de5aa3746a2af59" +checksum = "cb04c7a047b000dbab6b6e143f10e79a2cc5294d98fed74dc5dc11d374cef297" dependencies = [ "itertools 0.13.0", "lazy_static", @@ -4781,9 +4625,9 @@ dependencies = [ [[package]] name = "sp1-prover" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf5496754989ea23332537094818b4d8bc55e04171fc4f87161493399c2219ad" +checksum = "906ed35cdb4d24050b1d00aa51abfdb986883c5280ca6b34b1cd50e673cfad02" dependencies = [ "anyhow", "bincode", @@ -4803,15 +4647,13 @@ dependencies = [ "serde", "serde_json", "serial_test", - "sp1-core-executor", - "sp1-core-machine", + "sp1-core", "sp1-primitives", "sp1-recursion-circuit", "sp1-recursion-compiler", "sp1-recursion-core", "sp1-recursion-gnark-ffi", "sp1-recursion-program", - "sp1-stark", "subtle-encoding", "tempfile", "thiserror", @@ -4821,9 +4663,9 @@ dependencies = [ [[package]] name = "sp1-recursion-circuit" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0ee89dd4928419672f046a472b3e0114e405805d96de9f39e4e83d323778ab" +checksum = "95a620b1c84ea7776deebf9eed2a5310c040f1b5b1db0709a2b36b86516f743d" dependencies = [ "bincode", "itertools 0.13.0", @@ -4836,19 +4678,18 @@ dependencies = [ "p3-matrix", "p3-util", "serde", - "sp1-core-machine", + "sp1-core", "sp1-recursion-compiler", "sp1-recursion-core", "sp1-recursion-derive", "sp1-recursion-program", - "sp1-stark", ] [[package]] name = "sp1-recursion-compiler" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89d0dcf2766edd698ecc336c90d6a228759ee716fc6e24a8e3927210e2536de" +checksum = "cb5ef5565d25bf41f00280f0e09ab27cd39b8c8986af12c083e85a4061a49621" dependencies = [ "backtrace", "itertools 0.13.0", @@ -4862,61 +4703,19 @@ dependencies = [ "p3-poseidon2", "p3-symmetric", "p3-util", - "rayon", "serde", - "sp1-core-machine", + "sp1-core", "sp1-primitives", "sp1-recursion-core", - "sp1-recursion-core-v2", "sp1-recursion-derive", - "sp1-stark", "tracing", - "vec_map", ] [[package]] name = "sp1-recursion-core" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef244f580afc3c783880cdee7e26c56eb1d3c4522e2c98bd89f79366c3d92a1" -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-stark", - "static_assertions", - "tracing", - "zkhash", -] - -[[package]] -name = "sp1-recursion-core-v2" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82adbabcf41de013fb7394c06437937fd740c5005e760a215bfc2196f993ae" +checksum = "5785177a892714601fd2f3e5e79af43d222bdedc415fb7cbdd52c9b1ee4dc3e2" dependencies = [ "arrayref", "backtrace", @@ -4940,24 +4739,19 @@ dependencies = [ "p3-util", "serde", "serde_with", - "sp1-core-executor", - "sp1-core-machine", + "sp1-core", "sp1-derive", "sp1-primitives", - "sp1-recursion-core", - "sp1-stark", "static_assertions", - "thiserror", "tracing", - "vec_map", "zkhash", ] [[package]] name = "sp1-recursion-derive" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168c1e526a6c8b3877f360fae3fb545bdf0ce7e11e77878170775eeb87c9a043" +checksum = "f5970fa689c5b3e41d2ea4a81f9207594b9befc2ba5ad9d8727b6bdbc7ba054e" dependencies = [ "proc-macro2", "quote", @@ -4966,9 +4760,9 @@ dependencies = [ [[package]] name = "sp1-recursion-gnark-ffi" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1100ea8ab4374397aafb7f89b6d5d60ed8d5040b51f6db22bd3f9807204b13a1" +checksum = "6aacdfec9e2895f0166125b89f3f058a25cdbbdce300839a46b240d3bafbac13" dependencies = [ "anyhow", "bincode", @@ -4985,17 +4779,16 @@ dependencies = [ "serde", "serde_json", "sha2", - "sp1-core-machine", + "sp1-core", "sp1-recursion-compiler", - "sp1-stark", "tempfile", ] [[package]] name = "sp1-recursion-program" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35252bdd8b0bd54f37d1df5ec9ef10de0d301550e6a5fc660de134f1b126da78" +checksum = "40b570d8e40b8faad877e7c8604de8bc51f61dbee8ee7e0efe3ae7610585e69c" dependencies = [ "itertools 0.13.0", "p3-air", @@ -5013,31 +4806,29 @@ dependencies = [ "p3-util", "rand", "serde", - "sp1-core-executor", - "sp1-core-machine", + "sp1-core", "sp1-primitives", "sp1-recursion-compiler", "sp1-recursion-core", - "sp1-stark", "stacker", "tracing", ] [[package]] name = "sp1-sdk" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a21138889b9cbe9b72a652162dad26b904e07dccbbbc10adb4b081abdd4f80" +checksum = "6924c2ba6d0a522b17f29368f6db8ebd1bf2a424eb4d6e67308f1be4df9d860c" dependencies = [ "alloy-sol-types", "anyhow", "async-trait", + "axum", "bincode", "cfg-if", "dirs", "ethers", "futures", - "getrandom", "hashbrown 0.14.5", "hex", "indicatif", @@ -5054,10 +4845,8 @@ dependencies = [ "serde", "serde_json", "sha2", - "sp1-core-executor", - "sp1-core-machine", + "sp1-core", "sp1-prover", - "sp1-stark", "strum", "strum_macros", "sysinfo", @@ -5069,42 +4858,11 @@ dependencies = [ "vergen", ] -[[package]] -name = "sp1-stark" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfae288fe87c6c9fe5f15c04ad38605f2e8e27f86d1e4228359e36a20f003c68" -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", - "tracing", -] - [[package]] name = "sp1-zkvm" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a777787c41fffb1ce1e74229f480223ce8d0ae66763aaac689cec737a19663e" +checksum = "2b4490136e03f6fe931dc49559574bb6dbf5e6a86cae1f60dc3842d2b79905ed" dependencies = [ "bincode", "cfg-if", @@ -5765,12 +5523,6 @@ 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" - [[package]] name = "vergen" version = "8.3.2" diff --git a/README.md b/README.md index 295787d..65368b3 100644 --- a/README.md +++ b/README.md @@ -6,22 +6,13 @@ that can generate a proof of any RISC-V program. ## Requirements - [Rust](https://rustup.rs/) -- [SP1](https://docs.succinct.xyz/getting-started/install.html) +- [SP1](https://succinctlabs.github.io/sp1/getting-started/install.html) ## Running the Project -There are four main ways to run this project: build a program, execute a program, generate a core proof, and +There are three main ways to run this project: 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: @@ -42,25 +33,19 @@ cd script cargo run --release -- --prove ``` -### Generate an EVM-Compatible Proof +### Generate an EVM-Compatible (PLONK) Proof > [!WARNING] -> You will need at least 128GB RAM to generate a PLONK or Groth16 proof. +> You will need at least 128GB RAM to generate the PLONK proof. -To generate a proof that is small enough to be verified on-chain and verifiable by the EVM: +To generate a PLONK proof that is small enough to be verified on-chain and verifiable by the EVM: ```sh cd script -cargo run --release --bin evm -- --system plonk -``` - -this will generate a PLONK proof. If you want to generate a Groth16 proof, run the following command: - -```sh -cargo run --release --bin evm -- --system groth16 +cargo run --release --bin evm ``` -These commands will also generate fixtures that can be used to test the verification of SP1 zkVM proofs +This command also generates a fixture that can be used to test the verification of SP1 zkVM proofs inside Solidity. ### Retrieve the Verification Key @@ -68,7 +53,7 @@ inside Solidity. To retrieve your `programVKey` for your on-chain contract, run the following command: ```sh -cargo prove vkey --elf elf/riscv32im-succinct-zkvm-elf +cargo run --release --bin vkey ``` ## Using the Prover Network diff --git a/contracts/src/fixtures/fixture.json b/contracts/src/fixtures/fixture.json new file mode 100644 index 0000000..4c31d5e --- /dev/null +++ b/contracts/src/fixtures/fixture.json @@ -0,0 +1,8 @@ +{ + "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 deleted file mode 100644 index 548a760..0000000 --- a/contracts/src/fixtures/groth16-fixture.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "a": 6765, - "b": 10946, - "n": 20, - "vkey": "0x00b94374c2266f0d2e01793c47156bc0badd5d4d60899e1b0963a27f09ac9475", - "publicValues": "0x00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000001a6d0000000000000000000000000000000000000000000000000000000000002ac2", - "proof": "0x837629d32fe646eef2ba21ec161306d496e2938a0e3ec7f8990c3b0c74f28a8211852a1c2032cbb2a143b36636e1dafa6b02ae15db4884701ca24fed869efe4b8b4471441471f2f0778a20e563eda1852c7256118a447e35790fd719b9d3722401c537802f38e055b52c3f88abb76d4ac1da35112e7180d0a5c39ac37ce97b8ae38af59e254a8dcdfb728c9c55fa25c44e7ca994c30e1585792ad16494708b66ce54d75a0e6654e0b71270401e77e94615604a270cd73e549cb923bb997134bc1e96985f12f8d42a726a65767d0ae1265d216b703ba12d41a56c1b84b9e94d51ce6df8c42c8682896b84bbe18192ed3c36b3cedf6a0f93381e1d0c7e1e1ee40cd6bc75e9" -} \ No newline at end of file diff --git a/contracts/src/fixtures/plonk-fixture.json b/contracts/src/fixtures/plonk-fixture.json deleted file mode 100644 index c34adbd..0000000 --- a/contracts/src/fixtures/plonk-fixture.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "a": 6765, - "b": 10946, - "n": 20, - "vkey": "0x00c138feada234bda87064e52edfabf16720cb11c57149ee53c7620c27bbc1e2", - "publicValues": "0x00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000001a6d0000000000000000000000000000000000000000000000000000000000002ac2", - "proof": "0xc865c1b61a514c662608a8828d3824a57ff2a5ba82dedba6a3d548b533b21f30e6cb04640d6f6fe37638f9c902c9fb5925777defd28852bd42de46eab219496795bec9ae10958d6e2b581dfe293a9b93f3d50f8cd3c986ccbfaec9cc22184d368573465d13306190d2335df8aff016f18b5e69475159f2fd9cb1ea0c4d4428402d3dc91324cbdac05b9a50ad0d872bd02005d52eda6c76af17af39448c50b340935f9d591d8a1d567fbb375308a5be68022ea9f1ffd57e920da331236c0943f3f38893eb1db03793c2ff89ce82798af3eeef7c0e16af0e65ecff4637dfe0f51281f9a3b32e12d4fbe83384bedb40f8e5f0b0be8ac73d794e067684ce5fa4e4ae3ab1a155183257a1899476f55a2cf1186c6e143df0f5e26287d3f0463701d631cf3b112a198909d9abba5cd0092b116f8959bb568dc1e228c67814e5b26411729df14033286f74effc2ade9861d6dba5fa6a44b878c6d42c56f6922ea4998e142a718b82233dd60620c258e207015445bf4c389374c4f27579a73139d7dea7f2dbf1cc3b0ddea9fc98068e43d112d88b4a3266215dd39c16d77ed6ee244266ae6613025c0cea1172c3b6fc6decb50cc59f770dd3a8ef48a56a5b49dd1562a2a678361bf8147a6f79767950adcef9a3d0b89984956f28d50915c6650323f5a294b98e9d381c090d108f1ad88e4d19fe6cace99b1c5ab01bb80a6013396a072b5c506bd41e0c8ebf6a1258a38cda605fbb37e8f45fa882dba6a31db4217bb3139b49a63c7b2d28550fbad359106d913ed0b1b717afcef84c4fba258b07e785212544ee3f7427e653922829b3e07fe355a94ab6c186435f9cdc8585925593ab025715d0df0d0ed7f8248529d521f643585ac1adc7918eef9f0d1080c522cee1605d7272a0ad2fdaf906814793525c4e408cd409c4e2ccae835e42721502b92ded8d266936852441204386977b84ca61d613ae8d37b153c8fe875ac3e9ffd26b5b7509cdc7122a9d8d23f4dc5f1183539fbe76a83abe6a6ad4c028f0f65838717436b4b6d3d501017c333c5d2184aac2e5e9105ba09a63f4c2265378e2d69f649c44d6f291d813e6b4e004fd4bb2654cc70e6b71206a10ed3331bec66c74819e0aff77f726910ceab6dbec93048c9c8767d28487dbac866349e43ba609ddf253e80bfc2f16c72f06a089c5cdb946e187d13f45ae0893347520ffae16eacdfa58cd5c1f29555a" -} \ No newline at end of file diff --git a/contracts/test/Fibonacci.t.sol b/contracts/test/Fibonacci.t.sol index 9e065f1..bcbcf40 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/plonk-fixture.json"); + string memory path = string.concat(root, "/src/fixtures/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 71e053d5fc2dcb224ca7e43f3e0fd0300b187144..c55acc1452a8ccfa352e672370f280bfd688cfbd 100755 GIT binary patch delta 40687 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 R_8Elfy~z)x|0_%U`G4fbfbReR delta 40421 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 IF!AUA1NvX7vH$=8 diff --git a/program/Cargo.toml b/program/Cargo.toml index b5a8bb1..1ca3335 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -5,5 +5,5 @@ edition = "2021" [dependencies] alloy-sol-types = { workspace = true } -sp1-zkvm = "1.2.0" -fibonacci-lib = { path = "../lib" } +sp1-zkvm = "1.1.0" +fibonacci-lib = { path = "../lib" } \ No newline at end of file diff --git a/script/Cargo.toml b/script/Cargo.toml index 2e2ea25..dcc126b 100644 --- a/script/Cargo.toml +++ b/script/Cargo.toml @@ -12,8 +12,12 @@ path = "src/bin/main.rs" name = "evm" path = "src/bin/evm.rs" +[[bin]] +name = "vkey" +path = "src/bin/vkey.rs" + [dependencies] -sp1-sdk = "1.2.0" +sp1-sdk = "1.1.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"] } @@ -23,4 +27,4 @@ alloy-sol-types = { workspace = true } fibonacci-lib = { path = "../lib" } [build-dependencies] -sp1-helper = "1.2.0" +sp1-helper = "1.1.0" diff --git a/script/src/bin/evm.rs b/script/src/bin/evm.rs index b2940eb..7a8977e 100644 --- a/script/src/bin/evm.rs +++ b/script/src/bin/evm.rs @@ -3,15 +3,11 @@ //! //! You can run this script using the following command: //! ```shell -//! RUST_LOG=info cargo run --release --bin evm -- --system plonk -//! ``` -//! or -//! ```shell -//! RUST_LOG=info cargo run --release --bin evm -- --system groth16 +//! RUST_LOG=info cargo run --release --bin evm //! ``` use alloy_sol_types::SolType; -use clap::{Parser, ValueEnum}; +use clap::Parser; use fibonacci_lib::PublicValuesStruct; use serde::{Deserialize, Serialize}; use sp1_sdk::{HashableKey, ProverClient, SP1ProofWithPublicValues, SP1Stdin, SP1VerifyingKey}; @@ -26,15 +22,6 @@ 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 = "plonk")] - 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. @@ -67,24 +54,19 @@ fn main() { stdin.write(&args.n); println!("n: {}", args.n); - println!("Proof System: {:?}", args.system); - // 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"); + // Generate the proof. + let proof = client + .prove(&pk, stdin) + .plonk() + .run() + .expect("failed to generate proof"); - create_proof_fixture(&proof, &vk, args.system); + create_plonk_fixture(&proof, &vk); } /// Create a fixture for the given proof. -fn create_proof_fixture( - proof: &SP1ProofWithPublicValues, - vk: &SP1VerifyingKey, - system: ProofSystem, -) { +fn create_plonk_fixture(proof: &SP1ProofWithPublicValues, vk: &SP1VerifyingKey) { // Deserialize the public values. let bytes = proof.public_values.as_slice(); let PublicValuesStruct { n, a, b } = PublicValuesStruct::abi_decode(bytes, false).unwrap(); @@ -119,7 +101,7 @@ fn create_proof_fixture( 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(format!("{:?}-fixture.json", system).to_lowercase()), + fixture_path.join("fixture.json"), 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 new file mode 100644 index 0000000..0993301 --- /dev/null +++ b/script/src/bin/vkey.rs @@ -0,0 +1,27 @@ +//! 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()); +}