概览

logUp 是一种高效的查表论证方案,其核心是证明一个“分数和”为零:

$$ \sum_{\vec{x}} \left( \frac{m(\vec{x})}{\alpha - t(\vec{x})} - \sum_{i=1}^M \frac{1}{\alpha - w_i(\vec{x})} \right) = 0 $$

  • 表示表值 $t(\vec{x})$ 在所有见证列 $w_i(\vec{x})$ 中出现了 $m(\vec{x})$ 次
  • 传统做法:为了将分数和转换为多项式求和,需要为每个分数项引入辅助列 $h_i(\vec{x})=\frac{1}{\alpha - w_i(\vec{x})}$,为每一列单独生成承诺,并额外证明满足约束 $(\alpha - w_i(\vec{x}))\cdot h_i(\vec{x})=1$
  • 痛点:M 个见证列需要 O(M) 个额外的辅助列承诺。

作者引入 GKR 协议来直接证明上述分数和,无需生成任何辅助列

  • 电路构造:将分数和的计算建模为一个分层电路(Layer 0 到 Layer n),每层进行射影坐标下的分数加法 $(a,b)+ (c,d)=(ad+bc,bd)$
  • 成本对比传统 logUp:需承诺 M+1 个辅助列, GKR logUp:仅需承诺 1 个额外列(即 multiplicity 列 $m(X)$)
  • 优势:虽然算术运算翻倍,但省去了大量昂贵的承诺操作(尤其是在基于椭圆曲线或哈希的承诺方案中),预计可带来 2 到 10 倍 的证明者性能提升。

GKR 分数和检查的构造

问题重构:从分数和到电路求值

1. 原始目标

证明者需要证明以下等式在随机点 α 处成立:

$$ \sum_{\vec{x} \in H_n} \frac{m(\vec{x})}{\alpha - t(\vec{x})} - \sum_{i=1}^M \frac{1}{\alpha - w_i(\vec{x})} = 0 $$

2. 射影表示(Projective Representation)

为了在电路中处理分数,我们不再将 $\frac{1}{(α−w)}$视为一个域元素,而是将其表示为一对域元素 $(p,q)$,满足 $\frac{q}{p}=\frac{1}{(α−w)}$。即:

  • 分子 $p=1$
  • 分母 $q=α−w$

3. 分数加法规则

电路的核心操作是合并两个分数。给定两个分数 (a,b)和 (c,d),它们的和定义为:

$$ (a, b) + (c, d) = (a \cdot d + c \cdot b,\ b \cdot d) $$

这恰好对应了通分相加的规则:$\frac{b}{a}+\frac{d}{c}=\frac{ad+cb}{bd}$。

电路构造:分层合并分数

GKR 分数和检查构造了一个深度为 n($∣H_n∣=2^n$)的二叉树状电路。$H_n$ 表示 n 维布尔超立方体 $\{±1\}^n$

1. 输入层(第 n层)

  • 每个叶子节点对应超立方体 $H_n$ 上的一个点 $\vec{x}$
  • 每个节点存储一个分数对 $(p_n(\vec{x}),q_n(\vec{x}))$
  • 对于 logUp 问题,该层的值直接由查表约束定义:

    • 对于表侧(左侧):$p_n(\vec{x})=m(\vec{x})$, $q_n(\vec{x})=α−t(\vec{x}) $
    • 对于见证侧(右侧):$p_n(\vec{x})=1$, $q_n(\vec{x})=α−w_i(\vec{x}) $(需适当处理多个见证列)

2. 中间层(第 k层,0<k<n)

电路从第 n 层(叶子)开始,逐层向上合并,每一层的节点数是上一层的一半。对于第 k 层的任意节点 $\vec{x}∈\{0,1\}^k$,其值由其两个子节点 $\vec{x_0}$ 和 $\vec{x_1}$通过分数加法规则计算:

$$ \begin{aligned} p_k(\vec{x}) &= p_{k+1}(\vec{x_0}) \cdot q_{k+1}(\vec{x_1}) + p_{k+1}(\vec{x_1}) \cdot q_{k+1}(\vec{x_0}) \\ q_k(\vec{x}) &= q_{k+1}(\vec{x_0}) \cdot q_{k+1}(\vec{x_1}) \end{aligned} $$

其中,$\vec{x_0}=(\vec{x}, -1), \vec{x_1}=(\vec{x}, +1)$,表示将 ±1 追加到 $\vec{x}$

3. 输出层(第 0层)

  • 最终只剩下一个根节点,其值为 $(p_0,q_0)$
  • 根据递归构造,这个根节点存储的值正是整个超立方体上所有分数之和的通分结果

    $$ \frac{p_0}{q_0}=\sum_{x∈H_n}\frac{p_n(\vec{x})}{q_n(\vec{x})} $$

  • 验证者只需检查 $p_0=0$(且 $q_0\ne0$)即可验证原分数和为零。

递归 Sumcheck

当前层的 claim

假设 verifier 当前有:

$$ p_k(\vec r_k)=a $$

为了合并两个 claim,verifier 采样随机数:

$$ \lambda_k\leftarrow \mathbb F $$

然后只证明一个随机线性组合:

$$ p_k(\vec r_k)+\lambda_k q_k(\vec r_k) = a+\lambda_k b $$

如果 prover 能骗过这个随机线性组合,那么除非两个 claim 的错误刚好被 $\lambda_k$ 抵消,否则概率很小。

把 $p_k,q_k$ 写成关于下一层的 sum

因为:

$$ p_k(\vec X) = \sum_{\vec y\in H_k} L_k(\vec X,\vec y) \left( p_{k+1}(\vec y,+1)q_{k+1}(\vec y,-1) + p_{k+1}(\vec y,-1)q_{k+1}(\vec y,+1) \right) $$

所以:

$$ p_k(\vec r_k)+\lambda_k q_k(\vec r_k) $$

等于:

$$ \sum_{\vec y\in H_k} L_k(\vec r_k,\vec y) \Big( p_{k+1}(\vec y,+1)q_{k+1}(\vec y,-1) + p_{k+1}(\vec y,-1)q_{k+1}(\vec y,+1) + \lambda_k q_{k+1}(\vec y,+1)q_{k+1}(\vec y,-1) \Big) $$

这就是一个普通 sumcheck:

$$ \sum_{\vec y\in H_k} F_k(\vec y)=c_k $$

其中:

$$ F_k(\vec y) = L_k(\vec r_k,\vec y) \Big( p_{k+1}(\vec y,+1)q_{k+1}(\vec y,-1) + p_{k+1}(\vec y,-1)q_{k+1}(\vec y,+1) + \lambda_k q_{k+1}(\vec y,+1)q_{k+1}(\vec y,-1) \Big) $$

Sumcheck 结束后得到什么

对第 $k$ 层做完 sumcheck 后,verifier 会得到一个随机点:

$$ \vec \rho_k\in \mathbb F^k $$

并需要检查下一层在两个点上的值:

$$ p_{k+1}(\vec \rho_k,+1), \quad q_{k+1}(\vec \rho_k,+1) $$

也就是说,一个 sumcheck 把第 $k$ 层 claim 变成了第 $k+1$ 层的 two-point claims

但如果每一层都保留两个点,claim 数量会爆炸。

所以 GKR 要再做一次随机合并。


two-point claim 如何合并成 single-point claim

论文里 verifier 采样:

$$ \mu_k\leftarrow \mathbb F $$

然后令:

$$ \vec r_{k+1} = (\vec \rho_k,\ 1-\mu_k) $$

因为 $p_{k+1}$ 和 $q_{k+1}$ 对最后一个变量是 multilinear,所以如果知道:

$$ p_{k+1}(\vec \rho_k,+1) $$

和:

$$ p_{k+1}(\vec \rho_k,-1) $$

就可以线性插值得到任意点:

$$ p_{k+1}(\vec \rho_k,z) $$

特别是:

$$ z=1-\mu_k $$

同理对 $q_{k+1}$。

于是两个点的 claim 被压缩成一个随机点 claim:

$$ p_{k+1}(\vec r_{k+1}), \quad q_{k+1}(\vec r_{k+1}) $$

这一步就是递归的关键:

$$ \text{第 }k\text{ 层 single-point claim} \Rightarrow \text{第 }k+1\text{ 层 single-point claim} $$

参考

Improving logarithmic derivative lookups using GKR

DeepSeek

ChatGPT