zk-SNARKs
什么是zk-SNARKs?
Zcash是zk-SNARKs的第一个广泛应用,它是一种零知识密码学的新形式。Zcash的隐私保证源于可以屏蔽交易,但仍可通过zk-SNARK证明在网络共识规则下验证为有效。
缩写zk-SNARK代表“Zero-Knowledge Succinct Non-Interactive Argument of Knowledge 零知识简明非交互式知识”,并且指向的证明构造可以证明拥有某些信息,例如,一个密钥,不泄露该信息的情况下,也不在证明者和验证者之间进行任何交互。
“零知识”证明允许一方(证明方 prover)向另一方(验证方 verifier)证明声明的内容是真实的,不泄露超出声明本身有效性的任何信息。例如,考虑使用随机数的散列,证明者可以说服验证者确实存在具有该散列值的数字,而不透露数字的内容是什么。
在零知识“知识证明”中,证明者可以说服验证者不仅知道该数字存在,而且他们实际上知道这样一个数字,且不透露关于数字的任何信息。
可以在几毫秒内验证“简洁”的零知识证明,即使对于非常大的程序的声明内容,验证长度也只有几百字节。在最初零知识协议中,证明者和验证者必须多次来回通信,但在“非交互式”结构中,证明者发送“证明”给验证者,“证明”由单个消息组成。目前,唯一已知的生成非交互式的,足够短的,以发布到区块链的零知识证明方法具有“初始设置阶段 initial setup phase”,此阶段生成在证明者和验证者之间共享的公共参考字符串。我们将这个公共参考字符串称为系统的公共参数。
1. 引言
最近十年最强大的密码学技术可能就是:
通用简洁的零知识证明,又称为zk-SNARKs,全称为"zero knowledge succinct arguments of knowledge"。
所谓zk-SNARK,是指:
可为生成特定输出的计算提供相应的proof证明,使得验证proof的速度远远快于执行相应计算的速度。
而ZK (zero knowledge) 是附加属性:proof 可隐藏计算的某些输入值。如声称:
我知道某个秘密数字,使得对cow+该秘密数字执行1亿次SHA256 hash运算,其输出结果以0x57d00485aa 打头。
借助zk-SNARKs为以上声明生成proof,可使Verifier验证该proof的速度远远快于其直接运行1亿次hash运算(此时Verifier需知悉该秘密数字)。而zk-SNARKs的proof可保证该秘密数字不被泄露。
在区块链背景下,有两类很强大的应用程序:【本文重点关注扩展性问题。】
- 扩展性:若某个区块直接验证的时间很长,可改为由一人验证并生成proof,而网络中的其它人快速验证该proof,而不再需要每个人都花很长时间来直接验证。
- 隐私性:在交易中,你需要能证明你拥有某种未花费的资产,但是不想暴露资产的整个来源去向,可解决比特币等区块链平台中交易透明性带来的信息泄露,如who is transacting with whom and the amount。
zk-SNARKs的实现非常复杂,在2014-2017年期间,人们常称其为"moon math",近几年,经过科学家的努力,整个zk-SNARKs协议变得越来越简单和容易理解。
本文重点是向具有中等数学知识的人介绍zk-SNARKs的原理。
2. 为什么zk-SNARKs “应该”是很难实现的?
仍然以上节的例子为例:
我知道某个秘密数字,使得对cow+该秘密数字执行1亿次SHA256 hash运算,其输出结果以0x57d00485aa 打头。
我们希望,整个实现过程具有如下属性:
- succinct 简洁性:是指proof size和验证proof的时间都应该小于直接计算。若我们想要有“succinct”proof,则不能让Verifier在每轮都做hash运算,否则验证时间就与计算量成正比了。Verifier必须能对整个(1亿次)运算进行运算,而不是对每个单独的运算进行验证。
一种具有succinct特性的自然的应对技术为random sampling(随机取样):
即Verifier可随机选500个不同的位置进行取样并验证是否正确,若这500个随机取样都验证通过,则可假设剩余的 1亿-500 次运算有很大的概率是正确的。
同时,可借助Fiat-Shamir heuristic来将整个过程转为non-interactive proof:Prover computes a Merkle root of the computation,uses the Merkle root to pseudorandomly choose 500 indices, and provides the 500 corresponding Merkle branches of the data。
核心思想为:Prover does not know the hash until they have already “committed to” the data。若a malicous prover 在知悉取样位置后试图篡改数据,则其需要修改Merkle root,对应为a new set of random indices,对应需要再次篡改数据。。。如此往复,使得malicous prover进入了一个死循环。
但是随机采样验证存在一个致命缺陷:如下图所示,若malicious prover在计算的中间仅篡改了某个bit,使得输出结果截然不同,而Verifier借助随机采样验证可能永远都无法发现。
而借助zk-SNARK protocol,可解决以上问题,使得Verifier可check every single piece of the computation, without looking at each piece of the computation individually.
3. zk-SNARKs基础概念
3.1 polynomial 多项式
多项式为一类特殊的代数表达式,形如:【即为有限个形如 c x k cx^k cxk之和。】
∙ x + 5 \bullet \quad x+5 ∙x+5
∙ x 4 \bullet \quad x^4 ∙x4
∙ x 3 + 3 x 2 + 3 x + 1 \bullet \quad x^3+3x^2+3x+1 ∙x3+3x2+3x+1
∙ 628 x 271 + 318 x 270 + 530 x 269 + … … + 69 x + 381 \bullet \quad 628x^{271}+318x^{270}+530x^{269}+……+69x+381 ∙628x271+318x270+530x269+……+69x+381【其实即为表示具有816 digits 的 τ = 2 π \tau=2\pi τ=2π的多项式】
多项式有很多有趣的地方,特别的一点是:
polynomials are a single mathematical object that can contain an unbounded amount of information (想象其为a list of intergers即可)。
而多项式等式代表的是an unbounded number of equations between numbers。如,若 A ( x ) + B ( x ) = C ( x ) A ( x ) + B ( x ) = C ( x ) A(x)+B(x)=C(x) 成立,则以下皆成立:【以及其它任意点也都成立】
∙ A ( 0 ) + B ( 0 ) = C ( 0 ) \bullet \quad A ( 0 ) + B ( 0 ) = C ( 0 ) ∙A(0)+B(0)=C(0)
∙ A ( 1 ) + B ( 1 ) = C ( 1 ) \bullet \quad A ( 1 ) + B ( 1 ) = C ( 1 ) ∙A(1)+B(1)=C(1)
∙ A ( 2 ) + B ( 2 ) = C ( 2 ) \bullet \quad A ( 2 ) + B ( 2 ) = C ( 2 ) ∙A(2)+B(2)=C(2)
∙ A ( 3 ) + B ( 3 ) = C ( 3 ) \bullet \quad A ( 3 ) + B ( 3 ) = C ( 3 ) ∙A(3)+B(3)=C(3)
因此,可以 construct polynomials to deliberately represent sets of numbers so you can check many equations all at once. 如,假设你想验证以下等式是否成立:
∙ 12 + 1 = 13 \bullet \quad 12 +1 =13 ∙12+1=13
∙ 10 + 8 = 18 \bullet \quad 10 +8 =18 ∙10+8=18
∙ 15 + 8 = 23 \bullet \quad 15 +8 =23 ∙15+8=23
∙ 15 + 13 = 28 \bullet \quad 15 +13 =28 ∙15+13=28
可通过 Lagrange interpolation 来构建多项式 A ( x ) , B ( x ) , C ( x ) A ( x ) , B ( x ) , C ( x ) A(x),B(x),C(x),即在特定的坐标,如 ( 0 , 1 , 2 , 3 ) ( 0 , 1 , 2 , 3 ) (0,1,2,3) , A ( x ) A ( x ) A(x) 的输出分别为 ( 12 , 10 , 15 , 15 ) ( 12 , 10 , 15 , 15 ) (12,10,15,15) , B ( x ) B ( x ) B(x)的输出分别为 ( 1 , 8 , 8 , 13 ) ( 1 , 8 , 8 , 13 ) (1,8,8,13) , C ( x ) C ( x ) C(x)的输出分别为 ( 13 , 18 , 23 , 28 ) ( 13 , 18 , 23 , 28 ) (13,18,23,28),对应的多项式为:
∙ A ( x ) = − 2 x 3 + 19 2 x 2 − 19 2 x + 12 \bullet \quad A(x)=-2x^3+\frac{19}{2}{x}_{2}-\frac{19}{2}{x}+12 ∙A(x)=−2x3+219x2−219x+12
∙ B ( x ) = 2 x 3 − 19 2 x 2 + 29 2 x + 1 \bullet \quad B(x)=2x^3-\frac{19}{2}{x}_{2}+\frac{29}{2}{x}+1 ∙B(x)=2x3−219x2+229x+1