-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
零知识证明:R1CS 与 QAP #3
Comments
QAP问题假设,Prover 希望想Verifier 证明其知道方程:
需要注意的是,这个特殊的程序设计语言仅支持最基本的算术运算(加减乘除)和常数次幂的运算(i.e. 只能计算 x^7 ,但不可以计算x^y),此外,该语言还对计算步骤和逻辑有限制,也即不允许出现循环,不支持模运算和比较运(<,>,geq,leq,==,!=),因为在有限循环群算法中没有直接进行模运算或比较的有效方法,如果确实存在的话,则意味着破解椭圆曲线的速度比二进制搜索和中国剩余定理还要快得多。 |
Flattening第一步,我们需要将以上的代码拍平,转化为两种一次的表达式:
那么经过拍平后,我们的结果如下:
这时,可以将上述的每一行理解为一个数学电路中的逻辑门(如下图),与上一part中的代码相比,我们引入了 R1CS第二步需要将flattening的结果转化为一阶约束系统 R1CS,一个R1CS是由三个向量构成的向量组
同理,我们可以得到:
第3行,
第4行,
此时之前,我们说witness为
[验证]
|
R1CS to QAP接下来,我们需要将R1CS转化成 QAP的形式,什么是QAP形式呢?实际上,QAP实现了与R1CS完全相同的逻辑,只不过使用的是多项式而不是向量内积的形式。我们的具体做法是这样的:
我们依然以向量组A 为例, 首先,我们需要求出四个约束(row)所对应的每个 将多项式按x的degree升序排列,得到系数向量
[验证]
|
结语实际上,在上面的计算中,我也发现了,因为各种小数点运算的精度问题,导致很多误差的产生,所以,后面会在以上的流程中,出现更多的优化操作。我们实际使用中的zk - SNARKs 也会在有限域上做算术运算,这样结果就是整数了,避免了误差问题。 |
zk-SNARKs 是一种比较难掌握的技术,我们需要将大量的部件组合在一起,才能使整个系统正常工作,因此,想要深入学习这项技术,我决定将各项部件拆解,分别学习并理解它。zk-SNARKs 不能直接应用于任何计算问题,我们需要将计算问题一步步的转化为正确的“形式”,以便问题可以在zk-SNARKs的体系中顺利运行,其流程如下图:
这其中就包含了这篇博客要讲的两个重要流程,R1CS 和 QAP: - R1CS 的全称是 Rank-1 Constraint System,一阶约束系统,其本质是一个方程组。 - QAP 全称 Quadratic Arithmetic Problem, 二次算术问题。QAP 转换不仅可以将函数的代码转换为 QAP,还可以在转换的同时构建一个对应于代码输入的解(又称为 QAP 的 Witness),之后再基于这个 witness 构建一个实际的零知识证明系统。
后文将以Vitalik的文章Quadratic Arithmetic Programs: from Zero to Hero 为参照,详细展开解释R1CS和QAP转换的流程。
The text was updated successfully, but these errors were encountered: