做者:林冠宏 / 指尖下的幽灵html
GitHub : https://github.com/af913337456/算法
腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities数据库
虫洞区块链专栏:https://www.chongdongshequ.com/article/1536563643883.html浏览器
zk-SNARK
全称是“Zero-Knowledge Succinct Non-Interactive Argument ofKnowledge”,中文是“零知识简洁的非交互知识论证”。学习
zk-SNARK
是“零知识证实”理论在区块链
中的一个已经落地的被应用起来了的论证。区块链
早在以前曾学习过 zk-SNARK
,无耐当时可以稍微讲明白的文章都至关少见,我自己也是一个常常写技术文章的人,写做的人最容易陷入的情况就是写着写着,文章中的一些词忽然冒了出来,只有本身知道它是怎么被推算出的,却没有说清楚。在读者看来就感到一头雾水的莫名其妙。加密
zk-SNARK
的知识部分分有几大部分。各个部分,说实话,都离不开数学知识
的应用,非数学专业的读者理解起来,至关地困难。我将会分红5篇文章来逐个全面说清楚它们。开篇,也便是第一篇,是广义术语篇。code
既然 zk-SNARK
是基于零知识证实
理论的,那么咱们得先理解下零知识证实
。零知识证实
是由S.Goldwasser
、S.Micali
及C.Rackoff
这三我的在20世纪80年代初提出的。可是真正让它火了起来
是区块链的zk-SNARK
。
零知识证实
,它指的是证实者
可以在不向验证者
提供任何有用的信息
的状况下,使验证者相信某个论断是正确的。
有两种角色,证实者
和 验证者
,和一个要点: 有用的信息
。
证实者
,证实本身知道问题的答案验证者
,验证证实者的答案是正确的下面列举 2个例子来讲明下零知识证实
。
钱包的主人
A 做为验证者,捡到了一个钱包,此时B做为证实者,想要向A证实,这个钱包属于它的,即证实钱包属于B。要符合零知识的证实,那么要知足下面的证实要求:
B 此时能够提供:
A 在B回答完后,进行验证,若是 B 所有说对了,则确认B就是钱包主人。这种信息验证的手段就是零知识证实。B 没有向 A 直接提供钱包的状况下,证实了钱包是本身的,它也没法提供钱包,由于钱包在验证者A手上。实体的钱包就表明者有用的信息
。
阿里巴巴和40大盗
这是网上一个很广泛的讲述零知识证实
的例子。阿里巴巴是一我的名,下面简称 A,A 是证实者
,大盗是验证者
。
A 知道打开藏着财宝的山洞的咒语。强盗抓住他,让他说出咒语。若是A说出咒语,就会由于没有利用价值而被杀死。若是A坚持不说,强盗不会相信他真的掌握咒语,也会杀死他。A想了一个办法,他对强盗说:“大家离我一箭之地,用弓箭指着我,大家举起右手我就念咒语打开石门,举起左手我就念咒语关上石门,若是我作不到或逃跑,大家就用弓箭射死我。”
这样子,A 就能在距离大盗足够远的位置说出咒语打开石门,而大盗听不到咒语是什么,A。大盗眼见为实,石门的确被打开,验证A的确掌握咒语。这个过程 A 没有直接透露给大盗咒语,咒语就是有用的信息
。
此外还有一个数独
的例子。感兴趣的读者能够自行去浏览器搜索。这种证实方式有点相似于数学中的间接证实
的意味。
零知识证实,相信经过上面的两个例子,你们都能理解了。若是依然没法理解,我以为能够过段时间再来读读我这篇文章,如今不建议继续读下去。
若是直接在生活中,使用语言,动做来完成一次零知识证实
,这是很好操做的。就像钱包的例子同样,你们凑到一块,说说话,就能完成。
然而从计算机的角度去看,如何将问题转化为程序的形式,让计算机去帮咱们完成零知识证实
呢?这就须要咱们把实际的零知识证实
类问题转化为数学的描述形式,这样就能使用计算机程序去表达。
zk-SNARK
,就是一个为了将实际的零知识证实
类问题转为计算机程序问题的理论。全称“zero knowledge Succinct Non-interactive ARgument of Knowledge” 能够拆分为下面几点去理解:
交互
是个抽象名词,我这里要解释一下它。好比交互式程序就是你给它一个指令,它反馈给你一个对应的信息,而非交互式程序就是你给它一个指令,正确它就执行,错误它就不执行,并且它也不会将错误信息反馈给你。所以zk-SNARK
的无交互,就是证实者
提交证实后,错误的时候验证者
是不会透露错误的信息是什么的。zk-SNARK
是有被攻击的争议的,这种争议仅且仅当证实者拥有足够的算力
来经过伪造证据
来欺骗验证者,才会存在,注意关键词:足够的算力
,它足以打破公钥的加密,因此能够说几率极低。目前,区块链中的公链 ZCash
就应用了 zk-SNARK
的理论。
ZCash
使用 zk-SNARK
达到了什么目的目前区块链中一些著名公链,例如BTC
和ETH
的交易,在交易成功后,咱们去区块链浏览器
或调用对应的RPC接口
查看对应的交易记录的时候。是能够看出包含但不限于
下面的数据的:
交易发送者地址
交易接收者地址
虽说,单靠一个显示一串数字和字母组成的地址,例如:0xD224cA0c819e8E97ba0136B3b95ceFf503B79f53
也起到了很好的匿名效果,由于做为观察者来看,咱们根本不知道拥有该地址的人是谁,是男是女。
追求绝对的极致,那么可否将上面的数据也隐藏掉,达到所有数据匿名的效果呢?使用了zk-SNARK
原理的ZCash
公链就作到了。
ZCash
拥有一个匿名交易系统,它支持多种交易类型,其中一种就是可以隐藏交易双方地址
和交易数值
的交易。这是彻底的隐藏,而不是说数据还存放在ZCash
的节点数据库中,而不向外显示出的隐藏。而是连节点都不知道交易的内容。能够说,在某一些对私密性要求跟高的应用上,零知识证实所带来的数据隐藏性是很高的。
关于 ZCash
在隐藏地址之间进行的交易中使用到了zk-SNARK
。第二篇文章,我将重点介绍下:ZCash
在隐藏地址之间进行交易。