详细讲解:零知识证实 之 zk-SNARK 开篇

做者:林冠宏 / 指尖下的幽灵html

博客:http://www.cnblogs.com/linguanh/git

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8github

GitHub : https://github.com/af913337456/算法

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities数据库

虫洞区块链专栏:https://www.chongdongshequ.com/article/1536563643883.html浏览器


目录

  • 前序
  • 零知识证实
  • 零知识证实 与 zk-SNARK 的关系
  • ZCash 使用 zk-SNARK 达到了什么目的

前序

zk-SNARK 全称是“Zero-Knowledge Succinct Non-Interactive Argument ofKnowledge”,中文是“零知识简洁的非交互知识论证”。学习

zk-SNARK是“零知识证实”理论在区块链中的一个已经落地的被应用起来了的论证。区块链

早在以前曾学习过 zk-SNARK,无耐当时可以稍微讲明白的文章都至关少见,我自己也是一个常常写技术文章的人,写做的人最容易陷入的情况就是写着写着,文章中的一些词忽然冒了出来,只有本身知道它是怎么被推算出的,却没有说清楚。在读者看来就感到一头雾水的莫名其妙。加密

zk-SNARK 的知识部分分有几大部分。各个部分,说实话,都离不开数学知识的应用,非数学专业的读者理解起来,至关地困难。我将会分红5篇文章来逐个全面说清楚它们。开篇,也便是第一篇,是广义术语篇。code

零知识证实

既然 zk-SNARK 是基于零知识证实理论的,那么咱们得先理解下零知识证实零知识证实是由S.GoldwasserS.MicaliC.Rackoff这三我的在20世纪80年代初提出的。可是真正让它火了起来是区块链的zk-SNARK

零知识证实,它指的是证实者可以在不向验证者提供任何有用的信息的状况下,使验证者相信某个论断是正确的。

有两种角色,证实者验证者,和一个要点: 有用的信息

  • 证实者,证实本身知道问题的答案
  • 验证者,验证证实者的答案是正确的

下面列举 2个例子来讲明下零知识证实

例子1 钱包的主人

A 做为验证者,捡到了一个钱包,此时B做为证实者,想要向A证实,这个钱包属于它的,即证实钱包属于B。要符合零知识的证实,那么要知足下面的证实要求:

  1. A此时不能能让B看到钱包,更不能让他看到钱包里有什么东西。
  2. B必须提供足够多的准确无误的信息,证实钱包就是本身的。

B 此时能够提供:

  1. 钱包的颜色、大小、品牌分别是什么,等信息。
  2. 钱包里有什么东西?好比多少钱?什么证件?证件信息是什么?

A 在B回答完后,进行验证,若是 B 所有说对了,则确认B就是钱包主人。这种信息验证的手段就是零知识证实。B 没有向 A 直接提供钱包的状况下,证实了钱包是本身的,它也没法提供钱包,由于钱包在验证者A手上。实体的钱包就表明者有用的信息

例子2 阿里巴巴和40大盗

这是网上一个很广泛的讲述零知识证实的例子。阿里巴巴是一我的名,下面简称 A,A 是证实者,大盗是验证者

A 知道打开藏着财宝的山洞的咒语。强盗抓住他,让他说出咒语。若是A说出咒语,就会由于没有利用价值而被杀死。若是A坚持不说,强盗不会相信他真的掌握咒语,也会杀死他。A想了一个办法,他对强盗说:“大家离我一箭之地,用弓箭指着我,大家举起右手我就念咒语打开石门,举起左手我就念咒语关上石门,若是我作不到或逃跑,大家就用弓箭射死我。”

这样子,A 就能在距离大盗足够远的位置说出咒语打开石门,而大盗听不到咒语是什么,A。大盗眼见为实,石门的确被打开,验证A的确掌握咒语。这个过程 A 没有直接透露给大盗咒语,咒语就是有用的信息

此外还有一个数独的例子。感兴趣的读者能够自行去浏览器搜索。这种证实方式有点相似于数学中的间接证实的意味。

零知识证实 与 zk-SNARK 的关系

零知识证实,相信经过上面的两个例子,你们都能理解了。若是依然没法理解,我以为能够过段时间再来读读我这篇文章,如今不建议继续读下去。

若是直接在生活中,使用语言,动做来完成一次零知识证实,这是很好操做的。就像钱包的例子同样,你们凑到一块,说说话,就能完成。

然而从计算机的角度去看,如何将问题转化为程序的形式,让计算机去帮咱们完成零知识证实呢?这就须要咱们把实际的零知识证实类问题转化为数学的描述形式,这样就能使用计算机程序去表达。

zk-SNARK,就是一个为了将实际的零知识证实类问题转为计算机程序问题的理论。全称“zero knowledge Succinct Non-interactive ARgument of Knowledge” 能够拆分为下面几点去理解:

  • zero knowledge,零知识,即不透露任何有用的信息。
  • succinct,简洁的,主要是指计算机程序在验证的过程不涉及大量数据传输以及保证验证算法的简单。
  • non-interactive,无交互。交互是个抽象名词,我这里要解释一下它。好比交互式程序就是你给它一个指令,它反馈给你一个对应的信息,而非交互式程序就是你给它一个指令,正确它就执行,错误它就不执行,并且它也不会将错误信息反馈给你。所以zk-SNARK的无交互,就是证实者提交证实后,错误的时候验证者是不会透露错误的信息是什么的。
  • arguments,争议性。zk-SNARK 是有被攻击的争议的,这种争议仅且仅当证实者拥有足够的算力来经过伪造证据来欺骗验证者,才会存在,注意关键词:足够的算力,它足以打破公钥的加密,因此能够说几率极低。

目前,区块链中的公链 ZCash 就应用了 zk-SNARK 的理论。

ZCash 使用 zk-SNARK 达到了什么目的

目前区块链中一些著名公链,例如BTCETH的交易,在交易成功后,咱们去区块链浏览器或调用对应的RPC接口查看对应的交易记录的时候。是能够看出包含但不限于下面的数据的:

  • 交易发送者地址
  • 交易接收者地址
  • 交易的数值

虽说,单靠一个显示一串数字和字母组成的地址,例如:0xD224cA0c819e8E97ba0136B3b95ceFf503B79f53 也起到了很好的匿名效果,由于做为观察者来看,咱们根本不知道拥有该地址的人是谁,是男是女。

追求绝对的极致,那么可否将上面的数据也隐藏掉,达到所有数据匿名的效果呢?使用了zk-SNARK原理的ZCash公链就作到了。

ZCash拥有一个匿名交易系统,它支持多种交易类型,其中一种就是可以隐藏交易双方地址交易数值的交易。这是彻底的隐藏,而不是说数据还存放在ZCash的节点数据库中,而不向外显示出的隐藏。而是连节点都不知道交易的内容。能够说,在某一些对私密性要求跟高的应用上,零知识证实所带来的数据隐藏性是很高的。

关于 ZCash 在隐藏地址之间进行的交易中使用到了zk-SNARK。第二篇文章,我将重点介绍下:ZCash 在隐藏地址之间进行交易。

相关文章
相关标签/搜索