zk-SNARKs详细原理介绍(简单通俗易懂)

zk-SNARKs是一种零知识证明技术,首次应用于Zcash,允许在不泄露信息的情况下验证交易的有效性。本文深入浅出地介绍了zk-SNARKs的工作原理,包括多项式、零知识证明的概念,以及如何通过FRI(Fast Reed-Solomon Interactive Oracle Proofs of Proximity)实现简洁的非交互式证明。文章还探讨了zk-SNARKs在区块链隐私性和扩展性方面的重要应用,并指出当前的研究焦点在于提高FRI效率和计算编码优化。
摘要由CSDN通过智能技术生成

什么是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+219x2219x+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)=2x3219x2+229x+1

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值