在进入本章前,请先阅读
KZG承诺(1)–预备知识
KZG承诺(2)–方案构建流程
上一节介绍了KZG承诺完整流程,其中一个评估对应一个证明。在实际运用过程中往往存在各种情况,比如,一个多项式打开多个点或多个多项式打开一个点等等,如果都采用原始方案,将造成大量的验证开销和通信开销。因此针对不同多项式个数和评估点的数量,给出了不同的评估流程进行优化,我们主要从以下三种情况去了解具体的KZG多项式承诺批量验证方案,即一个多项式在多个评估点打开和验证,多个多项式在一个点打开和验证,多个多项式在多个点打开和验证。(一个多项式在一个点打开的情况在上一节)
我们给出以上三种情况下原始KZG方案所需要的计算代价和通信开销。假设此时多项式的阶数为 n n n,因为承诺和计算评估的过程在所有情况下都是一致的,我们只对比srs的大小、证明 π \pi π 的验证开销和证明大小。 P P P代表一次双线性配对操作, M M M代表一次幂乘操作,srs和证明大小都是群元素为单位,此时忽略两个群元素之间的不同。(注:所有对比操作中均忽略了群元素下的加法操作)
情况 | srs | 证明验证开销 | 证明大小 |
---|---|---|---|
一个多项式在一个评估点 | n + 3 n+3 n+3 | 2 P 2P 2P | 1 1 1 |
一个多项式在 m m m个评估点 | n + 3 n+3 n+3 | 2 m P 2mP 2mP | m m m |
m m m个多项式在一个评估点 | n + 3 n+3 n+3 | 2 m P 2mP 2mP | m m m |
m m m个多项式在 m m m个评估点 | n + 3 n+3 n+3 | 2 m 2 P 2m^2P 2m2P | m 2 m^2 m2 |
虽然单个KZG多项式承诺证明验证和通信开销已经很低了,但对于多个多项式在多点打开和验证情况,证明验证和通信开销依然和多项式和点的个数相关。因此,如果多个多项式需要在多个点值打开和验证,这时候需要批量打开【Batch Opening】和验证了。
一个多项式在 m m m个点打开和验证
当验证者询问一个承诺多项式在多个评估点的值时,采用原始KZG方案如下所示。
此时,证明的大小与评估点个数一致,且验证开销也是与评估点个数正相关。考虑去缩小验证和通信开销,我们可以一个非常巧妙的方法使其通过一次零点证明来确保多个评估的正确性。回忆一下,上述证明是为了确保以下等式成立。
f
(
z
1
)
=
v
1
f
(
z
2
)
=
v
2
.
.
.
f
(
z
m
)
=
v
m
f(z_1)=v_1\\ f(z_2)=v_2\\ ...\\ f(z_m)=v_m\\
f(z1)=v1f(z2)=v2...f(zm)=vm
对于右侧的值,可否当作一个多项式在点
z
1
,
z
2
,
.
.
.
,
z
m
z_1,z_2,...,z_m
z1,z2,...,zm的值为
v
1
,
v
2
,
.
.
.
,
v
m
v_1, v_2, ...,v_m
v1,v2,...,vm,因此可唯一确定一个
m
−
1
m-1
m−1阶的一个多项式
g
(
x
)
g(x)
g(x)。因此可以转变为证明任意
i
∈
m
i\in m
i∈m,
f
(
z
i
)
=
g
(
z
i
)
f(z_i)=g(z_i)
f(zi)=g(zi)。
进一步,此时可以转变为证明多项式
f
(
x
)
−
g
(
x
)
f(x)-g(x)
f(x)−g(x)在
z
1
,
z
2
,
.
.
.
,
z
m
z_1,z_2,...,z_m
z1,z2,...,zm的值为零,运用零点证明,则转换成证明存在
h
(
x
)
h(x)
h(x)使得以下等式成立。
f
(
x
)
−
g
(
x
)
=
h
(
x
)
(
x
−
z
1
)
(
x
−
z
2
)
.
.
.
(
x
−
z
m
)
f(x)-g(x)=h(x)(x-z_1)(x-z_2)...(x-z_m)
f(x)−g(x)=h(x)(x−z1)(x−z2)...(x−zm)
为了方便,用
z
(
x
)
z(x)
z(x)表示
(
x
−
z
1
)
(
x
−
z
2
)
.
.
.
(
x
−
z
m
)
(x-z_1)(x-z_2)...(x-z_m)
(x−z1)(x−z2)...(x−zm),此时一个多项式在
m
m
m个点打开和批量验证流程如下所示。
此时,一个多项式在 m m m个评估点的批量验证下,srs大小、证明大小和验证开销与原方案开销对比。
一个多项式在 m m m个评估点 | srs | 证明验证开销 | 证明大小 |
---|---|---|---|
原始方案 | n + 3 n+3 n+3 | 2 m P 2mP 2mP | m m m |
批量证明 | n + m + 2 n+m+2 n+m+2 | 2 P 2P 2P | 1 1 1 |
m m m个多项式在一个点打开和验证
当验证者询问多个承诺多项式在一个评估点的值时,采用原始KZG方案如下所示。
显而易见,此时证明的大小与多项式个数一致,且验证开销也是与评估点个数正相关。此时很显然无法使用一次零点证明来确保多个评估去缩小验证和通信开销,我们考虑使用其他手段来实现,观察验证等式。
e
(
[
f
1
(
r
)
]
1
−
[
v
1
]
1
,
[
1
]
2
)
=
e
(
[
π
1
]
1
,
[
r
−
z
]
2
)
e
(
[
f
2
(
r
)
]
1
−
[
v
2
]
1
,
[
1
]
2
)
=
e
(
[
π
2
]
1
,
[
r
−
z
]
2
)
.
.
.
e
(
[
f
m
(
r
)
]
1
−
[
v
m
]
1
,
[
1
]
2
)
=
e
(
[
π
m
]
1
,
[
r
−
z
]
2
)
e([f_1(r)]_1-[v_1]_1,[1]_2)=e([\pi_1]_1,[r-z]_2)\\ e([f_2(r)]_1-[v_2]_1,[1]_2)=e([\pi_2]_1,[r-z]_2)\\ ...\\ e([f_m(r)]_1-[v_m]_1,[1]_2)=e([\pi_m]_1,[r-z]_2)
e([f1(r)]1−[v1]1,[1]2)=e([π1]1,[r−z]2)e([f2(r)]1−[v2]1,[1]2)=e([π2]1,[r−z]2)...e([fm(r)]1−[vm]1,[1]2)=e([πm]1,[r−z]2)
在前面的章节,我们介绍了一种手段——随机线性化组合,用来将多个验证等式合并成一个等式,且介绍了在一些特殊情况下,其证明项进行合并可缩小证明的大小,如果没听说过,不用着急,可以点这阅读具体的内容。此时验证者选择一个随机数
ξ
\xi
ξ,将以上验证等式合并成以下验证等式。
e
(
∑
i
=
1
m
ξ
i
−
1
(
[
f
i
(
r
)
]
1
−
[
v
i
]
1
)
,
[
1
]
2
)
=
e
(
∑
i
=
1
m
ξ
i
−
1
[
π
i
]
1
,
[
r
−
z
]
2
)
e(\sum_{i=1}^{m}\xi^{i-1}([f_i(r)]_1-[v_i]_1),[1]_2)=e(\sum_{i=1}^{m}\xi^{i-1}[\pi_i]_1,[r-z]_2)
e(i=1∑mξi−1([fi(r)]1−[vi]1),[1]2)=e(i=1∑mξi−1[πi]1,[r−z]2)
注意,此时验证者公开随机数
ξ
\xi
ξ,证明人直接发送
∏
i
=
1
m
ξ
i
−
1
[
π
i
]
1
\prod_{i=1}^{m}\xi^{i-1}[\pi_i]_1
∏i=1mξi−1[πi]1作为证明(注:此时上述验证等式仅
π
=
∑
i
=
1
m
ξ
i
−
1
[
π
i
]
1
\pi=\sum_{i=1}^{m}\xi^{i-1}[\pi_i]_1
π=∑i=1mξi−1[πi]1未知,因此其值唯一,可缩小证明),因为若发送的证明使验证等式 (9) 成立,则可推导出等式 (8) 成立。此时这种情况下批量验证的完整流程如图所示。
注意图中证明者计算证明的过程与先分别计算出证明 π i \pi_i πi,再计算 π = ∑ i = 1 m ξ i − 1 π i \pi=\sum_{i=1}^m\xi^{i-1}\pi_i π=∑i=1mξi−1πi的结果一致。但图中计算更快。
可以给出 m m m个多项式在一个点打开和验证的批量验证下,srs大小、证明大小和验证开销与原方案开销对比。
m m m个多项式在一个点打开和验证 | srs | 证明验证开销 | 证明大小 |
---|---|---|---|
原始方案 | n + 3 n+3 n+3 | 2 m P 2mP 2mP | m m m |
批量验证 | n + 3 n+3 n+3 | 2 P + m M 2P+mM 2P+mM | 1 1 1 |
此时,大家可能有个疑问,在一个多项式在
m
m
m个点打开和验证的情形下,可以随机线性化组合将多个验证等式转换为一个验证等式的方式实现缩小开销和证明大小?答案当然是可以的,我们可以看看采用随机线性化组合的方式的方案流程。在证明人提交评估后,验证者选择随机数
ξ
\xi
ξ,此时验证等式可以合并为
e
(
∑
i
=
1
m
ξ
i
−
1
(
[
f
(
r
)
]
1
−
[
v
1
]
1
)
,
[
1
]
2
)
=
∏
i
=
1
m
e
(
[
π
i
]
1
,
[
r
−
z
1
]
2
)
ξ
i
−
1
e(\sum_{i=1}^{m}\xi^{i-1}([f(r)]_1-[v_1]_1),[1]_2)= \prod_{i=1}^{m}e([\pi_i]_1,[r-z_1]_2)^{\xi^{i-1}}
e(i=1∑mξi−1([f(r)]1−[v1]1),[1]2)=i=1∏me([πi]1,[r−z1]2)ξi−1
。此时我们可以观察到证明项
π
i
\pi_i
πi并不能合并,则证明依然是
π
1
,
π
2
,
.
.
.
,
,
π
m
\pi_1,\pi_2,...,, \pi_m
π1,π2,...,,πm。与基于零点证明实现的批量证明对比如下表所示。
一个多项式在 m m m个评估点 | srs | 证明验证开销 | 证明大小 |
---|---|---|---|
基于随机线性化组合 | n + 3 n+3 n+3 | ( m + 1 ) P + 2 ( m − 1 ) M (m+1)P+2(m-1)M (m+1)P+2(m−1)M | 1 |
基于零点证明 | n + m + 2 n+m+2 n+m+2 | 2 P + m M 2P+mM 2P+mM | 1 1 1 |
显而易见,一个多项式在 m m m个点打开和验证的情形下,在基于零点证明实现批量证明的验证开销远小于基于随机线性化组合实现的批量证明。此时我们可以得出一个结论,单个多项式多点打开适合采用零点证明实现批量验证,多个多项式单点打开适合采用随机线性化组合实现批量验证,且零点证明优先于随机线性化组合。
多个多项式在多个点打开和验证
上面两小节我们详细介绍了批量验证中两种常用手段——零点证明和随机线性化组合。这两种方法足以应对所有的场景,无非结合两种方法使用。为了方便大家理解多个多项式在多个评估点打开和验证的流程,我们以下面例子进行展开。大家也可结合上述结论考虑如何实现批量验证。
举个例子,证明者此时拥有两个多项式 f 1 ( x ) f_1(x) f1(x)和 f 2 ( x ) f_2(x) f2(x), f 1 ( x ) f_1(x) f1(x)在评估点 z 1 , z 2 z_1,z_2 z1,z2打开, f 2 ( x ) f_2(x) f2(x)在评估点 z 3 , z 4 z_3,z_4 z3,z4打开。首先按照通用的流程证明人发送承诺和评估,如图所示。
这时需要证明来证明
v
1
,
v
2
,
v
1
′
,
v
2
′
v_1, v_2,v_1^{\prime}, v_2^{\prime}
v1,v2,v1′,v2′是采用多项式正确计算的。即验证者验证(或者说证明者需证明)
v
1
=
f
(
z
1
)
v
2
=
f
(
z
2
)
v
1
′
=
f
′
(
z
3
)
v
2
′
=
f
′
(
z
4
)
v_1=f(z_1)\\ v_2=f(z_2)\\ v_1^{\prime}=f^{\prime}(z_3)\\ v_2^{\prime}=f^{\prime}(z_4)
v1=f(z1)v2=f(z2)v1′=f′(z3)v2′=f′(z4)
。首先,使用对在不同点打开的同一个多项式使用零点证明,验证者可以使用多项式点值对
(
z
1
,
v
1
)
(z_1,v_1)
(z1,v1)和
(
z
2
,
v
2
)
(z_2,v_2)
(z2,v2)唯一确定一个
1
1
1阶多项式
g
(
x
)
g(x)
g(x),
(
z
3
,
v
1
′
)
(z_3,v_1^{\prime})
(z3,v1′)和
(
z
4
,
v
2
′
)
(z_4,v_2^{\prime})
(z4,v2′)能唯一恢复一个
1
1
1阶多项式
g
′
(
x
)
g^{\prime}(x)
g′(x),则变为验证以下等式在
r
r
r点成立。
f
(
x
)
−
g
(
x
)
=
0
f
′
(
x
)
−
g
′
(
x
)
=
0
f(x)-g(x)=0\\ f^{\prime}(x)-g^{\prime}(x)=0\\
f(x)−g(x)=0f′(x)−g′(x)=0
对两个多项式运用零点证明,此时转变为存在评估证明
h
(
r
)
,
h
′
(
r
)
h(r),h^{\prime}(r)
h(r),h′(r)使得以下验证等式成立
f
(
r
)
−
g
(
r
)
=
h
(
r
)
(
r
−
z
1
)
(
r
−
z
2
)
f
′
(
r
)
−
g
′
(
r
)
=
h
′
(
r
)
(
r
−
z
3
)
(
r
−
z
4
)
f(r)-g(r)=h(r)(r-z_1)(r-z_2)\\ f^{\prime}(r)-g^{\prime}(r)=h^{\prime}(r)(r-z_3)(r-z_4)\\
f(r)−g(r)=h(r)(r−z1)(r−z2)f′(r)−g′(r)=h′(r)(r−z3)(r−z4)
,将
(
r
−
z
1
)
(
r
−
z
2
)
(r-z_1)(r-z_2)
(r−z1)(r−z2)表示成多项式形式
z
(
r
)
=
r
2
−
(
z
1
+
z
2
)
r
+
z
1
z
2
z(r)=r^2-(z_1+z_2)r+z_1z_2
z(r)=r2−(z1+z2)r+z1z2,
(
r
−
z
3
)
(
r
−
z
4
)
(r-z_3)(r-z_4)
(r−z3)(r−z4)表示成多项式
z
′
(
r
)
=
r
2
−
(
z
3
+
z
4
)
r
+
z
3
z
4
z^{\prime}(r)=r^2-(z_3+z_4)r+z_3z_4
z′(r)=r2−(z3+z4)r+z3z4。然后,验证者选择一个随机数
ξ
\xi
ξ,再使用随机化线性组合将这两个验证等式合并为以下验证等式。再将左边的等式将
z
(
r
)
z(r)
z(r)和
z
′
(
r
)
z^{\prime}(r)
z′(r)按照多项式项
1
,
x
,
.
.
.
1,x,...
1,x,...进行拆分和合并,
f
(
r
)
−
g
(
r
)
+
ξ
f
′
(
r
)
−
g
′
(
r
)
=
h
(
r
)
(
r
−
z
1
)
(
r
−
z
2
)
+
ξ
h
′
(
r
)
(
r
−
z
3
)
(
r
−
z
4
)
⇓
f
(
r
)
−
g
(
r
)
+
ξ
f
′
(
r
)
−
g
′
(
r
)
=
h
(
r
)
(
r
2
−
(
z
1
+
z
2
)
r
+
z
1
z
2
)
+
ξ
h
′
(
r
)
(
r
2
−
(
z
3
+
z
4
)
r
+
z
3
z
4
)
⇓
f
(
r
)
−
g
(
r
)
+
ξ
f
′
(
r
)
−
g
′
(
r
)
−
b
(
h
(
r
)
+
ξ
h
′
(
r
)
)
=
(
h
(
r
)
+
ξ
h
′
(
r
)
)
r
2
+
a
(
h
(
r
)
+
ξ
h
′
)
r
f(r)-g(r)+\xi f^{\prime}(r)-g^{\prime}(r)=h(r)(r-z_1)(r-z_2)+\xi h^{\prime}(r)(r-z_3)(r-z_4)\\ \Downarrow\\ f(r)-g(r)+\xi f^{\prime}(r)-g^{\prime}(r)=h(r)(r^2-(z_1+z_2)r+z_1z_2)+ \xi h^{\prime}(r)(r^2-(z_3+z_4)r+z_3z_4)\\ \Downarrow\\ f(r)-g(r)+\xi f^{\prime}(r)-g^{\prime}(r)-b(h(r)+\xi h^{\prime}(r))=(h(r)+\xi h^{\prime}(r))r^2+a(h(r)+\xi h^{\prime})r
f(r)−g(r)+ξf′(r)−g′(r)=h(r)(r−z1)(r−z2)+ξh′(r)(r−z3)(r−z4)⇓f(r)−g(r)+ξf′(r)−g′(r)=h(r)(r2−(z1+z2)r+z1z2)+ξh′(r)(r2−(z3+z4)r+z3z4)⇓f(r)−g(r)+ξf′(r)−g′(r)−b(h(r)+ξh′(r))=(h(r)+ξh′(r))r2+a(h(r)+ξh′)r
此时,
a
=
−
z
1
−
z
2
−
z
3
−
z
4
a=-z_1-z_2-z_3-z_4
a=−z1−z2−z3−z4和
b
=
z
1
z
2
+
z
3
z
4
b=z_1z_2+z_3z_4
b=z1z2+z3z4。因为
r
r
r是密文,所有实际验证等式如下。
e
(
[
f
(
r
)
]
1
−
[
g
(
r
)
]
1
+
ξ
(
[
f
′
(
r
)
]
1
−
[
g
′
(
x
)
]
1
)
−
b
(
[
h
(
r
)
]
1
+
ξ
[
h
′
(
r
)
]
1
)
,
[
1
]
2
)
=
e
(
[
h
(
r
)
]
1
+
ξ
[
h
′
(
r
)
]
1
,
[
r
2
]
2
)
+
e
(
a
(
[
h
(
r
)
]
1
+
ξ
[
h
′
(
r
)
]
1
)
,
[
r
]
2
)
\begin{align*} e([f(r)]_1-[g(r)]_1+\xi([f^{\prime}(r)]_1-[g^{\prime}(x)]_1)-b([h(r)]_1+\xi [h^{\prime}(r)]_1),[1]_2)&= \\e([h(r)]_1+\xi[h^{\prime}(r)]_1,[r^2]_2)+e(a([h(r)]_1+\xi [h^{\prime}(r)]_1),[r]_2) \end{align*}
e([f(r)]1−[g(r)]1+ξ([f′(r)]1−[g′(x)]1)−b([h(r)]1+ξ[h′(r)]1),[1]2)e([h(r)]1+ξ[h′(r)]1,[r2]2)+e(a([h(r)]1+ξ[h′(r)]1),[r]2)=
注意,此时证明者计算的证明为
[
h
(
r
)
]
1
,
[
h
′
(
r
)
]
1
[h(r)]_1,[h^{\prime}(r)]_1
[h(r)]1,[h′(r)]1。此时证明项并不能合并,所以此时证明不变。可能大家还是对整体流程有一些疑问,因此我们给出了以下流程图
根据以上例子,我们假设有 m m m个多项式,分别在集合 S 1 , S 2 , . . . , S m S_1,S_2,...,S_m S1,S2,...,Sm上打开和验证,其中 m a x = m a x { ∣ S 1 ∣ , ∣ S 2 ∣ , . . . , ∣ S m ∣ } max=max{\{|S_1|,|S_2|,...,|S_m|\}} max=max{∣S1∣,∣S2∣,...,∣Sm∣}。这种情况下的证明开销对比如表所示。
m m m个多项式在多个评估点 | srs | 证明验证开销 | 证明大小 |
---|---|---|---|
原始方案 | n + 3 n+3 n+3 | 2 m 2 P 2m^2P 2m2P | m 2 m^2 m2 |
批量验证 | n + 2 + m a x n+2+max n+2+max | ( m a x + 1 ) P + ( 3 m − 2 ) M (max+1)P+(3m-2)M (max+1)P+(3m−2)M | m m m |
KZG方案和其批量验证在各个场景的效率已经足够优秀,但在多个多项式在多个点打开和验证的场景还是略显不足,证明大小和验证开销都与多项式个数线性相关。后期SHPlonk提出了此场景下更高效的批量证明方案。
KZG批量验证方案–shPLONK