BTC 的匿名性

常见误区: BTC 的匿名性很好，能够保护隐私.

BTC 在一定程度上确实是匿名的.
因为在链上账本中，你没有用自己的名字，而是用「化名」替代了.
这个「化名」值得就是一串难以记忆的哈希地址.

但我们要知道我们追求的匿名性究竟是为了什么.
实际上，匿名是为了保护「隐私」. 让别人不知道这个名字下面对应的是谁.
BTC 的地址就像是上网的时候，我们可以开很多个账户，用很多个网名.
这里的网名在 BTC 中就是一个一个地址.
在很多钱包应用中，也会根据 BTC 白皮书中的推荐，每笔交易用的都是不同的地址.
这样，所有的钱都在不同的地址中，看起来像是匿名了.
但这样的匿名，真的保护了自己的隐私吗？

纸币，黄金之类的实体货币，实际上是最保护隐私，最匿名的.
纸币上印的，是面值，或者编号之类的，但上面不可能印上和你有关的信息.
假设你拿着 100 元面值的 RMB, 你把这张纸币交易出去之后，后面转了很多手.
最终持有纸币的人，几乎没法从纸币上找到你曾经持有过这种纸币的证据.

银行如果可以使用化名注册账号，实际上也比 BTC 要更保护隐私.
因为你所有的交易记录都没有被公开，你用一个化名的账户，不论怎么存怎么取，只有银行会知道.
而银行又只持有你的化名信息，只要我请一个人用化名注册一个银行账户，银行是不可能知道这个账户是我在用，它知道的只有我的化名信息.
当然，现实中银行是不可能让你用化名注册的，基本都是实名注册。不存在所谓隐私了.

为什么 BTC 反而比前两种的「隐私保护」能力要更弱呢？
白皮书中有提到过一种保护自身安全的方式，就是每次交易都用不一样的地址，防止被追踪.
现代的钱包，其实都自带的这样的功能，所有的钱实际上都打散到了不一样的地址.
但 BTC 的一大特性，就是账本是完全公开的，所有人都知道.
在账本上纪律的每一次交易，都在泄漏地址和地址之间的联系，暴露你在链上发生的所有交易.

例如，现在有一笔交易，是将 8 个 BTC 转给你的朋友 B.
你的账户有 6 和 4 的 UTXO 单子，分别放在不同的地址上.
这个交易单子就会构成这样:
inputs: addr1(6), addr2(4)
outputs: addr3(8), addr4(2)

我很容易就能推测出来，addr1 和 addr2 是同一个人持有的地址.
因为为了构造交易，发起交易的人必须要持有私钥搞出签名.
发起交易的人都知道私钥了，这个证据多半已经能证明地址是同一个人在持有了.

通过输出，也很容易判定 addr4 跟 addr1 和 addr2 是同一个人的地址.
因为要找零，如果 addr3 是找零的地址，完全没有必要用到两张 utxo, 只用一张就好了.
我可以马上推测出来，addr4 和 addr1, addr2 大概率是同一个人持有的地址.

所以不难看出，通过多地址分开存放 BTC, 希望通过多地址达到匿名的效果是不好的.
很容易通过分析交易的 UTXO, 分析出地址之间的关联，得出这些地址是不是都是同一个人在控制的结论.

在这个基础上，账本又是公开的.
假设我是一个线上的商家，你找我买东西，并打算用 BTC 支付.
你支付给我钱之后，你必须告诉我交易的哈希在哪，我去验证交易是否真的被节点 confirmed 了.
这个时候，我马上就知道你用了那些 inputs, 哪些 outputs.
我把矿工的地址，我自己的地址排除掉，剩下的地址多半都和你相关.
我再把所有跟这些地址相关的交易全部找出来，把关联的地址全部揪出来，我马上就知道，你跟谁交易了，每笔交易是交易了多少钱，现在你的账户还剩多少钱.
你发现了吗，你的隐私一览无余，我什么都能知道，只要你跟链上的地址发生任何一笔交易.
「公开的账本」非但不能保护隐私，还会让你跟裸奔一样，所有信息都对外公开，一览无余.

这种线上的交易系统，如果不跟现实世界发生交互还好。你可以永远用哈希地址代表自己，即使知道所有的账本，也不知道是你在持有，你在操作.
但如果一旦跟现实世界发生了交互，地址和现实世界的人很容易就产生关联.

比如你在一家星巴克使用 BTC 支付，买了一杯冰美式。我在后面排队.
我知道你点了一杯冰美式，花了大约多少钱，并且花钱的时间点，因为我就在你后面.
接着我也买一杯咖啡，也用 BTC 支付，就能得知星巴克的哈希地址.(或者别的办法也行，总之商家的哈希地址很容易就能获取).
接着，我仅仅需要根据价格和时间，筛选出最有可能是你发生交易的交易单，就能反推出几个可能的哈希地址.
后续只要多确认一次到两次你的消费，你现实中的人马上就能跟 BTC 的哈希地址联系上.

实际上所有的线上交易系统都有这样的通病。只要你跟现实世界发生交互，想将你跟账户联系起来，很容易.
即使是可以化名注册的银行也一样.
只不过 BTC 直接让所有人都能知道你的消费记录，而银行就银行知道.
也就看银行会不会泄露信息了.

如何保护隐私

在网络层上做匿名.
BTC 是运行在「网络层」上的「应用层」, 通过 p2p 连接节点.
既然想匿名保护隐私，那么至少从网络层的匿名做起.
ip 是最容易泄露个人信息的东西。通过 ip 定位你人在哪是很简单的.
所以如果真的需要匿名，在「网络层」上就要做好匿名。比如多路转发，用洋葱浏览器之类的.

在应用层上做匿名
coin mixing. 所有人的钱混在一起，inputs 和 outputs 全部打乱.
这样就很难将地址跟你联系起来.
这当然需要一个中心化的服务提供商来专门做这个事，把需要这项服务的人的钱全部放一次搞.
但因为这种服务提供商本身他自己也需要是匿名的。隐患就是如果它干到一半中途圈钱跑路，你一点办法都没有.
交易所也能做到一定的 coin mixing 的作用，因为所有的钱都混在一起了.