零知识证明--ZK-SNARKS(七)

311 阅读2分钟

KCA--系数知识假设

  1. KCA--系数知识假设,全称为"Knowledge of Coefficient Assumption",为了解决证明者伪造多项式的问题,引入了KCA,首先我们介绍一下KCA的基本概念:
    • 存在值a,b,满足b=c*a (c!=0),那么就称a,b构成了一个c对,即(a,b)为一个c对。
    • 注意:椭圆曲线上的运算符合两个特性:
      • 当c值较大时,很难通过a,b倒推出c值

      • 加法和乘法都满足交换律,并且满足同态隐藏

  2. 接下来我们构建一个简易的KCA过程:
    • 假设:证明Alice知道y值
      • Bob(验证者)随机选择一个c,生成c对(a,b),c自己保存,(a,b)发送给Alice(证明者)
      • Alice用自己 “ 知道的 ” y值,对接收到的(a,b)作乘法,即生成(a′,b′)=(y⋅a,y⋅b)
      • 此时Alice将(a′,b′)发送给Bob
      • Bob对接收到的(a′,b′)进行验证,即证明(a′,b′)是一个c对,如果验证通过,就证明Alice知道y
    • 怎样就是验证通过呢?
      • b′=yb=y(ca)=yca=c(ya)=ca′,此时(a′,b′)是一个c对,验证通过。

  3. 现在我们将以上过程推广到多个c对的场景,此时就成为d-KCA:
    • Bob(验证者)给Alic(证明者)e发送一系列的c对,例如n个c对(a1, b1),(a2, b2),…,(an, bn),仍需提供一个新的c对。

    • Alice返回一个由这些c对线性组合成的值对(a′,b′)=(k1a1 + k2a2+…+knan, k1b1 + k2b2+…+knbn),其中kn是任意整数。

    • Bob进行验证,即检查其收到的值对(a′,b′)是否是一个c对,如果验证通过,即说明证明者返回的a′和b′,是验证者提供的一系列c对所构成的相同线性组合,也就是证明者知道数组k。

  4. 此时,我们将KCA工具加入到零知识证明过程,具体流程(引自whrunningduck的博客)如下:

1.png

2.png

3.png

4.png

CRS(COMMON REFERENCE STRING)

  1. 那么ZK-SNARKS讲到这里,验证者和证明者仍旧交互过多,那么如何解决此算法中的多交互问题呢?
    • 我们引入了CRS(COMMON REFERENCE STRING),原理如下:
      • 将随机数c和t内置到 “ 系统 ” 中,即将这些参数放到链上,任何人都可以参与验证---验证者只需到链上获取参数即可,无需和证明者进行交互。

zkSNARKs--终极版

  1. 系统产生内置的随机数c和t,然后产生Verifier需要发给Prover的各种参数值,这些参数值公示在链上。
  2. Prover返回若干参数值。
  3. Verifier验证。