简介:本文是 Vitalik 写于 2016 年 12 月,用于介绍零知识证明的数学实现方式的论文。文章思路清晰,通俗易懂,也因此,该文成为区块链行业技术人员学习这方面知识的首选文章之一。
术语介绍
解决一个问题需要花费时间。如果解决问题需要的时间与问题的规模之间是多项式关系,则可以称该问题具有多项式复杂度。
P 问题*:指的是在多项式时间内可解的问题。*
NP 问题*(Non-Deterministic Polynomial Problem,非确定性多项式问题):指不能在多项式内可解,但是可以在多项式时间内验证的问题。*
QSP 问题*(QSP - Quadratic Span Program):实现基于布尔电路的 NP 问题的证明和验证。*
QAP 问题 (Quadratic Arithmetic Program):实现基于算术电路的 NP 问题的证明和验证,相对于 QSP,QAP 有更好的普适性。
正文翻译
最近人们对 zk-SNARKs(零知识证明)背后的技术有很多兴趣,人们越来越多地试图去揭开一些被许多人称为“月球数学”的东西的神秘面纱,因为人们认为它的复杂性非常难以理解。zk-SNARKs 的理解确实相当具有挑战性,尤其是由于整个系统需要组装起来才能工作的移动部件太多,但如果我们把这项技术一件一件地分解,那么理解起来就会变得更简单。
这篇文章的目的不是用于完整的介绍 zk-SNARKs,它假定您具有以下背景知识:
1- 你知道 zk-SNARKs 和他的大致原理;(译者注:如果不知道 zk-SNARK,建议您可以参考《一个数独引发的惨案:零知识证明》)
2- 你有足够的数学知识,能理解一些基本的多项式知识。(如 if P(x)+ Q(x)=(P + Q)(x)
,P
和Q
代表多项式,如果你对这类多项式表述方式已经非常熟悉,说明你符合继续阅读的要求)。
zk-SNARK知识管道图,Eran Tromer绘制
如上图,可以将以上零知识证明分为由上至下的两个阶段。首先,zk-SNARK 不能直接应用于任何计算问题;相反,您必须将问题转换为操作的正确“形式”。这种形式被称为“二次算术程序”(QAP),将函数的代码转换成这些代码本身就非常重要。与将函数代码转换为 QAP 的过程一起运行的还有另一个过程,这样,如果对代码有输入,就可以创建相应的解决方案(有时称为 QAP 的“见证”)。这就是本文需要讲述的内容。
在此之后,还有另一个相当复杂的过程来为这个 QAP 创建实际的“零知识证明”,还有一个单独的过程来验证别人传给你的证据,但是这些细节超出了本文的范围。
在下面示例中,我们将选择一个非常简单的问题:
求一个三次方程的解:x**3 + x + 5 == 35
(提示:答案是 3 )。
这个问题很简单,由此产生的 QAP 不会大到令人生畏,但也是很重要的,你可以由此案例看到所有的功能是如何发挥作用的。
用编程语言描述以上方程如下:
我们在这里使用的简单编程语言支持基本的算术(+、-、*、/)、恒等幂指数**(x**7,但不是x**y)***和变量赋值,这足够强大到理论上可以在其中进行任何计算(只要计算步骤的数量是有界的;不允许循环)。注意模(%)和比较运算符(<、>、≤≥)不支持,因为没有有效的方法做模或直接比较有限循环群算法(感谢;如果有任何一种方法可以做到这一点,那么椭圆曲线密码破环的速度将超过“二分查找”和“中国剩余定理”)。
您可以通过位分解来将语言扩展到模和比较,(例如:13 = 2**3 + 2**2 + 1 = 8 + 4 + 1
)作为辅助输入,证明这些分解的正确性,并在二进制电路
中进行数学运算;在有限域算法中,执行等式(==)检查也是可行的,实际上更容易一些,但这两个细节我们现在都不讨论。我们可以扩展语言来支持条件句(例如将语句:if x < 5: y = 7; else: y = 9;
转换为算术形式:y = 7 * (x < 5) + 9 * (x >= 5);
)不过请注意,条