加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 金华站长网 (https://www.0579zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

浅析区块链隐私保护技术之门罗币

发布时间:2018-10-14 12:03:30 所属栏目:业界 来源:bubbleszz
导读:副标题#e# 【新产品上线啦】51CTO播客,随时随地,碎片化学习 一、前言 说起来早期比特币出现的时候亮点应该就是其去中心化的特性以及随之而来的不可篡改性,这意味着我们的账户信息不必提供给某家公司或者政府机构,看起来就比较自由,然而事实上随着政府

然后我们来看看stealth address,其实它的中心思想很简单,就是利用接受者的view key的公钥计算出一个临时的一次性stealth address,然后将资金发送到这个地址,然后接收者对区块链进行扫描时发现这笔交易就可以利用自己的view key取走这部分资金,而网络上的其他人并不知道这笔交易是发送给谁的,只有接收者自己知道,从而确保了交易的匿名性

stealth address的公钥的计算方式如下:

  1. P = H(rA)G+B 

其中H()表示门罗币所使用的hash算法,r是发送者选取的一个随机数,G表示的是椭圆曲线的基点,如果不了解的话最好还是先去看看ECC,毕竟这也算是区块链中的基础密码学了,公式中的A和B则分别表示接收者的public view key和public send key。

得到公钥P后再由它得到一个门罗币的地址,这就是一次性的stealth key了。

接下来发送者再计算一个R=rG,然后将R也打包到以P为目标的交易中,将这笔交易广播到链上。

接收者则在这边一直扫描着链上的交易,对于每笔交易,计算:

  1. P1=H(aR)G+B 

其中a为接收者的private view key,因为在椭圆曲线对应的公私钥关系中 A=aG,所以rA=raG=aR,所以当接收者发现P=P1时,他就知道这笔交易是发送给自己的,因为对应的P1只有接收者自己可以计算出来,所以除了他以外别人并不知道该交易的目标地址。

要使用这笔交易,接收者只需计算出对应的私钥:

  1. x=H(aR)+b 

使用该私钥即可签名这笔交易中的资金进行使用。

可以看到接收方这边的压力还是比较大的,需要扫描整个链上的交易,这也是目前门罗币性能的一大瓶颈。

3. 环签名

接下来我们来看看门罗币中用以提供匿名性的另一关键技术,环签名。

其实环签名的中心思想也很好理解,当你直接对一笔交易进行签名时,这笔交易的来源自然就被确定是你,但是如果你另外挑一部分交易进来,将你的签名跟这些签名进行混合,就又得到了一个新的签名,这样别人就无法确定这笔交易是否是来自你,只能判断来自于那些公钥组成的集合,其实这倒是跟混币挺像的。

从2001年第一个正式的环签名方案提出以来,环签名一直在不断地发展完善,现在也算是成熟了,具体的操作方案挺多,不过都看得我有点懵逼,下面我们还是简要地讲讲环签名的流程,如果想了解细节可以看看cryptonote 2.0的白皮书里的签名方案。

首先发送者会确认一个ring size,也就是这个环签名中使用的签名数,一般而言这个ring size越大就代表着对应的公钥集合越大,这也意味着更大的安全性,然而这也将占用更多的空间,会对网络的效率以及区块数据的膨胀,毕竟这都是要存在链上的。

确定ring size后发送方就会随机选择一个ring size-1大小的公钥集合,然后将自己的公钥也添加进去组成一个大小为ring size的公钥集合{P1,P2,P3…Pn},接下来的操作就非常有趣了。

我们将利用这些公钥一同构建一个方程,而要解开这个方程需要你知道这些公钥中的一个对应的私钥,也只需要一个,所以你就可以使用自己的私钥进行解密,然后将这一方程的解与公钥以及选取的参数等打包组成签名发送给验证节点,验证节点对你的签名验证过后就能确认你确实是这笔交易的发送者,但是却无法判断你是公钥集中的哪一个,至于这种方程其实也有很多方案,cryptonote的白皮书中就有一种实现,写的还算详细,不过着实是有点复杂,我也就不细说了(其实还是太菜)。

(编辑:PHP编程网 - 金华站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!