美文网首页
V神讲解zk-SNARKs内部原理(上)

V神讲解zk-SNARKs内部原理(上)

作者: 鹏飞_3870 | 来源:发表于2018-08-07 09:09 被阅读0次

    简介:这是V神本系列文章的第三部分的上半部分,解释了zk-SNARKs背后的技术是如何运作的;以前关于二次运算程序椭圆曲线配对的文章是必读的,本文将假设你已经知道这两个概念,并了解zk-SNARKs的基本知识和它们的作用。另请参阅另外一篇对zk-SNARKs的介绍,Christian Reitwiessner的文章
    (本文授权BH好文好报群摘编、转载以及相关转授权推文行为)

    在之前的文章中,我们介绍了二次运算程序,这是一种用多项式方程表示任何计算问题的方法。我们还引入了椭圆曲线配对,它允许非常有限的单向同态加密形式,从而允许您进行相等检查。现在,我们将从我们离开的地方开始,并使用椭圆曲线配对以及其他一些数学技巧,使得证明者能够证明他们知道特定QAP的解决方案,同时不会泄露任何有关实际解决方案的信息。

    本文将重点介绍2013年Parno,Gentry,Howell和Raykova的皮诺曹协议(通常称为PGHR13);基本机制有一些变化,因此在实践中实施的zk-SNARK方案可能略有不同,但基本原则通常保持不变。


    首先,让我们进入一个关键的假设:指数知识假设(KEA)。这个假设我们将会在说明底层安全机制的时候会用到。

    KEA1: 对于任何一个对手A,它接收输入q,g, g^a,然后返回(C, Y)并且Y = C^a,那么必然存在一个“提取者”A',当它接收和A一样的输入时,能返回c使得g^c = C。

    这个假设基本上意味着,如果你得到一对点P和Q,其中P * k = Q,并且你得到一个C点,那么除非C能以某种方式从P“导出”,否则不可能得出C * k对应的点。可能看起来这是明显的事情,但这个假设实际上不能从我们在证明椭圆曲线协议的安全性时通常使用的任何其他假设(例如,离散对数难题)得出,因此zk-SNARK事实上确实在某种程度上,它的某些安全性基础要弱于椭圆曲线密码学的基础 - 不过它仍然足够坚固,大多数密码学家都可以使用它。


    现在,我们来看看如何使用它。假设一对点(P,Q)从天空落下,其中P * k = Q,但没有人知道k的值是什么。现在,假设我想出了一对点(R,S),其中R * k = S 。 然后,KoE假设意味着我可以获得该对点的唯一方法,是通过P和Q乘以我自己所知的某个因子r。还要注意,由于椭圆曲线配对的非凡特性,要检查R = k * S,实际上并不需要知道k -——而是可以简单地检查e(R,Q)= e(P,S)。

    让我们做一些更有趣的事情。假设我们有十对点从天空落下:(P_1,Q_1),(P_2,Q_2)......(P_10,Q_10)。在所有情况下,都满足P_i * k = Q_i。假设我然后给你一对点(R,S),其中R * k = S.你现在知道什么?你知道R是一些线性组合P_1 * i_1 + P_2 * i_2 + ... + P_10 * i_10,其中我知道系数i_1,i_2 ... i_10。也就是说,到达这样一对点(R,S)的唯一方法是取一些P_1,P_2 ...... P_10的倍数并将它们加在一起,并对Q_1,Q_2 ...... Q_10进行相同的计算。

    请注意,给定您可能想要检查线性组合的任何特定P_1 ... P_10点,您实际上无法创建伴随的Q_1 ... Q_10点而不知道k是什么,如果您确实知道k是什么,那么您可以创建一对(R,S),其中R * k = S表示您想要的任何R,而无需创建线性组合。因此,为了实现这一点,创建这些点的人必须都是值得信赖的,并且一旦创建了10个点,就要删除k。这就是“可信设置”概念的来源(译者注:可信设置,指的是zkSNARK系统启动的时候所进行一次设置,这个设置只需要进行一次)。


    回忆一下,QAP的解是一组多项式(A,B,C),使得A(x)* B(x) - C(x)= H(x)* Z(x),其中:

    A是一组多项式{A_1 ... A_m}的线性组合
    B是具有相同系数的{B_1 ... B_m}的线性组合
    C是具有相同系数的{C_1 ... C_m}的线性组合
    集合{A_1 ... A_m},{B_1 ... B_m}和{C_1 ... C_m}以及多项式Z是问题陈述的一部分。

    然而,在大多数现实世界中,A,B和C都非常大;对于像散列函数那样具有数千个电路门的东西,多项式(以及线性组合的因子)可能有数千项。因此,我们不是让证明者直接提供线性组合,而是使用我们上面介绍的技巧来证明他们提供的东西是线性组合,并且无需透露任何其他东西。

    您可能已经注意到上面的技巧适用于椭圆曲线点,而不是多项式。因此,实际的情况是,我们把下面的值添加到可信设置:

    G * A_1(t),G * A_1(t)* k_a
    G * A_2(t),G * A_2(t)* k_a
    ...
    G * B_1(t),G * B_1(t)* k_b
    G * B_2(t),G * B_2(t)* k_b
    ...
    G * C_1(t),G * C_1(t)* k_c
    G * C_2(t),G * C_2(t)* k_c
    ...
    您可以将t视为计算多项式的​​“秘密点”。 G是一个“生成器”(椭圆曲线上面某个随机的点,一旦确定之后,就把它作为协议的一部分),t,k_a,k_b和k_c是“有毒废物”,这些数字必须不惜一切代价删除掉,否则任何拥有它们的人将能够制作假证明。现在,如果有人给你一对点P,Q,使得P * k_a = Q(提醒:我们不需要k_a来检查这个,因为我们可以进行配对检查),那么你知道他们给你的是在t处计算出的A_i多项式的线性组合。

    因此,到目前为止,证明者必须给出:

    π_a= G * A(t),π'_a= G * A(t)* k_a
    π_b= G * B(t),π'_b= G * B(t)* k_b
    π_c= G * C(t),π'_c= G * C(t)* k_c

    注意,证明者实际上并不需要知道(并且不应该知道!)t,k_a,k_b或k_c来计算这些值;而是,证明者应该能够从我们添加到可信设置的点来计算这些值。


    译者注:V神的文章喜欢用长语句,我翻译的比较慢,怕翻译错了。今天先到这里吧,今天是上半部分,明天继续下半部分

    早赞声明:为方便早赞、避免乱赞,“BH好文好报群”为点赞者、写作者牵线搭桥,实行“先审后赞、定时发表”的规则,也让作品脱颖而出、速登热门!加群微信:we01230123(天平)。

    相关文章

      网友评论

          本文标题:V神讲解zk-SNARKs内部原理(上)

          本文链接:https://www.haomeiwen.com/subject/nsjjvftx.html