相信大家在接触ZK-SNARK过程中,频繁的看见KZG多项式承诺。这是一个多项式承诺方案,也称为Kate多项式承诺方案,允许验证者随机打开多项式上的任意点,具有较小的通信和验证开销,常用在ZK-SNARK中实现简洁性。
我们通过一个例子来了解多项式承诺的过程,假设Alice拥有一个多项式,Bob可以随意查询任意点的多项式值,但不想Bob知道多项式。首先,我们可以将多项式的承诺可以看成一个黑盒。
1)Alice向Bob公开这个黑盒
2)Bob可以随机选择一个点打开
3)Alice将这个点打开的结果发送给Bob
4)但是Alice可能发送错误的结果,为了证明结果的正确性,Alice可以记录下输入点 z z z到黑盒到得到多项式值的过程作为证明。
Bob查看这个记录就知道
F
(
z
)
F(z)
F(z)的正确性。在多项式承诺方案中如采用不同的方法构造的黑盒(承诺)和记录(证明)。
简单来说,证明者公开多项式的承诺,验证者可以询问多项式的任意点的值,证明人必须提供多项式值和证明,确保提供正确的多项式值。
KZG多项式承诺方案是常用多项式方案之一,相较于其他常用多项式承诺方案,例如IPA多项式承诺和PRI多项式承诺,其具有高效的验证效率和简短的证明长度,因此被Plonk等零知识证明方案采用。
预备知识
在介绍具体承诺方案前,需了解以下知识。此外可以回忆一下上篇博客的随机线性化组合的介绍,这些都是构成KZG多项式承诺的基础。
零点证明
这节主要介绍多项式的零点证明方案(这里简称零点证明)。证明者证明拥有一个多项式 f ( x ) f(x) f(x)在点 ( z 1 , z 2 , ⋯ , z n ) (z_1,z_2,\cdots,z_n) (z1,z2,⋯,zn)上为零等同于证明可计算多项式 h ( x ) = f ( x ) ( x − z 1 ) ( x − z 2 ) h(x)=\frac{f(x)}{(x-z_1)(x-z_2)} h(x)=(x−z1)(x−z2)f(x)。零点证明通常结合LPCP定理运用在多项式承诺和zk-snark方案中。最简洁的KZG多项式承诺便使用零点证明。
举个例子,一个 n n n阶多项式 f ( x ) f(x) f(x)在点 z 1 , z 2 z_1,z_2 z1,z2为零,则可写成如下形式:
f ( x ) = ( x − z 1 ) ( x − z 2 ) h ( x ) f(x)=(x-z_1)(x-z_2)h(x) f(x)=(x−z1)(x−z2)h(x)
若存在一个 n − 2 n-2 n−2阶的多项式 h ( x ) h(x) h(x)使上述等式成立,则 f ( x ) f(x) f(x)一定在点 z 1 , z 2 z_1,z_2 z1,z2为零。即证明 z 1 , z 2 z_1,z_2 z1,z2是多项式的零点,可通过证明存在多项式 h ( x ) = f ( x ) ( x − z 1 ) ( x − z 2 ) h(x)=\frac{f(x)}{(x-z_1)(x-z_2)} h(x)=(x−z1)(x−z2)f(x),使等式(1)成立。
LPCP
LPCP(Linear Probabilistically Checkable Proof)是说任意一个 n n n阶的多项式 f f f,都可以通过随机验证多项式在几个点上取值来确定这个多项式的每一项系数是否满足特定的要求。简单来说,存在两个 n n n阶多项式 f ( x ) , g ( x ) f(x),g(x) f(x),g(x),随机检验一个点 r ∈ F r\in F r∈F,若 f ( r ) = g ( r ) f(r)=g(r) f(r)=g(r),则证明多项式 f ( x ) = g ( x ) f(x)=g(x) f(x)=g(x)。如果两个 n n n阶多项式 f ( x ) , g ( x ) f(x),g(x) f(x),g(x)的系数不一样,那么如果我们随机验证一个点 r ∈ F r\in F r∈F的取值 f ( r ) , g ( r ) f(r),g(r) f(r),g(r),这两个值相等的几率最大为 n ∣ F ∣ \frac{n}{|F|} ∣F∣n,对于加密算法的域来说,这几乎是不可能的。
双线性配对(Bilinear Pairing)
G 1 , G 2 , G t G_1,G_2,G_t G1,G2,Gt都是 p p p阶循环群,假设 G 1 , G 2 G_1, G_2 G1,G2是加法循环群,定义一个映射 e : G 1 × G 2 → G t e:G_1 \times G_2 \rightarrow G_t e:G1×G2→Gt,对于任意的 P ∈ G 1 , Q ∈ G 2 , a , b ∈ Z p P\in G_1, Q\in G_2,a,b \in Z_p P∈G1,Q∈G2,a,b∈Zp ,满足双线性:
e ( a P , b Q ) = e ( P , Q ) a b e(aP,bQ)=e(P,Q)^{ab} e(aP,bQ)=e(P,Q)ab
同时满足非退化性,即存在 P ∈ G 1 , Q ∈ G 2 P\in G_1,Q\in G_2 P∈G1,Q∈G2,使得
e ( P , Q ) ≠ 1 e(P,Q)\neq 1 e(P,Q)=1
,且对任意的 P ∈ G 1 , Q ∈ G 2 P\in G_1,Q\in G_2 P∈G1,Q∈G2,存在一个高效的算法来计算 e ( P , Q ) e(P,Q) e(P,Q)。
值得注意的是,双线性配对群下操作满足以下性质。通俗来说,就是可以实现密文下的加法和一次乘法,为了简单起见,我们在后续中采用符号 [ ] 1 []_1 []1表示在双线性配对群 G 1 G_1 G1下的加密操作,即 [ a ] 1 = a P [a]_1=aP [a]1=aP;符号 [ ] 2 []_2 []2表示在双线性配对群 G 2 G_2 G2下的加密操作,即 [ b ] 2 = a Q [b]_2=aQ [b]2=aQ。
- 加法同态: [ a ] 1 + [ b ] 1 = [ a + b ] 1 ; [ a ] 2 + [ b ] 2 = [ a + b ] 2 [a]_1+[b]_1=[a+b]_1;[a]_2+[b]_2=[a+b]_2 [a]1+[b]1=[a+b]1;[a]2+[b]2=[a+b]2
- 一次乘法同态: e ( [ a ] 1 , [ b ] 2 ) = e ( [ a b ] 1 , [ 1 ] 2 ) = e ( [ 1 ] 1 , [ a b ] 2 ) e([a]_1,[b]_2)=e([ab]_1,[1]_2)=e([1]_1,[ab]_2) e([a]1,[b]2)=e([ab]1,[1]2)=e([1]1,[ab]2)
相信大家已经掌握了学习KZG承诺的必要知识,下一篇我们将从这些知识出发理解KZG承诺方案的原理。