一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
| 有帮助的话请点个赞吧~ |
简单介绍一下zk-SNARK算法,整理一下它的基本构造方法。算法还是很大很复杂的,有很多数学原理的东西,就分几天慢慢搞。
简介
- zk-SNARK:zero-knowledge Succinct Non-interactive Arguments of Knowledge
- succinct:简洁的,主要指生成的proof很小(需验证内容极大证明长度也不过几百Byte),验证时间为毫秒级,复杂度约为甚至是。
- non-interactive:非交互式,通过一个可信第三方生成随机数(公共参考字符串CRS)发出挑战实现。
- argument of knowledge:所证明的内容能表达知识、有价值。
- 第一个广泛应用为Zcash,在交易完全加密的情况下验证其有效。
基本构造
这里是参考[2]的构造思路,zk-SNARK的实际构造会更复杂一些,需要经过
下面构造过程中把R1CS和QAP放在一起,称为可验证算术电路。
(R1CS和QAP具体是什么可以暂时不用管,后面数学推导的时候会有形式化的解释)
确定有限域
选一个很大很大很大的质数生成一个计算空间,这个数比构造过程中用到的所有数字都大。
【这个单独拿出来做一步其实没有很理解它的作用】
构建算术运算电路(Arithmetic circuit)
-
算术电路可以类比逻辑电路理解,逻辑电路由基础的 “与” 门和 “或” 门经过各种排列组合得到,算术电路由基础的 “加法” 门和 “乘法” 门经过各种排列组合得到。在逻辑电路中,各种复杂逻辑都可以使用两个基础门实现,在算术电路中也一样。
-
比如一个与非门,用逻辑电路实现:
-
当输入内容为一位二进制数时,也就是或者,那么转为算术电路满足:
- 与门AND其实和乘法门(*)是完全一样的;
- 非门NOT则相当于减输入,也就是乘上输入加。
-
但是在实际场景中的输入值不会这么简单,那与非门的转化也就要复杂很多,所以下面就来设计一个取值约束电路,确保输入值为或者,也就是说输入值满足,那么一个取值约束电路可以构造如下:
注:说明输入合法
-
算术电路的复杂度通常用运算门的个数描述。
转化为可证明数学运算电路
-
首先来看看什么时可证明电路,就是说证明者P可以通过这个电路向验证者V证明他拥有一个秘密内容,电路可表示为,其中是一个公共参数,是P所保守的秘密信息,输出定义为验证通过。
-
那么把上面设计的电路融合在一起,可以得到一个可证明的与非门电路:
- 这个电路的复杂度大概是10,还是不小的,毕竟算术电路中的基础运算乘法其实花销是不小的,比如应用到SHA256验证中,复杂度可能会到25000,也就解释了证明电路在实际应用中慢的原因。
SNARK
- SNARK系统由三个部分组成——Setup、Prove和Verify,具体比较复杂,所以明天来讲……【绝不是因为太忙搞不完】
参考
[1] What are zk-SNARKs? | Zcash
[2] 浅谈零知识证明之二:简短无交互证明(SNARK)_安比实验室SECBIT的博客-CSDN博客
突发
嘤嘤嘤今天突然被安排,明天更完 还债完毕
这个介绍相对比较简单浅显,后面会有例子讲实际应用,然后慢慢深入……
| 欢迎指正与讨论! |