浅谈零知识证明之二:简短无交互证明(SNARK)

本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学,本系列文章来源于作者在斯坦福著名的课程《CS 251: Cryptocurrencies and blockchain technologies》上的学习笔记,该课程授课老师是密码学大拿 Dan Boneh。

上一期文章发表之后,非常惊讶有那么多小伙伴读完了表示喜欢。那么我们接着这期继续吧!这次,我们专注的聊一聊SNARK。
相信看完前一篇文章的朋友们会有一点很不解的地方:为什么我们可以如此简短的创建一个证明,并且证明很长的信息呢?在上课前我也有这同样的疑惑,甚至觉得这个是一个“黑科技”,不过相信大家看完这篇文章,就会知道如何去驾驭这个“黑科技”了。

在详细讨论之前,我们得稍微严肃一点,系统性的学习一下SNARK的基本构造。

SNARK的四步构造

因为SNARK的“黑科技”特性,想要构建一套简短证明系统,其实流程是略微有些复杂的。总结一下一共可以分为四步,我们来一步一步详细描述。

第一步:确定有限域

在构造之前,我们先需要确定一个可以包含所有我们想要计算的数字的大小的一个有限域(Finite Field)。用通俗易懂的话来说,我们需要选一个很大很大的数字p,确保这个数字比我们要解决的问题里的所有数字都大。

如果以前了解过类似于RSA密码学的朋友们可能对这个概念不陌生。有限域就是给我们所有数字加了一个天花板,确定了整个数学系统的计算空间,类似于在电脑里如果我们想创建一个存数字的变量,我们需要思考到底是需要一个uint32_t(32位),还是一个uint64_t(64位)一样。所有超过有限域的值,都会直接溢出之后再倒回去从0开始。

在数学界,符合这个特性的计算空间其实有很多种,最常见的一种就是RSA算法里面用到的正整数求模一个大质数(integer mod p)。上文说到的找到一个数字p,其实就是一个很大的质数,然后我们可以用它来生成一个计算空间。

在确定计算空间之后,我们就可以真正开始SNARK的搭建了。

第二步:构建数学运算电路(Arithmetic Circuit)

当我们找到一个数字空间之后,我们下一步要做的事情,就是要把我们想要证明解决的问题用数学运算电路表示出来。

什么是数学运算电路呢?我们先来看一看传统的逻辑电路。

在这里插入图片描述
上图表述的是一个与非门(NAND)的电路。先不用过多了解电路的用处,我们可以发现的是,两组输入信号分别通过了AND和OR这两个基础逻辑门**。像AND和OR这样的基础逻辑门是逻辑电路的基础模块,通过拼加和堆叠我们可以实现任何复杂逻辑。**

数学运算电路也是同理,只不过基础模块从逻辑门变成了数学运算。因为加法和乘法是最基础的数学运算,通过加法和乘法我们也可以近乎实现所有其他的运算方法,所以我们可以**选用“加法门”和“乘法门”作为我们数学运算电路的基础模块。**通过叠加运算门,我们可以搭建一个复杂多项式的“电路”。

为了能更好的理解运算门,我们来试试看把上面的NAND门从逻辑电路转换成数学运算电路。(假设Inp0和Inp1和原来逻辑电路一样,还是输入1/0的逻辑信号。 )

我们先来看AND门:AND其实很简单,因为只有当Inp0和Inp1都是1的时候,AND的结果才会是1。我们很快发现,一个乘法门可以完美的代替AND门:只有当两个输入是1的时候,相乘得到的结果才会是1。

解决了AND之后,我们来转换NOT:NOT其实也非常简单,因为输入信号只会是0或者1,只要用1减去输入的信号,得到的结果就是相反的了。注意有一个问题是,因为我们只有加法和乘法,所以如果需要实现减法的话,我们需要先把输入信号乘上一个常数-1。
在这里插入图片描述
经过如此转换,我们就成功的把一个逻辑电路转换为数字逻辑电路了。同时因为我们已经知道如何组建AND和NOT了,理论上我们就可以把这两个部分模块化,拼接任意的复杂逻辑出来。

看到这里,你可能会觉得运算电路非常简单,和逻辑电路转化也非常直白。但是其实这是因为我们一直在假设运算电路的输入和逻辑电路一样,都是0或者1。在真实场景下,一个运算门的输入值可能上限非常大(取决于我们有限域选择的大小)。所以我们必须要想办法约束我们运算电路的输入,使其不仅能够在功能性上和逻辑电路相同,并且在输入取值上只可以取[0,1]这两个数字。

但是怎么用运算门来表示这么一个关系呢?因为数学运算电路其实就是一个复杂的多项式(比如上图的NAND电路就变成了Out = 1 - Inp0 * Inp1),我们可以把这个问题转化一下:**能否创造出一个多项式,只有当一个输入满足[0,1]的取值范围的时候,才会输出0?**最后我们发现,有这么一个多项式可以满足这个要求:

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值