BINIUS-255: bind the reduction claim to the committed trace oracle#1775
Open
tcoratger wants to merge 1 commit into
Conversation
The AND-check and shift reduction crunched the whole batch down to one number: the witness folded over instances, evaluated at a random point. Nothing tied that number to the data the prover committed to at the start, so the claim was about "some witness", not "the committed witness". This wires the whole protocol on one transcript: commit the trace, run the reduction, then ring-switch the reduced claim onto the committed trace and open it. The tie needs no new cryptography. The trace's bit index is laid out as [bit | instance | wire], and evaluating a multilinear at a coordinate is a weighted sum over it. So evaluating the trace's instance coordinates at the fold challenge performs the instance fold for free. The bit-to-packed gap is what the existing ring-switch already handles. So the single-instance ring-switch is reused verbatim, opening the trace at r_j || r_rho || r_y. Prover and verifier now run the whole protocol instead of a standalone commit-open at a random point. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Closes BINIUS-255.
Ties the AND-check + shift reduction to the committed trace, so the data-parallel M4 prover/verifier now run end to end.
The problem
The reduction crunches the whole batch to one number: the witness, folded over instances at
r_rho, evaluated at a random point.But nothing linked that number to the data committed at the very start.
The idea
The verifier must force: the committed trace, read at the reduction's point, equals the reduced number.
Two mismatches make that look hard:
Both vanish with the right point. The trace's bit index is laid out as
[bit | instance | wire], and evaluating a multilinear at a coordinate is a weighted sum over it. So:r_rhoperforms the instance fold — for free.So the single-instance ring-switch is reused verbatim, opening the trace at:
No new gadget, no new assumption — just the right point.
The change
crates/m4-prover/src/prove.rs—Prover::proveruns the whole protocol;setupbuilds the shift keys once.crates/m4-verifier/src/verify.rs—Verifier::verifyruns the whole protocol; the verifier now stores the constraint system.crates/{m4-prover,m4-verifier}/src/reduction.rs— module docs updated: the trace-oracle tie is done by the protocol layer, not "a later step".Soundness
r_rhoon the instance axis — a multilinear evaluation is theeq-weighted sum, so this is exact, not an approximation.r_j || r_rho || r_ymatches the trace layout[bit | instance | wire]coordinate for coordinate.log_hidden + log_inst - 1elements; the point has6 + log_inst + log_hiddencoordinates, which is elements + 7 (the ring-switch packing width).Elemis$\mathbb{F}_{2^{128}}$, and M4 fixes its one oracle spec directly rather than deriving it against a symbolic channel — so the concreteElembound is correct and needs no generalization.Scope
Prover/Verifiernow run the whole protocol (were a standalone commit-open).Verification
cargo check,clippy -p binius-m4-prover -p binius-m4-verifier, nightlyfmt— clean.binius-m4-prover+ 3binius-m4-verifiertests pass, including:protocol_round_trips— a full proof over 64 instances verifies end to end (this is what confirms the point is correct).tampered_opening_is_rejected— flipping one bit of the opening fails with exactlyMerkleError(InvalidProof).🤖 Generated with Claude Code