声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
边肖:记得要集中注意力。
来源:蒋
前言主要分享Zcash树苗版本的协议细节。给我提建议_!
到目前为止,Zcash已经经历了三次迭代,第四个版本预计在12.11.2019升级。据官方介绍,此次更新主要是为了缩短封杀时间。详见Zcash网络信息。
作为零知识证明的一个成功应用项目,我们带着以下问题来研究Zcash的机制:
1.Z Cash是如何隐藏寄件人的?2.Z Cash如何隐藏接收者?3.Z Cash如何隐藏交易金额?
* *建议:在看这篇文章之前,你最好知道:1。注意的概念;2.零知识证明的基本概念;
Sapling本文主要分享Zcash Sapling版本协议的主要细节。相对于Sprout版本做了很多修改和优化,这里就不做详细的对比分析了。回归大方向,无论是树苗版还是萌芽版,交易的全过程都可以简单概括为以下三步:1。交易员发起交易;2.交易者生成zk-proof和签名,验证者验证;3.接收者接收交易;
接下来,我们将尽力仔细挖掘每一步,探究它是如何做到这三点的。
事务这里不详细介绍事务发起方如何发起事务,直接介绍Sapling中的事务结构,如图:
其实树苗的交易结构不止这些。这里只列出了Sapling特有的一些字段和相应的解释。完整的交易结构详见协议规范的第7.1节。
在Sapling中,交易由支出转移和产出转移组成,分别对应于隐藏输入和隐藏输出。支出描述和产出描述是分别用于描述支出转移和产出转移的数据字段。它们被编码并表示为vShieldSpend和vShieldOutput字段,存储在事务结构中。接下来重点介绍vShieldSpend、vShieldOutput、valueBlance和bindingSig四个字段表示的内容。
1.vshield spend一个vshield spend对应一个SpendDescription,一个可靠的SpendDescription表示一个票据的有效成本。其内容如下图所示:
Cv:对Inpunote价值的承诺,所谓的承诺,其实是对V值的一种隐瞒,是单向的,不可逆的,不可伪造的;anchor:CM Merkel树的根,用于验证inputnote的存在性和有效性;作废器:票据的唯一标识符,用于防止同一张票据被重复使用;Rk:用于验证消费者授权签名;Zkproof:零知识证据,在不泄露相应隐私的情况下,证明笔记的有效性、笔记的消费权、隐私地址的有效性。spendAuthSig:用私钥签署spendDescription,授权消费票据。
2.vshildputput类似地,vshildputput对应于OutputDescription,可靠的OutputDescription指示生成的新注释的有效性。其内容如下图所示:
Cv:对outputnote的值的承诺也满足单向性和不可伪造性;Cmu:对输出的承诺。承诺的数学形式是曲线上的一个点(U,v),cmu是该点的U坐标;EphemeralKey:临时公钥,用于计算解密密钥encCiphertext的密文:noteplaint,是note的具体内容;OutCiphertext:用于计算共享密钥的密文,可用于恢复noteplaint的信息zkproof:零知识证据,在不泄露任何隐私的情况下证明新生成的笔记的有效性。
3.valueBlancevalueBalance表示这个透明价值池的变化,它是通过从支出转移的V的总和中减去产出转移的V的总和而获得的。当valueBalance为正时,意味着将valueBalance从树苗价值池转移到透明价值池;如果是否定的,将执行相反的操作。valueBalance将位于bindingSig中,用于验证事务的Balance属性。
4.bindingSig在《树苗》中,Bing SIG扮演两个角色。第一,保证交易的余额属性;其次,通过计算输入输出笔记cv的随机数rcv生成签名私钥,防止攻击者对outputDescription的重放攻击(spendDescription的重放攻击由spendAuthSig保证)
Zk-proof和签名在Sapling中,交易者总共要生成两个Zk证明(输出ZK证明的SpendZK证明)和两个签名(spendAuthSig bindingSig)。下面就一个一个介绍吧。
1.spend zk-proofspend zkproof主要是为了证明txsender有权消费一些票据并且这些票据是有效的,不会暴露任何私人信息。输入分为两部分,一部分是主要输入,另一部分是辅助输入。主输入是公共输入信息,辅助输入是私有输入信息,只有txsender知道。具体内容如下图所示:
根据上图,花费zkproof一共证明了以下几点:注意承诺完整性:输入节点的承诺的完整性,证明cm确实是根据V,rcm,gd,pkd计算出来的;Merkle路径有效性:Merkel树验证路径有效性,证明cm存在于Merkel树上,是有效CM;承诺完整性:输入注释v的承诺完整性,证明cv是根据rcv,v计算的;Smallchecks:证明私有参数gd和ak是合法的;Nullifier integrity:Note唯一标识Note,证明nf实际上是根据nsk、cm、pos计算的;Spenauthority: note的消费能力,证明其拥有消费note所需的私有参数;多样化地址完整性:一次性地址的计算完整性。如果以上等式都能满足,说明txsender有权花掉相应的笔记,因为等式4、6、7成立;注意的成本是有效的,因为1,2,3,5成立。
2.output zkproofoutput zkproof主要是让validator相信txsender生成的新便笺是有效的,不会暴露任何隐私信息。输入还是分为两部分,一个是主输入,一个是辅助输入。主输入是公共输入信息,辅助输入是私有输入信息,只有txsender知道。具体内容如下图所示:
从上图可以看出,output zkproof一共证明了以下几点:注意承诺完整性:Output Node的承诺的完整性,证明cm确实是根据V,rcm,gd,pkd计算的;承诺完整性:输入注释v的承诺完整性,证明cv是根据rcv,v计算的;SmallChecks:证明私有参数,gd合法;临时公钥完整性:临时公钥的计算完整性。如果以上等式都满足,那么txsender生成的新音符有效,因为等式1、2、3都有效;等式4的建立可以保证txreceiver可以根据自己的ivk key和epk解析加密的np,并保存在本地集中。
3.spendAuthSig的含义可以在两种情况下描述。首先txsender自己生成zkproof,然后签名spendDescription。此时,如果有攻击者想要重放spendDescription,需要重新签名,rk将被替换,那么验证者将无法验证spend zkproof如果攻击者不替换rk,那么spendAuthSig的签名验证就会失败,所以spendAuthSig的存在可以有效避免spendDescription的重放攻击;第二:txsender调用第三方生成zkproof,然后自己签名spendDescription,这是Sapling版本允许的。为了让一些内存和计算能力有限的钱包支持隐私交易,即使隐私丢失,也需要将所有辅助输入发送给第三方。所以在这种情况下,为了防止第三方恶意生成有效的zkproof,txsender需要签名spendDescription。需要注意的是,txsender的签名是ask,zkproof中的花费权限证明是ak(ak可以通过ask计算),所以第三方无法生成有效的签名,有效避免了spendDescription的重放攻击。Dauthsig的签名流程如下图所示:
4.bindingSig如前所述,bindingSig主要实现两个功能。第一,交易余额;保证不暴露支出转移和产出转移的V值;其次,防止输出描述被攻击者重放。签名私钥bsk主要是利用spendDescription和outputDescription对应的随机数rcv生成的,用来计算CVs。这使得攻击者无法作恶。因此,签名验证公钥是使用spendDescription和outputDescription对应的CVs生成的,攻击者不能更改CVs,否则zkproof验证失败。BindingSig的签名验证过程如下图所示:
接收事务的一般步骤如下:接收者遍历每个事务的outputDes,尝试用outputDes中自己的ivk和epk解密每个Cenc,如果返回成功,则将收到的note添加到本地receiveSets。那么Cenc是什么?如何用ivk和epk解密Cenc?
1.Cenc是什么?Cenc是enc cipher,是用对称密钥加密的noteplaint的密文信息。noteplaint指的是新生成的便签的内容,是私有的。np的组成和Cenc的加密过程如下图所示:
相关字段解释如下:DiverfiedHash:一次性参数生成器,输入D,输出gd,每次调用都不一样;Esk和epk:一次性私钥和公钥,满足epk=esk * gd;Pkd:一次性传输地址;NP: note Plain {memo,rcm,V,d}=票据信息{特殊字段,由交易的发送方和接收方通过协商使用,生成随机数cm,票据的面额,persifier };卡。DerivePublic:计算公钥;卡。同意:计算共享密钥;KDF:密钥获取功能,获取最终的加密密钥陈思瀚;赛姆。Encrypt:一次性对称加密功能;陈思瀚是一次性对称加密密钥,Penc是编码的Cenc。从事务结构中可以看出,陈思瀚不是以明文形式直接传输的。那么,交易接收方如何获得陈思瀚并加密Cenc呢?
2.如何用ivk和epk解密Cenc?首先,我们重点看两个方程:pkd=ivk * gd esk * gd=epk。在加密过程中,输入参数KA。同意是pkd和esk,pkd * esk=ivk * gd * esk=ivk * epk。所以在解密的过程中,如果可以输入ivk和epk,那么ka。同意(考虑到这一点,我们来具体看看Cenc的解密过程,如下图所示:
相关字段解释如下:
注意提交:CM计算函数,原始输入是np数据;Cm:音符的承诺;Extractor: extractor,返回cm的U坐标,形式为cm (U,V);如果返回的cmu与outputDes中的一致,说明证明者有计算cm的私有数据;
1.总结了对Sapling中有关spendAuthSig的描述的理解。
形容词(adjective的缩写)目的:证明某人有权在inputnote上花钱,即拥有spendKey。
B.疑问:在zkproof of spendDes中,证明支出的权力如下:
花费权限:rk=spendAuthSig。RandomizePublic(a,ak) (1)
由于A和ak都是辅助输入,所以是私有数据。而AK=spendauthsig。导数public (ask) (2),ask也是私人数据,所以如果公式(1)成立,说明这个人有相应的消费能力。spendAuthSig存在的意义是什么?
碳(carbon的缩写)答:在sapling版本中,考虑到部分计算能力和内存空间有限的钱包不具备生成证明的能力,可能需要第三方代理生成。这时,生成证明所需的私有数据如ak、nsk等。需要透露给第三方,会失去隐私。在这种情况下,为了保证第三方不能随意生成有效的zkproof,交易发起者需要用私钥对整个spendDes进行签名。需要注意的一点是,生成zkproof需要ak,但不需要ask。签名时用ask。因此,第三方无法生成有效的签名。
2.为什么sprout的joinsplit转移演变成了sapling的spend转移output转移?
形容词(adjective的缩写)生成的凭证的大小变小,加入拆分[1698字节]花费[384字节]输出[948字节]
B.zkproof中没有实现平衡证明,降低了电路的复杂度,提高了生成和验证性能。
3.支出和产出证明都是验证余额属性。如何保证整体价值平衡?
使用Pederson值承诺法,具有同态加法性质,即不暴露v的值,验证:
vold – vold=vbalance
4.树苗接收人如何接收纸条?
接收者遍历每个事务的outputDes,尝试用outputDes中的ivk和epk解密每个Cenc,如果成功,则计算note并将其添加到receiveSets。
5.BindingSig .
关于该签名的实现,请参考协议规范文档的4.12节。不重新生成密钥对,而是基于cv和rcv的生成关系,实现签名验证过程。
6.如何隐藏交易的发送方?
每个事务的验证公钥是一次性的临时公钥,所以挖掘者不知道事务的发起者。
7.我如何隐藏交易的接收者?
交易结构中没有交易接收方的地址信息。交易接收方的私有地址用于生成对称密钥,并生成Cenc。交易接收者通过问题4的方法接收交易。并且由同一事务接收者向不同事务发起者展示的地址是不同的,以防止事务发起者之间的共谋。
8.如何隐藏V值?
彼得森价值承诺隐藏的同态。
以上是我个人的理解。如果错了,希望读者批评指正。谢谢您们。最后附上整体结构图,希望能帮助你理解。
画面不止是2M。有需要的可以看资料,私信我。
附录1。3359github.com/Zcash/zips/blob/master/protocol/protocol.pdf官方协议说明