Circuit commitments
Committing to the circuit assignments
At the start of proof creation, the prover has a table of cell assignments that it claims satisfy the constraint system. The table has rows, and is broken into advice, instance, and fixed columns. We define as the assignment in the th row of the th fixed column. Without loss of generality, we'll similarly define to represent the advice and instance assignments.
We separate fixed columns here because they are provided by the verifier, whereas the advice and instance columns are provided by the prover. In practice, the commitments to instance and fixed columns are computed by both the prover and verifier, and only the advice commitments are stored in the proof.
To commit to these assignments, we construct Lagrange polynomials of degree for each column, over an evaluation domain of size (where is the th primitive root of unity):
- interpolates such that .
- interpolates such that .
We then create a blinding commitment to the polynomial for each column:
is constructed as part of key generation, using a blinding factor of . is constructed by the prover and sent to the verifier.
Committing to the lookup permutations
The verifier starts by sampling , which is used to keep individual columns within lookups independent. Then, the prover commits to the permutations for each lookup as follows:
-
Given a lookup with input column polynomials and table column polynomials , the prover constructs two compressed polynomials
-
The prover then permutes and according to the rules of the lookup argument, obtaining and .
The prover creates blinding commitments for all of the lookups
and sends them to the verifier.
After the verifier receives , , and , it samples challenges and that will be used in the permutation argument and the remainder of the lookup argument below. (These challenges can be reused because the arguments are independent.)
Committing to the equality constraint permutation
Let be the number of columns that are enabled for equality constraints.
Let be the maximum number of columns that can be accommodated by a column set without exceeding the PLONK configuration's maximum constraint degree.
Let be the number of “usable” rows as defined in the Permutation argument section.
Let
The prover constructs a vector of length such that for each column set and each row
The prover then computes a running product of , starting at , and a vector of polynomials that each have a Lagrange basis representation corresponding to a -sized slice of this running product, as described in the Permutation argument section.
The prover creates blinding commitments to each polynomial:
and sends them to the verifier.
Committing to the lookup permutation product columns
In addition to committing to the individual permuted lookups, for each lookup, the prover needs to commit to the permutation product column:
- The prover constructs a vector :
- The prover constructs a polynomial which has a Lagrange basis representation corresponding to a running product of , starting at .
and are used to combine the permutation arguments for and while keeping them independent. The important thing here is that the verifier samples and after the prover has created , , and (and thus committed to all the cell values used in lookup columns, as well as and for each lookup).
As before, the prover creates blinding commitments to each polynomial:
and sends them to the verifier.