初识「零知识」与「证明」

副标题:探索零知识证明系列(一)

作者:郭宇

本文已更新至Github: https://github.com/sec-bit/learning-zkp/blob/master/zkp-intro/1/zkp-back.md

引言:

我认为区块链很难称为一个“技术”。它更像是一个领域,包罗万象。或者形而上地说,区块链更像一个有机体,融合了各种不同的理论技术。

零知识证明是构建信任的重要技术,也是区块链这个有机体中不可缺少的一环。

零知识证明是打通链上数据与链下计算的关键技术,也是实现链上数据隐私保护的重要途径

要解释「零知识证明」,我们需要先解释「证明」,然后解释什么是「知识」,最后再解释什么是「零知识」。

“证明” 的前世今生

什么是证明?很多人可能和我一样,看到这两个字,会不禁想起中学考卷中各种三角相似的几何图形,当老师在神奇地画出一条辅助线后,证明过程突然显而易见,然后会懊悔自己为何没想到。

古希腊:「证明」 == 「洞见」

数学证明最早源于古希腊。他们发明(发现)了公理与逻辑,他们用证明来说服对方,而不是靠权威。这是彻头彻尾的「去中心化」。自古希腊以降,这种方法论影响了整个人类文明的进程。
初识「零知识」与「证明」_第1张图片
上图是「勾股定理」的巧妙证明。历史上曾出现过许许多多精巧的证明,神奇的思路,天才的灵感。一旦一个命题被证明,上帝都无能为力。嗯,对了,还有那个「上帝不是万能的」证明:上帝不能造出一块他举不起来的石头。

一个数学证明往往暗藏无比深刻的「洞见」,相信很多人都看过「费马大定理」的故事[1],这个定理证明横跨四百年,从费马写下「这里空间太小,我写不下」,到怀尔斯最终登顶,耗费了许多代人的聪明才智。最近如「彭加莱猜想」,稍微带点年代感的如「哥德巴赫猜想」,还有我非常敬佩的华裔科学家张益唐十年磨一剑,在仔细研究了「Goldston-Pintz-Yıldırım」和 「Bombieri-Friedlander-Iwaniec.」的证明「洞见」之后,证明了「质数间的有界间隔」[2]。

自十七世纪,莱布尼茨起,人们就梦想找到一种机械的手段,可以来自动完成证明,而不再依赖天才的灵光一现。

二十世纪初:「证明」 == 「符号推理」

时间到了十九世纪末,康托、布尔、弗雷格、希尔伯特、罗素、布劳威、哥德尔等人定义了形式化逻辑的符号系统。而「证明」则是在利用形式化逻辑的符号语言编写的推理过程。逻辑本身靠谱么?逻辑本身「自恰」吗?逻辑推理本身对不对,能够证明吗?这让 数学家/逻辑学家/计算机科学家 发明(发现) 了符号系统,语法 vs. 语义,可靠 vs. 完备,递归 vs. 无穷。(这部分精彩故事请参看『逻辑的引擎』一书[3])。

1910年,罗素发表了洪(zhuan)荒(tou)巨著『数学原理』。在书中,罗素与怀特海试图将数学完整地「形式化」下来。如果能达到这样的目标,所有的数学成果都将以证明的方式建立在坚实的基础上。下图就是『数学原理(卷二)』中的一页:
初识「零知识」与「证明」_第2张图片
其中110.643这是一个命题:「1+1=2」,然后接下来就是这个定理的证明。大家可能奇怪,难道 1+1 还需要证明吗?是的,在数学原理一书中,数字 0,1,2,…… 都有严格定义,「加法」、「乘法」、「等于」都要严格定义,然后每一步的推理都需要指出依据。证明意味着什么?证明是可能繁琐无比的、但是每一步推理都严格无误。书中大量的证明都机械式的,按照公理和推理规则进行一种证明的构造,寻找证明就好像可以交给一个人,然后他无脑在公理与推理规则的集合中进行机械查找。

似乎人们距离「定理的自动证明」并不遥远了。

不幸的是,哥德尔在 1931 年证明了「哥德尔不完备性定理」[4],图灵在 1936 年证明了图灵机停机问题的不可判定性[5]。这些成果彻底终结了这个几百年的幻想。无论公理系统如何精巧设计,都无法抓住所有的真理。

证明不仅仅是一个严格推理,而且凝结了似乎很难机械化的创造性思维。证明中蕴含了大量的「知识」,每一次的突破,都将我们的认知提升到一个新的高度。不管是「洞见」,还是推理过程中所构造的「算法」,一个定理的证明的内涵往往远超出定理本身的结论。

六十年代:「证明」 == 「程序」

又过了半个世纪,到了六十年代,逻辑学家 Haskell Curry 和 William Howard 相继发现了在「逻辑系统」和「计算系统— Lambda 演算」中出现了很多「神奇的对应」,这就是后来被命名的「Curry-Howard Correspondence」。这个发现使得大家恍然大悟,「编写程序」和「编写证明」实际在概念上是完全统一的。而在这之后的 50 年,相关理论与技术发展使得证明不再停留在草稿纸上,而是可以用程序来表达。这个同构映射非常有趣:程序的类型对应于证明的定理;循环对应于归纳;……(这里推荐一本书:『软件基础』(Software Foundations 中译本)[6])。在直觉主义框架中,证明就意味着构造算法,构造算法实际上就是在写代码。(反过来也成立,嗯,码农码的不是代码,是数学证明,?)

目前在计算机科学领域,许多理论的证明已经从纸上的草图变成了代码的形式,比较流行的「证明编程语言」有

你可能感兴趣的:(科普文章,区块链,零知识证明,形式化验证,区块链)