原文链接 https://electriccoin.co/blog/snark-explain/
构造zk-SNARKs,需要对它的几个组成部分进行仔细的组合。要完整理解这些组成部分如何协同工作,是需要些时间的。
如果我不得不在这些组成部分里选出最耀眼的一个,它可能就是将被我称为同态隐藏(也叫HH)的那个1。在本文里,我们将会讲解HH是什么,然后举一个例子,说明为什么HH很有用以及它是如何被构造出来的。
HH可以被看成一个函数 E ( x ) E(x) E(x),它满足下列特性:
这里是一个很简单的例子,它表明HH对零知识证明是有用的:假设Alice想证明给Bob看,她知道数字 x x x和 y y y,且 x + y = 7 x + y = 7 x+y=7(当然,知道 x x x和 y y y并不是什么特别有趣的事,但是这个例子用来讲解概念还是挺好的)。
由于不同的输入被E映射到了不同的隐藏值,Bob实际上仅在Alice发送 x x x和 y y y的隐藏值,且 x + y = 7 x + y = 7 x+y=7 的情况下,才会接受这个证明。另一方面,Bob并不知道 x x x和 y y y是多少,因为他只能访问到隐藏值。2
现在我们来看一个如何构造隐藏函数的例子。我们实际上无法用常规的整数和常规加法来构造它们,我们需要看一下有限群(finite groups):
假设 n n n是某个整数。当我们写 A   m o d   n A \, mod \, n Amodn(其中 A A A是一个整数)的时候,我们的意思是取得 A A A除以 n n n后得到的余数。例如,
9   m o d   7 = 2 9 \, mod \, 7 = 2 9mod7=2
13   m o d   12 = 1 13 \, mod \, 12 = 1 13mod12=1
我们可以在数字集合 { 0 , . . . , n − 1 } \{0,...,n-1\} {0,...,n−1} 上用 m o d   n mod \, n modn 操作来定义加法:在正常加法后再做一个 ( m o d   n ) (mod \, n) (modn) 运算,得到一个落在 { 0 , . . . , n − 1 } \{0,...,n-1\} {0,...,n−1}这个范围内的数。我们有时把 ( m o d   n ) (mod \, n) (modn) 写在右边,以表明我们在用这类加法。例如,
2 + 3 = 1   ( m o d   4 ) 2 + 3 = 1 \, (mod \, 4) 2+3=1(mod4)
我们把集合 { 0 , . . . , n − 1 } \{0,...,n-1\} {0,...,n−1}跟这个加法合称为 Z n \textbf Z_n Zn群。(译者:群的概念是元素集合与在此集合上的二元操作的整体。这有些像面向对象程序设计中把数据跟方法封装在对象中一样,它们的共同存在才有意义。)
对于一个质数 p p p,我们可以用 m o d   p mod\,p modp 操作来定义一个在 { 1 , . . . , p − 1 } \{1,...,p-1\} {1,...,p−1}范围上的乘法。这个乘法的结果也总是在 { 1 , . . . , p − 1 } \{1,...,p-1\} {1,...,p−1}这个集合上。这个乘法先做一个常规的整数乘法,然后把结果做一次 m o d   p mod\,p modp 操作。3 例如,
2 ⋅ 4 = 1   ( m o d   7 ) 2 ⋅ 4 = 1\,(mod\,7) 2⋅4=1(mod7)
这个元素集合跟这个乘法操作一起合称为 Z p ∗ \textbf Z_p^* Zp∗群。 Z p ∗ \textbf Z_p^* Zp∗有如下相当有用的特性:
使用这些特性,我们现在来构造一个支持“加法”的HH,也就是 E ( x + y ) E(x+y) E(x+y)可以从 E ( x ) E(x) E(x)和 E ( y ) E(y) E(y)中计算得来。我们假定 E E E的输入 x x x是从 Z p − 1 \textbf Z_{p-1} Zp−1中来的,因此它在 { 0 , . . . , p − 2 } \{0,...,p-2\} {0,...,p−2}这个范围里。我们对每个这样的 x x x定义 E ( x ) = g x E(x) = g^x E(x)=gx, 并且声明 E E E是一个HH:
E ( x + y ) = g x + y   ( m o d   p − 1 ) E(x+y) = g^{x+y \, (mod \, p-1)} E(x+y)=gx+y(modp−1) = g x ⋅ g y = E ( x ) ⋅ E ( y ) = g^x ⋅ g^y = E(x) ⋅ E(y) =gx⋅gy=E(x)⋅E(y)
>>> 第二部分
同态隐藏不是密码学里正式的术语,在本文中引入这个术语主要是为了方便指示的目的。它跟计算性隐藏承诺的概念相似,只是要弱一点。区别是HH是一个对输入的确定性函数,而承诺会用到额外的随机性。结果HH基本上“隐藏多数 x x x”,而承诺“隐藏所有 x x x“。 ↩︎
Bob的确学到了关于 x x x和 y y y的一些信息。比如,他可以选择一个随机的x‘,然后计算 E ( x ′ ) E(x') E(x′)并检查是否 x = x ′ x = x' x=x′。由于这个原因,上面的协议并不是一个真正的零知识协议,只是在这里用作讲解目的。实际上,我们将在之后的文章里看到,HH最终会被用在snarks中去隐藏验证者的挑战(challenges),而不是隐藏证明者的秘密(secrets)。 ↩︎
当 p p p不是一个质数的时候,这样定义乘法是有问题的。一个问题就是当两个参数都不是零的时候,乘法结果也可能会是零。例如当 p = 4 p=4 p=4的时候 ,我们可以得到 2 ∗ 2 = 0   ( m o d   4 ) 2 * 2 = 0 \, (mod \, 4) 2∗2=0(mod4)。 ↩︎