# Inner Product Argument
https://dankradfeist.de/ethereum/2021/11/18/inner-product-arguments-mandarin.html
https://dankradfeist.de/ethereum/2021/06/18/pcs-multiproofs.html
https://eprint.iacr.org/2017/1066.pdf
## 符号约定
定义在 $\mathbb{F}_p$ 上的椭圆曲线群 $\mathbb{G}$,标量域为 $\mathbb{F}_r$,从 $\mathbb{G}$ 中选取两组独立的点作为 base:
$\vec{G} = (G_1, G_2, \dots, G_n)$
$\vec{H} = (H_1, H_2, \dots, H_n)$
两个向量的内积定义为:
$$\vec{a} \cdot \vec{b} = \langle \vec{a}, \vec{b} \rangle = \sum_{i=1}^n a_ib_i = a_1b_1+ a_2b_2 + \cdots + a_nb_n$$
## 问题
对于某 $c \in \mathbb{F}_r$, $C \in \mathbb{G}$,证明者 $\mathcal{P}$ 需要说服验证者 $\mathcal{V}$,$\mathcal{P}$ 知道两个向量 $\vec{a} = (a_1, a_2, \dots, a_n)$ 和 $\vec{b} = (b_1, b_2, \dots, b_n)$,使得:$$C = \langle \vec{a}, \vec{G} \rangle + \langle \vec{b}, \vec{H} \rangle \quad \text{and} \quad c = \langle \vec{a}, \vec{b} \rangle$$
一个直观的想法是,$\mathcal{P}$ 直接发送 $\vec{a}$ 和 $\vec{b}$ 给 $\mathcal{V}$,然后让 $\mathcal{V}$ 自行计算验证,但是这样通信量为 $2n$ 个 $\mathbb{F}_r$ 的元素。验证者的工作至少是 $2n$ 个 $\mathbb{G}$ 上的标量乘法。
通过 IPA,可以将通信量降低为 $2 \log_2 n$ 个 $\mathbb{G}$ 上的点。验证者的工作没有特别降低,仍然 $\mathcal{O}(n)$ 个 $\mathbb{G}$ 上的标量乘法。
在 $\vec{G}, \vec{H}$ 之后,新增另一个base,$U \in \mathbb{G}$,然后问题转化为:
对于某 $C \in \mathbb{G}$,证明者 $\mathcal{P}$ 需要说服验证者 $\mathcal{V}$,$\mathcal{P}$ 知道两个向量 $\vec{a} = (a_1, a_2, \dots, a_n)$ 和 $\vec{b} = (b_1, b_2, \dots, b_n)$,使得:$$C = \langle \vec{a}, \vec{G} \rangle + \langle \vec{b}, \vec{H} \rangle + \langle \vec{a}, \vec{b} \rangle U$$
## 协议描述
### Commit
$\mathcal{P}$ 计算 $C = \vec{a} \cdot \vec{G} + \vec{b} \cdot \vec{H} + \vec{a} \cdot \vec{b} \ U$ 并发送给 $\mathcal{V}$
### 第一轮
假设 $m = \frac{n}{2}$,令 $\vec{a}_L = (a_1, a_2, \dots, a_m)$,$\vec{a}_R = (a_m, a_{m+1}, \dots, a_n)$,其他同理。
$\mathcal{P}$:
- 计算:
- $z_L= \vec{a}_R \cdot \vec{b}_L$
- $z_R= \vec{a}_L \cdot \vec{b}_R$
- $C_L= \vec{a}_R \cdot \vec{G}_L + \vec{b}_L \cdot \vec{H}_R + z_LU$
- $C_R= \vec{a}_L \cdot \vec{G}_R + \vec{b}_R \cdot \vec{H}_L + z_RU$
- 并将 $C_L, C_R$ 发送给 $\mathcal{V}$
### 第 $i$ 轮
$\mathcal{V}$:
- 生成随机挑战值 $x \in \mathbb{F}_r$,发送给 $\mathcal{P}$
- 自己计算:
- $C^\prime = x C_L + C + x^{-1} C_R$
- $\vec{G}^\prime = \vec{G}_L + x^{-1}\vec{G}_R$
- $\vec{H}^\prime = \vec{H}_L + x \vec{H}_R$
$\mathcal{P}$:
- 计算:
- $\vec{G}^\prime = \vec{G}_L + x^{-1}\vec{G}_R$
- $\vec{H}^\prime = \vec{H}_L + x \vec{H}_R$
- $\vec{a}^\prime = \vec{a}_L + x \vec{a}_R$
- $\vec{b}^\prime = \vec{b}_L + x^{-1} \vec{b}_R$
现在需要 $\mathcal{P}$ 证明 $C^\prime = \vec{a}^\prime \cdot \vec{G}^\prime + \vec{b}^\prime \cdot \vec{H}^\prime + \vec{a}^\prime \cdot \vec{b}^\prime \ U$
所有长度为前一轮的一半。然后替换:
$C = C^\prime$
$\vec{G} = \vec{G}^\prime$
$\vec{H} = \vec{H}^\prime$
$\vec{a} = \vec{a}^\prime$
$\vec{b} = \vec{b}^\prime$
如果此时 $|\vec{a}|$ 的长度不等于 $1$,回到上一步;
否则这是最后一轮:
$\mathcal{P}$:
- 发送 $\vec{a} = (a_1), \vec{b} = (b_1)$ 给 $\mathcal{V}$
$\mathcal{V}$:
- 计算 $D = a_1 G_1 + b_1 H_1 + a_1 b_1 U$,如果 $D = C$ 则接受,输出 True;否则拒绝,输出 False.
## 示例
### 问题
对于 $C \in \mathbb{G}$,$\mathcal{P}$ 需要向 $\mathcal{V}$ 证明,$\mathcal{P}$ 知道 $\vec{a} = (a_1, a_2)$ 和 $\vec{b} = (b_1, b_2)$, 使得 $C = \vec{a} \cdot \vec{G} + \vec{b} \cdot \vec{H} + \vec{a} \cdot \vec{b} \ U = a_1G_1 + a_2G_2 + b_1H_1 + b_2H_2 + (a_1b_1 + a_2 b_2)U$
### Commit
$\mathcal{P}$ 计算 $C$ 并发送给 $\mathcal{P}$。
### 第一轮
$\mathcal{P}$:
- 从 $\vec{a}$ 中获取 $\vec{a}_{L} = (a_1)$,$\vec{a}_{R} = (a_2)$
- 从 $\vec{b}$ 中获取 $\vec{b}_{L} = (b_1)$,$\vec{b}_{R} = (b_2)$
- 从 $\vec{G}$ 中获取 $\vec{G}_{L} = (G_1)$,$\vec{G}_{R} = (G_2)$
- 从 $\vec{H}$ 中获取 $\vec{H}_{L} = (H_1)$,$\vec{H}_{R} = (H_2)$
- 计算 $C_L = \vec{a}_{R} \cdot \vec{G}_{L} + \vec{b}_{L} \cdot \vec{H}_{R} + \vec{a}_{R} \cdot \vec{b}_{L} \ U = a_2G_1 + b_1H_2 + a_2b_1 U$
- 计算 $C_R = \vec{a}_{L} \cdot \vec{G}_{R} + \vec{b}_{R} \cdot \vec{H}_{L} + \vec{a}_{L} \cdot \vec{b}_{R} \ U = a_1G_2 + b_2H_1 + a_1b_2 U$
- 并将 $C_L, C_R$ 发送给 $\mathcal{V}$
### 第二轮
$\mathcal{V}$:
- 生成随机挑战值 $x \in \mathbb{F}_r$,发送给 $\mathcal{P}$
- 自己计算:
- $C^\prime = xC_L + C + x^{-1}C_R$
- $\vec{G}^\prime = \vec{G}_L + x^{-1}\vec{G}_R= (G_1 + x^{-1}G_2)$
- $\vec{H}^\prime = \vec{H}_L + x\vec{H}_R = (H_1 + xH_2)$
$\mathcal{P}$:
- 计算:
- $\vec{G}^\prime = \vec{G}_L + x^{-1}\vec{G}_R= (G_1 + x^{-1}G_2)$
- $\vec{H}^\prime = \vec{H}_L + x\vec{H}_R = (H_1 + xH_2)$
- $\vec{a}^\prime = \vec{a}_L + x\vec{a}_R= (a_1 + xa_2)$
- $\vec{b}^\prime = \vec{b}_L + x^{-1}\vec{b}_R = (b_1 + x^{-1}b_2)$
- 长度为 $1$,这已经是最后一轮,发送 $\vec{a}^\prime$,$\vec{b}^\prime$ 给 $\mathcal{V}$
$\mathcal{V}$:
- 计算 $$\begin{align*} D &= \vec{a}^\prime \vec{G}^\prime + \vec{b}^\prime \vec{H}^\prime + a^\prime b^\prime U \\ &= (a_1 + xa_2)(G_1 + x^{-1}G_2) + (b_1 + x^{-1}b_2)(H_1 + xH_2) + (a_1+xa_2)(b_1 + x^{-1}b_2) U \\ &= (a_1 + xa_2)G_1 + (a_1x^{-1} + a_2)G_2 + (b_1+x^{-1}b_2)H_1 + (b_1x + b_2)H_2 + (a_1b_1 + a_1x^{-1}b_2 + xa_2b_1 + a_2b_2)U \end{align*}$$
- $\begin{align*} C^\prime &= xC_L + C + x^{-1}C_R \\ & = (xa_2G_1 + xb_1H_2 + xa_2b_1U) + (a_1G_1 + a_2G_2 + b_1H_1 + b_2H_2 + (a_1b_1+a_2b_2)U) + (x^{-1} a_1G_2 + x^{-1}b_2H_1 + x^{-1}a_1b_2U) \\ &= (a_1 + xa_2)G_1 + (a_2 + a_1x^{-1})G_2 + (b_1 + x^{-1}b_2)H_1 + (b_2 + xb_1)H_2 + (xa_2b_1 + a_1b_1 + a_2b_2 + x^{-1}a_1b_2)U \\ &= D \end{align*}$
因此接受.
## 安全性分析
### correctness
$\mathcal{P}$ 按照协议正确执行,那么 $\mathcal{V}$ 一定能够输出 True,因为
$C$ 可以扩展为:
$$\begin{align*} C & = \vec{a} \cdot \vec{G} + \vec{b} \cdot \vec{H} + \vec{a} \cdot \vec{b} \ U \\ & = \vec{a}_L \cdot \vec{G}_L + \vec{a}_R \cdot \vec{G}_R + \vec{b}_L \cdot \vec{H}_L + \vec{b}_R \cdot \vec{H}_R + (\vec{a}_L \cdot \vec{b}_L + \vec{a}_R \cdot \vec{b}_R) \ U \end{align*}$$
如果 $\mathcal{P}$ 正确计算了 $\vec{a}^\prime$, $\vec{b}^\prime$, $\vec{G}^\prime$, $\vec{H}^\prime$, 那么最后一轮 $\mathcal{P}$ 能够得出 $D = C^\prime$
$$\begin{align*} D &= \vec{a}^\prime\vec{G}^\prime + \vec{b}^\prime \vec{H}^\prime + \vec{a}^\prime\vec{b}^\prime U \\ & = (\vec{a}_L + x \vec{a}_R)(\vec{G}_L + x^{-1} \vec{G}_R) + (\vec{b}_L + x^{-1}\vec{b}_R)(\vec{H}_L + x \vec{H}_R) + (\vec{a}_L + x\vec{a}_R)(\vec{b}_L + x^{-1}\vec{b}_R)U \\ &= \vec{a}_L \vec{G}_L + x\vec{a}_R\vec{G}_L + \vec{a}_L x^{-1}\vec{G}_R + \vec{a}_R\vec{G}_R + \vec{b_L}\vec{H}_L + x\vec{b}_L\vec{H}_R + x^{-1} \vec{b}_R \vec{H}_L + \vec{b}_R\vec{H}_R + (\vec{a}_L \vec{b}_L + x\vec{a}_R\vec{b}_L + x^{-1}\vec{a}_L \vec{b}_R + \vec{a}_R\vec{b}_R)U \\ & = (\vec{a}_L\vec{G}_L + \vec{a}_R\vec{G}_R + \vec{b}_L\vec{H}_L + \vec{b}_R\vec{H}_R + (\vec{a}_L\vec{b}_L + \vec{a}_R\vec{b}_R)U) + x(\vec{a}_R\vec{G}_L + \vec{b}_L\vec{H}_R + \vec{a}_R\vec{b}_L U) + x^{-1}(\vec{a}_L\vec{G}_R + \vec{b}_R\vec{H}_L + \vec{a}_L\vec{b}_RU) \\ & = C + xC_L + x^{-1}C_R \\ & = C^\prime \end{align*}$$
### soundness
$\mathcal{P}$ 能否作恶来欺骗 $\mathcal{V}$?
假设 $\mathcal{P}$ 提交了 $C = \vec{a} \cdot \vec{G} + \vec{b} \cdot \vec{H} + r U$,其中 $r \neq \vec{a} \cdot \vec{b}$,
$\vec{a}^\prime =\vec{a}_L + x\vec{a}_R$
$\vec{b}^\prime =\vec{b}_L + x^{-1}\vec{b}_R$
$\vec{G}^\prime =\vec{G}_L + x^{-1}\vec{G}_R$
$\vec{H}^\prime =\vec{H}_L + x\vec{H}_R$
$C^\prime = \vec{a}^\prime\vec{G}^\prime + \vec{b}^\prime\vec{H}^\prime + (xz_L+ r + x^{-1}z_R)U$
要想最后成功验证,第二轮的参数需要满足内积形式:
$\vec{a}^\prime \cdot \vec{b}^\prime = xz_L+ r + x^{-1}z_R$
$\vec{a}_L\vec{b}_L + \vec{a}_R\vec{b}_R + x^{-1}\vec{a}_L\vec{b}_R + x\vec{a}_R\vec{b}_L = xz_L+ r + x^{-1}z_R$
$(\vec{a}_R\vec{b}_L - z_L)x^2 + (\vec{a}\cdot\vec{b}-r)x + (\vec{a}_L\vec{b}_R - z_R) = 0$
$\mathcal{V}$ 是在 $\mathcal{P}$ 承诺 $r, z_L, z_R$ 后选取的随机 $x$,因此上面等式成立的概率约为 $\frac{2}{|\mathbb{F}_r|}$,是一个可以忽略的值。
## 性能优化
$\mathcal{V}$ 每轮都需要更新 base $\vec{G}, \vec{H}$,但是他其实只需要每轮把 $x_i$ 发送过去,只有最后的时候需要验证,因此可以把 base 更新放到最后,并且使用标量之间的运算替代中间步骤的 msm。
$\vec{G}$: $(G_1, G_2, G_3, G_4, G_5, G_6, G_7, G_8)$
$\vec{H}$: $(H_1, H_2, H_3, H_4, G_5, H_6, H_7, H_8)$
$(G_1 + x_1^{-1}G_5, G_2 + x_1^{-1}G_6, G_3 + x_1^{-1}G_7, G_4 + x_1^{-1}G_8)$
$(G_1 + x_1^{-1}G_5 + x_2^{-1}G_3 + x_1^{-1}x_2^{-1}G_7, G_2+ x_1^{-1}G_6 + x_2^{-1}G_4 + x_1^{-1}x_2^{-1}G_8)$
$G_1 + x_3^{-1}G_2 + x_2^{-1}G_3 + x_2^{-1}x_3^{-1}G_4 + x_1^{-1}G_5 + x_1^{-1}x_3^{-1}G_6 + x_1^{-1}x_2^{-1}G_7 + x_1^{-1}x_2^{-1}x_3^{-1}G_8$
$$f_G(X) = \prod_{j=0}^{k-1}(1 + x_{k-j}^{-1} X^{2^j})$$
$f_G(X)$ 的 $X^i$ 系数对应 $G_{i+1}$的标量乘法。
$$f_H(X) = \prod_{j=0}^{k-1}(1 + x_{k-j} X^{2^j})$$
$f_H(X)$ 的 $X^i$ 系数对应 $H_{i+1}$的标量乘法。
## 使用 IPA 验证多项式
### 承诺的计算
场景:
- 验证 $f(x) = \sum_{i=0}^{n-1} a_i x^i$ 在 $z$ 处的取值。
- 令 $\vec{a} = (a_0, a_1, \dots, a_{n-1})$, $\vec{b} = (1, z, z^2, \dots, z^{n-1})$,则我们可以通过 IPA 验证承诺 $C$ 具体“内积属性”。并且通过改进,还能验证 $f(z) = \sum_{i=0}^{n-1} a_i z^i = \vec{a}\cdot\vec{b}$ 的结果
内积属性的含义是:$C = \vec{a} \cdot \vec{G} + \vec{b} \cdot \vec{H} + \vec{a}\cdot\vec{b} U$
$\mathcal{P}$:
- 计算承诺 $F = \vec{a} \cdot \vec{G}$
- 发送承诺 $F$ 给 $\mathcal{V}$
$\mathcal{V}$:
- 发送自变量 $z$ 给 $\mathcal{P}$
$\mathcal{P}$:
- 计算 $y = f(z)$,发送 $y$ 给 $\mathcal{V}$。
$\mathcal{V}$:
- 计算
- $C = \vec{a} \cdot \vec{G} + \vec{b} \cdot \vec{H} + \vec{a} \cdot \vec{b} U = F + \vec{b} \cdot \vec{H} + yU$
- 因为 $\vec{b} = (1, z, z^2, \dots, z^{n-1})$ 对 $\mathcal{V}$ 来说是已知的。
这里有个问题,$\mathcal{P}$ 可以作弊,比如他提交 $F = \vec{a} \cdot \vec{G} + t U$,然后能够证明 $f(z) = y -t$。问题的来源是 $\mathcal{P}$ 在承诺的时候就知道了base $U$,因此 $\mathcal{V}$ 可以在收到 $F$ 和 $y$ 之后重新选择 $U = wU$,$w$ 为一个随机标量。
- 后面的交互式流程就和前面描述的 IPA 一样了。
### 优化
$\vec{b} = (1, z, z^2, \dots, z^{n-1})$ 是已知的,可以参考前面对 $\vec{G}, \vec{H}$ 的优化。由 $f_G(Z)$ 给出系数。
### 针对点值形式 evaluation format 的多项式
前面给出了系数形式的 IPA
虽然给定 $n$ 个系数或者 $n$ 个点都能唯一确定 $n-1$ 次多项式,但是点值形式转系数形式需要 FFT,有 $\mathcal{O}(n \log n)$ 次运算,并且要求定义域使用 Root of unity。否则是 $\mathcal{O}(n^2)$。
为了避免这项开销,直接对值进行承诺:
$$F = f(x_0) G_0 + f(x_1)G_1 + \cdots + f(x_{n-1})G_{n-1}$$
这表示 $\vec{a} = (f(x_0), f(x_1), f(x_2), \dots, f(x_{n-1}))$
使用重心公式:
$$f(z) = A(z)\sum_{i=0}^{n-1}\frac{f(x_i)}{A^\prime(x_i)} \frac{1}{z-x_i}$$
如果我们选择 $\vec{b}$:
$$b_i = \frac{A(z)}{A^\prime(x_i)} \frac{1}{z-x_i}$$
就能得到 $\vec{a} \cdot \vec{b} = f(z)$