ZK-SNARKS简单描述

315 阅读3分钟

基本介绍

零知识特性的引入

  1. 在上一篇文章中我们通过示例来展现了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。

通过抽样--满足简洁性

  1. 在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,从而使此算法拥有了简洁性。