零知识证明(七)——zk-SNARK简介与基本构造

967 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

有帮助的话请点个赞吧~

简单介绍一下zk-SNARK算法,整理一下它的基本构造方法。算法还是很大很复杂的,有很多数学原理的东西,就分几天慢慢搞。

简介

  • zk-SNARK:zero-knowledge Succinct Non-interactive Arguments of Knowledge
    • succinct:简洁的,主要指生成的proof很小(需验证内容极大证明长度也不过几百Byte),验证时间为毫秒级,复杂度约为O(logn)O(\log n)甚至是O(1)O(1)
    • non-interactive:非交互式,通过一个可信第三方生成随机数(公共参考字符串CRS)发出挑战实现。
    • argument of knowledge:所证明的内容能表达知识、有价值。
  • 第一个广泛应用为Zcash,在交易完全加密的情况下验证其有效。

基本构造

这里是参考[2]的构造思路,zk-SNARK的实际构造会更复杂一些,需要经过
computationArithmeticcircuitR1CSQAPzkSNARKcomputation→Arithmetic circuit→R1CS→QAP→zk-SNARK
算式算术电路一阶约束系统二次算术程式zkSNARK算式→算术电路→一阶约束系统→二次算术程式→-zk-SNARK
下面构造过程中把R1CS和QAP放在一起,称为可验证算术电路。

(R1CS和QAP具体是什么可以暂时不用管,后面数学推导的时候会有形式化的解释)

确定有限域

选一个很大很大很大的质数生成一个计算空间,这个数比构造过程中用到的所有数字都大。

【这个单独拿出来做一步其实没有很理解它的作用】

构建算术运算电路(Arithmetic circuit)

  • 算术电路可以类比逻辑电路理解,逻辑电路由基础的 “与” 门和 “或” 门经过各种排列组合得到,算术电路由基础的 “加法” 门和 “乘法” 门经过各种排列组合得到。在逻辑电路中,各种复杂逻辑都可以使用两个基础门实现,在算术电路中也一样。

  • 比如一个与非门,用逻辑电路实现: image.png

  • 当输入内容为一位二进制数时,也就是00或者11,那么转为算术电路满足:

    • 与门AND其实和乘法门(*)是完全一样的;
    • 非门NOT则相当于11减输入,也就是1-1乘上输入加11image.png
  • 但是在实际场景中的输入值不会这么简单,那与非门的转化也就要复杂很多,所以下面就来设计一个取值约束电路,确保输入值为00或者11,也就是说输入值inin满足in[0,1]in×(in1)=0in\in [0,1] \Longleftrightarrow in \times (in-1)=0,那么一个取值约束电路可以构造如下: image.png 注:output=0output=0说明输入合法

  • 算术电路的复杂度通常用运算门的个数描述。

转化为可证明数学运算电路

  • 首先来看看什么时可证明电路,就是说证明者P可以通过这个电路向验证者V证明他拥有一个秘密内容,电路可表示为C(u,r)=0C(u,r)=0,其中uu是一个公共参数,rr是P所保守的秘密信息,输出00定义为验证通过。 image.png

  • 那么把上面设计的电路融合在一起,可以得到一个可证明的与非门电路: image.png

    • 这个电路的复杂度大概是10,还是不小的,毕竟算术电路中的基础运算乘法其实花销是不小的,比如应用到SHA256验证中,复杂度可能会到25000,也就解释了证明电路在实际应用中慢的原因。

SNARK

  • SNARK系统由三个部分组成——Setup、Prove和Verify,具体比较复杂,所以明天来讲……【绝不是因为太忙搞不完】

参考

[1] What are zk-SNARKs? | Zcash
[2] 浅谈零知识证明之二:简短无交互证明(SNARK)_安比实验室SECBIT的博客-CSDN博客

突发

嘤嘤嘤今天突然被安排,明天更完 还债完毕

这个介绍相对比较简单浅显,后面会有例子讲实际应用,然后慢慢深入……


欢迎指正与讨论!