Monero 学习笔记

Monero 名词解释

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


  • Unlinkability: 对于任意的两笔交易,无法证明这两笔交易是发送给同一个人。
    • Monero中实现这种特性使用了Stealth Public Addre,每次发送方发送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由1字节前缀+32字节public spend key +32字节public view key+4字节校验和组成,总共长度为69字节,转化为16进制字符,就是138位。
Monero地址是一个95个字符的字符串,分别由public spend key 和public view key构成。下图是地址生成的图解。

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

Monero 学习笔记

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=aG,B=bGA = aG, B = bG, G是一个密码学常数,的生成过程如下:

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

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

    • 生成的Stealth public Address 即为P。

现在对P进行如下的推导:
P=Hs(rA)G+B=Hs(raG)G+bG=G(Hs(raG)+b)=G(Hs(Ra)+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(Hs(Ra)+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,定义如下:
    • KeyImage=sH(P),sKey Image = sH(P),s是Alice 的private spend key, H()是哈希函数。
      对于对于相同的UTXO,其地址为P,Alice 的private spend key 也是唯一的,因此Alice第二次花费的时候提供生成的Key Image也是相同的,每一笔消费矿工都会记录相应的Key Image,再次出现相同的Key Image时,矿工就会拒绝这笔交易,这就可以防止双花。

注意: Key Image的生成最终是乘法得到的,这就感觉有个问题,如果其他人花费自己的UTXO时生成和Alice相同的Key Image的时候,但是此时如果Alice并没有花费P中的XMR,那么岂不是把Alice的位于P地址中的XMR给冻结了吗?

Ring Signature

  • Ring Signature: Monero中为了保护发送方的隐私,使用了环形签名,Alice 在给 Bob发送XMR的时候,除了给出花费的UTXO 的真实地址P之外,还会将Monero区块链中其他与P地址中余额相同的UTXO也添加到交易的inputs中,形成一个集合S=(P1,P2,...,Pm)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×10BA ×10^{B}的格式。使用了RingCTs之后,在区块链上隐藏了交易数额,这时候Alice挑选mixins的时候,不用考虑mixins的XMR的余额,提升了交易的隐私性。