门罗币(Monero)的环签名是如何创建的?

一、门罗币 Monero(XMR)

门罗币(Monero,代号 XMR)是一个创建于 2014 年 4 月开源加密货币,它着重于隐私、分权和可扩展性。与自比特币衍生的许多加密货币不同,Monero 基于 CryptoNote 协议,并在区块链模糊化方面有显著的算法差异。

门罗币排行、市值、排行

Monero 在 2016 年经历了市值(从 5 百万美元至 1.85 亿美元)和交易量的快速增长,这部分是因为它在 2016 年夏季末期得到了主要的暗网市场 AlphaBay 的采用。截至 2018 年 3 月,门罗币(Monero)价格接近 400 美元,是交易量排行前十的加密货币,市值超过 60 亿美元。


Monero 的模块化代码结构得到了比特币核心维护者之一的 Wladimir J. van der Laan 的赞赏。


二、门罗币底层协议 CryptoNote


CryptoNote 是一门技术,通过它我们可以创建完全匿名的虚拟货币。十多年来,其社区成员一直专注于密码学相关研究与开发工作。其目标是改进当前金融衍生产品,影响当代经济学范式。

随着计算机科学、数学和密码学的发展,加密货币的出现是新世界即将到来的第一个迹象。充分利用现有技术手段,公众可以制定新的、更加透明的协议,利用加密算法、共识机制保证其进行。

CryptoNote官网

CryptoNote 不仅仅一个数字货币,它所携带的思想和理念,更是值得我们学习与执行。下面让我给你列举一下门罗币(Monero)底层协议 CryptoNote 的几个设计理念。

  • 环签名 - 发送方,不可追踪
  • 混淆地址 - 接收方,不可链接
  • 环机密交易 - 交易金额的隐匿
  • 钥匙镜像 - 解决双花问题
  • 私人交易数据 - 不可分析
  • 区块大小、挖矿难度 - 自我动态调整
  • 平滑的发行曲线
  • 拒绝矿霸 - 更加平等的挖矿算法

以后,我会从设计思路,以及具体代码实现,一点一点的详细说明上述理念。我的公众号:Cryptocurrency 既关心技术,又关心投资。欢迎加我好友,与我交流…

下面我将介绍“环签名 - 发送方,不可追踪”这块进行介绍,这里会涉及到数学、密码学以及计算机科学(有少量伪代码),请做好准备。


三、环签名(Ring signature)- 发送方,不可追踪


基于一次性环签名的协议允许用户实现不可链接性。


普通类型的加密签名可以跟踪交易,知道它们各自的发送者和接收者。 我们解决这一问题的方法在于使用与现有电子现金系统中不同的签名类型。


我们将首先提供我们算法的一般描述,但没有明确的参考电子现金。


准备数据:


M - 要签名的数据,或者用 m 表示。

A[1], A[2], ..., A[n] - n 个公钥 A

i - 私钥索引

a[i] - 私钥

I - 即 key image,钥匙镜像


数据结构:


struct signature {

ec_scalar c, r;

};


struct ec_scalar {

char data[32];

};


保存数据:


c - challenge:

r - response:


> 提示:签名时需要的数据如:公钥、私钥、钥匙镜像等可以单独存放或计算得到,不用保存到 signature 门罗币里只保存 c, r 即可。


签名算法:


 Procedure generate_signature(M, A[1], A[2], ..., A[n], i, a[i]):
      I <- a[i]*H(A[i])
      c[j], r[j] [j=1..n, j!=i] <- random
      k <- random
      For j <- 1..n, j!=i
         X[j] <- c[j]*A[j]+r[j]*G
         Y[j] <- c[j]*I+r[j]*H(A[j])
      End For
      X[i] <- k*G
      Y[i] <- k*H(A[i])
      c[i] <- H(H(M) || X[1] || Y[1] || X[2] || Y[2] || ... || X[n] ||
       Y[n])-Sum[j=1..n, j!=i](c[j]) 
      r[i] <- k-a[i]*c[i]
      Return (I, c[1] || r[1] || c[2] || r[2] || ... || c[n] || r[n])
   End Procedure


数学公式:


1、生成随机数 q, w,

2、对 q, w 进行转换

3、零交互转换

4、得到 challenge 和 response

5、最终签名

校验算法:


 Procedure verify_signature(M, A[1], A[2], ..., A[n], I, c[1], r[1],
    c[2], r[2], ..., c[n], r[n]):
      For i <- 1..n
         X[i] <- c[i]*A[i]+r[i]*G
         Y[i] <- c[i]*I+r[i]*H(A[i])
      End For
      If H(H(M) || X[1] || Y[1] || X[2] || Y[2] || ... || X[n] || Y[n]) 
       = Sum[i=1..n](c[i])
         Return "Correct"
      Else
         Return "Incorrect"
      End If
   End Procedure


6、根据 signature 保存的及其它数据,运用算法计算出 L, R

7、最终校验,签名是否正确


签名就是:

随机数 + 要签名数据,已有数据 + 算法 -> 签名结果(主要就是处理过的随机数)


校验就是:

签名结果 + 要签名数据,已有数据 + 算法 -> 校验结果


四、补充:环签名基础步骤

环签名产生过程如下:

1.生成对称加密算法的密钥k = h(m),h是一个哈希算法(例如SHA),m是需签名的消息。

2.在Z∈[0, 2^b]范围内随机选择一个v值。

3.选择一组随机值xi作为签名环中单向陷门函数的输入,计算yi = gi(xi)

4.计算Ck,v(y1,y2,…yr)= v,计算签名者的陷门函数输入xs,令ys= gs(xs)。由于签名者控制自己的私钥,所以可以很方便地求得xs= gs-1(ys)。此时,计算的输入和输出形成一个“环”。

5.组成最终的环签名:(P1,P2,…,Pr;v;x1,x2,…,xr)


当验证者获取到环签名的时候,验证过程如下:

1.根据x1,x2,…,xr,以及陷门函数g1,g2,…,gr(通过公钥来推导),计算yi = gi(xi)。

2.计算对称加密的密钥k = h(m)。

3.计算Ck,v(y1,y2,…yr),并验证其结果是否等于v。


五、总结

上面大概给你介绍了四部分内容,重点在第三部分。


“门罗币 Monero(XMR)”给您介绍了门罗币当前市场价格、受认可程度,及在技术上它不是 clone 比特币的代码。

“门罗币底层协议 CryptoNote”给您介绍了 CryptoNote 的设计理念,如果您对技术感兴趣,可以一个个对应学习。如果您对虚拟货币感兴趣,也可以找对应文章一一了解。

“环签名(Ring signature)- 发送方,不可追踪”给您介绍了如何本文主题“门罗币(Monero)的环签名如何创建及校验的?”。注意 CryptoNote 用的是“一次性可跟踪环签名”,所以多了 key image 及零交互部分。

“补充:环签名基础步骤”,这部分知识是“环签名”的基础知识,实际操作进程中一般都对数据和算法都会有所改动。

我的微信公众号:Cryptocurrency,既关心技术,又关心投资。如果您觉得我写的文章有意思,欢迎加我好友,与我交流…



-- 本文完

编辑于 2018-03-08