KCA--系数知识假设
- KCA--系数知识假设,全称为"Knowledge of Coefficient Assumption",为了解决证明者伪造多项式的问题,引入了KCA,首先我们介绍一下KCA的基本概念:
- 存在值a,b,满足b=c*a (c!=0),那么就称a,b构成了一个c对,即(a,b)为一个c对。
- 注意:椭圆曲线上的运算符合两个特性:
-
当c值较大时,很难通过a,b倒推出c值
-
加法和乘法都满足交换律,并且满足同态隐藏
-
- 接下来我们构建一个简易的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对,验证通过。
-
- 假设:证明Alice知道y值
- 现在我们将以上过程推广到多个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。
-
- 此时,我们将KCA工具加入到零知识证明过程,具体流程(引自whrunningduck的博客)如下:
CRS(COMMON REFERENCE STRING)
- 那么ZK-SNARKS讲到这里,验证者和证明者仍旧交互过多,那么如何解决此算法中的多交互问题呢?
- 我们引入了CRS(COMMON REFERENCE STRING),原理如下:
-
将随机数c和t内置到 “ 系统 ” 中,即将这些参数放到链上,任何人都可以参与验证---验证者只需到链上获取参数即可,无需和证明者进行交互。
-
- 我们引入了CRS(COMMON REFERENCE STRING),原理如下:
zkSNARKs--终极版
- 系统产生内置的随机数c和t,然后产生Verifier需要发给Prover的各种参数值,这些参数值公示在链上。
- Prover返回若干参数值。
- Verifier验证。