上一篇讲到
Anna不知道t,也就不能找到合适的H(t)正好使E(P(t)) = E(H(t) * Z(t))成立
但是也有个问题就是
系数向量A(n)、B(n)和C(n)代表要求解的问题本身。假设Prover不知道使“s . C(n) - s . A(n) * s . B(n) = H(n) * Z(n)”成立的解s,但知道另一个问题的解s’:s’ . C’(n) - s’ . A’(n) * s’ = H’(n) * Z(n)。
Prover便可用不同于原始问题的系数向量A‘(n)、B’(n)和C‘(n)来生成P’(n) = s . C’(n) - s . A’(n) * s . B’(n),然后将P’(n)和H’(n)作为响应发给Verifier,那么Verifier一定会得出prover知道解的结论。
解决这个问题的方法用到了KCA,先用一个简答的例子解释KCA:
简单解释就是B给A一对(a,b),A返回(c,d)给B,如果A是通过B的(b,a)算出的(c,d),则c,d也应符合d=αc,而这个α只有B知道,这时他就可以验证是否正确。
将上面的例子推广一下同理:
接下来需要在零知识证明中应用KCA
左边列的A(n),B(n),C(n)经过KCA变换,变成了右边列。
原先传送如下图:
用KCA之后如下:
进一步提出问题:
最后一步用到了CRS将交互式的零知识证明变成了非交互式;
所以ZK-SNARK被称为预处理的简洁的非交互式的知识论证,它需要一个可信的设置,一对匹配友好的椭圆曲线并依赖强有力的假设。