Repository navigation
Conversation
to_mle_point translates a point of a sumcheck over {0, ∞}^n to the
Boolean hypercube, sigma_j = rho_j / (1 + rho_j), with the scales
prod_{j<k} (1 + rho_j) that relate u^∞ to the multilinear extension.
ProductProver becomes public so a caller can drive the round
polynomials with its own combination, as the BaseFold opening's
unit-weight, Libra-masked batch does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jimpo
requested changes
Nov 1, 2026
jimpo
left a comment
Collaborator
There was a problem hiding this comment.
Refactor to share more of the libra code with the ZK MLE-check in the spartan-prover and spartan-verifier crates. The Mask in zk_mlecheck looks very similar. This can be moved out to a libra in binius-ip/binius-ip-prover.
The ZK MLE-check's mask, its coefficient-table dimensions and the libra-eval operand describe the Libra mask itself, not the MLE-check. Move them to binius_ip::libra and binius_ip_prover::libra, where the BaseFold opening's own Libra mask can share them. No behavior change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the sigma/gamma claim masking with Phase A of the batched ZK
BaseFold opening (binius.xyz#128). The compiler commits a Libra oracle
for a masked opening, in a round of its own after the schedule's: the
coefficient table of a binius_ip_prover::libra::Mask of degree 2 on ℓ
variables, the mask the ZK MLE-check uses. The batched claim is
sumchecked over the infinity hypercube on f + α·h, leaving the
monomial evaluations α_r = M_r^∞(ρ_{<ℓ_r}) and the Libra query
β = h(ρ). The mask gains the round polynomials of that sumcheck, and
libra_eval takes the hypercube it evaluates over.
β is not an evaluation claim, so a masked opening also runs Phase A'
now: an unmasked sumcheck over the Libra round's m variables moves
every claim to prefixes of one point ρ''. Phase B translates the claims
to multilinear extensions at σ_j = ρ''_j / (1 + ρ''_j) and adds the
interleave round. The prover sends the round polynomial at Y = 1 and
the verifier samples γ after r'. Without it the claims, now on M_r
alone, could not reach the γ-fold the FRI opens.
An unmasked opening commits no Libra oracle and samples neither α nor
γ. The Spartan proof-size pin grows by the Libra oracle's openings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
benji-potamus
force-pushed
the
aj/binius-703-phase-a-libra-masked-batch-sumcheck-with-a-compiler
branch
from
November 1, 2026 09:54
3a65293 to
e02352f
Compare
Collaborator
Author
|
Addressed the review: the Libra code is now shared with the ZK MLE-check (pushed e02352f). The stack is now three commits:
Checks: the workspace passes (1956 tests, plus doc tests), and clippy with |
jimpo
approved these changes
Nov 1, 2026
Collaborator
Author
jimpo
deleted the
aj/binius-703-phase-a-libra-masked-batch-sumcheck-with-a-compiler
branch
November 1, 2026 23:08
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.
Linear: BINIUS-703 (Phase A of BINIUS-696, binius.xyz#128 "Batched ZK BaseFold opening").
This replaces the σ/γ claim masking with Phase A. The compiler now commits its own Libra oracle for a masked opening: a round of its own after the schedule's, holding
2^{⌈log2 ℓ⌉ + 2}entries (pad_len = 0until BINIUS-704). The batched claim is sumchecked over the infinity hypercube onf + α·h.Scope: this also brings in the minimal Phase A′ and Phase B interleave round
Phase A can't land on its own; details are in the Linear comment:
βuntil Phase A′. Left unchecked, it would let the prover hit anyf*, so the opening would accept any claims.α_rare claims onM_ralone. Reaching the γ-fold that*_mlecheck_basefoldopens needs the ω side, which is the interleave round.So a masked opening runs:
{0, ∞}^ℓ. The prover sendsα_r; the verifier checksΣ_r α_r · T_r^∞(ρ_{<ℓ_r}) = f*, gettingT_r^∞from the operand closures via the projective translation.infinity::batch_prove/batch_verifyover the Libra round'smvariables, moving every claim to prefixes ofρ''.σ_j = ρ''_j / (1 + ρ''_j). In the interleave round the prover sends the polynomial atY = 1, and γ is sampled afterr'. Then today's*_mlecheck_basefold, whose signature is unchanged.An unmasked opening commits no Libra oracle and samples neither α nor γ.
Left for BINIUS-705:
invert_or_zero, so the recursion circuit pays for the inverses.α'_r,β'and the interleave polynomial.ρ_j = 1is not rejected explicitly. It has probability ℓ/|K|, which the soundness error already covers.Commits
sumcheck::infinity::to_mle_point, and makesProductProverpublic so the opening can drive unit-weight sums plus the mask.binius_iop::basefold::libra(layout,libra-evaltable and its monomial evaluation) and the prover'sLibraMask.s_h/α_0rejected, masked and unmasked compiler layouts.Costs to look at
proof_size_testpin rises from 61680 to 77200. On that one-constraint circuit, most of the increase is the second round oracle's query openings.ProductProverfolds in place. It's marked with aponytail:note.hypercube::fold_highest_var::<InfCube>(Make fold_highest_var generic over the hypercube #2522).Testing
cargo nextest run --workspace --release: 1956 passed. Doc tests pass.cargo clippy --workspace --all-targets --all-features -D warnings: clean. Nightly fmt: clean.🤖 Generated with Claude Code