零知识证明的力量:深入理解 zk-SNARK
作者:0xAlpha Co-founder @DeriProtocol
编译:DODO Research
💡 在数字世界中,zk-SNARK 技术正静悄悄地引领一场隐私保护的革命。这篇文章将用数学解码这项技术,揭示它如何在不透露任何信息的情况下证明知识的真实性。准备好,让我们一起揭开 zk-SNARK 的神秘面纱。
介绍
zk-SNARK,即“零知识简洁非交互式知识论证”,使得一名验证者能够确认一名证明者拥有某些特定知识,这些知识被称为 witness,满足特定的关系,而无需透露关于见证本身的任何信息。
用具体的例子来说明,设想一个函数 ,其中 是它的输入。目标是证明证明者知道一个保密的输入 (即见证),使得 ,这里的 是公开已知的。
为特定问题生成 zk-SNARK 包括以下四个阶段:
将问题(或函数)转换成算术门电路。 然后将这个电路翻译成矩阵公式。 这个矩阵公式进一步转换成一个多项式,这个多项式应该能被一个特定的最小多项式整除。 最后,这种可整除性在有限域的椭圆曲线点中表示出来,证明就在这里进行。
前三个步骤仅仅是转换了原始陈述的表示方式。最后一个步骤使用同态加密将第三步的陈述投影到加密空间中,使得证明者能够证实其中的镜像陈述。鉴于这种投影利用了非对称加密,从第三步的陈述回溯到原始陈述是不可行的,确保了零知识的暴露。
阅读本文所需的数学背景相当于 STEM 专业学生的大一级代数水平。唯一可能具有挑战性的概念可能是椭圆曲线加密。对于不熟悉这一点的人来说,可以将其视为具有特殊基数的指数函数,同时要记住其逆函数仍然未解。本文将遵循以下符号规则:
矩阵:粗体大写字母,例如 ;显式形式写作 向量:带箭头的小写字母,例如;显式形式写作 ;默认情况下所有向量均为列向量 标量:常规字母表示
让我们用这个问题作为例子:
假设爱丽丝想要证明她知道一个
这个问题可能看起来太简单,因为它不涉及控制流(例如,if-then-else)。然而,将带有控制流的函数转换为算术表达式并不困难。例如,让我们考虑以下问题(或在编程语言中的“函数”):
在本文中,我们将继续使用方程式 (1) 作为讨论的基础。
第1步:算术门电路
方程式 (1) 可以分解为以下基本算术运算:
这对应于以下算术门电路:
第2步:矩阵
首先,让我们定义一个“见证”向量,如下所示:
其中
通常,对于一个有
接下来,让我们构造三个 n*(m+n+*1) 矩阵
其中
方程式 (3) 只是方程式 (2) 的另一种表示形式:每组
所以
我们跳过了构建
因此,我们已经成功地把算术门电路转换成了矩阵公式,即方程式 (3)。同时,我们也把需要证明掌握的对象,从 转变为了见证向量
第3步:多项式
现在,让我们构造一个 n*(*n+m+*1) 矩阵
使得
然后我们可以将
这些是六个变量的四组线性方程,可以用传统方法求解。然而,在这种情况下解决
类似地,我们分别为
如果提取出每一行单独观察,不难发现这四行对应于在四个点分别求值的相同表达式。因此,上述矩阵方程等价于:
其中
确定
其中:
一种直接但不保密的方式来证明这一点是提供方程式 (4) 的左边并展示因式分解。然而,zk-SNARK 的主要目的是保持隐秘(不透露任何知识)。因此,我们不会直接证明这个方程,而是在椭圆曲线点的空间中证明它的加密版本。
第4步:椭圆曲线点
将方程式 (4) 重写为:
其中
从高层次上看,这就是我们要做的:将多项式(具体来说,是多项式的系数)映射到椭圆曲线点,并将方程式 (5) 转换为加密空间中的以下镜像方程,这是需要证明的陈述:
请注意,算术运算,加法
接下来,我们将更详细地阐述实际的操作步骤。
椭圆曲线加密
椭圆曲线的一般理论远远超出了本文的范围。就本文的目的而言,椭圆曲线被定义为从素域
请注意,虽然到目前为止我们一直在讨论常规算术,但现在当我们转换到素域时,数字的算术运算是以模运算的方式进行的。例如,
另一方面,两个椭圆曲线点的加法定义如下图所示:
Figure from Wikipedia
具体来说,两个 ECPs
找到直线 和曲线的交点 ,定义为翻转到曲线上 的“镜像”点 。
因此我们定义椭圆曲线点的加法:
请注意,这个规则也适用于特殊情况,即一个 ECP 自加的情况,此时将使用该点的切线。
现在假设我们随机选择一个点
这有一个操作表达式。定义
也就是说,
从 作为 开始;然后进行 操作跳转到 :曲线和 处切线的交点的翻转;然后再次进行 操作跳转到 :曲线和直线 的交点的翻转;依此类推。
所以
请注意,给定一个椭圆曲线,由于选择
定义了加法后,以下线性关系很容易看出:
范数表达:
因此,
然而,Alice 想要证明的方程式 (5) 是二次形式的,所以线性不够。为了处理二次项,我们需要在加密空间中定义乘法。这被称为配对函数,或双线性映射,接下来将进行解释。
双线性映射
假设
使得如果
这个配对函数是我们在加密空间中需要的“乘法”操作,用于处理方程式 (5) 中的二次项。
其中
让我们用
这是我们都熟悉的东西——加法和乘法操作的分配律。
有了这样的双线性映射,我们就可以将方程式 (5) 的两边映射到加密空间。
公共参考字符串
在这里,我们需要一个可信的第三方来选择五个随机系数:
请注意,整个程序基于对第三方正确处理有毒数据的信任。在现实中,这个“可信设置”程序并不是一个简单的任务。在这篇文章中,我们将假设这一步骤将被正确进行。
设
这整体被称为“证明钥”(proving key),记为 PK。请注意,
同时,进行以下计算:
整个过程被称作“验证钥”,简称VK。这里只涉及7个椭圆曲线点(ECPs),需要提供给验证方。要注意的是,不管问题里面涉及多少输入和一级约束,VK始终是由7个ECPs构成的。
另外,值得一提的是,“可信设置”以及生成PK和VK的过程,对于一个特定的问题来说,只需操作一次即可。
证明与验证
现在拥有公钥(PK),爱丽丝将计算以下椭圆曲线点(ECPs):
这9个椭圆曲线点就是零知识简洁非交互式证明(zk-SNARK)的关键!注意,爱丽丝其实只是对公钥里的椭圆曲线点做了些线性组合运算。这点特别关键,验证时会重点检查。
现在,爱丽丝交出了zk-SNARK证明,咱们终于进入验证环节,分三步走。
首先得确认,前8个椭圆曲线点真的是通用参考串里那些点的线性组合。
其次,检查
最后,检查等式(5)的相等性:
如果这三项检查都成立,那么等式(5)得到验证,因此我们相信爱丽丝知道见证。
让我们解释一下等式背后的理由。以第一部分中的第一个等式为例,等式成立是因为双线性性质:
然而,由于爱丽丝不知道
参考:
“Zk-SNARKs: Under the Hood” (Vitalik Buterin) https://vitalik.ca/general/2017/02/01/zk_snarks.html “A Review of Zero Knowledge Proofs” (Thomas Chen, Abby Lu, Jern Kunpittaya, and Alan Luo) https://timroughgarden.github.io/fob21/reports/r4.pdf “Why and How zk-SNARK Works: Definitive Explanation” (Maksym Petkus) https://arxiv.org/abs/1906.07221 Website: Zero-Knowledge Proofs https://zkp.science/ Wikipedia: Elliptic curve https://en.wikipedia.org/wiki/Elliptic_curve Wikipedia: Finite field https://en.wikipedia.org/wiki/Finite_field Wikipedia: Pairing-based cryptography https://en.wikipedia.org/wiki/Pairing-based_cryptography
往期精彩
10+ Web3 新锐联合放送知识与奖励,一起瓜分 2000 美金!
专访 SPACE ID:通往 Web3 无许可域名服务协议之路
Rust Web3 Buidler 训练营公布!开发你的第一个 Web3 项目
关于我们
ABOUT US
TinTinLand 是赋能下一代开发者的技术社区,通过聚集、培育、输送开发者到各开放网络,共同定义并构建未来。
Discord: https://discord.gg/kmPnTDSFu8
Twitter: https://twitter.com/OurTinTinLand
Bilibili: https://space.bilibili.com/1152852334
Medium: https://medium.com/@tintin.land2021
YouTube: https://www.youtube.com/channel/UCfHiMcFt-4btbC75FsReQh