作者:CoinKite Team
来源:https://coldcard.com/learn/transaction-security/bitcoin-address-reuse
比特币是 假名的,不是匿名的。每一笔交易都会永久记录在分布式的公开账本上,并且每个地址都对所有人可见。每个地址都只使用一次,是比特币持有者可以采取的最简单、最有效的隐私性习惯。
什么是“地址复用”?
“地址复用” 意味着用同一个地址多次收款。层级式确定性(HD)钱包实现默认为每一次收款生成一个新地址,但是,如果用户自己执意把一个地址当成固定地址、在多次请求支付时分享同一个地址、或将一个地址用作捐赠地址,就会造成地址重复使用。
一个比特币地址是一段人眼可读的编码,从一个带有公钥的脚本通过单向哈希函数推导出来。每个地址都对应着一个具体的脚本,因此对应着具体的公钥(及其背后的私钥),私钥则能花费锁定在这个地址中的资金。《什么是比特币地址》一文详细讲解了地址的派生过程。
HD 钱包可以从主要的种子 —— 根据 BIP32 和 BIP44 派生标准 —— 派生出无限数量的子地址。每次你向钱包软件要求一个收款地址时,它都会显示序列中下一个尚未使用的地址。从任何一个地址花费都不会泄露其它地址。因此,在正常的钱包用法中,是不会出现意外的地址复用的。
尽管有 HD 钱包标准,还是有可能出现地址复用,但其情形是可以预测的:
- 公开一个固定的地址用于收取捐赠,这样每个捐赠者都会将资金发送到同一个地址
- 在请求支付时多次分享同一个地址(这会导致这些支付被联系起来,因为支付的交易都记录在区块链上,它们都有相同的收款地址)
- 手动从以往的交易复制地址,绕过了 HD 钱包的默认用法
不管是哪一种情形,都会让多笔交易永久跟一个地址联系起来。
为什么地址复用会伤害隐私性呢?
比特币的分布式公开账本会让每一笔交易都对所有观察者可见。假名隐私性只有在这些地址无法关联到你的真实世界身份时才成立,地址复用就会直接打破这一点,因为它在多笔交易之间产生了可以证明的、永久的关联。
关键在于推断和确定性是有区别的:
- 常见的 “CIOH(一笔交易的所有输入都来自同一个人)” 是一种 推断 。当一笔交易出现多个输入时,区块链分析工具会假设这些输入都由同一个实体控制。这个假设常常是对的,但并不能保证。
- 地址复用则是 确定性 的。两笔交易发送到了同一个地址,这两个地址必定由同一个(一些)私钥控制,没有模糊之处,也无可反驳。
区块链的公开记录,意味着任何观察者都可以看到支付数额、交易频率、收款数额总和,以及每一笔相关联的交易的所有地址。只要相互关联的交易中有任何一笔跟真实世界的身份联系起来,不论是因为 KYC 交易所取款、公开的论坛帖子、一个网购记录还是一个 IP 地址,就使得这些相关的交易全都去匿名化了。
这样的关联一旦出现在链上,就无法再取消,而且分析工具可能在未来(而不是现在)去匿名化这些历史交易。当一个地址跟你的身份关联起来时,几年前发送的交易也会成为暴露的记录。
区块链分析如何利用地址复用?
区块链分析公司将地址复用当成一种可信度最高的地址集群分类法。与 CIOH 不同(需要推断),地址复用提供了直接的密码学匹配。包括 Chainalysis、Elliptic 和 TRM Labs 在内的公司都提供了基于地址集群的分析,服务于交易所、执法部门和金融机构。
这些工具会建立地址关系图谱,并且肯定地到将复用的地址划分到一个集群中。发送到复用地址的每一笔新交易都会自动扩大这个集群,不需要额外的分析。
“锚点事件” 指的是让一个集群曝光的事情。一旦一个集群中有一个地址关联到了一个真实世界的身份,那么整个集群都消除匿名了。锚点事件可能是从一个需要 KYC 的交易所取款、一次网购(买家公开了支付记录)、一个论坛帖子,甚至一个从司法程序中曝光的 IP 地址日志。一个集群的交易历史越长,锚点事件带来的信息泄露就越大。
一个接收了几百笔支付的捐赠地址会产生一个将所有捐赠的历史关联到一个人的集群。每个捐赠者的支付数额和时机,都对所有寻找锚点事件的观察者可见。
CIOH 启发式分析是在论文《A Fistful of Bitcoins》(Meiklejohn 等人, 2013) 中明确表述的,它成了当代的区块链分析的基础。地址复用是这种聚类方法的更强形式,它能产生确定性的关联,而 CIOH 只能产生概率性的推测。
如何避免地址复用?
避免地址复用需要保持良好的习惯,并意识到固定地址会带来问题的情形。虽然现在的 HD 钱包软件自动处理了许多事情,但风险依然在一些角落存在,用户可能会绕过钱包的默认用法。
总是使用钱包软件的收款功能:不要从以往的交易复制地址然后使用,哪怕这感觉上很方便。在 Sparrow Wallet 软件中,“Receive(收款)” 栏总是会显示一个新的未使用的地址,每次打开都会。如果你想确认一个收款地址的正常功能,你可以生成一个新地址,先打进一小笔资金,然后再向同一个地址打进全部资金。在这里牺牲隐私性是可以接受的,因为这个关联是你有意为之,而其安全性受益是你确定这个地址可用,盖过了隐私性牺牲。
避免公开一个固定地址:如果你发布一个比特币地址在网站、社交媒体资料或论坛中,那每一笔发送到这个地址的支付都会扩大这个地址集群。如果你需要一个固定不变的公开标识符,请考虑使用 BIP47 可复用支付码。BIP47 标准让每个支付者都能从一个静态的标识符派生出一个新的子地址,从而每个支付方都会把资金发送到不同地址,而你的公开记录无需改变。Sparrow Wallet 支持 BIP47。
(译者注:现如今,可以考虑使用 BIP 352 静默支付,拥有类似的特性,但信息暴露更少。)
为每一次请求支付生成一个新的地址:在商家或循环支付的场景中,对多个顾客(或在多次支付中)出示相同的收款地址会导致这些支付可以明确关联起来。每次请求支付都用钱包生成一个新地址,就能避免这种关联,而且也不花什么力气。
验证你的找零地址的动作:HD 钱包软件会自动将交易的找零发送到未使用的钱包内部地址(遵循 BIP44 内部派生路径)。确认你的钱包(协调器)软件会自动是由新的找零地址、不会让找零返回你的花费地址。Sparrow 的默认设置就会正确处理。
检查你的钱包软件的空地址限额设置:一些协调器,在设置时如不注意,会给出重复的地址,而不是根据派生序列不断推进。在建立钱包之后,就确认你的软件每次都会出示新地址。
《比特币 UTXO 管理》一文介绍了在支付时如何合并多笔资金的互补性实践。
(完)