前言:
隐私是现代社会的产物,也是自由社会的根基。隐私保护也是区块链行业的重要研究方向之一,那么到底如何进行以及实现隐私保护呢?
隐私保护的其中一种方式就是零知识证明。
其实可以用一句话来概括:
“证明者(Alice)在不透露秘密的情况下,说服验证者(Bob)相信证明者(Alice)知道这个秘密”。
为了更直观解释,接下来会用隐私保护的例子来说明。
什么是隐私保护
隐私通常指不愿对他人公开的事情,或者是不愿意告诉别人的事情,在数据传输中就是不愿意也不需要交换的敏感信息。
隐私保护的目的是切断数据交易中发送方与接受方的联系,提高交易数据的隐私性和匿名性,使第三方更难追踪交易数据的用途以及归属。
举个生活中的例子:
游客向庙里功德箱中扔香火钱,所有的游客扔的都是同一个年份的一元硬币,这时有一个第三方在一旁观察,他可以知道谁在什么时间扔进去多少个硬币。但是当小沙弥从功德箱中取出混在一起的硬币时,他无法分辨取出的硬币分别是由谁扔进去的。
这里的功德箱就起到一个数据保护的功能。
游客使用功德箱可以快速高效地将自己的数据即硬币与其他的数据进行混合,但这里功德箱有个缺陷,游客扔进去的数据其实谁都可以取出没有限制,所以我们需要在接受者与混淆后的数据之间创建随机的联系,这时候可以使用零知识证明来解决在不暴露相关信息的情况下,解决证明隐私数据所有权的问题。
为什么需要隐私保护
最主要的原因是隐私保护帮我们解决了匿名与隐私问题。
匿名
目前公链的匿名只起到假名的作用,首先区分匿名与假名的不同。
匿名需要具备无关联性,无关联性指站在攻击者角度,无法将用户的任意两次操作进行关联。
假名很好理解,就是我们在网络上使用的一个与真实身份无关的身份。例如现实生活中的人可以生成任意多的公私钥对,用这些公钥在链上发送或接受每笔交易,这些公钥就充当他们的假名。如果外界不知道你和公钥的关系,他们就无法把你和你的交易历史关联起来,如果有人能把你跟公钥联系起来,就可以顺藤摸瓜找到你过去的交易历史。目前没有办法阻止第三方将我们和我们的公钥联系起来。
为了直观理解上面的文字,举一个例子来说明:
作家一般都会用一个假名与读者互动,比如《哈利波特》的作者乔安妮·罗琳总是以“J.K.罗琳”的名义出版作品。
她为什么这样做?
很可能是因为她想过正常人的生活,不让别人发现她是一个知名作家。不幸的是,一旦你被曝光,假名就变得毫无意义。就好像一旦我知道乔安妮·罗琳就是 J.K.罗琳,我会立即把她与她写过的每一件作品联系起来,并且意识到她一年的版税可能比我一辈子赚的钱都多。
到这里我们回答了需要隐私保护的理由:
隐私保护可以实现完全匿名且不可追踪。
用零知识证明进行隐私保护
为了在接受者与隐私保护后的数据之间创建随机的联系,需要使用零知识证明在不暴露相关信息的情况下,来解决证明数据所有权的问题。
那什么是零知识证明?
为什么零知识证明可以在不揭露敏感信息的情况下也可以证明你知道某个秘密呢?
零知识证明
接下来只从使用零知识证明的角度来讲解,让大家能从一个宏观的视角看零知识证明是如何被使用的,至于零知识证明的细节,在之后的文章中我会用通俗的方法来分享。
上图是使用零知识证明的一般过程。
这里我们将circuit看作是一个黑盒,在circuit中会执行一些约束,这些约束是与要解决的问题是相关的,比如x+y=5。
接下来从Prover向circuit中传入两个值:Private input(值:2),public input (值:3),接下来circuit会进行一系列的运算并检查约束是否满足(2+3=5),然后输出一个proof。Prover将proof以及public input发送给Verifier,Verifier使用proof,public input 进行运算来验证proof是否正确,如果正确则返回true,错误则返回false。
这里Private input是不对外揭露的,只有prover自己知道这个值。public input是prover与Verifier之间共享的一个值。
所以上面的过程可以总结为,prover 在不揭露Private input 的情况下向Verifier证明自己知道一个值能满足(x+3=5)。
基于circuit的零知识证明被称为通用零知识证明,通用零知识证明会将一个计算问题转化成circuit。
接下来以zk-Snark为例来说明,下图是zk-Snark流程图:
首先,zk-SNARK不能直接用于解决任何计算问题,我们必须先把问题转换成正确的“形式”来处理,这种形式叫做 "quadratic arithmeticproblem"(QAP)。
在进行QAP 转换的同时,我们可以用Private input ,public input创建一个对应的解,称为QAP的witness。prover使用这个witness来生成proof。
如上图所示:
1. 首先得有一个计算问题,这个问题一般是NP问题;
2. 然后将计算问题做一个等价转换变成QAP,步骤如下:
将计算问题拍平变成circuit;
接下来把circuit转化成 R1CS(rank-1 constraint system,一阶约束系统)。R1CS 是一个由三向量组 (a,b,c) 组成的序列,R1CS 有个解向量 s,s 必须满足符号表示向量的内积运算 a.s * b.s - c.s = 0,这里的解向量s就是witness;
接下来将 R1CS转化成 QAP 形式,这两者的区别是 QAP 使用多项式来代替点积运算,他们所实现的逻辑完全相同。
3. 接下的是比较重要的一步trusted setup,trusted setup会生成两个值PK,VK,truseted setup的目的是实现零交互验证,它生成的PK,VK相当于是一个“上帝”,由它来帮我们做一些挑战,来验证prover;
4. Prover会用PK以及witness生成一个proof交给Verifier;
5. Verifier拿到这个proof会用VK做一些校验,这一步发生在链上,由链上的节点或智能合约来做校验。
到这里,你已经基本掌握了zk-Snark的运作原理,虽然还有些细节不明白,不过没关系,这并不影响你利用zk-snark来做项目,有关zk-snark的细节我将在之后的文章中介绍。
总结
隐私保护的目的是切断数据交易中发送方与接受方的联系。
发送方利用隐私保护系统将自己的数据与其他人的数据进行混合,接受方利用零知识证明来证明有某一个数据的所有权,从而进行转账交易。