区块链主流匿名币匿名性分析

摘要

随着区块链技术被越来越多的人熟知,数字加密货币的概念越来越普及,加密货币的用户也日益增多。作为加密货币界的创世币,比特币当之无愧的是其中执牛耳者,拥有着最高的市值和最大的用户量,受到了极大的关注。作为区块链技术的起源和典型代表,比特币仍然有其自身的局限,即匿名性。由于比特币上所有账户的交易都可以追踪,每笔交易的来龙去脉都在区块链上追踪溯源;从本质来说,比特币是化名的(pseudonymous),而不是匿名的(anonymous),这对于那些对匿名性有强要求的用户来说是不可接受的,有没有什么相关的解决方案呢?在需求的驱动和技术的发展两种因素的驱使下,匿名币应运而生。不同的匿名币币,使用了不同的技术以实现匿名要求,从目前的市值来看,典型的匿名币主要有Dash、Monero 和 ZCash三种,这三种匿名币分别使用了不同的匿名技术,下文会详细介绍其技术原理,并根据自身理解分析这些匿名币的匿名性。

匿名币

匿名性

从字面上理解,匿名指的是“没有名字”,通常的解释有两种:

  • 交易的时候不适用真实的姓名。
  • 交易的时候完全不适用名字。

如果按照第一个解释,那么比特币是匿名的,因为比特币交易过程中没有使用用户的真实姓名,而是使用比特币地址。如果按照第二种解释,比特币不具有匿名性,因为交易的过程中必须使用的地址是仍然是一种标识,在计算机语言中,使用一种特定标识的折中做法称之为化名。

在计算机科学中,匿名指的是具有无关联性的化名。无关联性指的是一种针对特定攻击者的能力而定义的属性,直观的理解是,如果一个用户和系统重复进行交互,从攻击者的角度考虑,不同的交互行为之间应该无法互相关联。比特币是具备化名性,但是如果要求绝对隐私,那么比特币的匿名性还不够。区块链技术是一种公开的账本系统,任何人都可以查询包含给定地址的所有交易,如果某人的真实身份和其比特币地址联系起来,那么他所有过去、现在和未来的交易,都会被追踪到,这种情况下,区块链的隐私保护甚至不如传统的银行。此时对于匿名加密数字货币的动机也就不难理解了,我们对其的要求是:

  • 其匿名性至少和传统银行带来的隐私保护处于同一级别,降低公共区块链带来的信息泄露风险。
  • 超越传统银行带来的隐私隐患,在技术上任何人不能够轻易的追踪交易。

那么如何才能做到更好的匿名性呢?这需要交易具有更强的无关联性。

无关联性

如果需要在交易的过程中做到强无关联性,至少需要做到如下三点:

  1. 同一个用户的不同地址应该不易关联。
  2. 同一个用户的不同交易应该不易关联。
  3. 一个交易的交易双方应该不易关联。

上述第三点看起来令人费解,交易双方既要完成交易,却又要使得双方不易关联,这个确实难以做到,但并非不可能。后文介绍的Dash、Monero和ZCash,能做到去中心化的前提下,也能较好的做到交易双方的无关联性。下文会对三中典型的匿名币的相关匿名技术做一个概要的介绍和分析。

Dash

Dash的前身称之为Darkcoin,于2014年1月18日上线,其代码主要来自于Bitcoin,其主要特点如下:

  • 限量供应,Dash供应量大概在1800万~1900万之间。
  • Dash中出块时间被缩短到了2.5分钟,出块速度是比特币的4倍。
  • Dash网络中除了矿工和一般用户外,增加了另外一类节点,称之为Masternode. Masternode主要负责完成组织并发布Dash用户的混币交易以实现匿名性。
  • 在Dash中,将混币交易称之为PrivateSend, PrivateSend主要使用了CoinJoin(合币)思想,即将不同用户的输入和输出组织在同一笔交易中,从而使得外界用户无法判断交易中输入和输出的具体对应关系,这样经过多轮次的混币交易,实现用户交易的无法追踪性。
  • Dash中增加了InstantSend,用户一笔交易在尚未上链之前就能得到确认,同时保证这笔交易不会被双花。

更多Dash的相关资料,可以参考其白皮书, 相关代码的实现,可以参考其github源代码

Dash中的匿名技术

前文说道,PrivateSend使用了CoinJoin(合币),CoinJoin最先由Gregory Maxwell于2013年在比特币论坛提出,其核心思想是将多个不同用户的输入和输出放置在同一笔交易中,使得交易之外的第三方难以辨识输入和输出的对应关系。

早期的Dash币中采用CoinJoin技术(Dash中称之为DarkSend),而与Gregory Maxwell提出的CoinJoin不同的是,DarkSend交易中,Dash币必须是属于标准面额{100.001, 10.0001, 1.00001, 0.100001, 0.0100001}, 同时输入和输出的个数必须相等,同时每个用户来说,DarkSend交易的输入和输出地址都是当前用户的钱包地址,DarkSend交易过程中用户的Dash没有离开自身的钱包。下图是一个典型的DarkSend交易,这笔交易中,有14个输入和输出的值都是0.100001;6个输入和输出的之都是1.00001.这里面具有多个用户,每个用户都有自己的输入和输出,只有参与DarkSend的用户自己知道输入和输出之间的对应关系。

在这里插入图片描述

后来Dash币中又对DarkSend进行了进一步升级(称之为PrivateSend技术),在PrivateSend交易中,所有的输入和输出都是相同的标准面额值{10.0001, 1.00001, 0.100001, 0.0100001,0.00100001}。因此,如果一个要进行PrivateSend交易,必须对UTXO中的面额拆分成标准化的面额,这需要一笔转账交易完成。下图是一个将UTXO拆分成标准面额的交易。将一个价值为0.01的UTXO,拆分为8个0.00100001,同时0.0004的转账交易作为PrivateSend的手续费用,剩余部分作为找零。在UTXO经过若干轮PrivateSend之后,和其他人进行转账交易时不能和找零的UTXO放在同一个交易中,否则就会暴露用户自身的隐私。因此,使用PrivateSend过程中会产生额外的找零UTXO,这是一个弊端。

在这里插入图片描述

完成对UTXO的面额化交易之后就可以进行PrivateSend交易,用户的客户端会向MasterNode发起进行PrivateSend的请求以进行混币。下图是一个PrivateSend的交易。

在这里插入图片描述

在DashCore 0.13.0版本之前,参与PrivateSend的用户固定是3人,后续的版本的PrivateSend中的用户数量介于3~5人之间。

相比于之前的DarkSend, PrivateSend中所有的输入和输出相等,增加了对输入和输出对应关系的追踪难度,DashCore的用户可以选择进行多次的PrivateSend以增强匿名性,目前组最新版本的DarkSend,最多可以进行16轮的PrivateSend。

对于一笔交易,不需要完全知道交易中每个输入对应的输出,UTXO的交易模式中,也没有具体的说明某个输入和某个输出的明确的对应关系。因此在PrivateSend中,我们关注的重点在于input和output是否对应于同一个用户。假定参与用户是3人,一轮PrivateSend中,共有3n个输入和3n个输出,每个用户都有相同的n个输入,外部用户能够猜对具体的输入和输出的概率为:

1 C 3 n n × 1 C 3 n 3 \frac{1}{{C}^{n}_{3n}} \times \frac{1}{{C}^3_{3n}}

一般情况下,PrivateSend中的输入个数至少为5,为了方便计算,假设n=6,平均每个用户2个输入,此时猜对特定某个用户的输入和输出的概率为 1 225 \frac{1}{225} , 在当前的DashCore中,一般进行4次的PrivateSend,最高可以进行16轮。如果用户进行16轮PrivateSend,能猜对同一个用户输入和输出的全部对应关系的概率为:

( 1 225 ) 16 2.32 × 1 0 38 {(\frac{1}{225})}^{16} \approx 2.32 \times 10^{-38}

所以平均6个输入的PrivateSend,某个用户的输入和输出对应关系被猜对的概率范围是:

[ ( 1 225 ) 4 3.90 × 1 0 10 , ( 1 225 ) 16 2.32 × 1 0 38 ] [{(\frac{1}{225})}^{4}\approx {3.90}\times 10^{-10}, \quad \quad {(\frac{1}{225}})^{16}\approx 2.32 \times 10^{-38}]

需要说明的是,PrivateSend的过程需要Dash中MasterNode的参与,每个钱包参与PrivateSend时,都会选择一个特定的MasterNode,MasterNode对PrivateSend中撮合不同用户的输入和输出,因此MasterNode作为第三方,却可以掌握输入和输出之间的对应关系,如果有人能够控制MasterNode并且监控MasterNode的混合信息,那么用户的隐私将会收到极大的威胁。目前MasterNode都运行在云服务提供商的服务器上,每个云服务上运行节点数目详情可以参考如下链接。

由于所有的输入和输出都需要经过MasterNode之手,虽然Dash白皮书上对其进行了分析,认为MasterNode数量巨大(目前大概有4000+MasterNode),每个区块之后都会随机选择新的MasterNode进行PrivateSend,有效的降低了信息泄露的风险,但是这仍然不能掩盖PrivateSend的输入和输出对应关系会被MasterNode掌握的事实。

Dash的匿名性分析

  • Unlinkability:对于不可关联性来说,Dash中每次进行PrivateSend时,默认情况下,每次的输出都会采用新的地址,因此,对于任意的两个PrivateSend交易,由于没有其他地址方面的信息,确实无法证明两笔交易中的某些输出隶属于同一个实体。
  • UnTraceabiltiy:对于不可追踪性来说,Dash的PrivateSend中,除去交易参与方之外,只有MasterNode知道输入和输出的对应关系,此外其他的第三方难以知晓这种交易中输入和输出对应关系。
  • Convencience:对于便利性来说,Dash的PrivateSend中,只有DashCore对PrivateSend的支持性比较好,而DashCore时一个全节点,目前Dash的节点信息大约12G左右,移动用户使用起来不太方便。Dash中每次进行PrivateSend最高上限是1000Dash,超过1000Dash时需要进行多次的PrivateSend,同时Dash的区块间隔为2.5分钟,如果要完成4轮PrivateSend,需要等待至少10分钟。

Monero

2012 年 7 月,应用层协议CryptoNote支撑的第一个去中心化货币Bytecoin问世。尽管 Bytecoin 十分有前景,但是人们也注意到发生了很多负面的事情,并且鉴于它已经产出了 80% 的币。所以,决定将 Bytecoin 分叉,新链上的币叫做 Bitmonero,最终被重新命名为 Monero(门罗),在世界语中叫做“coin”,硬币的意思。门罗由一个 7 人的开发者团队领导,其中 5 人匿名,另 2 人已公开。他们是 David Latapie 和 Riccardo Spagni aka “Fluffypony”。项目是开源众筹的形式进行。Monero是一个独立的虚拟币种,而不是比特币的分支,且它规避了比特币的设计缺陷,变得更加隐私、去中心化。

Monero中的匿名技术

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。

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转账的地址是哪里。

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} 的格式。但是公开转账金额的做法无法隐藏交易本身的信息,为了解决这个问题,Gregory Maxwell提出了RingCT,RingCT可以做到隐藏交易额,这时候Alice挑选mixins的时候,可以选择RingCT中的output作为mix-in。

下图是一个Monero上的交易,通过区块链浏览器查看一笔交易显示结果如下。其中的每个input的金额显示为0,表示input的数额已经被隐藏。

在这里插入图片描述

这笔交易中,共有6个输入,4个输出,对其中第一个输入进行展开,可以看到下图的结果,其中第一个input中包含11个public key,但是其中只有1个是真正的input,其他input是decoy input。

在这里插入图片描述
对于第三方来说,难以辨别真正的input是到底是哪一个,decoy input数量越多,发现真正的input就越难。对于接收方而言,接收方的地址是发送方随机产生的地址,外部用户即使知道接收方的public view key 和public spend key,也无法知道其他人转给接收方的交易是哪一笔。

Monero的匿名性分析

  • Unlinkability:对于不可关联性来说,Monero中采用的Ring Signature可以很好的隐藏发送方的隐私,Ring Signature中的input越多,隐藏能力越好。对于一笔交易,每次都会产生一个新的接收地址,只有接收方和发送方知道接收地址,外部用户无法知道金额发送哪里。
  • UnTraceabiltiy:对于不可追踪性来说,Monero中可以同时保护发送方的隐私,接收方的隐私,同时也隐藏了交易数额,追踪某个人的交易记录变得几乎不可能。
  • Convencience:Monero的发送和接收,没有对钱包本身有过多的需求,另外发送的数额没有过多限制。

ZCash

Zcash的代码是基于比特币0.11.2代码修改,于2016年10月28日上线,其总供应量是2100万。区块奖励方式如下:

  • 前20000个块,第一个区块的奖励是0.000625币,随着高度线性递增,每增加1个区块,出块奖励提高0.000625 ZEC。
  • 从第20000个区块开始,奖励变为12.5,奖励按照每840000个区块减半,Zcash出块时间为2.5分钟,算下来大概是每4年减半。

Zcash中规定,前4年挖矿中的25%交给创世团队,因此到2020年10月28日为止,创始人团队都会收到出块奖励的25%。Zcash的良好隐蔽性源于使用了一个被称为 zk-SNARK算法 的零知识证明密码学架构,该架构是由经验丰富的密码学家团队开发的。这个框架允许网络在不公开交易参与方或者交易数额的情况下维护一个安全的账户余额账本。Zcash 交易的元数据是加密的,而不是公开地展示交易参与方和交易数额,zk-SNARK算法 被用来证明没有人进行欺骗或者偷窃。

ZCash中的匿名技术

ZCash的核心技术是零知识证明,零知识证明可以证明一个交易的合法性却又不需要暴露交易的金额以及交易参与方的信息。

ZCash提供两种地址,一种叫做transparent address,简称t-address,这种地址以t开头. 另外一种地址叫做shielded address。两种地址类型,于是便有了4中转账方式:z->t, z->z, t->z, t->t,其中z->z的转账匿名性,这种类型转账称之为Private transactions,从z-toz交易中只能得知交易费,但交易地址、地址数量以及交易的ZEC数目都是未知的。

下图是一个典型的z->z的转账,右下角蓝色方块内文字表示确认数目,黄色方块内文字表示交易费,红色方块内文字表示交易数额。JoinSplits中的内容完成零知识证明。除了参与交易的双方外,外界无法得知交易地址和转账费用等信息。

在这里插入图片描述

ZCash的匿名性分析

  • Unlinkability:对于不可关联性来说,ZCash中的z地址之间的转账,地址完全不可见,因此很好的实现了不可关联性。
  • UnTraceabiltiy:对于不可追踪性来说,与Monero相同,ZCash中的z地址之间的交易可以同时保护发送方的隐私,接收方的隐私,同时也隐藏了交易数额,这也追踪某个人的交易记录变得几乎不可能。
  • Convencience:目前的ZCash钱包,如果需要实现Z地址之间的转账,需要使用桌面电脑才能完成,其他的钱包只能完成t地址和t地址以及t地址和z地址之间的转账,这使得其便利性大打折扣,此外,涉及到z地址的转账,都需要用到零知识证明,需要更多的计算时间。

总结

Dash币中的PrivateSend有助于用户混淆自己的地址,但不能做到隐匿交易双方地址以及交易金额,使得第三方难以对交易记录进行追踪,同时也难以关联交易。但是由于在PrivateSend的过程中会有MasterNode的参与,MasterNode知道PrivateSend交易中的input和output的对应关系,同时MasterNode大部分都运行在云服务提供商的服务器上,如果MasterNode被控制,那么用户的交易隐私会暴露,在便利性方面,PrivateSend只能在DashCore桌面版本上使用,同时PrivateSend混币过程中需要其他用户的参与,需要的等待时间较长,此外,除了官方桌面版DashCore钱包外,其他钱包无法支持PrivateSend。

Monero中通过Stealth address的使用,使得第三方难以发现接收方的地址,保护了接收方的隐私,而使用Ring Signature则保护了发送方的隐私,第三方难以发现真正的发送方地址,但是Monero中不能隐藏发送方和接收方的地址。后续采用的Ring Confidential Transactions 可以隐藏交易金额,使得匿名性更强。Monero的便利性方面,在其钱包的使用情况上便利性上不存在这些问题,其便利性较好。但是Monero并非无懈可击,如果有人在Monero区块链中发布大量的小额交易,随后这些交易被用来当做decoy input时,那么就有可能追踪到其他人交易中的真正的input,引发瀑布效应,从而追踪到更多的交易信息。

ZCash中使用零知识证明,z地址之间的转账,可以直接隐藏发送方和接收方的地址,相比于Dash和Monero,具有更高的匿名性,在便利性方面,ZCash和Dash面临着同样的问题,两种币涉及到Z地址的转账,都需要桌面版ZecWallet的官方客户端的支持,便利性上两者都不如Monero。

猜你喜欢

转载自blog.csdn.net/t46414704152abc/article/details/93039769
今日推荐