基本介绍
零知识特性的引入
- 在上一篇文章中我们通过示例来展现了QAP问题的具体形式,那么,为什么要通过如此复杂的过程来分解出一个多项式呢?
-
因为我们要引入零知识的特性,举个例子你会更加理解:
-
假如证明者要向验证者证明,自己知道多项式x^3+x^2+x=14的解,通常情况下,只有-----告诉验证者x=2----这一种方法,但是如果通过多项式来表达自己知道x^3+x^2+x=14的解,还有其他的方式。
-
知道等式x^3+x^2+x=14,通过上文# 零知识证明--ZK-SNARKS(三)中对示例的了解,我们可以求解出A(n),B(n),C(n)-----这三个矩阵是公开的,令多项式 P(n) = s.C(n) - s.A(n) * s.B(n),因为s是一个向量,于A(n),B(n),C(n)分别作内积之后仍然是一个矩阵,我们就将此式记为P(n) =U(n)-V(n)*W(n),由于A(n),B(n),C(n)可以求出并且公开,所以此时证明者利用自己知道的解s,求出P(n),然后计算H(n)=P(n)/Z(n),此时证明者已经求解出了P(n)和 H(n),于是将P(n)和 H(n)发送给验证者,此时,验证者只需验证 P(n)?=H(n)*Z(n),(?= 含义是是否等于),如果验证通过,则验证者相信证明者拥有方程的解s。
-
通过抽样--满足简洁性
- 在ZK-SNARKS的验证过程中,有些多项式非常大,最高次幂也非常大,如果直接对如此大的多项式直接进行操作,那么系统的传输效率将会非常的不理想,那么此时,我们就可以通过选取一个抽样点的方式,即取n=t,那么此时将n=t代入P(n)和 H(n),此时P(n)和 H(n)就变成了两个数,此时再进行验证,操作就变的简洁了
- 接下来我们介绍一下具体的操作步骤:
- 验证者随机选取一个抽样点t,并将t发给证明者
- 证明者计算P(t)和 H(t),此时P(t)和 H(t)为两个数,并将这两个数值发送给验证者
- 验证者再判断 P(t)?=H(t)*Z(t)
- 如果验证通过,那么就代表证明者知道解向量s
- 但是这样是容易出现纰漏的,情况描述如下:
- 存在另一个多项式 D(x),在x=u1,x=u2,x=u3...处,有 D(x)=P(x),此时恰好x取到 u值。
- 那么上述这种情况出现的概率有多大呢?即这种情况出现的概率如何计算?
- D(x)=P(x)的解是满足上述情况的x取值,所以概率只需要计算D(x)=P(x)解的个数与所有实数个数的比值
- 如何判断D(x)=P(x)解的个数呢?
- 由于P(n)=H(n)*Z(n),假设H(n)和Z(n)最高次幂都是d,那么P(n)的最高次幂就是2d,此时D(x)=P(x)多项式的最高次幂也是2d,也就是说,可以将其看成一个一元2d次方程,由数学定理可知,一元2d次方程最多有2d个实根,因为实数域可以概括为R,所以上述情况出现的概率就是2d/R,因为2d是一个有限值,所以2d/R很小,也就是证明者知道解向量s的概率较大,即可以基本确定证明者知道解向量s
- 综上,我们可以通过抽样取值验证的方法来确定证明者知道解向量s,从而使此算法拥有了简洁性。
- 接下来我们介绍一下具体的操作步骤: