feat(zkvm): share witness/fixed Jagged inner opening#1341
Merged
Conversation
…_mle_zero_padding
…/ceno into feat/prover_mle_zero_padding
# Conflicts: # Cargo.lock # Cargo.toml
7e4cbf8 to
3d4cc63
Compare
kunxian-xia
approved these changes
May 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Ceno opens witness and fixed Jagged commitments in the same proof, but the previous integration still paid for separate inner Basefold openings. That duplicates inner query/opening proof bytes even though witness/fixed can share the same inner Basefold query set.
Design Rationale
Keep the outer Jagged protocol literally separate while sharing only the inner Basefold opening:
batch_open_with_trace_materializerJaggedProofcontains all Jagged rounds plus one required sharedinner_proofThis is intentionally surgical: it does not refactor witness lifecycle, q' ownership, q' residency, or fixed/witness commit paths. The only integration change is moving inner Basefold opening from per-Jagged-round execution to one batched inner opening after all Jagged reductions.
Soundness/correctness rationale: prover and verifier transcript order is aligned with gkr-backend: absorb all Jagged round reductions first, then absorb/verify one inner Basefold opening over all inner claims. Commitments remain independent, so sharing the inner proof does not merge witness/fixed roots.
Change Highlights
ceno_zkvm/src/scheme/gpu/mod.rs(round_proof, rho_row, col_evals)for each Jagged round.batch_open_with_trace_materializerfor witness/fixed inner claims.ceno_zkvm/src/scheme.rsCargo.tomlgkr-backendandceno-gpudependencies tofeat/jagged_single_commit.Benchmark / Performance Impact
Operation
reth-blockapp.provecreate_proof_of_shardcommit_tracespcs_openingLayer
Proof-size breakdown, shard 0
Sizes are MiB, computed as bytes / 2^20. Percent is relative to the after proof file (
5.48 MiB).app_proof.bitcodempcs_opening.totalmpcs_opening.roundsround[0]witness Jagged roundround[1]fixed Jagged roundinner_proofinner_proof.query_opening_proofinner_proof.commitsinner_proof.sumcheck_proofinner_proof.final_messageRaw proof-size data:
mpcs_opening.totalinner_proofTesting
Additional dependency checks:
E2E validation:
../ceno-reth-benchmark, block23587691, shard0, GPU,prove-app, verifier passed.Risks and Rollout
Risk is transcript/order mismatch because inner Basefold proof generation moved out of each Jagged round and into one shared call after all Jagged reductions. The verifier mirrors this order in gkr-backend, and shard-0 e2e verification passed.
Performance risk is low: proof size improves materially while
pcs_openingis flat on the measured shard.commit_tracesvaried upward in this run, but this PR does not change commit lifecycle or q' materialization.Rollback is localized: restore the previous per-Jagged-round inner opening path and the old dependency pins.
Follow-ups (optional)
None required for this PR. Broader cleanup can later remove temporary local benchmark patching once dependency branches are merged.
Copilot Reviewer Directive (keep this section)
When Copilot reviews this PR, apply
.github/copilot-instructions.mdstrictly.