零知识证明于区块链中的落地应用

摘要
现今区块链技术的发展速度愈发加快,区块链应用落地伴随而来的是用户对隐私安全性的要求愈发提高。基于此情况,众多区块链开发团队提出了多种不同的用户隐私安全保护机制。其中零知识证明与区块链技术相结合作为一种新的方案为提高区块链隐私安全性提供了更多的可能。本文将结合使用零知识证明的区块链系统-“Zcash” -对其加密技术以及零知识证明进行深入的探讨。
要点总结:
· 零知识证明是. 上世纪80年代提出的一项加密学理论,而其应用在区块链技术出现后才真正实现,该理论阐述了证明者如何在不提供有效信息的情况下通过验证者的验证。
· 目前零知识证明在区 块链中的应用大致可以分为三类,分别为可信任初始化设置、通信设置以及无需可信初始化设置,相对而言可信初始化设置的应用性较差,无需可信初始化设置扩展性较好,现阶段零知识证明协议偏向于无需可信初始化设置方向开发。
· Zcash 作为第一个使用零知识证明的区块链系统,通过zk Snarks实现了证明者与验证者之间零交互验证,目前交易模式分为透明交易、Sprout模式以及升级后的Sapling模式。
· zk-Snarks 通过将普通验证问题转化为复杂多项式的方式实现证明者与验证者之间的零知识证明验证。
· 平衡隐私安全保护与利用保护隐私 “作弊”将是未来零知识证明重要发展方向之一。
1. 零知识证明介绍
零知识证明(Zero-Knowledge Protocols)是上个世纪80年代由麻省理工研究人员S.Goldwasser. S.Micali 及C.Rackoff提出的一-种理论。该理论的核心是阐述证明者如何在不
向验证者提供任何有效证据的条件下证明某个论断是正确的。《HowtoExplainZero-Knowledge Protocols to Your Children》中举了-一个经典的例子,文中以《阿里巴巴与四十大盗》的故事为例,阿里巴巴想在不告诉强盗打开宝库大i ]方法的前提下证明他是可以打开大门的,这个时候可以采取的方式是让强盗与门保持足够远的距离,他念动咒语开启宝库大门,这时即使强盗不知道开门的方式仍然可以证明阿里巴巴知道开门的方式。
通过上述例子可以了解到零知识证明特征属性主要为三点:
· 完备性: 证明者如果能够可以通过重重验证,验证者则可以判断证明者的真实性。
· 零知识性: 通过验证的过程中,证明者不可以想验证者透露具体有用的相关信息。
· 合理性: 这个验证方法是独一-无二不可伪造的,除此之外没有其他方式可以通过验证。
满足这三点则可以实现零知识证明的验证方式。
2. 零知识证明协议分类对比
虽然零知识证明并非新概念,但是实际上- -直未出现契合的应用场景。直到区块链的出现,零知识证明才真正显示出其发展潜力。
自比特币问世以来,区块链技术-直处于蓬勃发展阶段。作为去中心化的账本,区块链的安全性始终都是人们最为关注的。尽管地址匿名化对用户隐私起到了-些保护作用,然而由于链上数据透明化,攻击者依旧可以通过对数据的分析、对网络的拓扑盗取用户的隐私。零知识证明与区块链相结合使得用户隐私安全性得到大幅度地提升。

目前密码学的专家们已经通过零知识证明开发出很多种协议,包括最早被使用于Zcash 中的zk- Snarks(Groth16)以及后来开发的Plonk、Sonic. Starks. DARKs、Bulletproof. SuperSonic等。部分特点对比如下图所示:

从表格中可知,目前的零知识证明协议根据可分为三类:
· 可信设置协议:最早的Snarks协议使用的是可信设置,例如Groth16协议。Groth16 可以以很小的证明高效的完成验证。而其缺点是使用的公用参考字符串通过一次性可信设置创建,这也意味着参考字符串无法升级,一旦程序出现问题,哪怕只是很小的问题也需要重新部署整个电路。另外新的应用也无法直接使用原本的可信设置,需要建立新的可信设置。同时可信设置会生成- -些“有毒废料”(toxicwaste), 如果“有毒废料”没有被及时处理的话有可能对协议的安全性产生影响。
· 通用设置协议: Sonic 是最早的通用设置协议,在传统Snarks协议之上加以改进,只需初始时进行一次可信设置即可。这也就意味着参考字符串可以升级无需重新部署整个电路,新的应用也可以重复使用这个可信设置。然而,在验证成本同样不低的情况下,验证时间与验证体积都要超过Groth16。
· 无需可信设置协议: 无需可信设置协议在Sonic的基础上进一步改善。公用参考字符串被公开同时不会产生“有毒废料”,提高安全性的同时,降低了使用的复杂度。然而取消可信初始化设置会导致证明的数据量增大,Starks 的验证体积更是可以超过100kb。 虽然SuperSonic与Bulletproof 比Starks好很多,但是在验证时间和验证体积上仍要超出SnarkSo
针对不同的应用场景,各类零知识证明协议都有其优点,下文将以zk-Snarks为例详细介绍零知识证明在区块链系统中的实现原理。
3. 零知识证明于区块链中的应 用场景Zcash
3.1 Zcash使用的交易模型
Zcash是首个使用零知识证明的区块链系统。作为以保护隐私为重点的区块链系统, Zcash的交易方式与比特币的交易方式是不同的,比特币系统当中使用的是UTXO(UnspentTransaction Output)的方式进行记账。
举例来说A拥有10个比特币,此时A想转3个比特币给B,那么转账的方式并不是以“10-3”、“x+3” 的方式进行交易。假设A手中的只拥有一个价值10比特币的UTXO,那么首先这个UTXO將被銷毀并生成一-个价値等于7比特而的UTXO与一个价値等于3的UTXO并将价値等于7的UTXO岌放給A,价値等于3的UTXO友放給B,这祥交易就完成了。

虽然UTXO模型很稳定的记录了比特币的每一笔交易记录,然而所有的交易数据却也直接公布到了链上,也就是说所有人都可以看到这些交易数据,这在隐私安全性上来说是存在着隐患的。
为了防止用户交易数据被“攻击者”利用,同时保证交易的真实可信性, Zcash在原本的UTXO模型上进行了改进,使用Note作为其交易结构。如下表所示:

与UTXO不同,Zcash使用的Note并没有直接将交易后作废的原UTXO销毁,而是创建了一个作废列表对原来的作废后的Note进行存储记录。
Zcash中通过两个表对交易进行记录,票据表(Commitment) 负责储存有效的、可使用的票据(Note),与之相对作废表(Nullifier) 表中则负责记录已经失效的票据。Note 当中包含如下四个元素:

· 用户的公钥 pk:由用户私钥sk生成,负责充当收款人地址
· Value :记录Note的价值
· 随机数rho:当Note被交易之后作废时,充当该Note在作废列表中的唯一编号(nf)。 .
· 随机数r:对r进行Hash后可以生成rho。
当交易者想要将自己手中的资产交易出去的时候,可以通过发布作废Note的“编号”并将其放入Nulifier表中的方式进行交易。
以下图为例,A想要给B转7个ZEC:
a)首先A找到了- -张自己的有效Note3,并使用自己的私钥a _sk (A的Spending key)对这张加密(Hash) 的Note进行解密并发现这个Note中有10个ZEC。
b)接下来以与 UTXO模型相同的方式把这张Note3分为一张value为7 ZEC的Note4和一张value为3 ZEC的Note5。
c)新的Note4与Note5中包含了生成的新随机数r4与r5、通过r4与r5生成rho4和rho5以及在Note4当中置入的B的公钥b_ .pk (B 的Paying key)和Note5中置入的A的公钥a_ .pk (A 的Paying Key)。
d)此时Note3不会被销毁。A需要将Note3的rho3 (Hash(r3)、 经过签名加密Note4与Note5广播到全网,由矿工进行验证。
e) 矿工收到消息后在Nullifier表中进行查询,当没有发现Nullifier表中并不存在A广播的rho3并验证了A对Note3的使用权益后将rho3 (Hash(r3)) 放入Nulifier表中,Note4与Note5放入Commitment表中完成交易。
f) B收到 Note4后可使用b_ sk (B 的Spending key)对Note4进行解密并获取其使用权。

上文中简单的描述了Zcash中的交易过程,其中有几个问题需要注意。
首先,当使用Zcash进行匿名交易时,就意味着Note中的信息全部都是加密过的,也就是说公钥pk信息、value、r以及rho都是隐秘的,除了交易方之外无法被他人看到。在上述交易过程中,当交易进行到步骤(d) 时,A需要将Note4与Note5分别使用签名加密才可以广播到全网,如此一来A的a_ pk (A的Payingkey)和B的b_ _pk (B的Payingkey)则会公开,这不符合.上述描述中a_ pk (A 的Payingkey)与b_ pk (B的Paying key)的信息也是隐藏的特点。
其次,如果Note中的信息全部匿名化了那么验证者则无法通过常规的方式验证交易的真实性。下文将就通过Zcash的交易模式对这两个问题进行说明。
3.2 Zcash 的交易模式
目前Zcash的交易方式分为三种:透明交易、Sprout 模式交易、Sapling 模式交易。
3.2.1透明交易
在Zcash的透明交易模式中,交易时无需对交易信息匿名化,用户可以直接使用透明的地址以及私钥完成交易的验证。
3.2.2 Sprout 模式
3.2.2.1 Sprout 内部交易结构
Sprout (萌芽期)则是Zcash早期使用的匿名化交易方式。下图为Sprout内部交易结构:

仍以上文为例,A与B进行交易,此时为了对交易添加签名同时不暴露公钥,Sprout 中通过产生随机交易密钥对“JoinSplitPublicKey/ JoinSplitPrivateKey” 的方式对交易内部数据进行签名(JoinSplitSig)。 由于密钥对是一次性 随机生成的,所以生成的密钥对只能保证数据的完整性而不能保证数据安全性,如果攻击者重新生成一对密钥对的话那么就有可能对交易进行重新签名篡改交易数据,为了防止这种情况发生Sprout 设计了hsig 机制。hsig 是通过JoinSplitPublicKey与JoinSplit内部数据结合算出的Hash值,生成的hsig再与发送方a_ sk(A的Spending Key)进行加密保存在JoinSplit 当中以确保其他人无法篡改随机生成的签名,从而保证了交易内容的安全性。
3.2.2.2 Sprout “线上”信息传递方式
除此以外Sprout还需要保证接收者能够在不暴露信息的情况下验证发送者发送信息的正确性。如下图所示:

图中交易地址中b_ pk (B 的Payingkey)是B通过私钥b_ sk (B 的SpendingKey)生成的公钥,b_ pkenc (B 的Encrypted Paying Key)则是B通过b_ _skenc(B 的Encrypted SpendingKey)生成的公钥。Incoming Viewing Key中的b_ _skenc (B 的Encrypted Spending Key)则是通过b_ _sk (B 的Spending Key)生成的私钥。
当A要将隐秘信息传递给B时,首先需要获取B的公钥b_ pk (B的Payingkey)与b_ pkenc(B的Encrypted PayingKey),随后A将b_ _pk (B的Payingkey)置入到隐秘信息中(也就是.上文中的Note)并通过Hash加密后放入到Note Commitment中等待验证。接下来, .A随机生成密钥对“esk/epk” ,其中esk与交易地址中的b_ pkenc (B 的Encrypted PayingKey)结合生成shared secrets,再通过shared secrets生成对称密钥Kenc。
接下来Note Plaintext 会通过Kenc 进行加密生成Cenc 并与之前生成的epk同时存放在JoinSplit中。此时B想要得到加密信息的内容就需要使用b_ _skenc(B 的Encrypted SpendingKey)与epk进行结合生成shared secrets,并通过shared secrets获得Kenc解密Cenco这个过程中由于只有B拥有b_ skenc (B 的Encrypted Spending Key),所以其他人无法通过epk获取密钥Kenc从而保障了信息传递的安全性。最后B可以通过将自己b_ _pk (B的Paying .key)代入隐秘信息中的方式求得Note并对其进行Hash运算与Commitment中发送者上传的Hash值进行对比确认信息的真实性。
3.2.3 Sapling 模式
3.2.3.1 Sapling 内部交易结构
Sapling (茁壮期)则为Sprout 的升级版。交易速度提高的同时,内部结构变得更为复杂。Sapling内部交易结构如”下图所示:

Sapling不采用Sprout 中的JoinSplit 结构进行交易,转而使用SpendDescription 与OutputDescription分别表示消费与入账。其中SpendingDescription 中包含了作废列表(Nulifier) , OutputsDescription 中包含Note Commitment以及B验证时需要的Cenco同样,为了保障交易的完整性与不可篡改性。A同样需要对交易进行签名。图中valuecommitment是value同态隐藏得出的值,rcv则是生成value commitment的随机数,通过对SpendDescription中所有rCV的和与OutputDescription中所有rcv的和进行求差值的方式得到签名私钥bsk;通过SpendDescription中所有rcv的和与OutputDescription 中所有rcv的和求差再与ValueBalance做差的方式得到签名公钥bvk。此时将交易中的信息进行加密再与bsk结合生成BindingSig以保证交易信息中数据的真实性与不可篡改性。
Sapling中不止对交易进行签名,同时还会对SpendDescriptions中的信息进行签名。如下图所示:

图中我们可以看到A通过a_ sk (A 的Spending Key)生成了a_ ask (A的AuthorizationSpending Key),a_ ask (A 的Authorization Spending Key)与随机数a结 合生成密钥rsk,rsk生成rk并将其置入SpendDescriptions中,随后rsk通过与交易信息中数据的Hash值进行结合生成SpendAuthSig如此-来变增强 了SpendDescriptions 的安全性。
3.2.3.2 Sapling “线上”信息传递方式
与Sprout不同,A传送信息给B时没有采用固定b_ pk (B的PayingKey)与b_ pkenc (B 的Encrypted Paying Key)而是采用了更具有流动性方式提高消息传递的匿名性。同时Sapling对于密钥的权限做了进一步分化。
· Incoming Viewing Key
B通辻Incoming Viewing Key可以査看Note Plaintext中的A侍送せ来的信息,如下圏所示:

首先,B会通过b_ sk (B 的Spending Key)生成两个加密私钥b_ ask (B 的AuthorizationSpendingKey)和b_ nsk (B的Nullifier SpendingKey),接下来b. _ask (B的AuthorizationSpendingKey)和b_ nsk (B的Nulifier SpendingKey)会分别生成b_ ak (B的AuthorizationKey)与b_ nk (B的NulifierKey)并结合会生成b_ ivk (B的IncomingViewingKey), b_ ivk(B的Incoming Viewing Key)通过与随机数d的结合生成pkd (Diversified Paying Key)作为B的接收地址。现在A将pkd (Diversified Paying Key)置入到隐私信息当中,并通过Hash加密将Hash值放入Note Commitment当中以待B的验证。A继续生成随机密钥对“esk/epk” , pkd (Divrsified Paying Key)与esk的结合会生成sharedsecrets,通过sharedsecrets可以生成对称密钥Kenc随即对Note Plaintext进行加密形成Cenc,接下来A将epk与Cenc同时放入OutputsDescription中即完成了他的工作。B接收到OutputsDescription中信息后可以使用b_ ivk(B的IncomingViewingKey)与epk进行结合得到shared secrets,并与A相同得到对称密钥Kenc, Kenc 通过对Cenc的解密得到Note Plaintext的内容。有了随机数d, B可以通过b_ ivk (B的IncomingViewing Key)求得pkd (Diversified Paying Key),并将其置入Note Plaintext中便可与Note Commitment中的Hash值对比验证A的交易信息是否真实。
· FullViewing Key
与IncomingViewingKey不同,FullViewing Key B不仅可以查看Note Plaintext中的信息,也可以使用b_ _fvk (B的FullViewingKey)验证OutputsDescription中的全部信息。如下图所示:

Full Viewing Key中包含b_ ovk (B的Outgoing Viewing Key)、b. _ak、b_ nk 三个密钥,上文中提到,b_ ak (B 的AuthorizationKey)与b_ _nk (B 的NullifierKey)结合会生成b_ _ivk(B的Incoming Viewing Key),也就是说Full Viewing Key具备直接解锁OutputsDescription的能力。不仅如此,b_ ovk (B的Outgoing Viewing Key)通过与epk结合可以直接生成对称密钥b_ _ovk (B 的Outgoing Viewing Key), A便可以使用b_ ovk (B的Outgoing Viewing Key)对pkd (Diversified Paying Key)与esk进行加密生成Cout,接下来B可以使用b_ _ovk (B的Outgoing Viewing Key)对Cout 进行解密从而直接得到pkd(Diversified PayingKey)与esk。至此,B已经得到所有密钥并可查看OutputsDescription中的所有信息。
3..3 zk- Snarks验证机制
通过复杂的交易机制Zcash成功的隐藏了用户之间所有的有用信息,保障了用户隐私的安全性,然而这也是对验证者验证交易真实性提出了挑战,此时便凸显出了零知识证明的重要性。零知识证明可以使验证者无需获得证明者有效信息的情况下并可证明交易信息的真实性与否,也就是说即使证明者可以在无需提供密钥解锁的情况下证明自己对于某笔资产的使用权。
Zcash中使用的零知识证明为zk_ Snarks (zero knowledge Succinct Non-interactiveArgument of Knowledge),中文为“零知识简洁非交互式证明”。Zk_ Snarks可以在证明者与验证者无交互的情况下高效的完成某些验证。
3.3.1 验证过程
如上文中提到,证明者若想验证对某一_笔 资产的使用权时需要提供一份Proof给验证者。根据Christian Lundkvist对Proof描述,Proof 的生成过程如下:
首先证明者需要提供一个隐秘参数w并通过电门C转换成多项式:
circuitC(x, w)
接下来系统中Generator将会使用产生的多项式与随机参数入生成对应密钥对pk,vk 作为验证时使用的密钥对:

证明需要通过Prover进行计算生成Proof r并交与验证者:
Prover(x pub inp, w sec inp):
π=P(pk,x,w)
最后Verifier拿到Proof π以后会对多项式进行验证:
Verifier:
V(Vk,x, π)=(3 ws.t. C(x, w)
若验证成功则证明证明者确实拥有这笔资产的支配权,验证者则会确认交易,反之则失败。在这个验证过程中隐秘参数w只有证明者自己知道,验证者无法得到所谓的有用信息。λ参数的保密性同样至关重要,如果证明者得到入参数,无论他是否知道隐秘参数w都可以生成假的proof并通过验证者的验证,也就是上文中提到的“有毒废料”。
3.3.2 验证逻辑
通过.上文的操作可以得知zk-Snarks中大概的验证过程。下文将对其具体的验证逻辑进行简单的介绍。
zk- Snarks的验证逻辑是清晰的,它的目的是“验证”而并非“求解”。 基于此, zk-Snarks 并没有直接使用求解简单数学方程来验证一个问题的正确性,因为证明者求出解也就相当于暴露了自己的有用信息。zk-Snarks采取的方式是将普通计算方程P (Polynomial) 问题通过QAP(Quadratic Arithmetic Programs,二次算术程序)的方式转化为NP (Non-deterministicPolynomial,非确定性多项式)问题。简单来说电门C的作用是将-一个验 证等式转换为多项式的一个过程:
V神用例: w**3+w+5=f= 35
这个方程很容易便可得到答案w等于3。问题是现在证明者不想把w等于3这个答案(也就是秘密参数)告诉验证者。所以这个等式最终通过QAP转换成了向量积表示形式:
w. a(n) *w. b(n)-w. c(n)= 0
如此一来w便成功被隐藏了,但是想要用来进行验证仍然不够所以继续转化:
w. a(n) *w. b(n)-w.c(n)=x* Z(n)
其中Z(n)表现形式为:
Z(n)= (n-1)* (n-2)* (-3)*..*-n)
n的取值范围为1,2.3…no
至此多项式转化的步骤就算完成了。N的问题通过电门C成功转化为了NP问题。为了方便下文的表示我们将多项式设为:

接下来证明者便需要通过验证者给出的n来计算P(n)与H(n),并将计算值交与验证者验证P(n)= H(n) * Z(n)的正确性。如果正确,验证者有很大的几率可以确认证明者确实知道隐秘参数W,反之则判定证明者提供的Proof是假的。
目前为止验证的逻辑可以理解为验证者需要通过验证多项式左右关系来确定证明者是否真的对一笔资产拥有着使用权,但是这种验证方式若想安全的实现,有些问题仍需要解决,否则这种程度的验证带来安全隐患是非常大的。
首先n值的选取是多样性的,在n值不确定的情况下,证明者还是有几率通过制造假的P’ (n)使多项式左右成立进而完成验证。对于这个问题zk Snarks采取的方式是对选取n的方式增加限制,验证者选取的n是通过随机抽样取得的,如此一来即使证明者撞到了P’ (n’)= P(n)= H(n) * Z(n)这种情况,n° 恰好也等于n的几率还是很小的.
通过n值随机抽样使得证明者无法直接伪造P^(n’)= H(n) * Z(n),然而证明者在得到n的情况下,仍可以通过伪造出H’ (n)使得P’ (n)=H^ (n) * Z(n)的方式通过验证者的验证,因为验证者的任务只是验证P(n)/H(n) ?= Z(n)来确定结果对错。为了防止这种情况的发生zk-Snarks对n值进行了同态隐藏(Homomorphic Hiding) 3。 同态隐藏的目的是为了让n转换成E(n)的同时仍然满足P(E(n)) = H(E(n)) * Z(E(n))多项式的验证,只能得到n值同态值的证明者自然无法通过真实的n值构造假的H (n)通过验证。
至此问题仍未解决完,尽管对n值进行了同态隐藏,证明者还是有可能在不知道w的情况下制造伪证使得P(E(n)) = H(E()) * Z(E())。由于P(E(n)) =w . a(E(n)) * w. b(E(n)) – w . (n),证明者可以通过伪造P(n))=w’ .a’ (E(n)) *w’. b’ (E(n)) – w^.c ())的方式完美伪造P())来通过验证者的验证。此时zk Snarks采取了KCA (Knowledge of Coefficient Testand Assumption)机制来阻止证明者伪造a()、b()、 c()等向量积。以a(E())为例:
a(E(n))→a(E()), λa(E(m))
原来的a(E(n))转换成了a(E(n))与入a(E())的向量对, 并且λ无法通过入a(E(n))/ a(E(n))的除法计算出值。这样便限制了证明者伪造a’ (E())的可能,因为自己伪造的ai (E())无法确定λa (E(n)的值。
除此之外证明者在向验证者提交Proof时,Proof 中还需要计算sum(入a(E(n)), (Ab(n)), λ())的值以确保证明者不会使用ya(E()), y入a(E(n)) (倍化)的方式伪造向量积对。
向量积对解决了证明者伪造a(E())的可能,但是同样引入了新的问题。

如上述公式所示,新的验证方式于单纯的加法同态运算之外又引入了加减法,此时zk-Snarks必须引入乘法同态运算法则才能解决验证问题。针对此问题zkSnarks采用了双线性映射(bilinear map) 4的方式使多项式的验证变为可能。
最终简化版验证多项式如下文公式所示:
w. (E()),入a()) * w . (n)), bNb()) -W . ()), A入c(E(n)) = H(E(n)) * Z(E(n))现在回到.上文描述的zk-Snarks的验证过程来看验证逻辑便清晰了很多,其过程如下:
a) circuit C(x, w)的作用是将w**3 +w+5=35 (例子)转换为w. a(n) *w. b(n)-w.c(n) = H(n) * Z(n)的一个多项式。参数x为H(n)。
b) Generator(Ccircuit, λ is ? ): (pk,vk)= G(\, C)则是将C circuit中的a()、(E(n))、())通过入转换为a(E())、入a(n)), b(E())、入b(E(n)), c(E(n))、 入c(E())。 pk、vk则为对应公共参数。
c) Prover(x pub inp, W secinp): π =P(pk, x, w则是通过pk、W、X生成了包含P(E())、H()的Proof π。
d) Verifier: V(vk,x, π)= (3 w s.t. C(x, w)则是验证者最终接收到π,再利用哈希值x、公共参数vk验证多项式的真伪。
综.上所述,zk-Snarks的目的是通过多次转换将能隐藏的信息全部隐藏起来并保证证明者在无法篡改被隐藏的验证内容的情况下验证最终的结果。
4. 零知识证明对未来区块链隐私性发展的作用
隐私始终是区块链研当中的热话题,其中如混币机制、二次加密等很多技术已经被广泛使用。然而这些技术始终绕不开需要通过密钥进行加解密的方式对证明者进行验证,零知识证明与区块链的结合犹如- -扇新的大门,为区块链隐私保护提供了新的发展方向。证明者无需向验证者提供有用的信息便可验证真实性使得攻击者很难通过对具体交易数据以及资金流向进行分析从而找到用户真实的身份,这使得未来区块链安全性发展愈发有前景。
与此同时,零知识证明的愈发成熟也就代表着链.上个人隐私保护与匿名性愈发强大。这为用户带来可靠安全性的同时也会给一些想利用区块链“作弊”的人提供机会。零知识证明为区块链隐私性提供安全保障的同时,如何平衡隐私性保护与“违规”也将是未来区块链发展道路上需要解决的重要问题之一。
5. 总结
零知识证明与区块链技术的结合为用户隐私保护机制的发展打开了一扇新的大门。长久以来零知识证明难以实现落地应用,而区块链技术的出现使零知识证明的优点得到了充分发挥。Zcash作为第一个结合零知识证明的区块链系统实现了证明者与验证者之间的零交互验证,验证者无需证明者提供任何有用信息便可实现对其的验证,提高了交易用户之间的隐私安全性。Zcash将交易方式分为透明交易与隐私交易两种,隐私交易经过发展从早期的Sprout模式到升级后的Sapling模式不断进行优化,性能上得到了显著提高,用户体验感亦得到了改善。由于Zcash的隐私交易模式是通过对用户密钥进行不断加密实现的,验证者无法得到证明者的地址以及验证密钥,因此零知识证明协议是Zcash区块链中核心的技术模块。Zcash 中使用zk-Snarks作为其零知识证明协议,zk Snarks则是通过将普通验证问题转化为复杂多项式的方式完成证明者与验证者之间的零交互验证。
未来零知识证明的研发更倾向于无需可信初始化设置方向,这可以使得使用零知识证明的区块链系统在提高隐私保护机制的同时拥有更好的扩展性。然而,零知识证明为保护区块链隐私提供了可行性的同时亦有可能为一些想利用区块链“作弊”的人提供了机会,如何平衡隐私保护与安全监控将是零知识证明未来发展道路上的重点之一。