Monero 学习笔记

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/t46414704152abc/article/details/89219891

Monero 名词解释

Monero(XMR) 是一个安全,隐私和不可追踪的加密货币。通过使用密码学中一种特殊的方法,门罗确保了所有交易保持 100% 的不可关联和不可追溯性(unlinkability and untraceability)。


  • Unlinkability: 对于任意的两笔交易,无法证明这两笔交易是发送给同一个人。
    • Monero中实现这种特性使用了Stealth Public Address,每次发送方发送XMR时都会发送到随机生成的这个地址,称之为Stealth Public Address。
  • Untraceability: 一笔交易中的inputs中有很多其他交易的output,无法证明真正花出去的是到底是哪一个output。
    • Monero中实现不可追踪性,采用环形签名(Ring Signature)。

  • view key: Monero中有一个public view key 和private view key。

    • public view key 用于生成一次性的stealth public address(隐匿的公开地址),XMR将会通过这个地址发送给接受者。
    • private view key 用于接收者扫描区块链来找到发送给他们的资金。
  • spend key:也有public spend key和private spend key。

    • public spend key帮助发送方参与环交易(ring transaction) ,并且验证密钥镜像(key image)的签名。
    • private spend key 帮助创建密钥镜像,密钥镜像使得发送方能够发送交易。

Monero地址

Monero地址是一个95个字符的字符串,分别由public spend key 和public view key构成。下图是地址生成的图解。

注意: 所有的Monero地址都是以4开头。

在这里插入图片描述

Stealth Public Address

  • Stealth Public Address:如果 Alice 要给 Bob 发送门罗币,除了 Alice,应该没人任何人知道 Bob 就是这笔钱的接收者。为了做到不可追踪性,Alice利用Bob的public view key 和public send key来随机生成一个一次性的公钥地址,叫做Stealth public Address 。假设Bob的view key的公私钥对是 ( A , a ) (A, a) , spend key 的公私钥对是 ( B , b ) (B,b) , 其中 A = a G , B = b G A = aG, B = bG , G是一个密码学常数,的生成过程如下:

    • 随机产一个 r r [ 1 , l ] l r,r∈[1, l], l 是G的一个素数阶。

    • R = r G , P = H s ( r A ) G + B H s ( ) R = rG, P = H_s(rA)G+B, H_s() 是Monero中使用的Keccak哈希算法。

    • 生成的Stealth public Address 即为P。

现在对P进行如下的推导:
P = H s ( r A ) G + B = H s ( r a G ) G + b G = G ( H s ( r a G ) + b ) = G ( H s ( R a ) + b ) P =\\ H_s(rA)G+B =H_s(raG)G+bG \\=G(H_s(raG)+b)=G(H_s(Ra)+b)

Alice告诉Bob这笔转账所在的区块号和交易号,Bob利用R、private view key a 和 private spend key b计算 P = G ( H s ( R a ) + b ) P = G(H_s(Ra)+b) 找到交易中的所有output,然后寻找相应的output中是否存在某个输出地址为P,如果存在,则可以证明Alice确实给Bob转账了.

注意: 对于其他人来说,由于不知道Bob的private view key 和private spend key,其他人无法知晓Alice给Bob转账的地址是哪里。

Key Image

Key Image:Alice 和 Bob之间的转账只有他们两个人知道,那么作为验证交易的矿工,如何确保Alice不会把同一个UTXO消费2次呢?这里就需要用到Key Image,定义如下:
* K e y I m a g e = s H ( P ) , s Key Image = sH(P),s 是Alice 的private spend key, H()是哈希函数。
对于对于相同的UTXO,其地址为P,Alice 的private spend key 也是唯一的,因此Alice第二次花费的时候提供生成的Key Image也是相同的,每一笔消费矿工都会记录相应的Key Image,再次出现相同的Key Image时,矿工就会拒绝这笔交易,这就可以防止双花。

需要说明的是,这里的P不是指Alice发给Bob时生成的stealth address, 而是Alice花费的UTXO所在的地址,因为对于同一个UTXO,其地址P不会变化,Alice的private spend key也不变。因此对应于同一个UTXO,有唯一的Key Image

思考: Key Image的生成最终是乘法得到的,这就感觉有个问题,如果其他人花费自己的UTXO时生成和Alice相同的Key Image的时候,但是此时如果Alice并没有花费P中的XMR,那么岂不是把Alice的位于P地址中的XMR给冻结了吗? 另外,如果Alice给出的Key Image不合法,即Alice根本不给出UTXO真正的Key Image,矿工如何判断Key Image的合法性呢?

Ring Signature

Ring Signature: Monero中为了保护发送方的隐私,使用了环形签名,Alice 在给 Bob发送XMR的时候,除了给出花费的UTXO 的真实地址P之外,还会将Monero区块链中其他与P地址中余额相同的UTXO也添加到交易的inputs中,形成一个集合 S = ( P 1 , P 2 , . . . , P m ) S = (P_1, P_2, ..., P_m)

Alice会将这个集合S作为交易中的inputs一起发布出去,这样对于外界来说(尤其是矿工和Bob),他们无从知晓Alice具体花费了S集合中的哪一个UTXO,这样就保护了Alice的隐私。其他被Alice添加进来用于迷惑其他人的UTXO称之为mixins,又叫chaff output或者 decoy output,Alice添加mixins的时候,并不需要得到其他用户的同意,Alice自行决定添加的mixins的数目。Monero中使用Ring Signature的主要目的就是实现untraceabity。

Ring Confidential Transactions

Ring Confidential Transactions: 2017年1月10日Monero中正式使用了RingCTs。而在此之前,Monero中假如Alice需要向Bob转12.5个XMR,则需要将自己的UTXO分别发送至三个地址,分别转账10XMR、2XMR和0.5XMR,这是因为Monero中要求转账的XMR格式为 A × 1 0 B A ×10^{B} 的格式。使用了RingCTs之后,在区块链上隐藏了交易数额,这时候Alice挑选mixins的时候,不用考虑mixins的XMR的余额,提升了交易的隐私性。

猜你喜欢

转载自blog.csdn.net/t46414704152abc/article/details/89219891