打字猴:1.703866945e+09
1703866945
1703866946 图6.1 维基解密的捐款页面的一个片段
1703866947
1703866948 注:请注意那个在比特币地址旁边的刷新按钮。维基解密遵循了为每一笔捐款生成一个新接收地址的比特币匿名化的最佳实践。
1703866949
1703866950 你可能觉得这些不同的地址一定是无法关联的,维基解密收到的不同的捐款是完全分开的,并且推测它们可以分开使用每一笔捐款,但事实并非如此。
1703866951
1703866952 关联性(linking)
1703866953
1703866954 假设爱丽丝想要去买一个茶壶,价格是8个比特币(可能根据2015年的比特币价格,实际情况应该是8分比特币,1个=100分)。进一步假设,她的比特币分在三个不同的地址里面,分别有3、5和6个比特币。实际上,爱丽丝没有一个比特币地址有足够的8个比特币,她必须要把两个输出合并成一个单体输入,以支付给店铺。
1703866955
1703866956
1703866957 隐形地址
1703866958
1703866959 假设鲍勃要通过他的网站还有广告牌来宣传他的捐赠地址。现在还没有任何方式可以将一个不同的地址显示给每个用户,必然地,接收现场捐款的这个地址会很容易连接到鲍勃的站点。
1703866960
1703866961 能够利索地解决这个问题的办法,是利用隐形地址(stealth addresses)。它允许收件人鲍勃发布一个静态“永久”的地址,任何发件人(比如爱丽丝)由此可以派生出新的地址,该地址的私钥只有鲍勃知道。
1703866962
1703866963 这是如何做到的呢?回忆一下椭圆曲线数字签名算法(ECDSA)中的公钥的函数形式是gx,其中的x是私钥,地址函数是H(gx)。为了启用隐形地址,鲍勃需要广告公钥本身,而不是长度更短的哈希值。然后,爱丽丝可以选取一个随机数值r, 计算 (gx)r=gxr,并且将钱汇给这个公钥。如果爱丽丝能够单独将数值r发送给鲍勃,鲍勃就可以计算出正确的私钥xr,将汇到公钥gxr的钱花掉。
1703866964
1703866965 这种方法并不完美,因为爱丽丝需要将数值r发送给鲍勃,而且还假定即使鲍勃不在线,比特币交易照样运行。为了解决这个问题,还有更复杂的协议,让爱丽丝能够有效地将数值r嵌入比特币交易本身。随后,鲍勃可以扫描区块链,检测针对他的交易,并恢复私钥。黑暗钱包中使用了这种方法,该钱包设计时旨在增强隐私,并且类似的想法在加密签名(CryptoNote)这种另类币中有所使用。
1703866966
1703866967 那么问题来了,这笔交易会在区块链网络里有一个永久的记录,任何看到这个记录的人都可以推断,这两个输入型交易很有可能是由同一个用户控制的。换句话说,共享型消费,成为不同输入地址联合控制的证据。当然也可能存在例外,有可能爱丽丝和鲍勃是同寝室的朋友,决定一起联合购买这个茶壶,并且分开付款。但是,大体来说,共同输入基本上意味着共同控制。
1703866968
1703866969
1703866970
1703866971
1703866972 图6.2 多地址输入交易
1703866973
1703866974 注:为了支付购买茶壶的钱,爱丽丝从两个不同的比特币地址创建了一个单一交易。这样爱丽丝就暴露了一个事实,即一个个体控制了两个不同的地址。
1703866975
1703866976 还不仅仅如此,攻击者可以重复上述过程,从而一步一步将这个个体所进行的所有交易关联起来。如果另外一个地址也关联到了爱丽丝用于交易的两个地址之一,那我们就知道所有三个地址都属于同一个个体,我们可以因此建立一个地址簇(clustering of addresses)。一般来说,如果一个新地址的输出,和该地址簇中的任何一个已知地址被一起花费,那么这个新的地址也将会被加到该地址簇中去。
1703866977
1703866978 在本章6.4节,我们将会探讨一种叫合币(CoinJoin)的匿名技术,该技术的工作原理打破了上述设想。但是到目前为止,对没有使用特别匿名技术的普通比特币钱包用户,这种簇技术还是非常有效的。接下来,我们很快将会讨论如何把这种地址簇关联到现实世界的身份。
1703866979
1703866980
1703866981 零钱地址(change address)的随机化
1703866982
1703866983 早期版本的比特币类库[Bitcoin-Qt library,现在又称为比特币中心(Bitcoin Core)]存在一个缺陷,对有两个输出地址的交易,它总把存放零钱的输出地址放在第一个,这意味着很容易分辨出很多交易中的零钱地址。这个缺陷在2012年得到了修复,但是重点在于:钱包软件在保护匿名性中扮演着非常重要的角色,如果你正在开发钱包软件,你需要格外注意很多陷阱,尤其是你需要保证零钱地址的位置应该永远是随机的,以避免为攻击者留下太多信息。
1703866984
1703866985 再回头看一下我们的例子。假设这个茶壶的价格从8个比特币上涨到了8.5个比特币,爱丽丝发现,未用完的支出账号里无法再组合生成恰好可以支付这个茶壶所需要的金额了。取而代之的方案是,爱丽丝利用交易可以有多重支出的特性,如图6.3所示,支出的其中之一就是茶壶店铺的接收地址,而另外一个则是爱丽丝自己的“找零”地址。
1703866986
1703866987 现在从其他人的视角来看这笔交易,他们可以推断出这两个输入地址都属于同一个用户,他们甚至可能怀疑其中一个支出地址也属于这个用户,但是无法知道具体是哪一个。事实上0.5个比特币虽然比其他的支出小,但是并不意味着这是一个零钱地址,爱丽丝可能有10 000个比特币参与了交易,其中她支付了8.5个比特币用于购买茶壶,而把剩余的9 991.5个比特币找零退回给了自己。在这样的场景中,更大的输出才是实际上的找零地址。
1703866988
1703866989
1703866990
1703866991
1703866992 图6.3 零钱地址
1703866993
1703866994 注:为了支付购买茶壶的钱,爱丽丝创建了一个交易,这个交易中的一部分比特币去了商家的钱包,而剩余的部分作为零钱退回给了她自己。
[ 上一页 ]  [ :1.703866945e+09 ]  [ 下一页 ]