Zerocheck
Code: crates/hypercube/src/verifier/shard.rs::verify_zerocheck
The goal of the zerocheck protocol is two-fold:
- verify the evaluations at the GKR point chosen above.
- verify that the constraints (specified via AIRs) hold on all rows (except for the padded rows).
Actually the zerocheck does not fully verify these claims but rather it reduces them to a claim about the multilinear extension of the sparse representation - this will be fed into the subsequent jagged step.
The zerocheck protocol proceeds as follows. First, the challenger samples three random extension field elements
- , for a RLC over the constraints.
- , for batching the claimed evaluations from GKR.
- for an RLC over the chips in zerocheck.
We now discuss the zerocheck per chip - combining will be done using as an RLC.
The usual manner in which zerocheck is used is to reduce the claim that
for all to claims about the individual underlying multilinears . This is done by first choosing a random and checking that
via the sumcheck protocol, where this will reduce to an evaluation claim of on another random point. However, since we pad with zeroes, and may not evaluate to zero on an all-zero row, the claim actually is that
for all , where is a multilinear polynomial that given checks that .
At the same time, we also want to verify that GKR evaluation claims at are correct. Thus, we check that
Since is already random, we can use this as our random for the zerocheck. This means that we're just checking
where the latter sum can be computed from the GKR evaluation claims.
We run the sumcheck here, and we would require
which can be derived from all the column evaluations at . We hash in the claimed openings at the end of the zerocheck function.