深入浅出区块链——零知识证明

引子  

  隐私保护在区块链领域越来越受到重视,在隐私保护的种种手段中,零知识证明脱颖而出。那么零知识证明到底是什么东西呢?

  首先,我们抛出一个问题:如何在不说出秘密的情况下,让对方知道你已经知道了这个秘密?

 

例子1:用户注册

  用户在系统注册时,系统不会保存用户的密码明文,而是保存了密码的哈希值;用户在登录系统时,只需要输入注册时的密码,系统会根据用户输入密码产生的哈希值与系统数据库保存的哈希值进行比对。如果一致,则系统认为——当前登录用户知道该账号的密码。

  这样,用户不需要告诉网站密码,就能证明自己的身份。这其实就是一种零知识证明。

 

例子2:在校大学生实习

  A要去公司实习,公司要求A在校所有功课没有挂科,才有资格加入公司。A虽然所有功课都没有挂科,但都在61、62左右徘徊;A不想让公司看到自己的成绩单,于是A委托学校开了一个证明:证明A在校所有功课全部及格。并交到了公司,加入了公司。

  这样,A既没有暴露自己的确切考试成绩,又向公司证明自己满足要求。这其实就是零知识证明。

 

如何从字面解释“零知识证明”?

  零知识证明:零知识,即在证明的过程中不透露任何内情。通俗的来讲,就是既证明了自己想证明的事情,同时透露给验证者的信息为“零”。

 

什么是零知识证明?

  零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它早于区块链诞生,但由于区块链,它被大家所熟知。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。

  零知识证明可以分为交互式非交互式两种。

 交互式

       零知识证明协议的基础是交互式的。它要求验证者不断对证明者所拥有的“知识”进行一系列提问。证明者通过回答一系列问题,让验证者相信证明者的确知道这些“知识”。然而,这种简单的方法并不能使人相信证明者和验证者都是真实的,两者可以提前串通,以便证明者可以在不知道答案的情况下依然通过验证。

 非交互式

  非交互式零知识证明不需要交互过程,避免了串通的可能性,但是可能需要额外的机器和程序来确定实验的顺序。

 

为什么区块链中要用到零知识证明? 

  在现在的时代,个人的身份与很多信息进行了关联,你的手机号,身份证号,银行卡号等等都绑定在一起,只要知道你的手机号,就可以通过关联信息获取到你的姓名,出生年月等等信息,可所谓“牵一发而动全身”。

  在区块链的世界中,用地址来表示交易双方,这样达到了匿名的作用。然而,链上的信息虽然是匿名的,但是通过链上信息绑定的链下信息,像很多交易所都绑定了链上地址与链下的银行账户、支付宝,使得可以很方便的追溯真实世界的交易双方,使得匿名性荡然无存。

  那么,有没有一种方法,能够在隐藏发送方、接受方以及交易金额等其他细节的情况下,保证交易有效呢

  答案就是:零知识证明

 

零知识如何保证区块链中交易的匿名性?

  通过利用零知识证明机制,可以将交易双方的地址、交易细节隐藏起来。

  目前ZCASH(大零币)使用零知识机制来证明交易有效,其零知识方法为:zk-SNARK是“zero knowledge Succinct Non-interactive ARgument of Knowledge”的缩写。ZCASH可以将交易纪录上的交易双方和金额都加密隐藏起来,因此矿工无从得知这些交易上的细节,但仍然可以验证交易。

  1、 zero knowledge:零知识,即在证明的过程中不透露任何内情,如上文的例子所示。

  2、 succinct:简洁的,主要是指验证过程不涉及大量数据传输以及验证算法简单。

  3、 non-interactive:无交互。

  在ZCASH中,摒弃了之前的UTXO方式,而是使用了一种基于UTXO,被称为NOTE(支票)的新方式代替。NOTE代表了当前账户对资产的支配权,与UTXO不同,账户余额的存储方式不再是“未消费的交易输出”,而是“未被作废的支票(NOTE)”;一个NOTE是由所有者公钥PK、所拥有金额V、和唯一区分支票的序列号r组成,表示为NOTE=(PK, v, r)。

  ZCash交易分为两类:透明地址交易隐藏地址交易

  透明地址交易的输入、输出直接是可见的NOTE信息;隐藏地址交易,输入和/或输出的地址和金额是隐藏的。

  透明地址交易:

  

 

  隐藏地址交易:

  

 

  透明地址和隐藏地址混用:

  

 

  

   在ZCASH的隐藏地址交易中,交易的输入输出不再是明文的NOTE,而是NOTE的签发和废弃通知

   

 

   左侧代表的是“签发的新的NOTE”,右侧代表的是“作废的NOTE”。每次进行转账,就会把转账方的NOTE放到作废列表里,代表此NOTE已经作废,同时为收款方创建一张等额的NOTE。这样就实现了“资产的转移”,并且由于都是记录的NOTE的哈希值,因此并不知道被废弃的和新签发的NOTE的内容,这样就做到了隐藏交易双方及交易细节。

   等等!从头至尾都没有用到零知识证明呀?矿工怎么能够确认这些匿名交易是真实有效的呢?

  其实,在矿工确认交易时,转账方会提供一个证明P,能够证明:转账方通过私钥SK、公钥PK、支票序列号r计算后的哈希值,与在签发列表中存在的哈希值一致,这足以证明转账方的NOTE存在。这样既没有泄露转账方的信息,又证明了NOTE存在(类似上文提到的用户注册的例子)。

  矿工确认NOTE存在后,就会在作废列表中查询,如果没有此笔NOTE的作废记录,则证明转账方NOTE有效(防止双花)。然后再在作废列表中,把当前NOTE的序列号哈希计算后的值记录在作废列表中,表明此笔NOTE已经作废,同时为收款方签发新的NOTE。

 

总结

  至此,就可以在区块链中应用零知识证明来保护交易双方隐私了。目前保护交易双方隐私的机制除了零知识机制,还有环签名机制,环签名是群签名的一种,后续有机会,也会和大家聊一聊的。

  以上就是我对零知识证明的一些粗浅的了解,如果有任何错误或者遗漏,请告知我,非常感谢。

 

 

posted @ 2019-10-22 10:18  Data&Truth  阅读(235)  评论(0编辑  收藏  举报