在上一篇 ZKSwap团队解读零知识证明PLONK电路 主要描述了PLONK协议里的一个核心部分,用置换校验的方法去证明电路门之间的一致性;接下来,将继续分享如何证明门的约束关系的成立,以及整体的协议剖析。
门约束
举个简单的例子,假如存在一个电路,电路中仅有3个乘法门,对应的约束如下:
L1 * R1 – O1 = 0
L2 * R2 – O2 = 0
L3 * R3 – O3 = 0
进行多项式压缩:定义多项式函数L(X)、R(X)、O(X) 满足:
L(1) = L1, R(1) = R1, O(1) = O1
L(2) = L2, R(2) = R2, O(2) = O2
L(3) = L3, R(3) = R3, O(3) = O3
此时,定义新的多项式函数F(X),令F(X) = L(X) * R(X) – O(X)
则有:
F(1) = L(1) * R(1) – O(1) = 0
F(2) = L(2) * R(2) – O(2) = 0
F(3) = L(3) * R(3) – O(3) = 0
也就是表明:如果多项式函数F(X)在X=1、2、3处有零点,则说明门关系约束成立。
多项式函数F(X)在X=1、2、3处有零点则表明多项式F(X)可以被(X – 1)(X – 2)(X – 3)整除,为了和论文一致,我们把这个多项式函数设置成Z(X),即:
F(X) = T(X) * Z(X) ==> T(X) = F(X) / Z(X)
如果能证明T(X)是一个多项式,则说明多项式F(X)与Z(X)有相同的零点,进而说明门约束关系成立。
一般过程应该如下:
但是如此过程存在两个问题,一个是复杂性问题,假如F(X)的阶为n,那通信复杂度就是O(n);而是安全性问题,多项式F(X)完全暴露给V。
那应该如何解决这两个问题呢?最佳的答案可能就是:多项式承诺
多项式承诺
什么是多项式承诺?就是证明方P用一个很短的数据来代表一个多项式F,这些很短的数据可以被验证方V用来验证多项式F在某一点的值确实为证明方P声称的值z。
具体看一下论文里的定义:
由图可知:
继续回到我们上面的问题:
证明方如何证明:T(X) = F(X) / Z(X),我们再简化一下场景,就令Z(X) = X – 1,则:
T(X) = F(X) / (X – 1) ==> T(X) * (X – 1) = F(X) ==> T(X) * X = F(X) + T(X)
对应多项式承诺的协议可知:证明方P其实是想证明多项式函数F(X)再X = 1处的值为0,因此根据协验证方只需要证明:
e(Commit(T(x)), x*G) =? e(Commit(F(x)) +Commit (T(x)), G) (双线性配对的性质)
可以看出,利用多项式承诺的数学工具,既可以实现复杂度的优化,又可以实现隐私保护。
协议
接下来分析一下完整的PLONK协议:
Relation
上图表示了PLONK算法里,要证明的一种关系,需要说明的是:
CRS & P_Input & V_Input
上图表示了PLONK算法里的CRS设置,以及证明方P和验证方V的一些输入,需要说明的是:
Prove
上图表示了PLONK算法里证明方的一些操作,需要说明的是:
上图表示了PLONK算法里证明方的一些操作,主要是置换校验,参考第一篇的置换校验的协议过程,生成多项式z(X),需要说明的是:
上图表示了PLONK算法里证明方P的一些操作,主要是把门约束和门之间的一致性约束组合到一起,通过α,需要说明的是:
上图表示了PLONK算法了证明方P的一些操作,主要根据多项式承诺的协议,前面P算出了多个多项式在点x=z处的值是多少,现在要用多项式承诺协议去证明,这些计算是正确的,需要说明的是:
Verify
至此,证明方P的所有操作都完事了,接下来都是验证方V的操作。
上图表示了PLONK算法里验证方V的一些操作,主要重新生成相关的参数,确保证明方P没有作恶。需要说明的是:
上图表示了PLONK算法里验证方V的一些操作,对于一些公开的,并且计算复杂度很小的多项式,其在x=z处的值还是需要自己计算,更为方便。需要说明的是:
结束
至此,PLONK算法的协议原理已全部分享完成,公式很密集,但是细分下来,又很有层次感。能坚持看完,已实属不易。