zk-snark的算法详解

前言

了解零知识证明的读者,可能都拜读过V神的文章,整个系列由浅入深,很有条理,相对其他文章更容易理解一下。其实V神讲解的算法是PGHR13算法的整体步骤,此算法也被应用于知名项目Zcash中,现在,就让我们去一起探究,在实际项目中,PGHR13算法是具体的什么步骤呢?

PGHR13

在Zcash的Sapling版本升级之前,其采用的零知识证明算法的主体就是PGHR13,并因为效率和安全问题,做了一些改动。算法的具体内容如下图所示:
zk-snark的算法详解

  1. Public paraments : 素数r,阶为r椭圆曲线群G1,G2,用于非对称双线性配对;非对称双线性配对效率最高
  2. Key generator:主要生成CRS(pk,vk)
    a. 输入算术环路C,其中n为pub_input size,h为witness size,l为output size
    b. 向量A,B,C,元素为多项式,个数为m + 3个,m为算术环路wire的数量
    c. Z为目标多项式
    d. 向量A,B,C扩展到m+3的目的是为了保护多项式变量的取值τ
    e. τ,ρ等随机数都是私有数据,生成完CRS后,要销毁
    f. τ是多项式的取值
    g. α等主要用来保证多项式A/B/C的valid commitment
    h. β主要用来保证数据安全,使pkK独立于pkA,pkB,pkC
    I. γ主要用来保证A,B,C使用同一组系数
  3. Prove:生成证据π,7个群1的元素,1个群2的元素
    a. s是系数向量,对应算术环路里每条wire所carry的值,元素个数和wire的数量一致
    b. pkA和pk`A前n个置0的目的是为了防止明文攻击,通过改变公开的信息,导致证明的等式变化,但是验证也能通过。通俗的讲,就是本来你证明的是x^3 +x +5 = 35,攻击者可以通过修改public input的值,使得证明的等式变成x^3 +x +6 = 36,验证同样会通过
    c. δ等值和(2.d)结合,保证τ的安全性 d. c向量,多项式的组合系数向量
  4. Verify:证明证据π成立
    a. 计算vkx,保证公开信息没有被篡改
    b. 校验A,B,C知识承诺的有效性,即A, B, C 是多项式的组合形式,采用d-KCA算法
    c. 校验A,B,C使用的是同一组系数,类似于乘法分配律,等式左边是A,B,C单个元素累加再线性组合的结果,右边是A,B,C先线性组合再累加的结果,如相等,在系数相同。
    d. 校验等式是否成立。
    为了清晰的看到以上几个步骤,向量里元素的变化情况,本人总结了一张图,具体如下图所示:
    zk-snark的算法详解

附录:

  1. v神讲解zk-snark https://www.jianshu.com/go-wild?ac=2&url=https%3A%2F%2Fmedium.com%2F%40VitalikButerin%2Fzk-snarks-under-the-hood-b33151a013f6
  2. 25页展示具体的PGHR13协议 https://eprint.iacr.org/2013/879.pdf