Taken from: Oleg Fomenko and Anton Levochko: Understanding Lasso - A Novel Lookup Argument Protocol


A sum-check protocol Lund et al., 1992 is an interactive proof protocol used in theoretical computer science to verify the correctness of a sum of values computed by a multivariate polynomial over a finite field, assuming oracle access to the polynomial. It allows a verifier to check a complex computation (like a huge sum over exponentially many values) using only a few rounds of interaction and logarithmic work.

Let be an -variate polynomial over a finite field . The goal of the sum-check protocol is for the verifier to check that the prover has correctly computed:

We assume that has oracle access to the polynomial . The protocol proceeds as follows:

  1. Initialization: sends a claimed value to .

  2. First Round: sends a univariate polynomial:

    checks that:

  3. Verifier Samples: picks a random and sends it to .

  4. Intermediate Rounds (for ): sends:

    checks:

    Then samples and sends it to .

  5. Final Round: sends:

    checks:

  6. Final Query and Check: picks and queries the oracle for . Then checks:

  7. Accept: If all checks pass, accepts. Otherwise, it rejects.

Sum-Check Protocol (with Commitment)

Oracle Query Procedure

Used to open committed values via any multilinear polynomial commitment protocol commitments.

Query(C_f ∈ 𝔽, x ∈ {0,1}^ℓ)
 
// Executed by both 𝒫 and 𝒱
𝒫 computes (f(x), π) ← Open(C_f, x)
𝒱 executes Verify(C_f, x, f(x), π)
Return f(x)

Algorithm

Executed by both prover and verifier for polynomial , its commitment , and claimed sum :

SumCheckProtocol(H ∈ 𝔽, g: {0,1}^ℓ → 𝔽, C_g ∈ 𝔽)
 
Set g₁(X₁) = ∑_{(x₂,…,x_ℓ) ∈ {0,1}^{ℓ-1}} g(X₁,x₂,…,x_ℓ)
𝒫 shares g₁ with 𝒱
𝒱 evaluates g₁(0), g₁(1)
If H ≠ g₁(0) + g₁(1): 𝒱 rejects
𝒱 samples r₁ ∈ 𝔽, evaluates g₁(r₁)
 
For j = 2 to ℓ:
    Set gⱼ(Xⱼ) = ∑_{(x_{j+1},…,x_ℓ)} g(r₁,…,r_{j−1},Xⱼ,x_{j+1},…,x_ℓ)
    𝒫 shares gⱼ with 𝒱
    𝒱 evaluates gⱼ(0), gⱼ(1)
    If gⱼ₋₁(rⱼ₋₁) ≠ gⱼ(0) + gⱼ(1): 𝒱 rejects
    𝒱 samples rⱼ ∈ 𝔽, evaluates gⱼ(rⱼ)
 
𝒱 calls Query(C_g, (r₁,…,r_ℓ)) to get g(r₁,…,r_ℓ)
If g_ℓ(r_ℓ) ≠ g(r₁,…,r_ℓ): 𝒱 rejects

Remark

Sometimes, is not committed directly, but rather defined as a known combination of other committed polynomials. In such cases, we override the query/commit methods by committing to and querying these polynomials individually, then combining them according to the predefined structure.