High-Level Overview
Here, we present a high-level overview of our backend. These stages reduce an input M3 instance into progressively simpler mathematical claims, culminating in claims about the evaluations of certain multilinear polynomials.
In this overview, we take the verifier's perspective, and not the prover's. The verifier's view attests to a protocol's soundness, while the prover's view attests to its completness.
Interaction, Fiat–Shamir, and Reductions
Binius operates within the Fiat–Shamir paradigm for noninteractive proofs. Our protocol proceeds through multiple broad phases, each encompassing multiple rounds of prover–verifier interaction. As is standard practice, our protocol replaces interactions with invocations of the random oracle.
We achieve this using a transcript. The transcript tracks all data sent by the prover to the verifier; it hashes this data, automating the calculation of the verifier's challenges. During verification, the verifier uses the transcript to absorb the prover's data and produce the correct challenge sequence.
Our protocol's phases are essentially cryptographic reductions. Each phase reduces the truth of claims of one sort to the truth of claims of a simpler sort.
The M3 Instance
Before beginning any given Binius proof, the prover and verifier must formalize the structure of the statement being proved. Binius operates in the M3 arithmetization paradigm, as we've already explained. For our purposes now, the prover and verifier must agree on the instance at hand—that is, on its tables, constraints, channels and flushing rules. As we will see shortly, it is not difficult to reexpress all of these objects in mathematical terms, using objects like multilinear polynomials, multisets and vanishing claims.
Taking for granted the M3 abstraction, we proceed into verifier's algorithms proper. In what follows, we sketch the steps by which the verifier may evaluate whether the prover's M3 instance is satisfying, by reducing its satisfaction to successively simpler claims.
Receiving Commitments
Before it generates any randomness, the verifier must receive the prover's commitments and absorb them into its transcript. Each "commitment" represents a massive, multilinear polynomial—or equivalently, a column in a table—which, for efficiency's sake, is hidden from the verifier (part of the M3 instance's witness). For the sake of succinctness, instead of conveying these columns directly to the verifier, the prover rather conveys commitments to them; these commitments "bottle up" the polynomials they represent. Concretely, each commitment looks like a single hash digest. As soon as the prover forks over these commitments to the verifier, it becomes effectively bound to the witness polynomials they conceal. We discuss our multilinear polynomial commitment scheme further in this site area's cryptography section.
Zerocheck
The prover's commitments, discussed above, represent the values with which it has opted to populate the M3 instance's various tables. To each among these tables is associated various constraints, multivariate polynomials which must hold identically, row-wise, on the table's rows (i.e., by definition of the M3 instance). The verifier's first task conceptually is to make sure that the relevant constraints actually hold row-wise on the prover's tables.
The zerocheck is the key tool for this problem. The zerocheck protocol reduces vanishing claims for composites of multilinears to evaluation claims on the underlying multilinears. Though we explain that protocol in great detail in our page dedicated to the matter, we sketch it here.
The classical zerocheck technique is essentially a thin wrapper around the sumcheck. Basically, if we want to check that the -variate multivariate composite polynomial is such that holds for each , then it's enough to define 's multilinear extension:
and check whether holds, for a point sampled randomly by the verifier. The key trick is that the claim itself, in turn, amounts to a sumcheck claim, and can be checked using that protocol. Here,
is the equality indicator polynomial, the unique, -variate multilinear polynomial whose restriction to is the equality indicator function. More precisely, the sumcheck protocol reduces the above sum claim—that is, —to an evaluation claim on the underlying polynomial (that is, to a claim of the form , where the values and arise during the sumcheck protocol).
Because we work over small fields, we in fact adopt a rather sophisticated variant of the zerocheck, called the univariate skip. Very roughly, this zerocheck treats the 0th round in a special way, and moves as much work as possible into that round.
The Channel-Balancing Argument
At the center of each M3 instance is a plurality of abstract objects called channels, which must balance if the proof is to pass. The verifier's next few steps involve establishing that the prover's channels balance. More precisely, the verifier must reduce the balancing of these channels to further evaluation claims. (These latter claims will accumulate, for now, alongside those already output by the zerocheck reduction sketched above.)
Under the hood, each channel amounts to a pair of dueling "multisets", abstract lists populated by the instance's flushing rules. To check whether the relevant channels balance, the verifier must therefore run a handful of multiset equality checks. The theory behind these checks is developed in Protocols 4.17 and 4.20 of [DP23], and is discussed further here. For now, we sketch the idea. We write and for a single multiset instance; that is, we want to check that
where both sides are viewed as multi-subsets of .
What [DP23, § 4] tells us is that to check this claim, it suffices (up to some negligible soundness error) for the verifier to sample a fingerprinting challenge and a permutation challenge , and to check instead that the virtual polynomials:
have identical grand products. That is, it's enough to check that .
The GKR-Based Grand Product Argument
In light of the above reduction, the balancing of the M3 instance's channels has now been reduced to an equality of grand products, or products of the values of certain polynomials over the cube. The verifier's next step is to further reduce the grand product claims at issue to evaluation claims. To achieve this, the verifier undertakes a "grand product argument", itself based on the GKR protocol.
We describe our GKR-based grand product argument in detail here; for now, we roughly sketch the idea. We write for a multilinear whose grand product we want to ascertain—that is, we want to check whether , let's say. To do this, the prover and verifier both imagine a height-, balanced binary tree, whose leaves are the values , and whose intermediate nodes are defined to be the products of their children. Clearly, it suffices for the verifier to check whether the tree's root note is . The idea of GKR is that for each tree layer , we can view the values of that layer's nodes as the values of some multilinear over the cube . Moreover, for each and each evaluation point , we obtain the following expression for , in terms of :
By sumchecking this thing, the verifier can reduce the claim to the further claim , for some further values and obtained during the sumcheck. By performing this repeatedly, we get a way to "unwind" the initial grand product claim into an evaluation claim of the form .
We've thus reduced all of our grand product claims to evaluation claims, which is what we wanted.
Evalcheck
Throughout the zerocheck protocol and the channel-balancing phases above, the verifier's goal was to progressively reduce the prover's M3 satisfaction to evaluation claims on multilinears. Here, we have finally reached that point. At this point in the protocol, we pass into a new phase, called evalcheck, in which we begin processing these evaluation claims.
The main problem is that the multilinears we want to evaluate are, in general, committed or virtual. Roughly, the verifier's task during evalcheck will be to progressively "unroll" the definitions of the virtual multilinears at hand, thereby reducing its running evaluation claims on them to claims on further, committed, multilinears.
Virtual multilinears play an essential role in Binius. For further detail, we refer to our page devoted exclusively to them, as well as to [DP23, § 4.1]. Here, we sketch the idea. Given access to various underlying concrete, committed multilinears, the verifier may use these as "building blocks" to construct further, virtual polynomials in its head. For example, given evaluation access to , the verifier can "simulate" evaluation access to its scaling (here, is some constant scalar). How? Easily: if the verifier wants to learn the value of at , say, it may query the underlying polynomial , and then locally multiply the result by .
As trivial as this idea sounds, it rapidly gets serious in Binius. For example, as we explain in [DP23, § 4.3], it is possible, given some fixed multilinear , to construct a further virtual multilinear—called —whose values on the cube are just those of , but circularly rotated (by steps in this case). Moreover, the verifier may reduce the problem of evaluating at some arbitrary point to that of evaluating the underlying polynomial at some further point , up to the cost of doing an -round sumcheck.
For a full explanation of how this gets done, we refer to our dedicated page on the matter. For now, we sketch it. Indeed, we get an expression:
Here, is a special, -variate multilinear whose restriction to is the circular shift indicator function (i.e., it's 1 on if and only if and are arithmetic steps apart, and 0 otherwise). The above expression shows that, for each evaluation point , the evaluation can itself be expressed as the sum over the cube of the product polynomial . By the aid of a sumcheck, we can reduce this sum to, in turn, evaluation claims on the underlying polynomials and . The essential, and non-trivial, point is that itself has an efficient circuit representation, and can be evaluated locally at any point by the verifier in just time. So the verifier just needs to query once.
This idea gives us lots of mileage, since, by setting the offset for example, we can shift a column by one step—and match the output of one row to the input of the next, let's say.
In any case, during evalcheck, the verifier runs various sumchecks, progressively reducing evaluation claims on virtual things like to evaluation claims on committed underlying polynomials like itself. We describe evalcheck in full here.
The Opening Phase
We're now finally ready to do some cryptography! At this point, the verifier has reduced the problem of checking the satisfaction of the prover's M3 instance to that of checking the evaluations of various committed multilinears at various points. Here, the verifier is going to directly evaluate these latter evaluation claims, by invoking our core polynomial commitment scheme (PCS). The full resource for this phase of the protocol appears here.
Binius uses the multilinear polynomial commitment scheme described in [DP24]. The thing that makes it fairly tricky is that we have to do an involved sort of batching, which operates over polynomials not just over different coefficient fields, but moreover of different lengths (i.e., numbers of variables). The key idea that we use relates to ring-switching, an idea expounded at length in [DP24, § 4].
We summarize the idea in the following way. We write for an -variate multilinear over the small field , say, and suppose that we're interested in the evaluation claim . We moreover write for 's "packing". The packed polynomial is a reinterpretation of as a polynomial over the huge field . Its coefficients are larger, but it has fewer of them—it has only variables, let's say, as opposed to .
As is explained in [DP24, § 4], it turns out that, up to a bit of interaction—in which the prover sends the verifier a "tensor algebra" element, and the verifier samples some random challenges—the prover and verifier may mutually reduce their initial evaluation claim to a sum claim, involving and a further -variate multilinear, . Here, is "transparent", in that it's succinctly evaluable locally by the verifier.
To unwind what that means, our sum claim looks like:
We've already seen a few times that the sumcheck can be used to reduce this thing to an evaluation of . Instead of proceeding that way, though, we're first going to batch the respective sum claims—i.e., each of the above form—that come from all of our initial evaluation claims. We're finally going to integrate this into FRI-Binius's FRI-folding procedure, so that we only have to do that once. The full details are available in our cryptography section.