diff --git a/.github/workflows/prover.yml b/.github/workflows/prover.yml index 5b288021e1..dcca8dbe47 100644 --- a/.github/workflows/prover.yml +++ b/.github/workflows/prover.yml @@ -37,63 +37,75 @@ jobs: concurrent_skipping: 'same_content_newer' paths_ignore: '["**/README.md"]' - fmt: - needs: [skip_check] - if: | - github.event.pull_request.draft == false && - (github.event.action == 'ready_for_review' || needs.skip_check.outputs.should_skip != 'true') - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@master - with: - toolchain: nightly-2023-12-03 - components: rustfmt - - name: Cargo cache - uses: Swatinem/rust-cache@v2 - with: - workspaces: "prover -> target" - - name: Cargo check - run: cargo check --all-features - - name: Cargo fmt - run: cargo fmt --all -- --check - - clippy: - needs: [skip_check, fmt] - if: | - github.event.pull_request.draft == false && - (github.event.action == 'ready_for_review' || needs.skip_check.outputs.should_skip != 'true') - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@master - with: - toolchain: nightly-2023-12-03 - components: clippy - - name: Cargo cache - uses: Swatinem/rust-cache@v2 - with: - workspaces: "prover -> target" - - name: Run clippy - run: cargo clippy --all-features --all-targets -- -D warnings - - compile: - needs: [skip_check, clippy] - if: | - github.event.pull_request.draft == false && - (github.event.action == 'ready_for_review' || needs.skip_check.outputs.should_skip != 'true') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@master - with: - toolchain: nightly-2023-12-03 - - name: Cache cargo - uses: Swatinem/rust-cache@v2 - with: - workspaces: "prover -> target" - - name: Test - run: | - make prover \ No newline at end of file +# fmt: +# needs: [skip_check] +# if: | +# github.event.pull_request.draft == false && +# (github.event.action == 'ready_for_review' || needs.skip_check.outputs.should_skip != 'true') +# runs-on: ubuntu-latest +# timeout-minutes: 5 +# steps: +# - uses: actions/checkout@v4 +# - uses: dtolnay/rust-toolchain@master +# with: +# toolchain: nightly-2023-12-03 +# components: rustfmt +# - name: Cargo cache +# uses: Swatinem/rust-cache@v2 +# with: +# workspaces: "prover -> target" +# - name: Configure Git to use PAT for specific repositories +# run: | +# git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/snarkify/halo2-scroll.git".insteadOf "https://github.com/snarkify/halo2-scroll.git" +# git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/snarkify/cusnark.git".insteadOf "https://github.com/snarkify/cusnark.git" +# - name: Cargo check +# run: cargo check --all-features +# - name: Cargo fmt +# run: cargo fmt --all -- --check +# +# clippy: +# needs: [skip_check, fmt] +# if: | +# github.event.pull_request.draft == false && +# (github.event.action == 'ready_for_review' || needs.skip_check.outputs.should_skip != 'true') +# runs-on: ubuntu-latest +# timeout-minutes: 30 +# steps: +# - uses: actions/checkout@v4 +# - uses: dtolnay/rust-toolchain@master +# with: +# toolchain: nightly-2023-12-03 +# components: clippy +# - name: Cargo cache +# uses: Swatinem/rust-cache@v2 +# with: +# workspaces: "prover -> target" +# - name: Configure Git to use PAT for specific repositories +# run: | +# git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/snarkify/halo2-scroll.git".insteadOf "https://github.com/snarkify/halo2-scroll.git" +# git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/snarkify/cusnark.git".insteadOf "https://github.com/snarkify/cusnark.git" +# - name: Run clippy +# run: cargo clippy --all-features --all-targets -- -D warnings +# +# compile: +# needs: [skip_check, clippy] +# if: | +# github.event.pull_request.draft == false && +# (github.event.action == 'ready_for_review' || needs.skip_check.outputs.should_skip != 'true') +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# - uses: dtolnay/rust-toolchain@master +# with: +# toolchain: nightly-2023-12-03 +# - name: Cache cargo +# uses: Swatinem/rust-cache@v2 +# with: +# workspaces: "prover -> target" +# - name: Configure Git to use PAT for specific repositories +# run: | +# git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/snarkify/halo2-scroll.git".insteadOf "https://github.com/snarkify/halo2-scroll.git" +# git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/snarkify/cusnark.git".insteadOf "https://github.com/snarkify/cusnark.git" +# - name: Test +# run: | +# make prover \ No newline at end of file diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 065e23d21d..0f469da655 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -2,6 +2,189 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags 2.5.0", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae682f693a9cd7b058f2b0b5d9a6d7728a8555779bedbbc35dd88528611d020" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64 0.22.1", + "bitflags 2.5.0", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2 0.3.26", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd 0.13.1", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn 2.0.66", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if 1.0.0", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "actix-macros", + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b02303ce8d4e8be5b855af6cf3c3a08f3eff26880faad82bab679c22d3650cb5" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1988c02af8d2b718c05bc4aeb6a66395b7cdf32858c2c71131e5637a8c05a9ff" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes", + "bytestring", + "cfg-if 1.0.0", + "cookie", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "addr2line" version = "0.21.0" @@ -97,6 +280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -111,6 +295,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" version = "0.2.18" @@ -225,6 +424,32 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "ark-bn254" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea691771ebbb28aea556c044e2e5c5227398d840cee0c34d4d20fa8eb2689e8c" +dependencies = [ + "ark-ec", + "ark-ff 0.3.0", + "ark-std 0.3.0", +] + +[[package]] +name = "ark-ec" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea978406c4b1ca13c2db2373b05cc55429c3575b8b21f1b9ee859aa5b03dd42" +dependencies = [ + "ark-ff 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-traits", + "rayon", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.3.0" @@ -337,6 +562,7 @@ checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", "rand", + "rayon", ] [[package]] @@ -462,6 +688,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + [[package]] name = "base64" version = "0.13.1" @@ -616,6 +848,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bs58" version = "0.5.1" @@ -706,6 +959,15 @@ dependencies = [ "serde", ] +[[package]] +name = "bytestring" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +dependencies = [ + "bytes", +] + [[package]] name = "c-kzg" version = "1.0.2" @@ -753,6 +1015,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.5", ] @@ -807,6 +1070,40 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +[[package]] +name = "cloudevents-sdk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801713078518ab05d7c78508c14cf55173a14a1a6659421d3352c2576a6167bf" +dependencies = [ + "actix-http", + "actix-web", + "async-trait", + "base64 0.12.3", + "bitflags 1.3.2", + "bytes", + "chrono", + "delegate-attr", + "futures", + "hostname", + "http 0.2.12", + "serde", + "serde_json", + "snafu", + "url", + "uuid 1.9.1", + "web-sys", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "coins-bip32" version = "0.8.7" @@ -896,6 +1193,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1055,6 +1363,30 @@ dependencies = [ "cipher", ] +[[package]] +name = "cusnark" +version = "0.1.0" +source = "git+https://github.com/snarkify/cusnark.git?tag=v0.1.2#d02bb7e1abf1049b646eff39198af755176417e2" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.3.0", + "ark-std 0.3.0", + "blst", + "cc", + "cmake", + "ff 0.13.0", + "group 0.13.0", + "halo2curves", + "rand", + "rand_chacha", + "rand_core", + "rayon", + "serial_test", + "sppark", + "which", +] + [[package]] name = "darling" version = "0.13.4" @@ -1096,6 +1428,17 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +[[package]] +name = "delegate-attr" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee7e7ea0dba407429d816e8e38dda1a467cd74737722f2ccc8eae60429a1a3ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "der" version = "0.6.1" @@ -1115,6 +1458,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1160,6 +1512,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "dotenvy" version = "0.15.7" @@ -1247,7 +1605,7 @@ name = "encoder" version = "0.1.0" source = "git+https://github.com/scroll-tech/da-codec.git?tag=v0.1.0#5a28b752d4504bf0966734fe4a6a5433981c74c2" dependencies = [ - "zstd", + "zstd 0.13.0", ] [[package]] @@ -1359,7 +1717,7 @@ dependencies = [ "sha2", "sha3 0.10.8", "thiserror", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -2121,12 +2479,13 @@ dependencies = [ [[package]] name = "halo2_proofs" version = "1.1.0" -source = "git+https://github.com/scroll-tech/halo2.git?branch=v1.1#e5ddf67e5ae16be38d6368ed355c7c41906272ab" +source = "git+https://github.com/snarkify/halo2-scroll.git?tag=snarkify-v0.1.5#7ab6227e118b58c58a5ade057a6debc5fa5f7368" dependencies = [ "ark-std 0.3.0", "blake2b_simd", "cfg-if 0.1.10", "crossbeam", + "cusnark", "ff 0.13.0", "group 0.13.0", "halo2curves", @@ -2239,6 +2598,26 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + [[package]] name = "http" version = "0.2.12" @@ -2649,6 +3028,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + [[package]] name = "lazy_static" version = "1.4.0" @@ -2676,6 +3061,23 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + [[package]] name = "lock_api" version = "0.4.12" @@ -2719,6 +3121,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "maybe-rayon" version = "0.1.1" @@ -2757,6 +3174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", + "log", "wasi", "windows-sys 0.48.0", ] @@ -2854,6 +3272,16 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num" version = "0.4.3" @@ -2888,6 +3316,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -3082,6 +3516,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "pairing" version = "0.23.0" @@ -3313,6 +3753,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3375,45 +3821,12 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax", + "regex-syntax 0.8.3", "rusty-fork", "tempfile", "unarray", ] -[[package]] -name = "prover" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64 0.13.1", - "clap", - "ctor 0.2.8", - "env_logger 0.11.3", - "eth-keystore", - "ethers-core 2.0.7 (git+https://github.com/scroll-tech/ethers-rs.git?branch=v2.0.7)", - "ethers-providers 2.0.7 (git+https://github.com/scroll-tech/ethers-rs.git?branch=v2.0.7)", - "futures", - "halo2_proofs", - "hex", - "http 1.1.0", - "log", - "once_cell", - "prover 0.1.0 (git+https://github.com/scroll-tech/zkevm-circuits.git?branch=v0.10)", - "prover 0.11.0", - "rand", - "reqwest 0.12.4", - "reqwest-middleware", - "reqwest-retry", - "rlp", - "serde", - "serde_json", - "sled", - "snark-verifier-sdk", - "tiny-keccak", - "tokio", -] - [[package]] name = "prover" version = "0.1.0" @@ -3482,6 +3895,41 @@ dependencies = [ "zkevm-circuits 0.11.0", ] +[[package]] +name = "prover_runner" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.13.1", + "clap", + "ctor 0.2.8", + "env_logger 0.11.3", + "eth-keystore", + "ethers-core 2.0.7 (git+https://github.com/scroll-tech/ethers-rs.git?branch=v2.0.7)", + "ethers-providers 2.0.7 (git+https://github.com/scroll-tech/ethers-rs.git?branch=v2.0.7)", + "futures", + "halo2_proofs", + "hex", + "http 1.1.0", + "log", + "once_cell", + "prover 0.1.0", + "prover 0.11.0", + "rand", + "reqwest 0.12.4", + "reqwest-middleware", + "reqwest-retry", + "rlp", + "serde", + "serde_json", + "sled", + "snark-verifier-sdk", + "snarkify-sdk", + "tiny-keccak", + "tokio", +] + [[package]] name = "psm" version = "0.1.21" @@ -3597,8 +4045,17 @@ checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", +] + +[[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", ] [[package]] @@ -3609,9 +4066,21 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.3", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[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.3" @@ -3740,6 +4209,12 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "result-inspect" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a950f8ecfa2029aec35fed979f0a412e593926f67bf771f7b98509b08db160" + [[package]] name = "retry-policies" version = "0.3.0" @@ -4154,6 +4629,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "scc" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af947d0ca10a2f3e00c7ec1b515b7c83e5cb3fa62d4c11a64301d9eec54440e9" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.23" @@ -4191,6 +4675,12 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "sdd" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84345e4c9bd703274a082fb80caaa99b7612be48dfaa1dd9266577ec412309d" + [[package]] name = "sec1" version = "0.3.0" @@ -4416,6 +4906,31 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "serial_test" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot 0.12.3", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4470,6 +4985,24 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "1.6.4" @@ -4521,6 +5054,27 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "snafu" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab12d3c261b2308b0d80c26fffb58d17eba81a4be97890101f416b478c79ca7" +dependencies = [ + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "snark-verifier" version = "0.1.0" @@ -4566,6 +5120,28 @@ dependencies = [ "snark-verifier", ] +[[package]] +name = "snarkify-sdk" +version = "0.1.0-alpha.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff0cd1e7be7f259cf8203735e3a3574f02dbddc28679f44492fc20c909620fea" +dependencies = [ + "actix-http", + "actix-rt", + "actix-web", + "async-trait", + "chrono", + "cloudevents-sdk", + "log", + "regex", + "result-inspect", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "socket2" version = "0.5.7" @@ -4598,6 +5174,15 @@ dependencies = [ "der 0.7.9", ] +[[package]] +name = "sppark" +version = "0.1.5" +source = "git+https://github.com/snarkify/cusnark.git?tag=v0.1.2#d02bb7e1abf1049b646eff39198af755176417e2" +dependencies = [ + "cc", + "which", +] + [[package]] name = "stacker" version = "0.1.15" @@ -4795,6 +5380,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -4804,6 +5399,37 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -4838,7 +5464,9 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot 0.12.3", "pin-project-lite", + "signal-hook-registry", "socket2", "windows-sys 0.48.0", ] @@ -4952,6 +5580,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4975,6 +5604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", ] [[package]] @@ -4987,6 +5617,48 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5092,6 +5764,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -5116,6 +5789,15 @@ dependencies = [ "serde", ] +[[package]] +name = "uuid" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +dependencies = [ + "getrandom", +] + [[package]] name = "valuable" version = "0.1.0" @@ -5274,6 +5956,18 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5670,7 +6364,16 @@ name = "zstd" version = "0.13.0" source = "git+https://github.com/scroll-tech/zstd-rs?branch=hack/mul-block#5c0892b6567dab31394d701477183ce9d6a32aca" dependencies = [ - "zstd-safe", + "zstd-safe 7.0.0", +] + +[[package]] +name = "zstd" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +dependencies = [ + "zstd-safe 7.1.0", ] [[package]] @@ -5678,7 +6381,16 @@ name = "zstd-safe" version = "7.0.0" source = "git+https://github.com/scroll-tech/zstd-rs?branch=hack/mul-block#5c0892b6567dab31394d701477183ce9d6a32aca" dependencies = [ - "zstd-sys", + "zstd-sys 2.0.9+zstd.1.5.5", +] + +[[package]] +name = "zstd-safe" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +dependencies = [ + "zstd-sys 2.0.11+zstd.1.5.6", ] [[package]] @@ -5689,3 +6401,13 @@ dependencies = [ "cc", "pkg-config", ] + +[[package]] +name = "zstd-sys" +version = "2.0.11+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 192f617340..fae1e2cc82 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "prover" +name = "prover_runner" version = "0.1.0" edition = "2021" @@ -10,12 +10,13 @@ edition = "2021" ethers-signers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } halo2curves = { git = "https://github.com/scroll-tech/halo2curves", branch = "v0.1.0" } [patch."https://github.com/privacy-scaling-explorations/halo2.git"] -halo2_proofs = { git = "https://github.com/scroll-tech/halo2.git", branch = "v1.1" } +halo2_proofs = { git = "https://github.com/snarkify/halo2-scroll.git", tag = "snarkify-v0.1.5" } [patch."https://github.com/privacy-scaling-explorations/poseidon.git"] poseidon = { git = "https://github.com/scroll-tech/poseidon.git", branch = "main" } [patch."https://github.com/privacy-scaling-explorations/bls12_381"] bls12_381 = { git = "https://github.com/scroll-tech/bls12_381", branch = "feat/impl_scalar_field" } - +[patch."https://github.com/scroll-tech/halo2.git"] +halo2_proofs = { git = "https://github.com/snarkify/halo2-scroll.git", tag = "snarkify-v0.1.5" } [dependencies] anyhow = "1.0" @@ -46,3 +47,5 @@ sled = "0.34.7" http = "1.1.0" clap = { version = "4.5", features = ["derive"] } ctor = "0.2.8" +snarkify-sdk = "0.1.0-alpha.8" +async-trait = "0.1.80" diff --git a/prover/Dockerfile b/prover/Dockerfile new file mode 100644 index 0000000000..0515879704 --- /dev/null +++ b/prover/Dockerfile @@ -0,0 +1,16 @@ +# The build step is skipped, one should build on the host first +# Use the NVIDIA CUDA runtime image for the runtime stage +FROM nvidia/cuda:12.3.0-base-ubuntu22.04 + +WORKDIR /snarkify + +# Copy the build artifact from the build stage +COPY target/release/snarkify /usr/local/bin/snarkify +COPY lib/libzktrie.so /usr/local/lib/libzktrie.so +COPY config.json . +# Set environment variables +ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH \ + SCROLL_PROVER_ASSETS_DIR=/snarkify-data/assets,/snarkify-data/assets \ + RUST_MIN_STACK=100000000 +# Set the entrypoint for the container +ENTRYPOINT ["snarkify"] \ No newline at end of file diff --git a/prover/Makefile b/prover/Makefile index d0b06e7589..ec83981967 100644 --- a/prover/Makefile +++ b/prover/Makefile @@ -19,7 +19,7 @@ $(info ZKEVM_COMMIT is ${ZKEVM_COMMIT}) HALO2_GPU_VERSION=$(shell ./print_halo2gpu_version.sh | sed -n '2p') GIT_REV=$(shell git rev-parse --short HEAD) -GO_TAG=$(shell grep "var tag = " ../common/version/version.go | cut -d "\"" -f2) +GO_TAG=$(shell grep "var tag = " version.go | cut -d "\"" -f2) ifeq (${GO_TAG},) $(error GO_TAG not set) @@ -35,6 +35,7 @@ else ZK_VERSION=${ZKEVM_COMMIT}-${HALO2_GPU_VERSION} endif + prover: GO_TAG=${GO_TAG} GIT_REV=${GIT_REV} ZK_VERSION=${ZK_VERSION} cargo build --release rm -rf ./lib && mkdir ./lib @@ -50,3 +51,8 @@ lint: cargo check --all-features cargo clippy --all-features --all-targets -- -D warnings cargo fmt --all + +snarkify: + GO_TAG=${GO_TAG} GIT_REV=${GIT_REV} ZK_VERSION=${ZK_VERSION} cargo build --bin snarkify --release + rm -rf ./lib && mkdir ./lib + find target/ -name "libzktrie.so" | xargs -I{} cp {} ./lib \ No newline at end of file diff --git a/prover/README.md b/prover/README.md new file mode 100644 index 0000000000..f93d9ad722 --- /dev/null +++ b/prover/README.md @@ -0,0 +1,29 @@ +## How-to run Snarkify prover locally +1. `make snarkify` +2. download parameters and assets to the referred directory in `config.json`, +following step3 & 4 in https://www.notion.so/scrollzkp/How-to-run-a-batch-prover-locally-43fee225911f4375a61a232cdea1e546 +3. setting up envrionment variable +```shell +export LD_LIBRARY_PATH=$(pwd)/lib:$LD_LIBRARY_PATH +export SCROLL_PROVER_ASSETS_DIR=assets,assets +export RUST_MIN_STACK=100000000 +export CHAIN_ID=534351 #update here, 534351 for sepolia, and 534352 for mainnet +``` +4. run `./target/release/snarkify` +5. In a different shell, run `run_batch.sh` to submit a sample job to the prover to generate proof + +## How-to run Snarkify prover docker +under the scroll/prover directory, run +1. `make snarkify` +2. `docker build -t scroll-prover-gpu:latest .` +3. `docker run -v /home/ubuntu/scroll/volume:/snarkify-data -p 8080:8080 scroll-prover-gpu` +4. In a different shell, run `run_batch.sh` to submit a sample job to the prover to generate proof + +## How-to run Snarkify prover remotely +ssh to gpu-5 +1. `cd scroll/scroll/prover` +2. build the docker image following above instructions +3. `snarkify deploy --tag "{your_tag}" --image scroll-prover-gpu:latest` +4. Follow the printed instruction to check if the deployment is done, it should show {your_tag} if it is successful +5. `snarkify task create --file prover_input.json` to create a new proof task +6. you should get a {task_id} if the task is created, then use `snarkify task log {task_id}` to stream the logs \ No newline at end of file diff --git a/prover/config.json b/prover/config.json index daaf989f53..2421faf555 100644 --- a/prover/config.json +++ b/prover/config.json @@ -6,21 +6,21 @@ "proof_type": 2, "low_version_circuit": { "hard_fork_name": "bernoulli", - "params_path": "params", - "assets_path": "assets" + "params_path": "/snarkify-data/params", + "assets_path": "/snarkify-data/assets" }, "high_version_circuit": { "hard_fork_name": "curie", - "params_path": "params", - "assets_path": "assets" + "params_path": "/snarkify-data/params", + "assets_path": "/snarkify-data/assets" }, "coordinator": { - "base_url": "http://localhost:8555", + "base_url": "https://sepolia-coordinator.scroll.io", "retry_count": 10, "retry_wait_time_sec": 10, "connection_timeout_sec": 30 }, "l2geth": { - "endpoint": "http://localhost:9999" + "endpoint": "https://purple-cool-grass.scroll-testnet.quiknode.pro/7c71f2df0436f31b249b4158a1ef4dc1ddfe5248/" } } diff --git a/prover/run_batch.sh b/prover/run_batch.sh new file mode 100644 index 0000000000..a2a52637a0 --- /dev/null +++ b/prover/run_batch.sh @@ -0,0 +1,7 @@ +curl --location --request POST 'http://localhost:8080' --header 'Content-Type: application/json' --header 'ce-specversion: 1.0' --header 'ce-id: abcdef123456' --header 'ce-source: test' --header 'ce-type: com.test.example' --data-raw '{ + "uuid": "104787d8-f1f3-4aad-84b4-455199e53dba", + "id": "1234567890", + "type": 2, + "hard_fork_name": "curie", + "task_data": "{\"chunk_proofs\":[{\"protocol\":\"eyJkb21haW4iOnsiayI6MjUsIm4iOjMzNTU0NDMyLCJuX2ludiI6WzAsMCwwLDU0OTc1NTgxMzg4OF0sImdlbiI6WzEzMzM4NjA1OTI0MjczMzY0NDQyLDExNDQwNDQ5NzA0MjQ4NDUxMDk2LDE2ODU5NjA5MzY1OTEyNDc3NDUyLDM0MjEyNTIzMjQzNjUxODQ3NThdLCJnZW5faW52IjpbMjczODI0Mjk4MDQ2NzM5MjA2NCw4NzY1NDYwMTYyODUwMTM5NDIwLDY2Mzc4MTQwODQ0OTI0NzMyMTYsMTI2MDQ5MzcwNzMzOTExNTI3Nl19LCJwcmVwcm9jZXNzZWQiOlt7IngiOls0NTQxNDc4ODQyNTg3NjE3Njc4LDcxODg0NzU3MTg1NzE1Njc3MjgsMjM5Mzc4Njk2ODIzMDEwMzczLDE3OTM0MjE1NDI1NzM2MjQ5MV0sInkiOlsyMTAyOTYwNzY1NDgyMzg0NjA1LDE4MTYzMDgzNzk2NTcyNzMxMDYzLDE3OTQzNDgwODY2MjE3MjY2Nzc0LDg1MTAzODc1MDA2MzI4ODk2XX0seyJ4IjpbMTU0MTM5NDE5MDQ3OTY2MjQ2NSw0NTYyMzEyMTM2OTUyOTgzNDE5LDM3ODgyNDEyMjM0ODIyNTM0ODksMTU5OTQzMDczNjQ0MDg0MjI3NV0sInkiOlszNzI4MzM3MzIwNTAzOTAyOTc1LDEyNDgzNzI3NzkxNDAwMzY2MDI1LDUyNjI3NTUwMTM5NTE4NDA0ODgsMjY0MjIyMTkxNTEyNzUwMDEzM119LHsieCI6WzcxMDE4NDQ3NDcyNDQ0OTY1NDYsODAwODEyMDQyMTY5MjYzMzg2MCw2MDYzMjk4NzcxMjA1NDg1MTI0LDEzODY1MjU1MjE5ODE3NDYzNTFdLCJ5IjpbMTIxOTk0NDI1NDU3OTA3NDE0NTcsOTQ2MjU3MDM5NDg4Mjg0NTY3Niw4NzQ5MDY2OTAyMjgwNDk5OTc2LDIxMjc2ODA0Nzc0NjI3NzI2ODBdfSx7IngiOls4MzU1NTMxODkwNzgyNTgzODc0LDE4MzUwODA5NjI5MzM2MjE5NTQ3LDE3NDU1NTIyNzkzMTU3NDQ2MjkxLDYzMTg1MjYzNDI2NTkyODAyXSwieSI6WzIxNTE3MzQ0ODYyMjM3NTAxNjAsMjA3NDM5NTQ1ODM2MTMxMDY2LDQxMDI1Njg1NjI1MDE3NzAwODcsMzM2MzE0NjMxMjkxNjM0Nzg0OV19LHsieCI6WzE3OTQ3ODE2Njk1NDk1NjE1NTQ0LDg1MzA0Njc2ODk3MjU2NjQ2NzMsMTc3MjQ5NjA2MDk2OTMwNjA4MDEsMTE1NTU3Njc2OTU5ODAxMDM4NV0sInkiOlsyOTg0ODI5MTQyMDQ2NzcyMDU1LDE3NTIxMjc5NTQ0OTEwODYyMDEzLDE5NTI4NDIzNzIxMzU4ODY1MzMsMTM0OTYxMTkxNTIxOTk5NDAyNF19LHsieCI6WzE3OTQ3Nzc0OTMzNjg4MDI0ODYwLDI3NjU5NDI5Mjc3NjU2NjU2MSwzNzE2ODUxNzE2NzI4NzE2ODE3LDMwMjkwNjI1NzQyNzkxMDQzNTZdLCJ5IjpbMTUxOTYxOTYwNjkwMDk2NjIwMDYsMTQ1NDE5MDQxMTIyOTY2MzA1OSwxODE2NDU0MTYwNDQyMDE4OTM2OSwzNDAwOTM0OTM3NTcyOTk0MDI4XX0seyJ4IjpbNTE0Mjc2Mzc5MTMyMjE0Mzk4NSw4NTI4NTgxNzI5MjI1OTk1NzM2LDEyNzkxNTA2MjkzNTEyMDMzNzI0LDI3MTQxNTUwODQxODgyMTk4NjNdLCJ5IjpbMTgwOTM1NDM2MDQ1NDE5MTc5MTUsMTQwNzMwMDA4OTg1MTE4NTIwNDEsMTM2NTU3ODYxMjk2NDYzMDA2NywzNDMwOTc1MTIzMjExMTc5MDExXX1dLCJudW1faW5zdGFuY2UiOls0NF0sIm51bV93aXRuZXNzIjpbMSwxLDNdLCJudW1fY2hhbGxlbmdlIjpbMSwyLDFdLCJldmFsdWF0aW9ucyI6W3sicG9seSI6OCwicm90YXRpb24iOjB9LHsicG9seSI6OCwicm90YXRpb24iOjF9LHsicG9seSI6OCwicm90YXRpb24iOjJ9LHsicG9seSI6OCwicm90YXRpb24iOjN9LHsicG9seSI6MSwicm90YXRpb24iOjB9LHsicG9seSI6MCwicm90YXRpb24iOjB9LHsicG9seSI6Miwicm90YXRpb24iOjB9LHsicG9seSI6Mywicm90YXRpb24iOjB9LHsicG9seSI6MTIsInJvdGF0aW9uIjowfSx7InBvbHkiOjQsInJvdGF0aW9uIjowfSx7InBvbHkiOjUsInJvdGF0aW9uIjowfSx7InBvbHkiOjYsInJvdGF0aW9uIjowfSx7InBvbHkiOjEwLCJyb3RhdGlvbiI6MH0seyJwb2x5IjoxMCwicm90YXRpb24iOjF9LHsicG9seSI6MTEsInJvdGF0aW9uIjowfSx7InBvbHkiOjExLCJyb3RhdGlvbiI6MX0seyJwb2x5Ijo5LCJyb3RhdGlvbiI6MH1dLCJxdWVyaWVzIjpbeyJwb2x5Ijo4LCJyb3RhdGlvbiI6MH0seyJwb2x5Ijo4LCJyb3RhdGlvbiI6MX0seyJwb2x5Ijo4LCJyb3RhdGlvbiI6Mn0seyJwb2x5Ijo4LCJyb3RhdGlvbiI6M30seyJwb2x5IjoxMCwicm90YXRpb24iOjB9LHsicG9seSI6MTAsInJvdGF0aW9uIjoxfSx7InBvbHkiOjExLCJyb3RhdGlvbiI6MH0seyJwb2x5IjoxMSwicm90YXRpb24iOjF9LHsicG9seSI6OSwicm90YXRpb24iOjB9LHsicG9seSI6MSwicm90YXRpb24iOjB9LHsicG9seSI6MCwicm90YXRpb24iOjB9LHsicG9seSI6Miwicm90YXRpb24iOjB9LHsicG9seSI6Mywicm90YXRpb24iOjB9LHsicG9seSI6NCwicm90YXRpb24iOjB9LHsicG9seSI6NSwicm90YXRpb24iOjB9LHsicG9seSI6Niwicm90YXRpb24iOjB9LHsicG9seSI6MTMsInJvdGF0aW9uIjowfSx7InBvbHkiOjEyLCJyb3RhdGlvbiI6MH1dLCJxdW90aWVudCI6eyJudW1fY2h1bmsiOjQsImNodW5rX2RlZ3JlZSI6MSwibnVtZXJhdG9yIjp7IkRpc3RyaWJ1dGVQb3dlcnMiOltbeyJQcm9kdWN0IjpbeyJQb2x5bm9taWFsIjp7InBvbHkiOjIsInJvdGF0aW9uIjowfX0seyJTdW0iOlt7IlN1bSI6W3siUG9seW5vbWlhbCI6eyJwb2x5Ijo4LCJyb3RhdGlvbiI6MH19LHsiUHJvZHVjdCI6W3siUG9seW5vbWlhbCI6eyJwb2x5Ijo4LCJyb3RhdGlvbiI6MX19LHsiUG9seW5vbWlhbCI6eyJwb2x5Ijo4LCJyb3RhdGlvbiI6Mn19XX1dfSx7Ik5lZ2F0ZWQiOnsiUG9seW5vbWlhbCI6eyJwb2x5Ijo4LCJyb3RhdGlvbiI6M319fV19XX0seyJQcm9kdWN0IjpbeyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjowfX0seyJTdW0iOlt7IkNvbnN0YW50IjpbMTI0MzYxODQ3MTcyMzYxMDkzMDcsMzk2MjE3MjE1NzE3NTMxOTg0OSw3MzgxMDE2NTM4NDY0NzMyNzE4LDEwMTE3NTI3Mzk2OTQ2OTgyODddfSx7Ik5lZ2F0ZWQiOnsiUG9seW5vbWlhbCI6eyJwb2x5IjoxMCwicm90YXRpb24iOjB9fX1dfV19LHsiUHJvZHVjdCI6W3siQ29tbW9uUG9seW5vbWlhbCI6eyJMYWdyYW5nZSI6LTd9fSx7IlN1bSI6W3siUHJvZHVjdCI6W3siUG9seW5vbWlhbCI6eyJwb2x5IjoxMCwicm90YXRpb24iOjB9fSx7IlBvbHlub21pYWwiOnsicG9seSI6MTAsInJvdGF0aW9uIjowfX1dfSx7Ik5lZ2F0ZWQiOnsiUG9seW5vbWlhbCI6eyJwb2x5IjoxMCwicm90YXRpb24iOjB9fX1dfV19LHsiUHJvZHVjdCI6W3siU3VtIjpbeyJTdW0iOlt7IkNvbnN0YW50IjpbMTI0MzYxODQ3MTcyMzYxMDkzMDcsMzk2MjE3MjE1NzE3NTMxOTg0OSw3MzgxMDE2NTM4NDY0NzMyNzE4LDEwMTE3NTI3Mzk2OTQ2OTgyODddfSx7Ik5lZ2F0ZWQiOnsiQ29tbW9uUG9seW5vbWlhbCI6eyJMYWdyYW5nZSI6LTd9fX1dfSx7Ik5lZ2F0ZWQiOnsiU3VtIjpbeyJTdW0iOlt7IlN1bSI6W3siU3VtIjpbeyJTdW0iOlt7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi02fX0seyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjotNX19XX0seyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjotNH19XX0seyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjotM319XX0seyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjotMn19XX0seyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjotMX19XX19XX0seyJTdW0iOlt7IlByb2R1Y3QiOlt7IlBvbHlub21pYWwiOnsicG9seSI6MTAsInJvdGF0aW9uIjoxfX0seyJQcm9kdWN0IjpbeyJQcm9kdWN0IjpbeyJTdW0iOlt7IlN1bSI6W3siUG9seW5vbWlhbCI6eyJwb2x5IjoxLCJyb3RhdGlvbiI6MH19LHsiUHJvZHVjdCI6W3siQ2hhbGxlbmdlIjoxfSx7IlBvbHlub21pYWwiOnsicG9seSI6NCwicm90YXRpb24iOjB9fV19XX0seyJDaGFsbGVuZ2UiOjJ9XX0seyJTdW0iOlt7IlN1bSI6W3siUG9seW5vbWlhbCI6eyJwb2x5Ijo4LCJyb3RhdGlvbiI6MH19LHsiUHJvZHVjdCI6W3siQ2hhbGxlbmdlIjoxfSx7IlBvbHlub21pYWwiOnsicG9seSI6NSwicm90YXRpb24iOjB9fV19XX0seyJDaGFsbGVuZ2UiOjJ9XX1dfSx7IlN1bSI6W3siU3VtIjpbeyJQb2x5bm9taWFsIjp7InBvbHkiOjcsInJvdGF0aW9uIjowfX0seyJQcm9kdWN0IjpbeyJDaGFsbGVuZ2UiOjF9LHsiUG9seW5vbWlhbCI6eyJwb2x5Ijo2LCJyb3RhdGlvbiI6MH19XX1dfSx7IkNoYWxsZW5nZSI6Mn1dfV19XX0seyJOZWdhdGVkIjp7IlByb2R1Y3QiOlt7IlBvbHlub21pYWwiOnsicG9seSI6MTAsInJvdGF0aW9uIjowfX0seyJQcm9kdWN0IjpbeyJQcm9kdWN0IjpbeyJTdW0iOlt7IlN1bSI6W3siUG9seW5vbWlhbCI6eyJwb2x5IjoxLCJyb3RhdGlvbiI6MH19LHsiUHJvZHVjdCI6W3siUHJvZHVjdCI6W3siQ2hhbGxlbmdlIjoxfSx7IkNvbnN0YW50IjpbMTI0MzYxODQ3MTcyMzYxMDkzMDcsMzk2MjE3MjE1NzE3NTMxOTg0OSw3MzgxMDE2NTM4NDY0NzMyNzE4LDEwMTE3NTI3Mzk2OTQ2OTgyODddfV19LHsiQ29tbW9uUG9seW5vbWlhbCI6IklkZW50aXR5In1dfV19LHsiQ2hhbGxlbmdlIjoyfV19LHsiU3VtIjpbeyJTdW0iOlt7IlBvbHlub21pYWwiOnsicG9seSI6OCwicm90YXRpb24iOjB9fSx7IlByb2R1Y3QiOlt7IlByb2R1Y3QiOlt7IkNoYWxsZW5nZSI6MX0seyJDb25zdGFudCI6WzExMTAwMzAyMzQ1ODUwMjkyMzA5LDUxMDkzODMzNDE3ODg1ODM0ODQsNjQ1MDE4MjAzOTIyNjMzMzA5NSwyNDk4MTY2NDcyMTU1NjY0ODEzXX1dfSx7IkNvbW1vblBvbHlub21pYWwiOiJJZGVudGl0eSJ9XX1dfSx7IkNoYWxsZW5nZSI6Mn1dfV19LHsiU3VtIjpbeyJTdW0iOlt7IlBvbHlub21pYWwiOnsicG9seSI6Nywicm90YXRpb24iOjB9fSx7IlByb2R1Y3QiOlt7IlByb2R1Y3QiOlt7IkNoYWxsZW5nZSI6MX0seyJDb25zdGFudCI6WzExOTIyMTQzOTExMjIxMTAxMDM5LDQ3NjI4NTUzMzU4Nzk0OTMyNzUsOTYzNDg1MjgxMjk4NDU4MzQzNywyMTA0MzQyMjY1NTUxMjkyODk0XX1dfSx7IkNvbW1vblBvbHlub21pYWwiOiJJZGVudGl0eSJ9XX1dfSx7IkNoYWxsZW5nZSI6Mn1dfV19XX19XX1dfSx7IlByb2R1Y3QiOlt7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOjB9fSx7IlBvbHlub21pYWwiOnsicG9seSI6MTEsInJvdGF0aW9uIjowfX1dfSx7IlByb2R1Y3QiOlt7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi03fX0seyJQb2x5bm9taWFsIjp7InBvbHkiOjExLCJyb3RhdGlvbiI6MH19XX0seyJQcm9kdWN0IjpbeyJTdW0iOlt7IlN1bSI6W3siQ29uc3RhbnQiOlsxMjQzNjE4NDcxNzIzNjEwOTMwNywzOTYyMTcyMTU3MTc1MzE5ODQ5LDczODEwMTY1Mzg0NjQ3MzI3MTgsMTAxMTc1MjczOTY5NDY5ODI4N119LHsiTmVnYXRlZCI6eyJDb21tb25Qb2x5bm9taWFsIjp7IkxhZ3JhbmdlIjotN319fV19LHsiTmVnYXRlZCI6eyJTdW0iOlt7IlN1bSI6W3siU3VtIjpbeyJTdW0iOlt7IlN1bSI6W3siQ29tbW9uUG9seW5vbWlhbCI6eyJMYWdyYW5nZSI6LTZ9fSx7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi01fX1dfSx7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi00fX1dfSx7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi0zfX1dfSx7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi0yfX1dfSx7IkNvbW1vblBvbHlub21pYWwiOnsiTGFncmFuZ2UiOi0xfX1dfX1dfSx7IlN1bSI6W3siUHJvZHVjdCI6W3siUHJvZHVjdCI6W3siU3VtIjpbeyJEaXN0cmlidXRlUG93ZXJzIjpbW3siUG9seW5vbWlhbCI6eyJwb2x5IjowLCJyb3RhdGlvbiI6MH19XSx7IkNoYWxsZW5nZSI6MH1dfSx7IkNoYWxsZW5nZSI6MX1dfSx7IlN1bSI6W3siRGlzdHJpYnV0ZVBvd2VycyI6W1t7IlByb2R1Y3QiOlt7IlBvbHlub21pYWwiOnsicG9seSI6Mywicm90YXRpb24iOjB9fSx7IlBvbHlub21pYWwiOnsicG9seSI6OCwicm90YXRpb24iOjB9fV19XSx7IkNoYWxsZW5nZSI6MH1dfSx7IkNoYWxsZW5nZSI6MX1dfV19LHsiU3VtIjpbeyJQb2x5bm9taWFsIjp7InBvbHkiOjExLCJyb3RhdGlvbiI6MX19LHsiTmVnYXRlZCI6eyJQb2x5bm9taWFsIjp7InBvbHkiOjExLCJyb3RhdGlvbiI6MH19fV19XX0seyJOZWdhdGVkIjp7IlN1bSI6W3siU3VtIjpbeyJEaXN0cmlidXRlUG93ZXJzIjpbW3siUG9seW5vbWlhbCI6eyJwb2x5IjowLCJyb3RhdGlvbiI6MH19XSx7IkNoYWxsZW5nZSI6MH1dfSx7IkNoYWxsZW5nZSI6MX1dfSx7Ik5lZ2F0ZWQiOnsiUHJvZHVjdCI6W3siUG9seW5vbWlhbCI6eyJwb2x5Ijo5LCJyb3RhdGlvbiI6MH19LHsiU3VtIjpbeyJEaXN0cmlidXRlUG93ZXJzIjpbW3siUHJvZHVjdCI6W3siUG9seW5vbWlhbCI6eyJwb2x5IjozLCJyb3RhdGlvbiI6MH19LHsiUG9seW5vbWlhbCI6eyJwb2x5Ijo4LCJyb3RhdGlvbiI6MH19XX1dLHsiQ2hhbGxlbmdlIjowfV19LHsiQ2hhbGxlbmdlIjoxfV19XX19XX19XX1dfV0seyJDaGFsbGVuZ2UiOjN9XX19LCJ0cmFuc2NyaXB0X2luaXRpYWxfc3RhdGUiOlsxMjM0NzgyODg0NDA3NjYwNzk2OCwzNTA4ODYwNDk5MjU0NDAxNTIyLDE0NTM2MTMzOTk2NTMxMTU3NzE0LDMxMjYzMjMxODQ0NTE4OTk4MTNdLCJpbnN0YW5jZV9jb21taXR0aW5nX2tleSI6bnVsbCwibGluZWFyaXphdGlvbiI6bnVsbCwiYWNjdW11bGF0b3JfaW5kaWNlcyI6W1tbMCwwXSxbMCwxXSxbMCwyXSxbMCwzXSxbMCw0XSxbMCw1XSxbMCw2XSxbMCw3XSxbMCw4XSxbMCw5XSxbMCwxMF0sWzAsMTFdXV19\",\"proof\":\"bH6Ztz91DGhAJsJPVkOcY/v/KIfK01vF+7EXJ7n6/UC49cPijDzP2QWDpBPZk1d84YUNQDbpd8rzOHF3uDbLa3RiSdHWiDZCYNKKgiVG/V6MnG4zXH+aH0myGsYCX/BqIEPpx4TvjLAdlognr3tUl0MIWnVSZClgO8SJpC0EKBkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJpAFsT4uZi8n0PUbKeTMbwZDZSQNlJklSjmm4GZIW8BlF5vjwiIGZSZ0O1pmSO33L2elT14J5UUEriXag7h319IsMvmf1auMIGo+EbeivYwQBeHBMaouRZYVGmUhwsyVMYYLfmylICnCNoNCQs4VLghbtrYGip5pl2rxNR6Ck4YmVLJ9mzeI15QThvc2ydkihERv2+1N3DcGAaRCkXK0R0a5n8hhK/Pmh76wFV5fIMCZshRIGqxnLbLyqDODVG7I7GW2ounIFaKoZvHgn3GpiE0/wCg4r8SNAvkokIHR5sGfCymPcb4D8yV9D4/KuX2T3xaeNX/L6os/6Wgd8kgMx2H5dQl6NFvlqJ3TL3fL6+g1SBPz6+9R0fl/6U0jMfEAYTkabyhbDEK1rDWlW8xi/xAMPZAa3J7Q2wflAxEUmAfHBGdbaSJWqI+qWZlvW2PNvYslbSry+c+/XyqF6TP3S6gw5r5nX2eoljVp13RbBNFcq1CfWDAt8J7qimGzIYSBQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA08oYIca7CwOn46ZFcPHz27FutixCmsYcjwLEEgckQiLjedWb4mciy7kuuRmbKJVjZOH9uLu8pmqn6a5MNf0VDqmp7PlctwuYlug4z/IXvh+TzaO6q6XXPJsS9EMN538DM8d/ngUq90tDBVMGrEy9Q42HiQAq2rirNLorqbWFICXMiFnzIBWz9Llsch9h9rtYPMSeDVUGiZ+AEpB1YKPdCJsm5oGNzMbjP/8Xsi7HXTOzdQtqTv/5V+njNV2fzNArkxgGnizUxt8ScA0d4meTAQ94kW6ZvfHun2/xwvPNjQnzkRJ6t943+aatYPWKSXWAVjvAJVrxZKO3CcJ6IEblHetYY3AwvqKJ1y+1mjNdrcOciFZMC3IFI8Vdw3L/3kAVexsmN5c0wZHbXApyyTOCcf8VB8J73pgpW3dJgalERS0=\",\"instances\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAKqFF0/7mMySuG1MAAAAAAAAAAAAAAAAAAAAAAAAAAADD5PiGJp8+m/qIPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoFaUQNXxv3NNiAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZnXI9AJqi4GocoAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ8264f6mSdCshfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQmUmIAtyS5ehnAAAAAAAAAAAAAAAAAAAAAAAAAAAANZhdef+5Q2d+/yEAAAAAAAAAAAAAAAAAAAAAAAAAAABOW0G8SfAIiMvVzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQk5SA0w+xujgAAAAAAAAAAAAAAAAAAAAAAAAAAAAUzYxCsNvCh63vqMAAAAAAAAAAAAAAAAAAAAAAAAAAADi7YKamY4umaDXOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATrM5aCBe4GVNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxA==\",\"vk\":\"AAAAGQAAAATyWEABRbJ6hQQ5/zLX1gTasr7349minA9rSgMS6gDeHwZKqikRiO3md+pXjjxMHnKQtmXYgMXhJSvlmZ+Ws+cheuly2X1RuNQzcZuRImaKPR9LJsVZYsXfJbuqdKX8p0Gj8G83wMJOmTzNVUyUol0w0lTU+CEiTpHOnxBsTF3EWaW3s1u4ycOgWt1c9M6s7WmaBZLYgAWYCunO5CLCLApNGbCASeck/LuSoedEri5u6HccCKU2khG6zl6W07jvYSbDVLJktbjRiHv+/HQix+K14j8boo8Z/unhpwXCsPxkQA==\",\"git_version\":\"38a68e2\",\"chunk_info\":{\"chain_id\":534351,\"prev_state_root\":\"0x00606f93fb83982e0281082031a9163da456139d69d7176fbb7f6e26e9158fa0\",\"post_state_root\":\"0x2af56683123a4bfeef31e1bddb9005b8f7d7ea3eba34b20c8f5b3400a7cc365b\",\"withdraw_root\":\"0xce7ee5a0936755a7218162d7299782db38d7887b59438c4cd09ff4b3aedcb933\",\"data_hash\":\"0x53bf52be14b624c7819705364687417d620b1a9ab6b122fe48bbfc4e62529df3\",\"tx_bytes\":\"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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAidQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAidQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAAAAAAAAAAAAAAAA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\",\"is_padding\":false}}],\"chunk_infos\":[{\"chain_id\":534351,\"prev_state_root\":\"0x00606f93fb83982e0281082031a9163da456139d69d7176fbb7f6e26e9158fa0\",\"post_state_root\":\"0x2af56683123a4bfeef31e1bddb9005b8f7d7ea3eba34b20c8f5b3400a7cc365b\",\"withdraw_root\":\"0xce7ee5a0936755a7218162d7299782db38d7887b59438c4cd09ff4b3aedcb933\",\"data_hash\":\"0x53bf52be14b624c7819705364687417d620b1a9ab6b122fe48bbfc4e62529df3\",\"tx_bytes\":\"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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAidQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAidQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzAAAAAAAAAAAAAAAAAAA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\",\"is_padding\":false}]}" +}' \ No newline at end of file diff --git a/prover/src/bin/snarkify.rs b/prover/src/bin/snarkify.rs new file mode 100644 index 0000000000..1f8eac5285 --- /dev/null +++ b/prover/src/bin/snarkify.rs @@ -0,0 +1,51 @@ +use std::io; + +use async_trait::async_trait; +use prover_runner::{ + config::{AssetsDirEnvConfig, Config}, + prover_core::Prover, + types::{ProofDetail, Task}, + version, +}; +use snarkify_sdk::prover::ProofHandler; +use std::cell::RefCell; + +struct MyProofHandler; + +fn init_prover() -> Prover<'static> { + let config: Config = + Config::from_file("config.json".to_string()).expect("Failed to load config"); + + if let Err(e) = AssetsDirEnvConfig::init() { + log::error!("AssetsDirEnvConfig init failed: {:#}", e); + std::process::exit(-2); + } + + log::info!( + "Starting prover. name: {}, type: {:?}, version: {}", + config.prover_name, + config.proof_type, + version::get_version(), + ); + + Prover::new(Box::leak(Box::new(config))).expect("Failed to create prover") +} + +thread_local! { + static PROVER: RefCell> = RefCell::new(init_prover()); +} + +#[async_trait] +impl ProofHandler for MyProofHandler { + type Input = Task; + type Output = ProofDetail; + type Error = String; + + async fn prove(data: Self::Input) -> Result { + PROVER.with_borrow(|p| p.prove_task(&data).map_err(|e| e.to_string())) + } +} + +fn main() -> Result<(), io::Error> { + snarkify_sdk::run::() +} diff --git a/prover/src/lib.rs b/prover/src/lib.rs new file mode 100644 index 0000000000..a32833a597 --- /dev/null +++ b/prover/src/lib.rs @@ -0,0 +1,12 @@ +pub mod config; +mod coordinator_client; +mod geth_client; +mod key_signer; +mod prover; +pub mod prover_core; +mod task_cache; +mod task_processor; +pub mod types; +mod utils; +pub mod version; +mod zk_circuits_handler; diff --git a/prover/src/prover_core.rs b/prover/src/prover_core.rs new file mode 100644 index 0000000000..b18730598f --- /dev/null +++ b/prover/src/prover_core.rs @@ -0,0 +1,73 @@ +use anyhow::{Context, Ok, Result}; + +use std::{cell::RefCell, rc::Rc}; + +use crate::{ + config::Config, + geth_client::GethClient, + key_signer::KeySigner, + types::ProofType, + zk_circuits_handler::{CircuitsHandler, CircuitsHandlerProvider}, +}; + +use super::types::{ProofDetail, Task}; + +pub struct Prover<'a> { + config: &'a Config, + circuits_handler_provider: RefCell>, +} + +impl<'a> Prover<'a> { + pub fn new(config: &'a Config) -> Result { + let proof_type = config.proof_type; + let keystore_path = &config.keystore_path; + let keystore_password = &config.keystore_password; + + let geth_client = if config.proof_type == ProofType::Chunk { + Some(Rc::new(RefCell::new( + GethClient::new( + &config.prover_name, + &config.l2geth.as_ref().unwrap().endpoint, + ) + .context("failed to create l2 geth_client")?, + ))) + } else { + None + }; + + let provider = CircuitsHandlerProvider::new(proof_type, config, geth_client.clone()) + .context("failed to create circuits handler provider")?; + + let prover = Prover { + config, + circuits_handler_provider: RefCell::new(provider), + }; + + Ok(prover) + } + + pub fn get_proof_type(&self) -> ProofType { + self.config.proof_type + } + + pub fn prove_task(&self, task: &Task) -> Result { + log::info!("[prover] start to prove_task, task id: {}", task.id); + let handler: Rc> = self + .circuits_handler_provider + .borrow_mut() + .get_circuits_handler(&task.hard_fork_name) + .context("failed to get circuit handler")?; + self.do_prove(task, handler) + } + + fn do_prove(&self, task: &Task, handler: Rc>) -> Result { + let mut proof_detail = ProofDetail { + id: task.id.clone(), + proof_type: task.task_type, + ..Default::default() + }; + + proof_detail.proof_data = handler.get_proof_data(task.task_type, task)?; + Ok(proof_detail) + } +}