Overview
Suppose we are given a -variate polynomial defined over a finite field . The purpose of the sumcheck protocol is to compute the sum: In order to execute the protocol, the verifier needs to be able to evaluate for a randomly chosen vector . From the verifier’s perspective, the sumcheck protocol reduces the task of summing ‘s evaluations over inputs (all inputs in ) to the task of evaluating at a single input .Protocol Description
The protocol proceeds in rounds as follows:Round 1
The prover sends a polynomial and claims that: If is as claimed, then . The polynomial has degree , the degree of variable in . The prover specifies by sending the evaluation of at each point in the set . (Actually, the prover does not need to send , since the verifier can infer that .)Round
The verifier chooses a value uniformly at random from and sends to the prover. We say that variable gets bound to value . In return, the prover sends a polynomial and claims that: The verifier performs two checks:- Consistency check: Verify that , rejecting if not
- Degree check: Verify that the degree of is at most , the degree of variable in
Final Round
In the final round, the prover has sent which is claimed to be . The verifier performs a final check: If this test succeeds, along with all previous tests, the verifier accepts and is convinced that .Complexity
Prover complexity: - The prover must compute the sum for each round polynomial. Verifier complexity: communication and checks, plus one evaluation of at a random point. Soundness: If the prover cheats (i.e., the actual sum), the verifier will catch the deception except with negligible probability (roughly where is the maximum degree).Role in Jolt
Sumcheck is used extensively throughout Jolt’s proving pipeline:- Spartan R1CS verification: Proves constraint satisfaction via outer and product sumchecks
- Instruction lookups: Verifies instruction execution correctness
- Memory checking: Proves correct read/write behavior for RAM and registers
- Claim reductions: Reduces polynomial opening claims across multiple stages
- Batched sumcheck: Proves multiple sumcheck instances simultaneously
- Streaming sumcheck: Processes large polynomials in chunks to reduce memory usage
- Univariate skip: Optimizes rounds where polynomials have low degree
- Zero-knowledge sumcheck: Uses Pedersen commitments to hide round polynomials (see BlindFold)
Implementation Details
The core sumcheck implementations live injolt-core/src/subprotocols/:
sumcheck.rs: Core batched sumcheck prover and verifierunivariate_skip.rs: Optimized handling of univariate roundsblindfold/: Zero-knowledge sumcheck via Pedersen commitments
SumcheckInstanceParams trait, which defines:
input_claim(): How to compute the input claim from polynomial openingsoutput_claim_constraint(): Constraints for verifying output claims- Binding order and polynomial access patterns
Further Reading
For a detailed introduction to the sumcheck protocol, see:- Chapter 4 of Proofs, Arguments, and Zero Knowledge by Justin Thaler
- Original exposition in Thaler13