门罗币是互联世界的现金,用门罗币连接的交易,快速、私密且安全。在门罗币的世界里,你可以成为自己的银行,除了你自己,没有人知道你账户的地址、资产,没有人能追踪你的交易历史,没有人知道你是谁。
1 门罗币的发展历史
2013年,Nicolas van Saberhagen发表了“CryptoNote protocol”,Bytecoin是第一个基于这个协议的货币(Bytecoin诞生于CryptoNote协议发表之前)。与中本聪一样,Bytecoin的发明者也保持了匿名,通过Bitcointalk来推进Bytecoin的发展。
尽管在2012年,Bytecoin就已经写好了,但是直到2014年3月才随着CryptoNote的第二版白皮书一起面世。社区就产生了疑惑:为什么这样一个厉害的货币在过去两年一致没有消息?为什么白皮书是第二版本?经过考察之后,社区发现Bytecoin涉嫌伪造签名、时间戳、阶段任务等,这让Bytecoin陷入巨大的质疑漩涡。社区成员thankful_for_today通过研究Bytecoin的释放曲线(emission curve),发现82%的Bytecoin已经释放出来了,这就说明币的供给是严重中心化的。但Bytecoin完全否认了这项指控,并于2017年发布了澄清说明。
最终,贪婪的预挖行为损害了Bytecoin的信用与推广。thankful_for_today重新组建了一个开发团队,2014年落地了Monero加密货币。
2 门罗的设计宗旨
1 去中心化网络(network decentralization):门罗网络是全球分布的,一个节点的关闭、一个国家的所有节点关闭,不会影响网络的其他部分正常处理交易。
2 金融安全性(financial security):传统金融市场中,需要第三方机构做信任背书,我们的账户信息、交易信息都会暴露在第三方机构的视野里。门罗网络中,信任是通过不可篡改的算法来保证的,互相不信任的节点可以根据算法验证交易的有效性,甚至交易者本人就可以验证他们自己的账本。
3 金融隐私性(financial privacy):很多加密货币项目牺牲了隐私性来提高安全性,而门罗币是把用户的隐私性放在第一位的。交易过程中无需暴露交易双方身份、交易金额,从而你的消费行为无法被任何人追踪。
4 可交换性(fungibility):某个资产的不同种类是可以互相交换的。比如,邻居向你借了1千克面粉去做面包,下一周还了你1千克面粉。那么面粉是可以交换的。但是,如果邻居向你借了自行车,下周还了你一个别的自行车,你是不会同意的,因为你还是想要自己的车子。那么车子就是不可交换的。
门罗币具有可交换性,这个性质是由门罗币的不可追溯特性决定的。你可能会问,可交换性有什么作用呢?没有可交换性,不影响交易啊,从alice手中获得的btc,与从bob手中获得的btc,都可以用来买咖啡。但是,如果alice是贩毒分子,卖咖啡的老板可能会拒绝你用从alice手中获得的btc支付。如果使用门罗币,咖啡店老板无法获知你的门罗币来源,也就不会拒绝售卖咖啡。
3 门罗币的两个特性
门罗币的交易是私密的、抗审查的(censorship-resistant),也就是说,门罗网络上的交易,我们无法获悉其发送者、接受者、交易的门罗币数量。表现为门罗币的两个特性:
- untraceability:交易的发送者等可能地来自于一个集合中的任何成员。
- unlinkability:无法证明两个交易的接受者是同一个人。也就是说,即使几笔交易是属于同一个人的,但是它们看起来却没有任何关系。
满足以上两种特性的加密货币,才能保护用户隐私,做到真正的匿名性。第一个特性的核心在于环签名(ring signature),用于保护交易发送者的匿名性,同时将加密机制整合进环签名算法中,保证了交易数量的隐匿性。第二个特性的核心在于创新的公钥机制(unlinkable payments),用于保护交易接收者的匿名性,交易接收者不是直接用自己的地址接收,而是用由该地址产生的一个针对本次交易的一次性地址接收。
4 unlinkable payments
如果用户想通过一个地址,接收不同的交易,并且这不同的几笔交易无法看出有内在联系(发送到同一个地址),我们提出了一个办法。交易不再是发送到一个地址,而是发送到与这个地址(?)和某个随机数有关的公钥。从而由于随机数的不同,不同的交易会得到不同的公钥,从而其他人无法判定两笔交易是否发送给了相同的接受人,即无法将两笔交易联系起来。这个算法中的使用到了diffie-hellman安全协议。
4.1 diffie-hellman
DH算法是一个在不安全网络上交换密钥的安全协议,让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥,这个密钥一般作为“对称加密”的密钥而被双方在后续数据传输中使用。
交易的双方alice和bob,分别生成自己的密钥对 和 ,公开自己的公钥 。注意到:
从而alice和bob可以通过一个公开的密钥S,来交换自己的密钥信息。比如,alice向bob传输一段信息 ,可以先计算 ,然后将 发送给bob。bob接收到信息之后,计算 ,然后得到 。
第三方只拥有 的人是无法获得信息 的,哪怕他拥有无穷的算力,因为他没有足够的信息。
4.2 交易过程
alice是发送人,bob是接受人,bob的地址是一对公钥 ,公开在网络上。
- alice随意生成一个整数 ,和bob的地址,计算一次性公钥(接收地址):
- 计算 (R是alice与bob通过diffie-hellman产生的shared secret的一部分),将之打包到交易当中,发送到P。
- bob遍历网络上的每一个交易,计算 ,其中 是bob的半个私钥,如果 ,那么bob判定这个交易的接受人是他自己。这意味着:
- bob利用自己的完整私钥 计算出一次性私钥: (即 ),之后bob消费接收到的币时,就可以用这个私钥 对交易进行签名。
在验证交易方面,bob只需要提供 (白皮书中称作tracing key)给其他节点进行验证。其他节点检验 ,即可判定交易是有效的。因为第三方并不知道另一半私钥 ,所以无法消费属于bob的收入。
如果交易的输出不是一个(single-input)而是多个(multi-output)呢?如何在两个或多个交易输出的接收者实际上是同一个地址的情况下,保证一次性接收地址是不同的呢?也就是说如何在多输出的情况下,保证unlinkability?答案是,可以为每一个输出编号,比如,有p个输出,那么分别对这p个输出编号 ,在alice对shared secret(即 )哈希之前,塞入编号 ,即:。这就能保证每个输出发送到不同的地址。
那么alice如何证明她发送了交易呢?她可以公开随机数 或者通过零知识证明的方法证明她知道 (比如说用 对交易进行签名,签名方法ring signature) 。
每一笔交易,都利用随机数 与公钥 产生一个一次性的地址,从而第三方无法判定两个交易是否属于同一个接收人。也就是保证了 unlinkability 特性。
5 ring signature(RS)
RF签名包含一个环和一个签名。签名是由一个单一的私钥和一系列与私钥不相关的公钥生成的;环(ring)是由与私钥相关的公钥、与私钥不相关的一系列公钥组成的。其他人可以验证签名是由某个成员创造的,但是不知道是哪个成员。
RF的一些特性对交易是否匿名起了关键作用:
- 混淆签名者(Signer Ambiguity)。如上所述,验证者可以验证签名者是这个环的一个成员,但无法确定是哪一个成员。这个特性可以混淆交易的发送者。
- 可连接(linkability):门罗中用这个特性来避免双花。交易的时候,每个输入对应一个一次性私钥,只有拥有这个一次性私钥的人,才能花费这笔钱。所以证明者提供签名,来证明自己的正当使用权。在证明者公布的签名内容中,有一项是密钥图像(key image),它的计算与私钥有关,因此,如果验证者发现两个交易的密钥图像一致,那么判定第二次交易为双花交易。
- 攻击者无法伪造签名。
5.1 EdDSA
EdDSA 是Monero中使用的签名算法。可以带来两个好处:1 注意到,alice在证明自己是交易的发送者时,需要产生一个随机数。如果随机算法选择不好,导致某两次交易的随机数相同了,可能会造成一次性交易地址不再是一次性的,而是重合的。考虑到哈希函数配合私钥、发送内容基本不可能输出相同的结果,所以用这种方法产生随机整数。2 可以防止cache timing attacks.
5.2 签名与验证
令 是要签名的消息本身,或者消息的哈希值;公钥集合(ring/group) , 私钥 ,它的公钥 , 是秘密索引,两个哈希函数 , 将输入映射到0到l上。
生成签名:
环签名包含 签名 , 密钥镜像 ,环 。
验证签名:
我们可以举一个具体的例子,来观察环签名的签名与验证方式。环(公钥集合),并且私钥 。
生成签名
生成密钥图像(key image):
生成随机数:
初始化签名循环(signature loop):
开始迭代 :
结束循环迭代,计算
将 代入3中的式子,可得:
生成最终环签名:
验证签名
上面讲的例子是单一输入(single-input)的环签名,然而,实际中很多交易是多个输入(multi-input)的。签名与验证过程与上面类似,只是每一个输入都有自己的私钥, 比如 个输入就对应 把私钥,那么就需要用这 把私钥对交易进行签名,相应地,公钥集合 就包含 个元素。最终生成的环签名:
,即 个整数, 个公钥, 个密钥图像。
6 交易量的匿名性
截至目前,讲述了Monero中如何保证交易双方的匿名性,但是还没有思考交易量如何匿名,以及交易量被隐匿之后,验证者如何验证与交易量相关的交易的有效性,也就是,证明者应如何在交易量匿名的情况下,证明交易的输入=输出?且输入、输出>0?
引入Pedersen commitment。这是一种加密commitment方案,可以在不揭露某个值的情况下,证明确知这个值。Pedersen Commitment一个重要特性就是同态可加性,比如, 和 分别是两个值 和 的commitment,那么 。将此性质应用到我们匿名交易有效性的证明,即可在不揭露输入、输出数量的前提下,证明输入=输出。
什么样的函数具有这样的性质呢?椭圆曲线加密函数。它满足:,如果我们只是简单地令 ,会存在一定的风险。比如,当 时容易知道 是什么,从而就能推测出真实的输入输出数量。因此,我们可以添加一个遮蔽因子(blinding factor)和另外一个生成器 ,,从而很难单单从 中知道 是什么。在Monero中, 。
因此,我们可以将数量 的commitment设置为 ,其中,是一个遮蔽因子。有许多组不同的 可以产生相同的,从而攻击者无法得到真正的交易数量 。
举例 交易有 个输入 和 个输出 。我们想证明:
而commitment是同态可加的,既要证明总输入Commitment=总输出Commitment,即:
为了避免交易发送者的身份被暴露,Shen Noether 提出了总输入Commitment-总输出Commitment=非零值。即:
被称作“commitment to zero”,因为数量=0。
门罗币的应用场景
以比特币为代表的众多加密货币,在某些应用场景中,作用受到限制。而门罗币,就有了用武之地。
1 价格操纵(Price Manipulation)。Sofia是小镇唯一的汽修工,她向顾客收取比特币,顾客换取相应服务。某次交易之后,她通过在区块链账本上查阅自己的地址,按图索骥发现顾客的钱包里有巨额比特币,足以买下几个兰博基尼。那么等下次顾客过来维修的时候,Sofia可能就会收取更高昂的费用。但是,如果顾客使用Monero支付,Sofia就无法追踪到顾客的地址,无法获知顾客的账户余额,从而无法操纵价格。
2 金融监管(Financial Surveillance)。Oleg的父母向他的钱包里打入1个比特币让他购买学习资料,并时刻监控这1个比特币的流向。结果Oleg将这笔钱剩余的部分全部打入了慈善机构公开在网络上的捐献地址。Oleg的父母发现了这一行为,并责骂了他。如果Oleg和父母使用的是Monero,就会避免这种情况,用户的任何交易行为不会被监视。
3 供应链隐私(Supply Chain Privacy)。Kyung-seok经营着一家便利店,生意非常好,平时都是用比特币作为交易媒介的。他的竞争对手就可以追踪到他所有的客户,并与之联系,最后为这些客户提供一个更低的价格,从而抢走Kyung-seok的生意。如果Kyung-seok一开始用的是Monero就会避免这种情况。
4 歧视(Discrimination)。Ramona租到了一个离工作地点非常近的房子,性价比高。每个月向房东支付2个比特币作为房租。几次支付过后,房东发现 Ramona的比特币都是来自于一个合法的在线赌场,她非常讨厌赌博,于是坚决拒绝 Ramona的再次租房请求。如果 Ramona使用的是Monero,房东不会发现她的收入来源,从而不会因为偏见而拒绝租房给她。
5 交易安全性/隐私性(Transaction Privacy/security)。
6 污染币(tainted coins)。