Page 360 - 《软件学报》2021年第7期
P. 360

2278                                     Journal of Software  软件学报 Vol.32, No.7,  July 2021

                 防伪验证由中心机构的签名验签问题转变为一个已发行货币列表的成员证明问题,这也是实现零币中全局混
                 币技术的基础.2013 年,Miers 等人设计了基于区块链的匿名分布式电子现金系统 Zerocoin                    [77] ,它通过使用区块
                 链来确保货币列表的完整性.2014 年,Ben-Sasson 等人设计了 Zerocoin 的升级版本 Zerocash               [78] ,由此奠定了
                 Zcash 交易协议的理论基础.基于 Zerocash 设计的密码货币 Zcash,目前已经过 Sprout 和 Sapling 两个主要版本
                 的开发  [79] .在身份隐私保护方面,首先,零币沿用了比特币中基于椭圆曲线公钥密码体制的匿名身份认证技术,
                 但其用户地址形式和作用不同于比特币;其次,零币实现了交易过程中的身份隐藏机制,通过全局混币和基于零
                 知识证明的货币权属确认实现了交易发送方的身份隐藏,通过交易内容的链上加密传输实现了交易接收方的
                 身份隐藏.
                    在此,我们以 Zcash 中实现方式最接近于原 Zerocash 论文的 Sprout 版本为例介绍零币中的身份隐私保护.
                 零币中仍然沿用了比特币中的匿名身份认证机制,但密钥形式和作用与比特币有很大的不同.在 Sprout 中,用户
                 密钥和地址之间的关系如图 16 所示:零币中的每个用户均具有两个密钥对(a pk ,a sk )和(pk enc ,sk enc ),由用户自主匿
                 名生成.其中,a pk 和 pk enc 统称为支付地址,作为用户交易过程中的身份标识符.a pk 称为支付密钥,在发起交易时用
                 于计算新生成硬币的承诺,pk enc 称为传输密钥,用于加密消息,指定交易的接收者.a pk 和 sk enc 统称为收入查看密
                 钥,sk enc 又称为接收密钥,这两个密钥在接收某笔交易时使用.a sk 称为花费密钥,a pk 和 sk enc 密钥均是由 a sk 通过伪
                 随机函数(pseudo random function,简称 PRF)派生而来.(pk enc ,sk enc )则是 ED 25519 算法中的一对公私钥.在 Sprout
                 系统中可以简单地理解为用户只有拥有了 a sk ,才能有花费某个匿名资产的权利.零币中的密钥体系是系统实现
                 交易隐私保护的基础.
                    为了实现交易的隐私保护,零币系统并未将货币明文直接存储在公开账本中,而是将系统已生成货币的承
                 诺值列表和已花费货币的序列号列表公开,交易过程中的货币合法性验证即成为一个承诺列表的成员证明问
                 题,防双花问题则通过已花费货币的序列号比对来完成.零币中的每个货币 np 可以表示为由以下内容构成:
                                                     np:={a pk ,,,rcm},
                 其中,a pk 是货币持有者公钥,是货币金额,是一个秘密值,用于计算硬币承诺和硬币的序列号,rcm 是门限值.货
                 币承诺的计算方式如下:
                                              cm:=SHA 256(10110000|a pk |||rcm).
                    零币系统通过两类交易实现新币承诺的生成:mint 和 pour 交易.其中,mint 用于由基础币(Basecoin)生成零
                 币;pour 用于实现用户间的交易支付.每个新生成的货币承诺 cm 会被加入一棵承诺 Merkle 树中,如图 17 所示.
















                      Fig.16    User addresses and keys in ZCash   Fig.17    Commitment Merkle tree in ZCash
                         图 16   零币中的用户密钥和地址                           图 17   零币中的承诺 Merkle 树

                    整棵 Merkle 树构成了系统中已经出现过的所有匿名货币列表(包括已经花费和未花费的),其中每个币的
                 承诺值 cm 充当这棵树的叶子节点,每个承诺 Merkle 树均具有一个根散列值 rt.由此,对于交易过程中所使用的
                 货币合法性验证即转化为一个证明承诺值 cm 是否属于承诺 Merkle 树的成员证明问题.此外,为了防止货币双
                 花,零币系统还维护了一个已花费货币序列号 Nullifier Set,矿工如果检测到支付出现在列表 Nullifier Set 中的货
   355   356   357   358   359   360   361   362   363   364   365