diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f6b333ebe..aff994348 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -167,7 +167,7 @@ jobs: env: RUSTFLAGS: "-C opt-level=3" run: | - cargo run --release --package ceno_recursion --bin e2e -- --platform=ceno --max-cycle-per-shard=1600 examples/target/riscv32im-ceno-zkvm-elf/release/examples/keccak_syscall + cargo run --release --package ceno_recursion --bin e2e_aggregate -- --platform=ceno --max-cycle-per-shard=1600 examples/target/riscv32im-ceno-zkvm-elf/release/examples/keccak_syscall - name: Install cargo make run: | diff --git a/Cargo.lock b/Cargo.lock index a08b43f8f..5f3d9f948 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,7 +160,7 @@ dependencies = [ "proptest", "rand 0.9.2", "ruint", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "sha3", "tiny-keccak", @@ -613,17 +613,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "aurora-engine-modexp" version = "1.2.0" @@ -700,6 +689,26 @@ dependencies = [ "serde", ] +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -944,6 +953,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bytesize" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" + [[package]] name = "c-kzg" version = "2.1.4" @@ -973,7 +988,7 @@ name = "cargo-ceno" version = "0.1.0" dependencies = [ "anyhow", - "bincode", + "bincode 1.3.3", "cargo_metadata 0.19.2", "ceno_emul", "ceno_host", @@ -1105,7 +1120,7 @@ dependencies = [ "num-traits", "rayon", "rrs-succinct", - "rustc-hash 2.1.1", + "rustc-hash", "secp", "serde", "smallvec", @@ -1143,7 +1158,7 @@ dependencies = [ name = "ceno_recursion" version = "0.1.0" dependencies = [ - "bincode", + "bincode 1.3.3", "ceno-examples", "ceno_emul", "ceno_host", @@ -1157,6 +1172,8 @@ dependencies = [ "openvm", "openvm-circuit", "openvm-continuations", + "openvm-cuda-backend", + "openvm-instructions", "openvm-native-circuit", "openvm-native-compiler", "openvm-native-compiler-derive", @@ -1166,7 +1183,6 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "p3 0.1.0 (git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.18)", - "p3-monty-31", "parse-size", "rand 0.8.5", "serde", @@ -1212,7 +1228,7 @@ name = "ceno_zkvm" version = "0.1.0" dependencies = [ "base64", - "bincode", + "bincode 1.3.3", "ceno-examples", "ceno_emul", "ceno_host", @@ -1243,7 +1259,7 @@ dependencies = [ "proptest", "rand 0.8.5", "rayon", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "serde_json", "sp1-curves", @@ -1411,12 +1427,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1597,6 +1607,22 @@ dependencies = [ "memchr", ] +[[package]] +name = "ctor" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67773048316103656a637612c4a62477603b777d91d9c62ff2290f9cde178fdb" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + [[package]] name = "cuda_hal" version = "0.1.0" @@ -1696,6 +1722,20 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "dashu" version = "0.4.2" @@ -1876,19 +1916,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.101", -] - [[package]] name = "derive_more" version = "1.0.0" @@ -1990,6 +2017,21 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dtor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + [[package]] name = "dyn-clone" version = "1.0.20" @@ -2131,29 +2173,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "primitive-types", - "uint", -] - [[package]] name = "examples" version = "0.1.0" @@ -2432,7 +2451,7 @@ dependencies = [ name = "gkr_iop" version = "0.1.0" dependencies = [ - "bincode", + "bincode 1.3.3", "criterion", "cuda_hal", "cudarc", @@ -2524,69 +2543,6 @@ dependencies = [ "halo2_proofs", ] -[[package]] -name = "halo2-axiom" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aee3f8178b78275038e5ea0e2577140056d2c4c87fccaf6777dc0a8eebe455a" -dependencies = [ - "blake2b_simd", - "crossbeam", - "ff 0.13.1", - "group 0.13.0", - "halo2curves-axiom", - "itertools 0.11.0", - "maybe-rayon", - "pairing 0.23.0", - "rand 0.8.5", - "rand_core 0.6.4", - "rayon", - "rustc-hash 1.1.0", - "sha3", - "tracing", -] - -[[package]] -name = "halo2-base" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678cf3adc0a39d7b4d9b82315a655201aa24a430dd1902b162c508047f56ac69" -dependencies = [ - "getset", - "halo2-axiom", - "itertools 0.11.0", - "log", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "poseidon-primitives", - "rand_chacha 0.3.1", - "rayon", - "rustc-hash 1.1.0", - "serde", - "serde_json", -] - -[[package]] -name = "halo2-ecc" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c00681fdd1febaf552d8814e9f5a6a142d81a1514102190da07039588b366" -dependencies = [ - "halo2-base", - "itertools 0.11.0", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "rayon", - "serde", - "serde_json", - "test-case", -] - [[package]] name = "halo2_proofs" version = "0.1.0" @@ -3022,15 +2978,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -3148,9 +3095,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libgit2-sys" @@ -3310,16 +3257,6 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "memchr" version = "2.7.4" @@ -3401,7 +3338,7 @@ name = "mpcs" version = "0.1.0" source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.15#9be620b18900138d0b89569759fc2b3b9451b49e" dependencies = [ - "bincode", + "bincode 1.3.3", "clap", "ff_ext 0.1.0 (git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.15)", "itertools 0.13.0", @@ -3425,7 +3362,7 @@ name = "mpcs" version = "0.1.0" source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.18#f53336217179d70df37852fc850b786d4bc82f15" dependencies = [ - "bincode", + "bincode 1.3.3", "clap", "ff_ext 0.1.0 (git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.18)", "itertools 0.13.0", @@ -3812,8 +3749,8 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openvm" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "bytemuck", "num-bigint 0.4.6", @@ -3825,13 +3762,14 @@ dependencies = [ [[package]] name = "openvm-algebra-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "eyre", - "itertools 0.14.0", + "halo2curves-axiom", "num-bigint 0.4.6", "num-traits", "openvm-algebra-transpiler", @@ -3847,15 +3785,14 @@ dependencies = [ "openvm-stark-sdk", "rand 0.8.5", "serde", - "serde-big-array", "serde_with", "strum", ] [[package]] name = "openvm-algebra-complex-macros" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-macros-common", "quote", @@ -3864,8 +3801,8 @@ dependencies = [ [[package]] name = "openvm-algebra-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "halo2curves-axiom", "num-bigint 0.4.6", @@ -3880,8 +3817,8 @@ dependencies = [ [[package]] name = "openvm-algebra-moduli-macros" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "num-bigint 0.4.6", "num-prime", @@ -3892,8 +3829,8 @@ dependencies = [ [[package]] name = "openvm-algebra-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-algebra-guest", "openvm-instructions", @@ -3906,9 +3843,10 @@ dependencies = [ [[package]] name = "openvm-bigint-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "openvm-bigint-transpiler", @@ -3928,8 +3866,8 @@ dependencies = [ [[package]] name = "openvm-bigint-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-platform", "strum_macros", @@ -3937,8 +3875,8 @@ dependencies = [ [[package]] name = "openvm-bigint-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-bigint-guest", "openvm-instructions", @@ -3952,8 +3890,8 @@ dependencies = [ [[package]] name = "openvm-build" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "cargo_metadata 0.18.1", "eyre", @@ -3964,11 +3902,12 @@ dependencies = [ [[package]] name = "openvm-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "backtrace", "cfg-if", + "dashmap", "derivative", "derive-new 0.6.0", "derive_more 1.0.0", @@ -3976,16 +3915,23 @@ dependencies = [ "eyre", "getset", "itertools 0.14.0", + "libc", + "memmap2", "metrics", "openvm-circuit-derive", "openvm-circuit-primitives", "openvm-circuit-primitives-derive", + "openvm-cuda-backend", + "openvm-cuda-builder", + "openvm-cuda-common", "openvm-instructions", "openvm-poseidon2-air", "openvm-stark-backend", + "openvm-stark-sdk", "p3-baby-bear", + "p3-field", "rand 0.8.5", - "rustc-hash 2.1.1", + "rustc-hash", "serde", "serde-big-array", "static_assertions", @@ -3995,24 +3941,28 @@ dependencies = [ [[package]] name = "openvm-circuit-derive" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "itertools 0.14.0", + "proc-macro2", "quote", "syn 2.0.101", ] [[package]] name = "openvm-circuit-primitives" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "derive-new 0.6.0", "itertools 0.14.0", "num-bigint 0.4.6", "num-traits", "openvm-circuit-primitives-derive", + "openvm-cuda-backend", + "openvm-cuda-builder", + "openvm-cuda-common", "openvm-stark-backend", "rand 0.8.5", "tracing", @@ -4020,8 +3970,8 @@ dependencies = [ [[package]] name = "openvm-circuit-primitives-derive" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "itertools 0.14.0", "quote", @@ -4030,8 +3980,8 @@ dependencies = [ [[package]] name = "openvm-continuations" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "derivative", "openvm-circuit", @@ -4043,10 +3993,65 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "openvm-cuda-backend" +version = "1.2.1" +source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.1#dde6cdaf105cc57d1609fd49568c7bce0a066cc2" +dependencies = [ + "bincode 2.0.1", + "bincode_derive", + "derivative", + "derive-new 0.7.0", + "itertools 0.14.0", + "lazy_static", + "metrics", + "openvm-cuda-builder", + "openvm-cuda-common", + "openvm-stark-backend", + "openvm-stark-sdk", + "p3-baby-bear", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-merkle-tree", + "p3-symmetric", + "p3-util", + "rustc-hash", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "openvm-cuda-builder" +version = "1.2.1" +source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.1#dde6cdaf105cc57d1609fd49568c7bce0a066cc2" +dependencies = [ + "cc", + "glob", +] + +[[package]] +name = "openvm-cuda-common" +version = "1.2.1" +source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.1#dde6cdaf105cc57d1609fd49568c7bce0a066cc2" +dependencies = [ + "bytesize", + "ctor", + "lazy_static", + "metrics", + "openvm-cuda-builder", + "thiserror 1.0.69", + "tracing", +] + [[package]] name = "openvm-custom-insn" version = "0.1.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "proc-macro2", "quote", @@ -4055,11 +4060,13 @@ dependencies = [ [[package]] name = "openvm-ecc-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", + "halo2curves-axiom", "hex-literal", "lazy_static", "num-bigint 0.4.6", @@ -4069,13 +4076,12 @@ dependencies = [ "openvm-circuit", "openvm-circuit-derive", "openvm-circuit-primitives", - "openvm-circuit-primitives-derive", "openvm-ecc-transpiler", "openvm-instructions", "openvm-mod-circuit-builder", "openvm-rv32-adapters", - "openvm-rv32im-circuit", "openvm-stark-backend", + "rand 0.8.5", "serde", "serde_with", "strum", @@ -4083,8 +4089,8 @@ dependencies = [ [[package]] name = "openvm-ecc-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "ecdsa 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", "elliptic-curve", @@ -4102,8 +4108,8 @@ dependencies = [ [[package]] name = "openvm-ecc-sw-macros" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-macros-common", "quote", @@ -4112,8 +4118,8 @@ dependencies = [ [[package]] name = "openvm-ecc-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-ecc-guest", "openvm-instructions", @@ -4126,8 +4132,8 @@ dependencies = [ [[package]] name = "openvm-instructions" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "backtrace", "derive-new 0.6.0", @@ -4143,8 +4149,8 @@ dependencies = [ [[package]] name = "openvm-instructions-derive" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "quote", "syn 2.0.101", @@ -4152,9 +4158,10 @@ dependencies = [ [[package]] name = "openvm-keccak256-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "itertools 0.14.0", @@ -4170,24 +4177,22 @@ dependencies = [ "p3-keccak-air", "rand 0.8.5", "serde", - "serde-big-array", "strum", "tiny-keccak", - "tracing", ] [[package]] name = "openvm-keccak256-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-platform", ] [[package]] name = "openvm-keccak256-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-instructions", "openvm-instructions-derive", @@ -4200,36 +4205,36 @@ dependencies = [ [[package]] name = "openvm-macros-common" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "syn 2.0.101", ] [[package]] name = "openvm-mod-circuit-builder" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "itertools 0.14.0", "num-bigint 0.4.6", "num-traits", "openvm-circuit", "openvm-circuit-primitives", + "openvm-cuda-builder", "openvm-instructions", "openvm-stark-backend", "openvm-stark-sdk", "rand 0.8.5", - "serde", - "serde_with", "tracing", ] [[package]] name = "openvm-native-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "eyre", @@ -4238,24 +4243,27 @@ dependencies = [ "openvm-circuit-derive", "openvm-circuit-primitives", "openvm-circuit-primitives-derive", + "openvm-cuda-backend", + "openvm-cuda-builder", + "openvm-cuda-common", "openvm-instructions", "openvm-native-compiler", "openvm-poseidon2-air", "openvm-rv32im-circuit", + "openvm-rv32im-transpiler", "openvm-stark-backend", "openvm-stark-sdk", + "p3-field", "rand 0.8.5", "serde", - "serde-big-array", "static_assertions", "strum", - "tracing", ] [[package]] name = "openvm-native-compiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "backtrace", "itertools 0.14.0", @@ -4269,7 +4277,6 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "serde", - "snark-verifier-sdk", "strum", "strum_macros", "zkhash", @@ -4277,8 +4284,8 @@ dependencies = [ [[package]] name = "openvm-native-compiler-derive" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "quote", "syn 2.0.101", @@ -4286,13 +4293,12 @@ dependencies = [ [[package]] name = "openvm-native-recursion" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "cfg-if", "itertools 0.14.0", "lazy_static", - "once_cell", "openvm-circuit", "openvm-native-circuit", "openvm-native-compiler", @@ -4306,15 +4312,13 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "serde_with", - "snark-verifier-sdk", "tracing", ] [[package]] name = "openvm-native-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-instructions", "openvm-transpiler", @@ -4323,28 +4327,26 @@ dependencies = [ [[package]] name = "openvm-pairing-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "eyre", "halo2curves-axiom", - "itertools 0.14.0", "num-bigint 0.4.6", "num-traits", "openvm-algebra-circuit", "openvm-circuit", "openvm-circuit-derive", "openvm-circuit-primitives", - "openvm-circuit-primitives-derive", "openvm-ecc-circuit", "openvm-ecc-guest", "openvm-instructions", "openvm-mod-circuit-builder", "openvm-pairing-guest", "openvm-pairing-transpiler", - "openvm-rv32-adapters", "openvm-rv32im-circuit", "openvm-stark-backend", "rand 0.8.5", @@ -4354,8 +4356,8 @@ dependencies = [ [[package]] name = "openvm-pairing-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "halo2curves-axiom", "hex-literal", @@ -4375,11 +4377,10 @@ dependencies = [ [[package]] name = "openvm-pairing-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-instructions", - "openvm-instructions-derive", "openvm-pairing-guest", "openvm-stark-backend", "openvm-transpiler", @@ -4389,8 +4390,8 @@ dependencies = [ [[package]] name = "openvm-platform" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "libm", "openvm-custom-insn", @@ -4399,11 +4400,12 @@ dependencies = [ [[package]] name = "openvm-poseidon2-air" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "derivative", "lazy_static", + "openvm-cuda-builder", "openvm-stark-backend", "openvm-stark-sdk", "p3-monty-31", @@ -4416,8 +4418,8 @@ dependencies = [ [[package]] name = "openvm-rv32-adapters" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "derive-new 0.6.0", "itertools 0.14.0", @@ -4429,16 +4431,14 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "rand 0.8.5", - "serde", - "serde-big-array", - "serde_with", ] [[package]] name = "openvm-rv32im-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "eyre", @@ -4453,14 +4453,13 @@ dependencies = [ "openvm-stark-backend", "rand 0.8.5", "serde", - "serde-big-array", "strum", ] [[package]] name = "openvm-rv32im-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-custom-insn", "p3-field", @@ -4469,8 +4468,8 @@ dependencies = [ [[package]] name = "openvm-rv32im-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-instructions", "openvm-instructions-derive", @@ -4485,12 +4484,12 @@ dependencies = [ [[package]] name = "openvm-sdk" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ - "async-trait", "bitcode", "bon", + "cfg-if", "clap", "derivative", "derive_more 1.0.0", @@ -4526,21 +4525,21 @@ dependencies = [ "openvm-stark-sdk", "openvm-transpiler", "p3-fri", + "rand 0.8.5", "rrs-lib", "serde", "serde_json", "serde_with", - "snark-verifier", - "snark-verifier-sdk", "tempfile", "thiserror 1.0.69", + "toml", "tracing", ] [[package]] name = "openvm-sha256-air" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-circuit-primitives", "openvm-stark-backend", @@ -4550,15 +4549,15 @@ dependencies = [ [[package]] name = "openvm-sha256-circuit" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ + "cfg-if", "derive-new 0.6.0", "derive_more 1.0.0", "openvm-circuit", "openvm-circuit-derive", "openvm-circuit-primitives", - "openvm-circuit-primitives-derive", "openvm-instructions", "openvm-rv32im-circuit", "openvm-sha256-air", @@ -4573,16 +4572,16 @@ dependencies = [ [[package]] name = "openvm-sha256-guest" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-platform", ] [[package]] name = "openvm-sha256-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "openvm-instructions", "openvm-instructions-derive", @@ -4595,13 +4594,14 @@ dependencies = [ [[package]] name = "openvm-stark-backend" -version = "1.1.1" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.1.1#0879de162658b797b8dd6b6ee4429cbb8dd78ba1" +version = "1.2.1" +source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.1#dde6cdaf105cc57d1609fd49568c7bce0a066cc2" dependencies = [ "bitcode", "cfg-if", "derivative", "derive-new 0.7.0", + "eyre", "itertools 0.14.0", "metrics", "p3-air", @@ -4613,19 +4613,21 @@ dependencies = [ "p3-uni-stark", "p3-util", "rayon", - "rustc-hash 2.1.1", + "rustc-hash", "serde", + "serde_json", "thiserror 1.0.69", "tracing", ] [[package]] name = "openvm-stark-sdk" -version = "1.1.1" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.1.1#0879de162658b797b8dd6b6ee4429cbb8dd78ba1" +version = "1.2.1" +source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.1#dde6cdaf105cc57d1609fd49568c7bce0a066cc2" dependencies = [ + "dashmap", "derivative", - "derive_more 0.99.20", + "derive_more 1.0.0", "ff 0.13.1", "itertools 0.14.0", "metrics", @@ -4657,8 +4659,8 @@ dependencies = [ [[package]] name = "openvm-transpiler" -version = "1.3.0" -source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fceno_leaves#8590149a1aed64dd66d4c03d7943e483fe0755bd" +version = "1.4.1" +source = "git+https://github.com/scroll-tech/openvm.git?branch=feat%2Fv1.4.1-scroll-ext#097e353b718628c7256cc1cac4b7a07101e7c887" dependencies = [ "elf", "eyre", @@ -5309,21 +5311,6 @@ dependencies = [ "serde", ] -[[package]] -name = "poseidon-primitives" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4aaeda7a092e21165cc5f0cbc738e72a46f31c03c3cbd87b71ceae9d2d93bc" -dependencies = [ - "bitvec", - "ff 0.13.1", - "lazy_static", - "log", - "rand 0.8.5", - "rand_xorshift", - "thiserror 1.0.69", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -5983,12 +5970,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -6403,50 +6384,6 @@ dependencies = [ "serde", ] -[[package]] -name = "snark-verifier" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c426469de23e6a799d6755465df2aec9bec12e5a263c817394c28b833614da6" -dependencies = [ - "halo2-base", - "halo2-ecc", - "hex", - "itertools 0.11.0", - "lazy_static", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "pairing 0.23.0", - "rand 0.8.5", - "ruint", - "serde", - "sha3", -] - -[[package]] -name = "snark-verifier-sdk" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc442a507abb490f3c2f5e2a0be2626b1d9d9ea2137fb240c6ddf5a8377e24" -dependencies = [ - "bincode", - "ethereum-types", - "getset", - "halo2-base", - "hex", - "itertools 0.11.0", - "lazy_static", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "serde_json", - "snark-verifier", -] - [[package]] name = "snowbridge-amcl" version = "1.0.2" @@ -6730,39 +6667,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "test-case" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" -dependencies = [ - "test-case-macros", -] - -[[package]] -name = "test-case-core" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "test-case-macros" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "test-case-core", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -7191,6 +7095,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "url" version = "2.5.4" @@ -7286,6 +7196,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -7393,7 +7309,7 @@ name = "whir" version = "0.1.0" source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.15#9be620b18900138d0b89569759fc2b3b9451b49e" dependencies = [ - "bincode", + "bincode 1.3.3", "clap", "derive_more 1.0.0", "ff_ext 0.1.0 (git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.15)", @@ -7416,7 +7332,7 @@ name = "whir" version = "0.1.0" source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.18#f53336217179d70df37852fc850b786d4bc82f15" dependencies = [ - "bincode", + "bincode 1.3.3", "clap", "derive_more 1.0.0", "ff_ext 0.1.0 (git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.18)", diff --git a/Cargo.toml b/Cargo.toml index 66089f2ba..a7f10f33d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,19 +36,6 @@ transcript = { git = "https://github.com/scroll-tech/gkr-backend.git", package = whir = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "whir", tag = "v1.0.0-alpha.18" } witness = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "witness", tag = "v1.0.0-alpha.18" } -# openvm -openvm = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-circuit = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false, features = ["bench-metrics"] } -openvm-continuations = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-native-circuit = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-native-compiler = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-native-compiler-derive = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-native-recursion = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-rv32im-circuit = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false } -openvm-sdk = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/ceno_leaves", default-features = false, features = ["evm-prove"] } -openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.1.1", default-features = false } -openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.1.1", default-features = false } - alloy-primitives = "1.3" anyhow = { version = "1.0", default-features = false } bincode = "1" @@ -100,6 +87,22 @@ uint = "0.8" ceno_gpu = { git = "https://github.com/scroll-tech/ceno-gpu-mock.git", package = "cuda_hal", branch = "main", default-features = false, features = ["bb31"] } cudarc = { version = "0.17.3", features = ["driver", "cuda-version-from-build-system"] } +# ceno-recursion dependencies +openvm = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-circuit = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-continuations = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-instructions = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-native-circuit = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-native-compiler = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-native-compiler-derive = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-native-recursion = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-rv32im-circuit = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } +openvm-sdk = { git = "https://github.com/scroll-tech/openvm.git", branch = "feat/v1.4.1-scroll-ext", default-features = false } + +openvm-cuda-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.1", default-features = false } +openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.1", default-features = false } +openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.1", default-features = false } + [profile.dev] lto = "thin" # We are running our tests with optimizations turned on to make them faster. @@ -134,3 +137,15 @@ lto = "thin" #transcript = { path = "../gkr-backend/crates/transcript", package = "transcript" } #whir = { path = "../gkr-backend/crates/whir", package = "whir" } #witness = { path = "../gkr-backend/crates/witness", package = "witness" } + +# [patch."https://github.com/scroll-tech/openvm.git"] +# openvm = { path = "../openvm-scroll-tech/crates/toolchain/openvm", default-features = false } +# openvm-circuit = { path = "../openvm-scroll-tech/crates/vm", default-features = false } +# openvm-continuations = { path = "../openvm-scroll-tech/crates/continuations", default-features = false } +# openvm-instructions = { path = "../openvm-scroll-tech/crates/toolchain/instructions", default-features = false } +# openvm-native-circuit = { path = "../openvm-scroll-tech/extensions/native/circuit", default-features = false } +# openvm-native-compiler = { path = "../openvm-scroll-tech/extensions/native/compiler", default-features = false } +# openvm-native-compiler-derive = { path = "../openvm-scroll-tech/extensions/native/compiler/derive", default-features = false } +# openvm-native-recursion = { path = "../openvm-scroll-tech/extensions/native/recursion", default-features = false } +# openvm-rv32im-circuit = { path = "../openvm-scroll-tech/extensions/rv32im/circuit", default-features = false } +# openvm-sdk = { path = "../openvm-scroll-tech/crates/sdk", default-features = false } diff --git a/ceno_cli/src/sdk.rs b/ceno_cli/src/sdk.rs index a32595ba4..67c357bca 100644 --- a/ceno_cli/src/sdk.rs +++ b/ceno_cli/src/sdk.rs @@ -1,10 +1,7 @@ #![allow(dead_code)] use ceno_emul::{Platform, Program}; use ceno_recursion::{ - aggregation::{ - CenoLeafVmVerifierConfig, CenoRecursionVerifierKeys, INTERNAL_LOG_BLOWUP, LEAF_LOG_BLOWUP, - ROOT_LOG_BLOWUP, SBOX_SIZE, - }, + aggregation::{CenoAggregationProver, CenoRecursionProvingKeys, CenoRecursionVerifierKeys}, zkvm_verifier::binding::E, }; use ceno_zkvm::{ @@ -15,24 +12,12 @@ use ceno_zkvm::{ use ff_ext::{BabyBearExt4, ExtensionField}; use gkr_iop::hal::ProverBackend; use mpcs::{Basefold, BasefoldRSParams, PolynomialCommitmentScheme}; -use openvm_circuit::{ - arch::{MemoryConfig, SystemConfig, VirtualMachine}, - system::program::trace::VmCommittedExe, -}; -use openvm_continuations::verifier::{ - common::types::VmVerifierPvs, - internal::{InternalVmVerifierConfig, types::InternalVmVerifierPvs}, -}; -use openvm_native_circuit::NativeConfig; -use openvm_native_compiler::conversion::CompilerOptions; -use openvm_sdk::prover::vm::{local::VmLocalProver, types::VmProvingKey}; +use openvm_circuit::arch::VmInstance; +use openvm_native_circuit::{NativeBuilder, NativeConfig}; +use openvm_sdk::prover::vm::new_local_prover; use openvm_stark_backend::config::StarkGenericConfig; -use openvm_stark_sdk::{ - config::{ - FriParameters, - baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine}, - }, - engine::StarkFriEngine, +use openvm_stark_sdk::config::baby_bear_poseidon2::{ + BabyBearPoseidon2Config, BabyBearPoseidon2Engine, }; use std::{marker::PhantomData, sync::Arc}; @@ -58,12 +43,7 @@ pub struct Sdk< // aggregation pub zkvm_agg: Option>>, - pub agg_pk: Option<( - Arc>, - Arc>, - Arc>, - Arc>, - )>, + pub agg_pk: Option>, phantom: PhantomData, } @@ -119,15 +99,7 @@ where } #[allow(clippy::type_complexity)] - pub fn set_agg_pk( - &mut self, - agg_pk: ( - Arc>, - Arc>, - Arc>, - Arc>, - ), - ) { + pub fn set_agg_pk(&mut self, agg_pk: CenoRecursionProvingKeys) { self.agg_pk = Some(agg_pk); } @@ -183,149 +155,42 @@ where pub fn create_agg_prover( &mut self, ) -> ( - VmLocalProver, - VmLocalProver, + VmInstance, + VmInstance, ) { - let (ceno_leaf_agg_pk, leaf_committed_exe, internal_vm_pk, internal_committed_exe) = - self.agg_pk.clone().unwrap_or_else(|| { - let Some(app_vk) = self.zkvm_vk.clone() else { - panic!("set app vk first"); - }; - - tracing::debug!( - "empty agg proving/verifying key detected — running key generation..." - ); - let [leaf_fri_params, internal_fri_params, _root_fri_params] = - [LEAF_LOG_BLOWUP, INTERNAL_LOG_BLOWUP, ROOT_LOG_BLOWUP] - .map(FriParameters::standard_with_100_bits_conjectured_security); - - let leaf_vm_config = NativeConfig { - system: SystemConfig::new( - SBOX_SIZE.min(leaf_fri_params.max_constraint_degree()), - MemoryConfig { - max_access_adapter_n: 16, - ..Default::default() - }, - VmVerifierPvs::::width(), - ) - .with_max_segment_len((1 << 24) - 100) - .with_profiling(), - native: Default::default(), - }; - - let leaf_committed_exe: Arc> = { - let leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); - let leaf_program = CenoLeafVmVerifierConfig { - vk: app_vk, - compiler_options: CompilerOptions::default().with_cycle_tracker(), - } - .build_program(); - - Arc::new(VmCommittedExe::commit( - leaf_program.into(), - leaf_engine.config.pcs(), - )) - }; - - // let recursion_proving_keys = RecursionProvingKeys::keygen(leaf_fri_params, leaf_vm_config); - let ceno_leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); - let ceno_leaf_vm_pk = Arc::new({ - let vm = VirtualMachine::new(ceno_leaf_engine, leaf_vm_config.clone()); - let vm_pk = vm.keygen(); - assert!(vm_pk.max_constraint_degree <= leaf_fri_params.max_constraint_degree()); - VmProvingKey { - fri_params: leaf_fri_params, - vm_config: leaf_vm_config, - vm_pk, - } - }); - - // Internal engine and config - let internal_engine = BabyBearPoseidon2Engine::new(internal_fri_params); - let internal_vm_config = NativeConfig { - system: SystemConfig::new( - SBOX_SIZE.min(internal_fri_params.max_constraint_degree()), - MemoryConfig { - max_access_adapter_n: 8, - ..Default::default() - }, - InternalVmVerifierPvs::::width(), - ) - .with_max_segment_len((1 << 24) - 100), - native: Default::default(), - }; - - // Construct internal vm, pk and vk - let internal_vm = VirtualMachine::new(internal_engine, internal_vm_config.clone()); - let internal_vm_pk = Arc::new({ - let vm_pk = internal_vm.keygen(); - assert!( - vm_pk.max_constraint_degree <= internal_fri_params.max_constraint_degree() - ); - VmProvingKey { - fri_params: internal_fri_params, - vm_config: internal_vm_config, - vm_pk, - } - }); - let internal_vm_vk = internal_vm_pk.vm_pk.get_vk(); - - // Commit internal program - let internal_program = InternalVmVerifierConfig { - leaf_fri_params, - internal_fri_params, - compiler_options: CompilerOptions::default(), - } - .build_program(&ceno_leaf_vm_pk.vm_pk.get_vk(), &internal_vm_vk); - let internal_committed_exe: Arc> = - Arc::new(VmCommittedExe::commit( - internal_program.into(), - internal_vm.engine.config.pcs(), - )); - - ( - ceno_leaf_vm_pk, - leaf_committed_exe, - internal_vm_pk, - internal_committed_exe, - ) - }); - - let leaf_prover = VmLocalProver::<_, NativeConfig, BabyBearPoseidon2Engine>::new( - ceno_leaf_agg_pk.clone(), - leaf_committed_exe.clone(), - ); + let vb = NativeBuilder::default(); + + if let Some(agg_pk) = self.agg_pk.as_ref() { + let leaf_prover = new_local_prover::( + vb.clone(), + &agg_pk.leaf_vm_pk, + agg_pk.leaf_committed_exe.exe.clone(), + ) + .expect("leaf prover"); + let internal_prover = new_local_prover::( + vb.clone(), + &agg_pk.internal_vm_pk, + agg_pk.internal_committed_exe.exe.clone(), + ) + .expect("internal prover"); + + return (leaf_prover, internal_prover); + } - let internal_prover = VmLocalProver::<_, NativeConfig, BabyBearPoseidon2Engine>::new( - internal_vm_pk.clone(), - internal_committed_exe.clone(), - ); + let agg_prover = CenoAggregationProver::new(vb, self.zkvm_vk.clone().unwrap()); // set to agg_pk - self.agg_pk = Some(( - ceno_leaf_agg_pk, - leaf_committed_exe, - internal_vm_pk, - internal_committed_exe, - )); + self.agg_pk = Some(agg_prover.pk.clone()); - (leaf_prover, internal_prover) + (agg_prover.leaf_prover, agg_prover.internal_prover) } - pub fn create_agg_verifier(&self) -> CenoRecursionVerifierKeys { - let Some((ceno_leaf_agg_pk, _leaf_committed_exe, internal_vm_pk, internal_committed_exe)) = - self.agg_pk.as_ref() - else { + pub fn create_agg_verifier(&self) -> CenoRecursionVerifierKeys { + let Some(agg_pk) = self.agg_pk.as_ref() else { panic!("empty agg_pk") }; - CenoRecursionVerifierKeys { - ceno_leaf_vm_vk: ceno_leaf_agg_pk.vm_pk.get_vk(), - ceno_leaf_fri_params: ceno_leaf_agg_pk.fri_params, - internal_vm_vk: internal_vm_pk.vm_pk.get_vk(), - ceno_internal_fri_params: internal_vm_pk.fri_params, - internal_commit: internal_committed_exe.get_program_commit().into(), - } + agg_pk.get_vk() } } diff --git a/ceno_recursion/Cargo.toml b/ceno_recursion/Cargo.toml index dfaa4095b..3b978aa56 100644 --- a/ceno_recursion/Cargo.toml +++ b/ceno_recursion/Cargo.toml @@ -21,6 +21,19 @@ gkr_iop = { path = "../gkr_iop" } itertools.workspace = true mpcs.workspace = true multilinear_extensions.workspace = true +openvm.workspace = true +openvm-circuit.workspace = true +openvm-continuations.workspace = true +openvm-cuda-backend = { workspace = true, optional = true } +openvm-instructions.workspace = true +openvm-native-circuit.workspace = true +openvm-native-compiler.workspace = true +openvm-native-compiler-derive.workspace = true +openvm-native-recursion.workspace = true +openvm-rv32im-circuit.workspace = true +openvm-sdk.workspace = true +openvm-stark-backend.workspace = true +openvm-stark-sdk.workspace = true p3.workspace = true parse-size = "1.1" rand.workspace = true @@ -34,34 +47,14 @@ transcript.workspace = true whir.workspace = true witness.workspace = true -# openvm -openvm.workspace = true -openvm-circuit.workspace = true -openvm-continuations.workspace = true -openvm-native-circuit.workspace = true -openvm-native-compiler.workspace = true -openvm-native-compiler-derive.workspace = true -openvm-native-recursion.workspace = true -openvm-rv32im-circuit.workspace = true -openvm-sdk.workspace = true - -# openvm = { path = "../../openvm-scroll-tech/crates/toolchain/openvm", default-features = false } -# openvm-circuit = { path = "../../openvm-scroll-tech/crates/vm", default-features = false, features = ["bench-metrics"] } -# openvm-native-circuit = { path = "../../openvm-scroll-tech/extensions/native/circuit", default-features = false } -# openvm-sdk = { path = "../../openvm-scroll-tech/crates/sdk", default-features = false } -# openvm-native-compiler = { path = "../../openvm-scroll-tech/extensions/native/compiler", default-features = false } -# openvm-native-compiler-derive = { path = "../../openvm-scroll-tech/extensions/native/compiler/derive", default-features = false } -# openvm-native-recursion = { path = "../../openvm-scroll-tech/extensions/native/recursion", default-features = false } -# openvm-continuations = { path = "../../openvm-scroll-tech/crates/continuations", default-features = false } -# openvm-rv32im-circuit = { path = "../../openvm-scroll-tech/extensions/rv32im/circuit", default-features = false } - -openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.1.1", default-features = false } -openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.1.1", default-features = false } -p3-monty-31 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb" } +[[bin]] +name = "e2e_aggregate" +path = "src/bin/e2e_aggregate.rs" [features] -bench-metrics = ["openvm-circuit/bench-metrics"] +bench-metrics = ["openvm-circuit/metrics"] default = ["parallel", "nightly-features"] +gpu = ["openvm-circuit/cuda", "openvm-native-circuit/cuda", "dep:openvm-cuda-backend"] nightly-features = [ "ceno_zkvm/nightly-features", "openvm-stark-sdk/nightly-features", diff --git a/ceno_recursion/src/aggregation/mod.rs b/ceno_recursion/src/aggregation/mod.rs index 93bb80c1c..35fc94e88 100644 --- a/ceno_recursion/src/aggregation/mod.rs +++ b/ceno_recursion/src/aggregation/mod.rs @@ -1,18 +1,39 @@ use crate::zkvm_verifier::{ - binding::{E, F, ZKVMProofInput}, - verifier::verify_zkvm_proof, + binding::{ + E, F, SepticExtensionVariable, SepticPointVariable, ZKVMProofInput, ZKVMProofInputVariable, + }, + verifier::{add_septic_points_in_place, verify_zkvm_proof}, +}; +use ceno_emul::Tracer; +use ceno_zkvm::{ + instructions::riscv::constants::{ + END_PC_IDX, INIT_CYCLE_IDX, INIT_PC_IDX, SHARD_ID_IDX, SHARD_RW_SUM_IDX, + }, + scheme::{ZKVMProof, constants::SEPTIC_EXTENSION_DEGREE}, + structs::ZKVMVerifyingKey, }; -use ceno_zkvm::{scheme::ZKVMProof, structs::ZKVMVerifyingKey}; use mpcs::{Basefold, BasefoldRSParams}; -use openvm_circuit::arch::{VirtualMachine, instructions::program::Program}; +use openvm_circuit::{ + arch::{ + MemoryConfig, SystemConfig, VirtualMachine, VmInstance, instructions::program::Program, + }, + system::program::trace::VmCommittedExe, + utils::air_test_impl, +}; + use openvm_continuations::{ C, verifier::{ common::types::VmVerifierPvs, - internal::types::{InternalVmVerifierInput, InternalVmVerifierPvs, VmStarkProof}, + internal::{ + InternalVmVerifierConfig, + types::{InternalVmVerifierInput, InternalVmVerifierPvs, VmStarkProof}, + }, }, }; -use openvm_native_circuit::NativeConfig; +#[cfg(feature = "gpu")] +use openvm_cuda_backend::engine::GpuBabyBearPoseidon2Engine as BabyBearPoseidon2Engine; +use openvm_native_circuit::{NativeBuilder, NativeConfig}; use openvm_native_compiler::{ asm::AsmBuilder, conversion::{CompilerOptions, convert_program}, @@ -22,30 +43,194 @@ use openvm_native_recursion::hints::Hintable; use openvm_sdk::{ SC, commit::AppExecutionCommit, - prover::vm::{SingleSegmentVmProver, local::VmLocalProver}, + config::DEFAULT_NUM_CHILDREN_INTERNAL, + prover::vm::{new_local_prover, types::VmProvingKey}, +}; +use openvm_stark_backend::{ + config::{Com, StarkGenericConfig}, + engine::StarkEngine, }; -use openvm_stark_backend::engine::StarkEngine; +#[cfg(not(feature = "gpu"))] +use openvm_stark_sdk::config::baby_bear_poseidon2::BabyBearPoseidon2Engine; use openvm_stark_sdk::{ - config::{FriParameters, baby_bear_poseidon2::BabyBearPoseidon2Engine}, + config::{ + FriParameters, baby_bear_poseidon2::BabyBearPoseidon2Config, + fri_params::standard_fri_params_with_100_bits_conjectured_security, + }, engine::StarkFriEngine, openvm_stark_backend::keygen::types::MultiStarkVerifyingKey, p3_bn254_fr::Bn254Fr, }; +use p3::field::FieldAlgebra; use serde::{Deserialize, Serialize}; -use std::{borrow::Borrow, fs::File, time::Instant}; +use std::{borrow::Borrow, fs::File, sync::Arc, time::Instant}; pub type RecPcs = Basefold; use openvm_circuit::{ arch::{ CONNECTOR_AIR_ID, PROGRAM_AIR_ID, PROGRAM_CACHED_TRACE_INDEX, PUBLIC_VALUES_AIR_ID, + SingleSegmentVmProver, hasher::{Hasher, poseidon2::vm_poseidon2_hasher}, + instructions::exe::VmExe, }, system::{memory::CHUNK, program::trace::compute_exe_commit}, }; +use openvm_native_compiler::{ + asm::AsmConfig, + ir::{Array, Builder, Config, Felt}, +}; +use openvm_sdk::util::check_max_constraint_degrees; +use openvm_stark_backend::proof::Proof; +pub type InnerConfig = AsmConfig; pub const LEAF_LOG_BLOWUP: usize = 1; pub const INTERNAL_LOG_BLOWUP: usize = 2; pub const ROOT_LOG_BLOWUP: usize = 3; pub const SBOX_SIZE: usize = 7; +const VM_MAX_TRACE_HEIGHTS: &[u32] = &[ + 4194304, 4, 128, 2097152, 8388608, 4194304, 262144, 8388608, 16777216, 2097152, 16777216, + 2097152, 8388608, 262144, 2097152, 1048576, 4194304, 1048576, 262144, +]; +pub struct CenoAggregationProver { + pub leaf_prover: VmInstance, + pub internal_prover: VmInstance, + pub vk: CenoRecursionVerifierKeys, + pub pk: CenoRecursionProvingKeys, +} + +impl CenoAggregationProver { + pub fn new( + vm_builder: NativeBuilder, + vk: ZKVMVerifyingKey>, + ) -> Self { + let vb = NativeBuilder::default(); + let [leaf_fri_params, internal_fri_params, _root_fri_params] = + [LEAF_LOG_BLOWUP, INTERNAL_LOG_BLOWUP, ROOT_LOG_BLOWUP] + .map(FriParameters::standard_with_100_bits_conjectured_security); + + // Configure vm for the leaf layer + let leaf_vm_config = NativeConfig { + system: SystemConfig::new( + SBOX_SIZE.min(leaf_fri_params.max_constraint_degree()), + MemoryConfig { + max_access_adapter_n: 16, + ..Default::default() + }, + VmVerifierPvs::::width(), + ) + .with_max_segment_len((1 << 24) - 100) + .with_profiling() + .without_continuations(), + native: Default::default(), + }; + + // Leaf layer keygen + let leaf_vm_pk = { + let leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); + let (_, vm_pk) = + VirtualMachine::new_with_keygen(leaf_engine, vb.clone(), leaf_vm_config.clone()) + .expect("leaf keygen"); + assert!(vm_pk.max_constraint_degree <= leaf_fri_params.max_constraint_degree()); + check_max_constraint_degrees(&leaf_vm_config.system, &leaf_fri_params); + Arc::new(VmProvingKey { + fri_params: leaf_fri_params, + vm_config: leaf_vm_config, + vm_pk, + }) + }; + let leaf_vm_vk = leaf_vm_pk.vm_pk.get_vk(); + + // Leaf layer program + let leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); + let leaf_program = CenoLeafVmVerifierConfig { + vk, + compiler_options: CompilerOptions::default().with_cycle_tracker(), + } + .build_program(); + let leaf_committed_exe = Arc::new(VmCommittedExe::::commit( + leaf_program.into(), + leaf_engine.config().pcs(), + )); + let leaf_prover = new_local_prover::( + vm_builder.clone(), + &leaf_vm_pk, + leaf_committed_exe.exe.clone(), + ) + .expect("leaf prover"); + + // Configure vm for internal layers + // needs to be a multiple of DIGEST_SIZE + let num_public_values = + InternalVmVerifierPvs::::width().div_ceil(DIGEST_SIZE) * DIGEST_SIZE; + let internal_vm_config = NativeConfig { + system: SystemConfig::new( + SBOX_SIZE.min(internal_fri_params.max_constraint_degree()), + MemoryConfig { + max_access_adapter_n: 16, + ..Default::default() + }, + num_public_values, + ) + .with_max_segment_len((1 << 24) - 100) + .with_profiling() + .without_continuations(), + native: Default::default(), + }; + + // Internal keygen + let internal_engine = BabyBearPoseidon2Engine::new(internal_fri_params); + let (internal_vm, vm_pk) = + VirtualMachine::new_with_keygen(internal_engine, vb, internal_vm_config.clone()) + .expect("internal keygen"); + check_max_constraint_degrees(&internal_vm_config.system, &internal_fri_params); + assert!(vm_pk.max_constraint_degree <= internal_fri_params.max_constraint_degree()); + let internal_vm_pk = Arc::new(VmProvingKey { + fri_params: internal_fri_params, + vm_config: internal_vm_config, + vm_pk, + }); + let internal_vm_vk = internal_vm_pk.vm_pk.get_vk(); + + // Internal program + let internal_program = InternalVmVerifierConfig { + leaf_fri_params, + internal_fri_params, + compiler_options: CompilerOptions::default().with_cycle_tracker(), + } + .build_program(&leaf_vm_vk, &internal_vm_vk); + let internal_committed_exe = Arc::new(VmCommittedExe::::commit( + internal_program.into(), + internal_vm.engine.config().pcs(), + )); + let internal_prover = new_local_prover::( + vm_builder.clone(), + &internal_vm_pk, + internal_committed_exe.exe.clone(), + ) + .expect("internal prover"); + + let vk = CenoRecursionVerifierKeys { + leaf_vm_vk, + leaf_fri_params: leaf_vm_pk.fri_params, + internal_vm_vk, + internal_fri_params: internal_vm_pk.fri_params, + internal_commit: internal_committed_exe.get_program_commit(), + }; + + let pk = CenoRecursionProvingKeys { + leaf_vm_pk, + leaf_committed_exe, + internal_vm_pk, + internal_committed_exe, + }; + + Self { + leaf_prover, + internal_prover, + vk, + pk, + } + } +} /// Config to generate leaf VM verifier program. pub struct CenoLeafVmVerifierConfig { @@ -58,12 +243,122 @@ impl CenoLeafVmVerifierConfig { let mut builder = Builder::::default(); { - builder.cycle_tracker_start("VerifyCenoProof"); - - let zkvm_proof_input_variables = ZKVMProofInput::read(&mut builder); - verify_zkvm_proof(&mut builder, zkvm_proof_input_variables, &self.vk); - - builder.cycle_tracker_end("VerifyCenoProof"); + let ceno_leaf_input = CenoLeafVmVerifierInput::read(&mut builder); + let stark_pvs = VmVerifierPvs::>::uninit(&mut builder); + + builder.cycle_tracker_start("Verify Ceno ZKVM Proof"); + let zkvm_proof = ceno_leaf_input.proof; + let shard_raw_pi = zkvm_proof.raw_pi.clone(); + let calculated_shard_ec_sum = verify_zkvm_proof(&mut builder, zkvm_proof, &self.vk); + builder.cycle_tracker_end("Verify Ceno ZKVM Proof"); + + builder.cycle_tracker_start("PV Operations"); + let pv = ceno_leaf_input.pv; + builder + .if_eq(ceno_leaf_input.is_last, Usize::from(1)) + .then(|builder| { + builder.assert_nonzero(&pv.len()); + + // PC and cycle checks + let prev_pc: Ext<_, _> = builder.uninit(); + builder.range(0, pv.len()).for_each(|idx_vec, builder| { + let shard_pi = builder.get(&pv, idx_vec[0]); + let init_cycle = builder.get(&shard_pi, INIT_CYCLE_IDX); + let tracer_default: Ext<_, _> = + builder.constant(E::from_canonical_u64(Tracer::SUBCYCLES_PER_INSN)); + builder.assert_ext_eq(init_cycle, tracer_default); + let end_pc = builder.get(&shard_pi, END_PC_IDX); + let init_pc = builder.get(&shard_pi, INIT_PC_IDX); + builder.if_eq(idx_vec[0], Usize::from(0)).then_or_else( + |builder| { + let entry_point: Ext<_, _> = + builder.constant(E::from_canonical_u32(self.vk.entry_pc)); + builder.assert_ext_eq(init_pc, entry_point); + }, + |builder| { + builder.assert_ext_eq(init_pc, prev_pc); + }, + ); + builder.assign(&prev_pc, end_pc); + }); + + // EC sum verification + let expected_last_shard_id = Usize::uninit(builder); + builder.assign(&expected_last_shard_id, pv.len() - Usize::from(1)); + + let shard_id_fs = builder.get(&shard_raw_pi, SHARD_ID_IDX); + let shard_id_f = builder.get(&shard_id_fs, 0); + let shard_id = Usize::Var(builder.cast_felt_to_var(shard_id_f)); + builder.assert_usize_eq(expected_last_shard_id, shard_id); + + let ec_sum = SepticPointVariable { + x: SepticExtensionVariable { + vs: builder.dyn_array(7), + }, + y: SepticExtensionVariable { + vs: builder.dyn_array(7), + }, + is_infinity: Usize::uninit(builder), + }; + builder.assign(&ec_sum.is_infinity, Usize::from(1)); + + builder.range(0, pv.len()).for_each(|idx_vec, builder| { + let shard_pv = builder.get(&pv, idx_vec[0]); + let x = SepticExtensionVariable { + vs: shard_pv.slice( + builder, + SHARD_RW_SUM_IDX, + SHARD_RW_SUM_IDX + SEPTIC_EXTENSION_DEGREE, + ), + }; + let y = SepticExtensionVariable { + vs: shard_pv.slice( + builder, + SHARD_RW_SUM_IDX + SEPTIC_EXTENSION_DEGREE, + SHARD_RW_SUM_IDX + 2 * SEPTIC_EXTENSION_DEGREE, + ), + }; + let shard_ec = SepticPointVariable { + x: x.clone(), + y: y.clone(), + is_infinity: Usize::uninit(builder), + }; + let is_x_zero = x.is_zero(builder); + let is_y_zero = y.is_zero(builder); + builder.if_eq(is_x_zero, Usize::from(1)).then_or_else( + |builder| { + builder + .if_eq(is_y_zero.clone(), Usize::from(1)) + .then_or_else( + |builder| { + builder.assign(&shard_ec.is_infinity, Usize::from(1)); + }, + |builder| { + builder.assign(&shard_ec.is_infinity, Usize::from(0)); + }, + ); + }, + |builder| { + builder.assign(&shard_ec.is_infinity, Usize::from(0)); + }, + ); + + add_septic_points_in_place(builder, &ec_sum, &shard_ec); + }); + + add_septic_points_in_place(builder, &ec_sum, &calculated_shard_ec_sum); + + let is_sum_x_zero = ec_sum.x.is_zero(builder); + let is_sum_y_zero = ec_sum.y.is_zero(builder); + + builder.assert_usize_eq(is_sum_x_zero, Usize::from(1)); + builder.assert_usize_eq(is_sum_y_zero, Usize::from(1)); + }); + + for pv in stark_pvs.flatten() { + builder.commit_public_value(pv); + } + builder.cycle_tracker_end("PV Operations"); builder.halt(); } @@ -72,29 +367,125 @@ impl CenoLeafVmVerifierConfig { } #[derive(Clone, Serialize, Deserialize)] -pub struct CenoRecursionVerifierKeys { - pub ceno_leaf_vm_vk: MultiStarkVerifyingKey, - pub ceno_leaf_fri_params: FriParameters, +#[serde(bound( + serialize = "Com: Serialize", + deserialize = "Com: Deserialize<'de>" +))] +pub struct CenoRecursionVerifierKeys { + pub leaf_vm_vk: MultiStarkVerifyingKey, + pub leaf_fri_params: FriParameters, pub internal_vm_vk: MultiStarkVerifyingKey, - pub ceno_internal_fri_params: FriParameters, - pub internal_commit: [F; CHUNK], + pub internal_fri_params: FriParameters, + pub internal_commit: Com, +} + +pub struct CenoRecursionProvingKeys { + pub leaf_vm_pk: Arc>, + pub leaf_committed_exe: Arc>, + pub internal_vm_pk: Arc>, + pub internal_committed_exe: Arc>, +} + +impl Clone for CenoRecursionProvingKeys { + fn clone(&self) -> Self { + Self { + leaf_vm_pk: self.leaf_vm_pk.clone(), + leaf_committed_exe: self.leaf_committed_exe.clone(), + internal_vm_pk: self.internal_vm_pk.clone(), + internal_committed_exe: self.internal_committed_exe.clone(), + } + } +} + +impl CenoRecursionProvingKeys { + pub fn get_vk(&self) -> CenoRecursionVerifierKeys { + CenoRecursionVerifierKeys { + leaf_vm_vk: self.leaf_vm_pk.vm_pk.get_vk(), + leaf_fri_params: self.leaf_vm_pk.fri_params, + internal_vm_vk: self.internal_vm_pk.vm_pk.get_vk(), + internal_fri_params: self.internal_vm_pk.fri_params, + internal_commit: self.internal_committed_exe.get_program_commit(), + } + } +} +pub(crate) struct CenoLeafVmVerifierInput { + pub proof: ZKVMProofInput, + pub is_last: usize, + pub pv: Vec>, +} + +#[derive(DslVariable, Clone)] +pub(crate) struct CenoLeafVmVerifierInputVariable { + pub proof: ZKVMProofInputVariable, + pub is_last: Usize, + pub pv: Array>>, +} + +impl Hintable for CenoLeafVmVerifierInput { + type HintVariable = CenoLeafVmVerifierInputVariable; + + fn read(builder: &mut Builder) -> Self::HintVariable { + let proof = ZKVMProofInput::read(builder); + let is_last = Usize::Var(usize::read(builder)); + let pv = Vec::>::read(builder); + + Self::HintVariable { proof, is_last, pv } + } + + fn write(&self) -> Vec::N>> { + let mut stream = Vec::new(); + stream.extend(self.proof.write()); + stream.extend(>::write(&self.is_last)); + stream.extend(> as Hintable>::write(&self.pv)); + stream + } +} + +pub(crate) fn chunk_ceno_leaf_proof_inputs( + zkvm_proofs: Vec, +) -> Vec { + let user_public_values = zkvm_proofs + .iter() + .map(|p| p.pi_evals.clone()) + .collect::>>(); + let mut ret: Vec = zkvm_proofs + .into_iter() + .map(|p| CenoLeafVmVerifierInput { + proof: p, + is_last: 0, + pv: vec![], + }) + .collect(); + + let last = ret.last_mut().unwrap(); + last.pv = user_public_values; + last.is_last = 1; + + ret } pub fn compress_to_root_proof( - leaf_prover: &VmLocalProver, - internal_prover: &VmLocalProver, zkvm_proofs: Vec>, -) -> VmStarkProof { + vk: ZKVMVerifyingKey>, +) -> (CenoRecursionVerifierKeys, VmStarkProof) { + let aggregation_start_timestamp = Instant::now(); + // Construct zkvm proof input let zkvm_proof_inputs: Vec = zkvm_proofs .into_iter() .enumerate() .map(|(shard_id, p)| ZKVMProofInput::from((shard_id, p))) .collect(); + let user_public_values: Vec = zkvm_proof_inputs + .iter() + .flat_map(|p| p.raw_pi.iter().flat_map(|v| v.clone()).collect::>()) + .collect(); + let leaf_inputs = chunk_ceno_leaf_proof_inputs(zkvm_proof_inputs); - let aggregation_start_timestamp = Instant::now(); + let vm_builder = NativeBuilder::default(); + let mut ceno_aggregation_prover = CenoAggregationProver::new(vm_builder, vk); - let leaf_proofs = zkvm_proof_inputs + let leaf_proofs = leaf_inputs .iter() .enumerate() .map(|(proof_idx, p)| { @@ -103,9 +494,15 @@ pub fn compress_to_root_proof( proof_idx, aggregation_start_timestamp.elapsed() ); + let mut witness_stream: Vec> = Vec::new(); witness_stream.extend(p.write()); - let leaf_proof = SingleSegmentVmProver::prove(leaf_prover, witness_stream); + + let leaf_proof = SingleSegmentVmProver::prove( + &mut ceno_aggregation_prover.leaf_prover, + witness_stream, + VM_MAX_TRACE_HEIGHTS, + ); // _debug: export // let file = @@ -118,7 +515,7 @@ pub fn compress_to_root_proof( aggregation_start_timestamp.elapsed() ); - leaf_proof + leaf_proof.expect("leaf proof") }) .collect::>(); @@ -135,15 +532,21 @@ pub fn compress_to_root_proof( // proof, in order to shrink the proof size while proofs.len() > 1 || internal_node_height == 0 { let internal_inputs = InternalVmVerifierInput::chunk_leaf_or_internal_proofs( - internal_prover.committed_exe.get_program_commit().into(), + (*ceno_aggregation_prover.internal_prover.program_commitment()).into(), &proofs, - 3, // _debug + DEFAULT_NUM_CHILDREN_INTERNAL, ); - proofs = internal_inputs + + let layer_proofs: Vec> = internal_inputs .into_iter() .map(|input| { internal_node_idx += 1; - let internal_proof = SingleSegmentVmProver::prove(internal_prover, input.write()); + let internal_proof = SingleSegmentVmProver::prove( + &mut ceno_aggregation_prover.internal_prover, + input.write(), + VM_MAX_TRACE_HEIGHTS, + ); + println!( "Aggregation - Completed internal node (idx: {:?}) at height {:?}: {:?}", internal_node_idx, @@ -158,10 +561,11 @@ pub fn compress_to_root_proof( // )) // .expect("Create export proof file"); // bincode::serialize_into(file, &internal_proof).expect("failed to serialize internal proof"); - - internal_proof + internal_proof.expect("internal_proof") }) .collect(); + + proofs = layer_proofs; internal_node_height += 1; } println!( @@ -172,39 +576,42 @@ pub fn compress_to_root_proof( // Export e2e stark proof (used in verify_e2e_stark_proof) let root_stark_proof = VmStarkProof { - proof: proofs.pop().unwrap(), - user_public_values: zkvm_proof_inputs - .iter() - .flat_map(|p| p.raw_pi.iter().flat_map(|v| v.clone()).collect::>()) - .collect(), + inner: proofs.pop().unwrap(), + user_public_values, }; - let file = File::create("root_stark_proof.bin").expect("Create export proof file"); - bincode::serialize_into(file, &root_stark_proof).expect("failed to serialize internal proof"); + // let file = File::create("root_stark_proof.bin").expect("Create export proof file"); + // bincode::serialize_into(file, &root_stark_proof).expect("failed to serialize internal proof"); - root_stark_proof + // Export aggregation key (used in verify_e2e_stark_proof) + let vk = ceno_aggregation_prover.vk; + + let file = File::create("ceno_vk.bin").expect("Create export proof file"); + bincode::serialize_into(file, &vk).expect("failed to serialize internal proof"); + + (vk, root_stark_proof) } // Source from OpenVm SDK::verify_e2e_stark_proof with abridged key // See: https://github.com/openvm-org/openvm pub fn verify_e2e_stark_proof( - k: &CenoRecursionVerifierKeys, + k: &CenoRecursionVerifierKeys, proof: &VmStarkProof, _expected_exe_commit: &Bn254Fr, _expected_vm_commit: &Bn254Fr, ) -> Result { - if proof.proof.per_air.len() < 3 { + if proof.inner.per_air.len() < 3 { return Err("Invalid number of AIRs: expected at least 3".into()); - } else if proof.proof.per_air[0].air_id != PROGRAM_AIR_ID { + } else if proof.inner.per_air[0].air_id != PROGRAM_AIR_ID { return Err("Missing program AIR".into()); - } else if proof.proof.per_air[1].air_id != CONNECTOR_AIR_ID { + } else if proof.inner.per_air[1].air_id != CONNECTOR_AIR_ID { return Err("Missing connector AIR".into()); - } else if proof.proof.per_air[2].air_id != PUBLIC_VALUES_AIR_ID { + } else if proof.inner.per_air[2].air_id != PUBLIC_VALUES_AIR_ID { return Err("Missing public values AIR".into()); } - let public_values_air_proof_data = &proof.proof.per_air[2]; + let public_values_air_proof_data = &proof.inner.per_air[2]; - let program_commit = proof.proof.commitments.main_trace[PROGRAM_CACHED_TRACE_INDEX].as_ref(); - let internal_commit: &[_; CHUNK] = &k.internal_commit; + let program_commit = proof.inner.commitments.main_trace[PROGRAM_CACHED_TRACE_INDEX].as_ref(); + let internal_commit: &[_; CHUNK] = &k.internal_commit.into(); let (vm_vk, fri_params, vm_commit) = if program_commit == internal_commit { let internal_pvs: &InternalVmVerifierPvs<_> = public_values_air_proof_data @@ -219,14 +626,14 @@ pub fn verify_e2e_stark_proof( } ( &k.internal_vm_vk, - k.ceno_internal_fri_params, + k.internal_fri_params, internal_pvs.extra_pvs.leaf_verifier_commit, ) } else { - (&k.ceno_leaf_vm_vk, k.ceno_leaf_fri_params, *program_commit) + (&k.leaf_vm_vk, k.leaf_fri_params, *program_commit) }; let e = BabyBearPoseidon2Engine::new(fri_params); - e.verify(vm_vk, &proof.proof) + e.verify(vm_vk, &proof.inner) .expect("stark e2e proof verification should pass"); let pvs: &VmVerifierPvs<_> = @@ -317,31 +724,30 @@ pub fn verify_proofs( let mut witness_stream: Vec> = Vec::new(); witness_stream.extend(zkvm_proof_input.write()); - let log_blowup = 1; let poseidon2_max_constraint_degree: usize = 3; - let fri_params = FriParameters::standard_with_100_bits_conjectured_security(log_blowup); - - let engine = BabyBearPoseidon2Engine::new(fri_params); let mut config = NativeConfig::aggregation(0, poseidon2_max_constraint_degree); config.system.memory_config.max_access_adapter_n = 16; - let vm = VirtualMachine::new(engine, config); - - let _result = vm.execute_and_generate(program, witness_stream).unwrap(); - // let pk = vm.keygen(); - // let proofs = vm.prove(&pk, result); - // for proof in proofs { - // verify_single(&vm.engine, &pk.get_vk(), &proof).expect("Verification failed"); - // } + let exe = VmExe::new(program); + + let fri_params = standard_fri_params_with_100_bits_conjectured_security(1); + let vb = NativeBuilder::default(); + air_test_impl::( + fri_params, + vb, + config, + exe, + witness_stream, + 1, + true, + ) + .unwrap(); } } #[cfg(test)] mod tests { - use super::{ - CenoLeafVmVerifierConfig, CenoRecursionVerifierKeys, INTERNAL_LOG_BLOWUP, LEAF_LOG_BLOWUP, - ROOT_LOG_BLOWUP, SBOX_SIZE, verify_e2e_stark_proof, - }; + use super::verify_e2e_stark_proof; use crate::{ aggregation::{compress_to_root_proof, verify_proofs}, zkvm_verifier::binding::E, @@ -352,31 +758,9 @@ mod tests { structs::ZKVMVerifyingKey, }; use mpcs::{Basefold, BasefoldRSParams}; - use openvm_circuit::{ - arch::{MemoryConfig, SystemConfig, VirtualMachine}, - system::program::trace::VmCommittedExe, - }; - use openvm_continuations::{ - SC, - verifier::{ - common::types::VmVerifierPvs, - internal::{InternalVmVerifierConfig, types::InternalVmVerifierPvs}, - }, - }; - use openvm_native_circuit::NativeConfig; - use openvm_native_compiler::conversion::CompilerOptions; - use openvm_sdk::prover::vm::{local::VmLocalProver, types::VmProvingKey}; - use openvm_stark_backend::config::StarkGenericConfig; - use openvm_stark_sdk::{ - config::{ - FriParameters, baby_bear_poseidon2::BabyBearPoseidon2Engine, - setup_tracing_with_log_level, - }, - engine::StarkFriEngine, - p3_bn254_fr::Bn254Fr, - }; + use openvm_stark_sdk::{config::setup_tracing_with_log_level, p3_bn254_fr::Bn254Fr}; use p3::field::FieldAlgebra; - use std::{fs::File, sync::Arc}; + use std::fs::File; pub fn aggregation_inner_thread() { setup_tracing_with_log_level(tracing::Level::WARN); @@ -392,119 +776,11 @@ mod tests { bincode::deserialize_from(File::open(vk_path).expect("Failed to open vk file")) .expect("Failed to deserialize vk file"); - let [leaf_fri_params, internal_fri_params, _root_fri_params] = - [LEAF_LOG_BLOWUP, INTERNAL_LOG_BLOWUP, ROOT_LOG_BLOWUP] - .map(FriParameters::standard_with_100_bits_conjectured_security); - - let leaf_vm_config = NativeConfig { - system: SystemConfig::new( - SBOX_SIZE.min(leaf_fri_params.max_constraint_degree()), - MemoryConfig { - max_access_adapter_n: 16, - ..Default::default() - }, - VmVerifierPvs::::width(), - ) - .with_max_segment_len((1 << 24) - 100) - .with_profiling(), - native: Default::default(), - }; - - let leaf_committed_exe = { - let leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); - let leaf_program = CenoLeafVmVerifierConfig { - vk: vk.clone(), - compiler_options: CompilerOptions::default().with_cycle_tracker(), - } - .build_program(); - - Arc::new(VmCommittedExe::commit( - leaf_program.into(), - leaf_engine.config.pcs(), - )) - }; - - // let recursion_proving_keys = RecursionProvingKeys::keygen(leaf_fri_params, leaf_vm_config); - - let ceno_leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); - let ceno_leaf_vm_pk = Arc::new({ - let vm = VirtualMachine::new(ceno_leaf_engine, leaf_vm_config.clone()); - let vm_pk = vm.keygen(); - assert!(vm_pk.max_constraint_degree <= leaf_fri_params.max_constraint_degree()); - VmProvingKey { - fri_params: leaf_fri_params, - vm_config: leaf_vm_config, - vm_pk, - } - }); - - let leaf_prover = VmLocalProver::::new( - ceno_leaf_vm_pk.clone(), - leaf_committed_exe, - ); - - // Internal engine and config - let internal_engine = BabyBearPoseidon2Engine::new(internal_fri_params); - let internal_vm_config = NativeConfig { - system: SystemConfig::new( - SBOX_SIZE.min(internal_fri_params.max_constraint_degree()), - MemoryConfig { - max_access_adapter_n: 8, - ..Default::default() - }, - InternalVmVerifierPvs::::width(), - ) - .with_max_segment_len((1 << 24) - 100), - native: Default::default(), - }; - - // Construct internal vm, pk and vk - let internal_vm = VirtualMachine::new(internal_engine, internal_vm_config.clone()); - let internal_vm_pk = Arc::new({ - let vm_pk = internal_vm.keygen(); - assert!(vm_pk.max_constraint_degree <= internal_fri_params.max_constraint_degree()); - VmProvingKey { - fri_params: internal_fri_params, - vm_config: internal_vm_config, - vm_pk, - } - }); - let internal_vm_vk = internal_vm_pk.vm_pk.get_vk(); - - // Commit internal program - let internal_program = InternalVmVerifierConfig { - leaf_fri_params, - internal_fri_params, - compiler_options: CompilerOptions::default(), - } - .build_program(&ceno_leaf_vm_pk.vm_pk.get_vk(), &internal_vm_vk); - let internal_committed_exe = Arc::new(VmCommittedExe::::commit( - internal_program.into(), - internal_vm.engine.config.pcs(), - )); - let internal_prover = VmLocalProver::::new( - internal_vm_pk.clone(), - internal_committed_exe.clone(), - ); - - let root_stark_proof = compress_to_root_proof(&leaf_prover, &internal_prover, zkvm_proofs); + let (vk, root_stark_proof) = compress_to_root_proof(zkvm_proofs, vk); - let ceno_vk = CenoRecursionVerifierKeys { - ceno_leaf_vm_vk: ceno_leaf_vm_pk.vm_pk.get_vk(), - ceno_leaf_fri_params: ceno_leaf_vm_pk.fri_params, - internal_vm_vk: internal_vm_pk.vm_pk.get_vk(), - ceno_internal_fri_params: internal_vm_pk.fri_params, - internal_commit: internal_committed_exe.get_program_commit().into(), - }; - - verify_e2e_stark_proof( - &ceno_vk, - &root_stark_proof, - // _debug - &Bn254Fr::ZERO, - &Bn254Fr::ZERO, - ) - .expect("Verify e2e stark proof should pass"); + // _debug + verify_e2e_stark_proof(&vk, &root_stark_proof, &Bn254Fr::ZERO, &Bn254Fr::ZERO) + .expect("Verify e2e stark proof should pass"); } pub fn verify_single_inner_thread() { diff --git a/ceno_recursion/src/arithmetics/mod.rs b/ceno_recursion/src/arithmetics/mod.rs index 8bd72a9e8..d9aae2205 100644 --- a/ceno_recursion/src/arithmetics/mod.rs +++ b/ceno_recursion/src/arithmetics/mod.rs @@ -11,6 +11,7 @@ use openvm_native_compiler::prelude::*; use openvm_native_compiler_derive::iter_zip; use openvm_native_recursion::challenger::{FeltChallenger, duplex::DuplexChallengerVariable}; use openvm_stark_backend::p3_field::{FieldAlgebra, FieldExtensionAlgebra}; + type E = BabyBearExt4; const MAX_NUM_VARS: usize = 25; @@ -1045,6 +1046,7 @@ pub fn extend( mod tests { use ff_ext::BabyBearExt4; use openvm_circuit::arch::{SystemConfig, VmExecutor, instructions::program::Program}; + use openvm_instructions::exe::VmExe; use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::{ asm::{AsmBuilder, AsmCompiler}, @@ -1064,11 +1066,10 @@ mod tests { .with_max_segment_len((1 << 22) - 100); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config); - - executor - .execute_and_then(program.clone(), vec![], |_, seg| Ok(seg), |err| err) - .unwrap(); + let executor = VmExecutor::::new(config).expect("executor initiation"); + let exe = VmExe::new(program); + let interpreter = executor.instance(&exe).unwrap(); + interpreter.execute(vec![], None).unwrap(); } #[test] diff --git a/ceno_recursion/src/basefold_verifier/hash.rs b/ceno_recursion/src/basefold_verifier/hash.rs index 23b94c045..8a465607b 100644 --- a/ceno_recursion/src/basefold_verifier/hash.rs +++ b/ceno_recursion/src/basefold_verifier/hash.rs @@ -47,6 +47,7 @@ impl Hintable for Hash { #[cfg(test)] mod tests { use openvm_circuit::arch::{SystemConfig, VmExecutor}; + use openvm_instructions::exe::VmExe; use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::asm::AsmBuilder; @@ -63,7 +64,7 @@ mod tests { // configure the VM executor let system_config = SystemConfig::default().with_max_segment_len(1 << 20); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::new(config); + let executor = VmExecutor::new(config).unwrap(); // prepare input let mut input = Vec::new(); @@ -71,6 +72,8 @@ mod tests { // execute the program let program = builder.compile_isa(); - executor.execute(program, input).unwrap(); + let exe = VmExe::new(program); + let interpreter = executor.instance(&exe).unwrap(); + interpreter.execute(input, None).unwrap(); } } diff --git a/ceno_recursion/src/basefold_verifier/mmcs.rs b/ceno_recursion/src/basefold_verifier/mmcs.rs index fb624d36b..d4a59e0ad 100644 --- a/ceno_recursion/src/basefold_verifier/mmcs.rs +++ b/ceno_recursion/src/basefold_verifier/mmcs.rs @@ -91,6 +91,7 @@ pub fn mmcs_verify_batch(builder: &mut Builder, input: MmcsVerifie #[cfg(test)] pub mod tests { use openvm_circuit::arch::{SystemConfig, VmExecutor, instructions::program::Program}; + use openvm_instructions::exe::VmExe; use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::asm::AsmBuilder; use openvm_native_recursion::hints::Hintable; @@ -113,9 +114,7 @@ pub mod tests { // Pass in witness stream let f = |n: usize| F::from_canonical_usize(n); - let mut witness_stream: Vec< - Vec>, - > = Vec::new(); + let mut witness_stream: Vec> = Vec::new(); let commit = MmcsCommitment { value: [ f(414821839), @@ -258,13 +257,12 @@ pub mod tests { .with_max_segment_len((1 << 25) - 100); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config); - executor.execute(program, witness).unwrap(); + let executor = VmExecutor::::new(config).unwrap(); - // _debug - // let results = executor.execute_segments(program, witness).unwrap(); - // for seg in results { - // println!("=> cycle count: {:?}", seg.metrics.cycle_count); - // } + let exe = VmExe::new(program); + let interpreter = executor.instance(&exe).unwrap(); + interpreter + .execute(witness, None) + .expect("test_mmcs_verify_batch should not fail"); } } diff --git a/ceno_recursion/src/basefold_verifier/query_phase.rs b/ceno_recursion/src/basefold_verifier/query_phase.rs index 4d13e84b3..6064731c7 100644 --- a/ceno_recursion/src/basefold_verifier/query_phase.rs +++ b/ceno_recursion/src/basefold_verifier/query_phase.rs @@ -811,6 +811,7 @@ pub mod tests { pcs_batch_commit, pcs_trim, util::hash::write_digest_to_transcript, }; use openvm_circuit::arch::{SystemConfig, VmExecutor, instructions::program::Program}; + use openvm_instructions::exe::VmExe; use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::asm::AsmBuilder; use openvm_native_recursion::hints::Hintable; @@ -978,14 +979,12 @@ pub mod tests { .with_max_segment_len((1 << 25) - 100); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config); - executor.execute(program.clone(), witness.clone()).unwrap(); - - // _debug - let results = executor.execute_segments(program, witness).unwrap(); - for seg in results { - println!("=> cycle count: {:?}", seg.metrics.cycle_count); - } + let executor = VmExecutor::::new(config).unwrap(); + let exe = VmExe::new(program); + let interpreter = executor.instance(&exe).unwrap(); + interpreter + .execute(witness, None) + .expect("constructed test should pass"); } #[test] diff --git a/ceno_recursion/src/basefold_verifier/rs.rs b/ceno_recursion/src/basefold_verifier/rs.rs index c09a68519..c70ce2d49 100644 --- a/ceno_recursion/src/basefold_verifier/rs.rs +++ b/ceno_recursion/src/basefold_verifier/rs.rs @@ -222,6 +222,7 @@ pub(crate) fn encode_small( pub mod tests { use openvm_circuit::arch::{SystemConfig, VmExecutor, instructions::program::Program}; + use openvm_instructions::exe::VmExe; use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::{asm::AsmBuilder, prelude::*}; use openvm_native_recursion::hints::Hintable; @@ -251,9 +252,7 @@ pub mod tests { builder.halt(); // Pass in witness stream - let mut witness_stream: Vec< - Vec>, - > = Vec::new(); + let mut witness_stream: Vec> = Vec::new(); let verifier_input = DenseMatrix { values: vec![E::ONE; 25], @@ -263,9 +262,7 @@ pub mod tests { // Hint for height witness_stream.extend(>::write(&5)); - let program: Program< - p3_monty_31::MontyField31, - > = builder.compile_isa(); + let program: Program = builder.compile_isa(); (program, witness_stream) } @@ -279,13 +276,11 @@ pub mod tests { .with_max_segment_len((1 << 25) - 100); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config); - executor.execute(program, witness).unwrap(); - - // _debug - // let results = executor.execute_segments(program, witness).unwrap(); - // for seg in results { - // println!("=> cycle count: {:?}", seg.metrics.cycle_count); - // } + let executor = VmExecutor::::new(config).unwrap(); + let exe = VmExe::new(program); + let interpreter = executor.instance(&exe).unwrap(); + interpreter + .execute(witness, None) + .expect("test_dense_matrix_pad should not fail"); } } diff --git a/ceno_recursion/src/basefold_verifier/verifier.rs b/ceno_recursion/src/basefold_verifier/verifier.rs index 69559a3d7..485ed505f 100644 --- a/ceno_recursion/src/basefold_verifier/verifier.rs +++ b/ceno_recursion/src/basefold_verifier/verifier.rs @@ -380,13 +380,14 @@ pub mod tests { .with_profiling(); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config); - executor.execute(program.clone(), witness.clone()).unwrap(); - - let results = executor.execute_segments(program, witness).unwrap(); - for seg in results { - println!("=> cycle count: {:?}", seg.metrics.cycle_count); - } + // _debug + // let executor = VmExecutor::::new(config); + // executor.execute(program.clone(), witness.clone()).unwrap(); + // + // let results = executor.execute_segments(program, witness).unwrap(); + // for seg in results { + // println!("=> cycle count: {:?}", seg.metrics.cycle_count); + // } } #[test] diff --git a/ceno_recursion/src/bin/e2e.rs b/ceno_recursion/src/bin/e2e_aggregate.rs similarity index 65% rename from ceno_recursion/src/bin/e2e.rs rename to ceno_recursion/src/bin/e2e_aggregate.rs index 892442df9..c5cf3f7df 100644 --- a/ceno_recursion/src/bin/e2e.rs +++ b/ceno_recursion/src/bin/e2e_aggregate.rs @@ -1,9 +1,6 @@ use ceno_emul::{IterAddresses, Program, WORD_SIZE, Word}; use ceno_host::{CenoStdin, memory_from_file}; -use ceno_recursion::aggregation::{ - CenoLeafVmVerifierConfig, CenoRecursionVerifierKeys, INTERNAL_LOG_BLOWUP, LEAF_LOG_BLOWUP, - ROOT_LOG_BLOWUP, SBOX_SIZE, compress_to_root_proof, -}; +use ceno_recursion::aggregation::compress_to_root_proof; use ceno_zkvm::{ e2e::{ Checkpoint, FieldType, MultiProver, PcsKind, Preset, run_e2e_with_checkpoint, @@ -14,26 +11,7 @@ use ceno_zkvm::{ use clap::Parser; use ff_ext::BabyBearExt4; use mpcs::{Basefold, BasefoldRSParams, SecurityLevel}; -use openvm_circuit::{ - arch::{MemoryConfig, SystemConfig, VirtualMachine}, - system::program::trace::VmCommittedExe, -}; -use openvm_continuations::{ - SC, - verifier::{ - common::types::VmVerifierPvs, - internal::{InternalVmVerifierConfig, types::InternalVmVerifierPvs}, - }, -}; -use openvm_native_circuit::NativeConfig; -use openvm_native_compiler::conversion::CompilerOptions; -use openvm_sdk::prover::vm::{local::VmLocalProver, types::VmProvingKey}; -use openvm_stark_backend::config::StarkGenericConfig; -use openvm_stark_sdk::{ - config::{FriParameters, baby_bear_poseidon2::BabyBearPoseidon2Engine}, - engine::StarkFriEngine, -}; -use std::{fs, fs::File, path::PathBuf, sync::Arc}; +use std::{fs, fs::File, path::PathBuf}; use tracing::level_filters::LevelFilter; use tracing_forest::ForestLayer; use tracing_subscriber::{ @@ -290,110 +268,7 @@ fn main() { .expect("PrepSanityCheck should yield zkvm_proof."); let vk = result.vk.expect("PrepSanityCheck should yield vk."); - let [leaf_fri_params, internal_fri_params, _root_fri_params] = - [LEAF_LOG_BLOWUP, INTERNAL_LOG_BLOWUP, ROOT_LOG_BLOWUP] - .map(FriParameters::standard_with_100_bits_conjectured_security); - - let leaf_vm_config = NativeConfig { - system: SystemConfig::new( - SBOX_SIZE.min(leaf_fri_params.max_constraint_degree()), - MemoryConfig { - max_access_adapter_n: 16, - ..Default::default() - }, - VmVerifierPvs::::width(), - ) - .with_max_segment_len((1 << 24) - 100) - .with_profiling(), - native: Default::default(), - }; - - let leaf_committed_exe = { - let leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); - let leaf_program = CenoLeafVmVerifierConfig { - vk: vk.clone(), - compiler_options: CompilerOptions::default().with_cycle_tracker(), - } - .build_program(); - - Arc::new(VmCommittedExe::commit( - leaf_program.into(), - leaf_engine.config.pcs(), - )) - }; - - // let recursion_proving_keys = RecursionProvingKeys::keygen(leaf_fri_params, leaf_vm_config); - - let ceno_leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params); - let ceno_leaf_vm_pk = Arc::new({ - let vm = VirtualMachine::new(ceno_leaf_engine, leaf_vm_config.clone()); - let vm_pk = vm.keygen(); - assert!(vm_pk.max_constraint_degree <= leaf_fri_params.max_constraint_degree()); - VmProvingKey { - fri_params: leaf_fri_params, - vm_config: leaf_vm_config, - vm_pk, - } - }); - - let leaf_prover = VmLocalProver::::new( - ceno_leaf_vm_pk.clone(), - leaf_committed_exe, - ); - - // Internal engine and config - let internal_engine = BabyBearPoseidon2Engine::new(internal_fri_params); - let internal_vm_config = NativeConfig { - system: SystemConfig::new( - SBOX_SIZE.min(internal_fri_params.max_constraint_degree()), - MemoryConfig { - max_access_adapter_n: 8, - ..Default::default() - }, - InternalVmVerifierPvs::::width(), - ) - .with_max_segment_len((1 << 24) - 100), - native: Default::default(), - }; - - // Construct internal vm, pk and vk - let internal_vm = VirtualMachine::new(internal_engine, internal_vm_config.clone()); - let internal_vm_pk = Arc::new({ - let vm_pk = internal_vm.keygen(); - assert!(vm_pk.max_constraint_degree <= internal_fri_params.max_constraint_degree()); - VmProvingKey { - fri_params: internal_fri_params, - vm_config: internal_vm_config, - vm_pk, - } - }); - let internal_vm_vk = internal_vm_pk.vm_pk.get_vk(); - - // Commit internal program - let internal_program = InternalVmVerifierConfig { - leaf_fri_params, - internal_fri_params, - compiler_options: CompilerOptions::default(), - } - .build_program(&ceno_leaf_vm_pk.vm_pk.get_vk(), &internal_vm_vk); - let internal_committed_exe = Arc::new(VmCommittedExe::::commit( - internal_program.into(), - internal_vm.engine.config.pcs(), - )); - let internal_prover = VmLocalProver::::new( - internal_vm_pk.clone(), - internal_committed_exe.clone(), - ); - - compress_to_root_proof(&leaf_prover, &internal_prover, zkvm_proofs); - - let ceno_vk = CenoRecursionVerifierKeys { - ceno_leaf_vm_vk: ceno_leaf_vm_pk.vm_pk.get_vk(), - ceno_leaf_fri_params: ceno_leaf_vm_pk.fri_params, - internal_vm_vk: internal_vm_pk.vm_pk.get_vk(), - ceno_internal_fri_params: internal_vm_pk.fri_params, - internal_commit: internal_committed_exe.get_program_commit().into(), - }; + let (ceno_vk, _) = compress_to_root_proof(zkvm_proofs, vk); // serialize aggregation key let file = File::create("ceno_vk.bin").expect("Create export proof file"); diff --git a/ceno_recursion/src/extensions/mod.rs b/ceno_recursion/src/extensions/mod.rs index 0aa0ecc94..6e92fbd60 100644 --- a/ceno_recursion/src/extensions/mod.rs +++ b/ceno_recursion/src/extensions/mod.rs @@ -5,6 +5,7 @@ mod tests { zkvm_verifier::binding::F, }; use openvm_circuit::arch::{SystemConfig, VmExecutor}; + use openvm_instructions::exe::VmExe; use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::{ asm::AsmBuilder, @@ -35,9 +36,7 @@ mod tests { builder.halt(); // Pass in witness stream - let witness_stream: Vec< - Vec>, - > = Vec::new(); + let witness_stream: Vec> = Vec::new(); // Compile program let options = CompilerOptions::default().with_cycle_tracker(); @@ -52,18 +51,12 @@ mod tests { system_config.profiling = true; let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config); - - // Alternative execution - // executor.execute(program, witness_stream).unwrap(); - - let res = executor - .execute_and_then(program, witness_stream, |_, seg| Ok(seg), |err| err) - .unwrap(); - - for (i, seg) in res.iter().enumerate() { - println!("=> segment {:?} metrics: {:?}", i, seg.metrics); - } + let executor = VmExecutor::::new(config).unwrap(); + let exe = VmExe::new(program); + let interpreter = executor.instance(&exe).unwrap(); + interpreter + .execute(witness_stream, None) + .expect("test_native_multi_observe should not fail"); } fn vm_program(builder: &mut Builder) { diff --git a/ceno_recursion/src/zkvm_verifier/binding.rs b/ceno_recursion/src/zkvm_verifier/binding.rs index 68459ab98..fe12ca613 100644 --- a/ceno_recursion/src/zkvm_verifier/binding.rs +++ b/ceno_recursion/src/zkvm_verifier/binding.rs @@ -128,16 +128,8 @@ impl Hintable for ZKVMProofInput { let max_num_var = usize::read(builder); let max_width = usize::read(builder); let witin_commit = BasefoldCommitment::read(builder); - let witin_perm: Array< - AsmConfig< - p3_monty_31::MontyField31, - BinomialExtensionField< - p3_monty_31::MontyField31, - 4, - >, - >, - Var>, - > = Vec::::read(builder); + let witin_perm: Array>, Var> = + Vec::::read(builder); let fixed_perm = Vec::::read(builder); let pcs_proof = BasefoldProof::read(builder); @@ -311,7 +303,6 @@ impl Hintable for TowerProofInput { } pub struct ZKVMChipProofInput { - // _debug: binding pub idx: usize, pub sum_num_instances: usize, @@ -660,9 +651,6 @@ impl Hintable for LayerProofInput { } #[derive(Default)] pub struct GKRProofInput { - // _debug: binding - // pub num_var_with_rotation: usize, - // pub num_instances: usize, pub layer_proofs: Vec, } @@ -680,38 +668,17 @@ impl From> for GKRProofInput { #[derive(DslVariable, Clone)] pub struct GKRProofVariable { - // _debug: binding - // pub num_var_with_rotation: Usize, - // pub num_instances_minus_one_bit_decomposition: Array>, pub layer_proofs: Array>, } impl Hintable for GKRProofInput { type HintVariable = GKRProofVariable; fn read(builder: &mut Builder) -> Self::HintVariable { - // let num_var_with_rotation = Usize::Var(usize::read(builder)); - // let num_instances_minus_one_bit_decomposition = Vec::::read(builder); let layer_proofs = Vec::::read(builder); - Self::HintVariable { - // _debug: binding - // num_var_with_rotation, - // num_instances_minus_one_bit_decomposition, - layer_proofs, - } + Self::HintVariable { layer_proofs } } fn write(&self) -> Vec::N>> { let mut stream = Vec::new(); - // _debug: binding - // stream.extend(>::write( - // &self.num_var_with_rotation, - // )); - - // let eq_instance = self.num_instances - 1; - // let mut bit_decomp: Vec = vec![]; - // for i in 0..32usize { - // bit_decomp.push(F::from_canonical_usize((eq_instance >> i) & 1)); - // } - // stream.extend(bit_decomp.write()); stream.extend(self.layer_proofs.write()); stream } diff --git a/ceno_recursion/src/zkvm_verifier/verifier.rs b/ceno_recursion/src/zkvm_verifier/verifier.rs index b302e622f..248447e4f 100644 --- a/ceno_recursion/src/zkvm_verifier/verifier.rs +++ b/ceno_recursion/src/zkvm_verifier/verifier.rs @@ -99,7 +99,7 @@ pub fn verify_zkvm_proof>( builder: &mut Builder, zkvm_proof_input: ZKVMProofInputVariable, vk: &ZKVMVerifyingKey, -) { +) -> SepticPointVariable { let mut challenger = DuplexChallengerVariable::new(builder); transcript_observe_label(builder, &mut challenger, b"riscv"); @@ -461,12 +461,12 @@ pub fn verify_zkvm_proof>( // _debug // batch_verify( - // builder, - // zkvm_proof_input.max_num_var, - // zkvm_proof_input.max_width, - // rounds, - // zkvm_proof_input.pcs_proof, - // &mut challenger, + // builder, + // zkvm_proof_input.max_num_var, + // zkvm_proof_input.max_width, + // rounds, + // zkvm_proof_input.pcs_proof, + // &mut challenger, // ); let empty_arr: Array> = builder.dyn_array(0); @@ -498,6 +498,8 @@ pub fn verify_zkvm_proof>( // logup check let zero: Ext = builder.constant(C::EF::ZERO); builder.assert_ext_eq(logup_sum, zero); + + shard_ec_sum } pub fn verify_chip_proof( @@ -2213,11 +2215,10 @@ pub fn add_septic_points_in_place( |builder| { let x_diff_inv = invert(builder, &x_diff); let slope = septic_ext_mul(builder, &y_diff, &x_diff_inv); - let x_sum = septic_ext_add(builder, &right.x, &left.x); let slope_squared = septic_ext_squared(builder, &slope); let x = septic_ext_sub(builder, &slope_squared, &x_sum); - + let x_diff = septic_ext_sub(builder, &left.x, &x); let slope_mul_x_diff = septic_ext_mul(builder, &slope, &x_diff); let y = septic_ext_sub(builder, &slope_mul_x_diff, &left.y); diff --git a/ceno_zkvm/src/scheme/verifier.rs b/ceno_zkvm/src/scheme/verifier.rs index eba5c4d7b..fe1f2301d 100644 --- a/ceno_zkvm/src/scheme/verifier.rs +++ b/ceno_zkvm/src/scheme/verifier.rs @@ -122,7 +122,15 @@ impl> ZKVMVerifier let end_pc = vm_proof.pi_evals[END_PC_IDX]; // add to shard ec sum - shard_ec_sum = shard_ec_sum + self.verify_proof_validity(shard_id, vm_proof, transcript)?; + // _debug + // println!("=> shard pi: {:?}", vm_proof.pi_evals.clone()); + let shard_ec = self.verify_proof_validity(shard_id, vm_proof, transcript)?; + // println!("=> start_ec_sum: {:?}", shard_ec_sum); + // println!("=> shard_ec: {:?}", shard_ec); + // shard_ec_sum = shard_ec_sum + self.verify_proof_validity(shard_id, vm_proof, transcript)?; + shard_ec_sum = shard_ec_sum + shard_ec; + // println!("=> new_ec_sum: {:?}", shard_ec_sum); + Ok((Some(end_pc), shard_ec_sum)) })?; // check shard ec_sum is_infinity