# Sumcheck(求和检验)协议:基础
> 适用对象:已学习有限域、基础多项式、概率论与复杂性基础(可选:交互式证明/PCP/IOP 基础)
>
> 本讲目标:掌握标准 Sumcheck 协议、完备性与健全性证明框架,并理解其在现代证明系统(如 GKR、SNARK/IOP)中的接口方式。
---
## 目录
1. [学习目标与背景](#学习目标与背景)
2. [问题定义:要验证什么?](#问题定义:要验证什么?)
3. [直觉:逐维“折叠”指数求和](#直觉:逐维“折叠”指数求和)
4. [标准 Sumcheck 协议(形式化流程)](#标准Sumcheck协议形式化流程)
5. [正确性:完备性与健全性(核心证明)](#正确性完备性与健全性核心证明)
6. [例子:2 变量多线性多项式跑一遍协议](#例子2-变量多线性多项式跑一遍协议)
7. [为何多线性扩展(MLE)几乎总出现?](#为何多线性扩展mle几乎总出现)
8. [与多项式承诺/IOP 的接口](#与多项式承诺iop-的接口)
9. [常见变体与工程技巧](#常见变体与工程技巧)
10. [复杂度与参数选择](#复杂度与参数选择)
11. [课后练习与思考题](#课后练习与思考题)
12. [一页速记(Cheat Sheet)](#一页速记cheat-sheet)
---
## 学习目标与背景
### 为什么要学 Sumcheck?
Sumcheck(求和检验)是交互式证明(IP)与 IOP/SNARK 体系中的**核心子协议**,用于验证如下类型的声明:
$$S \stackrel{?}{=} \sum_{x\in\{0,1\}^n} g(x).$$
它的重要性体现在:
- 将对 $2^n$ 个点的求和验证,压缩成 **$n$ 轮交互**;
- 通信量与多项式次数线性相关,常见情形(多线性)每轮只需常数个域元素;
- 可作为“胶水协议”把复杂全局约束归约为少量随机点的多项式求值一致性。
### 本讲你应当掌握
- 能写出标准 Sumcheck 协议并解释每一步含义;
- 能用“逐轮归纳 + 一元多项式根数界”给出健全性证明;
- 了解多线性扩展(MLE)为何使协议更干净($d=1$);
- 了解它与多项式承诺/低度测试组合后的用法。
---
## 问题定义:要验证什么?
### 输入
- 有限域 $\mathbb{F}$(通常取大素域或扩域);
- 多项式 $g(X_1,\dots,X_n)\in\mathbb{F}[X_1,\dots,X_n]$;
- 声称的求和值 $S\in\mathbb{F}$。
### 目标声明
验证者希望验证:
$$S = \sum_{x\in\{0,1\}^n} g(x).$$
### 关键假设:度数上界
Sumcheck 的健全性依赖一个低度假设。常见的度界形式:
- **按变量度界**:对每个 $i$,$\deg_{X_i}(g)\le d$。
在现代证明系统中,$g$ 常常是**多线性**(每变量度 $\le 1$),此时 $d=1$。
---
## 直觉:逐维“折叠”指数求和
将声明写成嵌套求和:
$$S = \sum_{x_1\in\{0,1\}} \sum_{x_2\in\{0,1\}} \cdots \sum_{x_n\in\{0,1\}} g(x_1,\dots,x_n).$$
先把最外层提出:
$$S = \sum_{x_1\in\{0,1\}} G_1(x_1),\quad \text{其中 }G_1(X_1)=\sum_{x_2,\dots,x_n\in\{0,1\}} g(X_1,x_2,\dots,x_n).$$
注意:$G_1$ 是一元多项式,次数 $\le d$。如果证明者给出 $G_1$,验证者可检查:
1. **边界一致性**:$G_1(0)+G_1(1)=S$;
2. 随机抽取 $r_1\in\mathbb{F}$,把问题降维为验证
$$G_1(r_1) \stackrel{?}{=} \sum_{x_2,\dots,x_n\in\{0,1\}} g(r_1,x_2,\dots,x_n).$$
这将 $n$ 维求和归约为 $n-1$ 维求和。重复 $n$ 次即可。
---
## 标准 Sumcheck 协议(形式化流程)
### 记号
- 初始声明值:$S_0 := S$
- 验证者随机挑战:$r_1,\dots,r_n \in \mathbb{F}$
- 第 $i$ 轮证明者发送的一元多项式:$p_i(X)$
- 更新:$S_i := p_i(r_i)$
### 协议
令 $S_0=S$。对 $i=1,2,\dots,n$:
1. **Prover → Verifier:** 发送一元多项式 $p_i(X)$,并声称:
$$p_i(X) \stackrel{claim}{=} \sum_{x_{i+1},\dots,x_n\in\{0,1\}} g(r_1,\dots,r_{i-1},X,x_{i+1},\dots,x_n).$$
2. **Verifier 检查:**
$$p_i(0)+p_i(1) \stackrel{?}{=} S_{i-1}.$$
若不等则拒绝。
3. **Verifier → Prover:** 采样随机 $r_i\xleftarrow{\$}\mathbb{F}$ 并发送。
4. **更新:** $S_i := p_i(r_i)$。
最后,验证者检查:
$$S_n \stackrel{?}{=} g(r_1,\dots,r_n).$$
> **备注**:在很多应用中,验证者无法直接计算 $g(r)$。这时需要多项式承诺/IOP 来提供 $g(r)$ 的可信求值(见后文)。
---
## 正确性:完备性与健全性(核心证明)
### 完备性(Completeness)
若证明者诚实发送真实的部分求和多项式,则第 $i$ 轮:
$$S_{i-1} = \sum_{x_i\in\{0,1\}} \sum_{x_{i+1..n}\in\{0,1\}} g(r_{<i},x_i,x_{>i})
= p_i(0)+p_i(1).$$
且更新 $S_i=p_i(r_i)$ 保持与真实降维目标一致,最终 $S_n=g(r_1,\dots,r_n)$ 成立。因此诚实证明者总能被接受。
### 可靠性(Soundness)——核心直觉
若声明为假:
$$S \ne \sum_{x\in\{0,1\}^n} g(x),$$
任何作弊证明者想通过,必须在某一轮伪造 $p_i$。验证者每轮随机选择 $r_i$,迫使 $p_i$ 在随机点上与真实多项式一致。由于都是低度一元多项式,伪造在随机点“碰巧”一致的概率很小。
#### 一元多项式根数界
若 $q(X)$ 是非零一元多项式且 $\deg(q)\le d$,则它在 $\mathbb{F}$ 上最多有 $d$ 个根。
#### 逐轮归纳的健全性界(常用版本)
设 $\deg_{X_i}(g)\le d$ 对所有 $i$。则对任意证明者,在声明错误时通过协议的概率:
$$\Pr[\text{Verifier accepts}] \le \frac{n\cdot d}{|\mathbb{F}|}.$$
**证明框架:**
- 定义真实的第 $i$ 轮多项式:
$$G_i(X) := \sum_{x_{i+1..n}\in\{0,1\}} g(r_1,\dots,r_{i-1},X,x_{i+1},\dots,x_n).$$
- 若作弊发送 $p_i\neq G_i$,令差多项式 $\Delta_i(X)=p_i(X)-G_i(X)$,则 $\Delta_i$ 是次数 $\le d$ 的非零一元多项式。
- 想继续欺骗,必须满足 $p_i(r_i)=G_i(r_i)$,即 $\Delta_i(r_i)=0$。随机 $r_i$ 落在根上的概率 $\le d/|\mathbb{F}|$。
- 用并集界/逐轮归纳汇总得到 $\le nd/|\mathbb{F}|$。
我们可以展开证明过程:
- 每一步成功猜中多项式随机点的概率 $\le d/|\mathbb{F}|$,如果没有猜中,攻击者仍然可以构造多项式,满足中间的检查。
- 考虑攻击轮次, 攻击者在第 $i$ 轮攻击成功(猜中多项式随机交叉点)的概率是 $\le (1-d/|\mathbb{F}|)^{i-1}d/|\mathbb{F}|$。
- 因此攻击者总的攻击成功的概率可以用并集界/逐轮归纳汇总得到 $\le nd/|\mathbb{F}|$。
> **参数含义**:域越大、次数越低,作弊成功概率越小。多线性情形 $d=1$ 通常非常理想。
---
## 例子:2 变量多线性多项式跑一遍协议
取 $n=2$,$g(x_1,x_2)=3x_1x_2+2x_1+5$。验证:
$$S \stackrel{?}{=} \sum_{(x_1,x_2)\in\{0,1\}^2} g(x_1,x_2).$$
### 真实求和值(可课堂练习)
- $g(0,0)=5$
- $g(0,1)=5$
- $g(1,0)=7$
- $g(1,1)=10$
总和 $S=27$。
#### 尝试攻击(可以作为反例来演示为什么攻击会失败)
恶意证明者伪造 $S' = 25$。
### 第 1 轮
$$p_1(X_1)=\sum_{x_2\in\{0,1\}} g(X_1,x_2).$$
计算:
- $g(X_1,0)=2X_1+5$
- $g(X_1,1)=3X_1+2X_1+5=5X_1+5$
相加:$p_1(X_1)=7X_1+10$。
Verifier 检查:$p_1(0)+p_1(1)=10+(17)=27$ 通过。
抽样 $r_1$,更新:$S_1=p_1(r_1)=7r_1+10$。
$r_1 = 3$, $S_1=p_1(r_1)=7r_1+10 = 7*3+10 = 31$。
#### 尝试攻击
恶意证明者伪造 $p_1(X_1) = 7X_1 + 9$,通过第1轮中的 Verifier 检查:$p_1(0)+p_1(1)=9+(16)=25$。
此时 Verifier 计算的 $S_1 = 7r_1+9=30$。
### 第 2 轮
$$p_2(X_2)=g(r_1,X_2)=3r_1X_2+2r_1+5.$$
$$p_2(X_2)=g(r_1,X_2)=3r_1X_2+2r_1+5 = 9X_2 + 11.$$
Verifier 检查:
$$p_2(0)+p_2(1)=(2r_1+5)+(3r_1+2r_1+5)=7r_1+10=S_1.$$
$$p_2(0)+p_2(1)=(2r_1+5)+(3r_1+2r_1+5)=7r_1+10=31.$$
抽样 $r_2$,更新:$S_2=p_2(r_2)=g(r_1,r_2)$。
最终检查自然通过:
$$r_2 = 7, g(r_1,r_2)= 3*3*7 + 2*3 +5 = 74$$
$$p_2(r_2) = p_2(7) = 9*7 + 11 = 74$$
#### 尝试攻击
为了使得 $p_2(0)+p_2(1)= 30 $, 恶意证明者伪造 $$p_2(X_2) = 10X_2 + 10$$
此时,Verifier 计算 $$p_2(r_2) = 10*7+10=80 $$
但是,Verifier 计算出的原始多项式在 $(r_1, r_2)$ 处的取值是
$$g(r_1,r_2)= 3*3*7 + 2*3 +5 = 74$$
明显与恶意证明者提供的多项式的计算结果不符合,所以 Verifier 拒绝证明者的伪造,攻击失败。
---
## 为何多线性扩展(MLE)几乎总出现?
很多时候我们从布尔超立方体上的函数出发:
$$f:\{0,1\}^n\to\mathbb{F}.$$
为了用 Sumcheck,我们希望有一个多项式 $\tilde f$ 满足:
- $\tilde f(x)=f(x)$ 对所有 $x\in\{0,1\}^n$;
- $\deg_{X_i}(\tilde f)\le 1$(多线性),使得 $d=1$。
**多线性扩展**保证上述两点并且是唯一的:任意布尔函数都存在唯一的多线性多项式与其在布尔点上一致。
> 直觉:布尔点上做拉格朗日插值,但限制每变量次数 $\le 1$,得到唯一扩展。
---
## 与多项式承诺/IOP 的接口
标准 Sumcheck 的最后一步需要验证者得到 $g(r_1,\dots,r_n)$ 的可信值。但在许多应用中:
- $g$ 是由证明者持有的大表(例如电路每层的值),验证者无法直接计算;
- 或 $g$ 很大,计算代价过高。
典型解决办法:
1. **多项式承诺(PC)**:证明者先对 $g$(或相关多项式)做承诺;最后提供对点 $r$ 的开证明,验证 $g(r)$ 与承诺一致。
2. **IOP/PCP**:将 $g$ 作为 oracle,并用低度测试保证其确为低度多项式;Sumcheck 的终检点查询结合 oracle 访问完成。
因此 Sumcheck 常被视为一个**中间层**:把“指数规模求和”归约为“少量随机点求值一致性”。
---
## 常见变体与工程技巧
### 1) 批量(Batched)Sumcheck
要同时验证多个求和:$S^{(j)}=\sum_x g_j(x)$。可用随机线性组合压缩:
$$\sum_j \alpha_j S^{(j)} \stackrel{?}{=} \sum_x \left(\sum_j \alpha_j g_j(x)\right),$$
只跑一次 sumcheck,通信与轮数不变。
### 2) 低通信实现:只发系数
每轮发送一元多项式 $p_i$ 的系数即可:次数 $\le d$ 需 $d+1$ 个域元素。多线性($d=1$)时每轮只需 2 个域元素。
### 3) 非交互化:Fiat–Shamir(ROM)
将每轮随机挑战 $r_i$ 用哈希生成:
$$r_i := H(\text{transcript up to round }i).$$
这在 SNARK/IOP 中非常常见,但要注意:
- hash-to-field 方式;
- transcript 绑定与域分离(domain separation);
- 与多项式承诺的组合顺序。
---
## 复杂度与参数选择
### 轮数
- 轮数固定为 $n$(变量数)。
### 通信量
- 每轮发送一个次数 $\le d$ 的一元多项式:$d+1$ 个域元素;
- 总通信 $\approx n(d+1)$ 个域元素(不含最终开证明/承诺等)。
### 验证开销
- 每轮做常数次多项式求值(对 0、1 与随机点),加一次随机采样;
- 终检需要得到 $g(r)$(直接算或由承诺/IOP 提供)。
### 健全性误差
- $\le nd/|\mathbb{F}|$。
> 使用中上选取 64-bit 或 128-bit 大域,使误差可忽略。
---
## 练习与思考题
1. **手算 3 变量**:给一个 3 变量多线性 $g$,写出每轮 $p_i$ 并验证一致性条件。
2. **误差估算**:若 $|\mathbb{F}|=2^{64}$、$n=30$、$d=2$,给出最大作弊成功概率上界。
3. **度界讨论**:比较“按变量度界”和“总度界”的差异,为何分析更常用前者?
4. **接口题**:若验证者无法计算 $g(r)$,描述用多项式承诺完成终检的一般流程。
5. **FS 直觉**:在随机预言机模型下,用哈希生成挑战为何合理?它替代了什么假设?
---
## 一页速记(Cheat Sheet)
- **目标**:验证 $S=\sum_{x\in\{0,1\}^n} g(x)$
- **第 i 轮**:Prover 发 $p_i(X)\approx\sum_{x_{i+1..n}} g(r_{<i},X,x_{>i})$
- **检查**:$p_i(0)+p_i(1)=S_{i-1}$
- **挑战**:随机 $r_i\in\mathbb{F}$,更新 $S_i=p_i(r_i)$
- **终检**:$S_n=g(r_1,\dots,r_n)$
- **健全性误差**:$\le nd/|\mathbb{F}|$;多线性时 $d=1$
---