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

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

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

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篇文章来逐个全面说清楚它们。开篇,也即是第一篇,是广义术语篇。

零知识证明

既然 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 在隐藏地址之间进行交易。

详细讲解:零知识证明 之 zk-SNARK 开篇的更多相关文章

  1. 详细讲解:零知识证明 之 ZCash 完整的匿名交易流程

    作者:林冠宏 / 指尖下的幽灵 博客:http://www.cnblogs.com/linguanh/ 掘金:https://juejin.im/user/587f0dfe128fe100570ce2 ...

  2. 详细讲解nodejs中使用socket的私聊的方式

    详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然 ...

  3. Nginx基础详细讲解

    Nginx基础详细讲解 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App,操作更方便哦 1. ...

  4. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  5. iOS KVC详细讲解

    iOS KVC详细讲解 什么是KVC? KVC即NSKeyValueCoding,就是键-值编码的意思.一个非正式的 Protocol,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取 ...

  6. Android webservice的用法详细讲解

    Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...

  7. 详细讲解Android对自己的应用代码进行混淆加密防止反编译

    1.查看项目中有没有proguard.cfg. 2.如果没有那就看看这个文件中写的什么吧,看完后将他复制到你的项目中. -optimizationpasses 5 -dontusemixedcasec ...

  8. 详细讲解Hadoop源码阅读工程(以hadoop-2.6.0-src.tar.gz和hadoop-2.6.0-cdh5.4.5-src.tar.gz为代表)

    首先,说的是,本人到现在为止,已经玩过.                   对于,这样的软件,博友,可以去看我博客的相关博文.在此,不一一赘述! Eclipse *版本 Eclipse *下载 Jd ...

  9. [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...

随机推荐

  1. CCNET自动构建之路

    人永远追求效率(想偷懒),不想手动编译项目.发布站点于是产生了自动构建技术,.NET领域中CCNET是个不错的选择. 一路问题不少,记录一下. 准备环境 服务器上需要有iis.vs(与开发环境的版本一 ...

  2. StringUtils类使用 (转载)

    检查字符串是否为空或null或仅仅包含空格  String test = "";  String test1=" ";  String test2 = &quo ...

  3. Android中通过GPS或NetWork获取当前位置的经纬度

    今天在Android项目中要实现一个通过GPS或NetWork来获取当前移动终端设备的经纬度功能.要实现该功能要用到Android Framework 中的 LocationManager 类.下面我 ...

  4. HTML5学习笔记简明版(9):变化的元素和属性

    改变的元素(Element) 下面元素在HTML5里的使用方法稍作改动以便能在web里更好的使用或者起到更大作用: 没有href属性的a元素将显示成一个占位符,并且a元素内部如今支持flow cont ...

  5. CAS 单点登录原理

    访问服务: 浏览器发送请求访问应用系统 定向认证: 应用系统重定向用户请求到 SSO 服务器. 用户认证:用户身份认证. 发放票据: 认证通过后,SSO 服务器会产生一个随机的 Service Tic ...

  6. 【BZOJ3197】[Sdoi2013]assassin 树同构+动态规划+KM

    [BZOJ3197][Sdoi2013]assassin Description Input Output Sample Input 4 1 2 2 3 3 4 0 0 1 1 1 0 0 0 Sam ...

  7. 支付宝cookie 是支付密码 不是登录密码

    开发文档/ 手机网站支付 / 产品介绍 开放平台文档中心 https://docs.open.alipay.com/203/105288

  8. 编译性语言&解释性语言

    计算机是不能理解高级语言.当然也就不能直接执行高级语言了.计算机仅仅能直接理解机器语言,所以不论什么语言,都必须将其翻译成机器语言.不论什么编程语言编写的程序归根究竟都是由底层机器的机器代码(01序列 ...

  9. target!

    工作到现在也有8个月了,从学生时代想从事嵌入是开发,到工作中从事android开发,跨度还是比较大的:曾经想从事这些消费类电子产品的开发,想从一个用户变成一个生产者,但是真正进入到这一行之后,才知道在 ...

  10. [HTML & CSS] HTML和CSS基础知识

    最近将博客简单地修饰了下,需要用到HTML和CSS代码,花了一天时间学习了一下这两方面的知识.虽然内容很简单,但是足够用来修改自己的博客了. 1. HTML 1.1. HTML介绍 HTML与CSS的 ...