技术 › 谁发送的?

诱饵选择

环中 15 个他人的输出从何而来——以及为什么这比看上去更难

简而言之

钱包从区块链上所有输出中挑选 15 个诱饵,使它们的“年龄”分布与真实花费的年龄分布一致:较新的多,较旧的少。它对年龄的对数使用伽马分布。如果诱饵的分布与人们的实际行为不同,真实输入就会在统计上暴露出来。

为什么不能简单地用“随机输出”

假设诱饵是从整条区块链中均匀挑选的。那么一个典型的诱饵会有好几年的历史。但人们通常花的是最近收到的钱:几天或几周之内的。在一个 16 成员的环里,一个新输出加 15 个旧输出——猜猜哪个是真的。

早期的门罗币正是如此:2017 年的一项研究(Miller、Möser 等人,"An Empirical Analysis of Traceability in the Monero Blockchain")表明,对于那个时期的环,“最新的输入就是真实输入”这一启发式方法在大多数情况下都是对的。

伽马分布

自 2018 年起,钱包按如下方式选取诱饵的年龄:

x ~ Gamma(shape = 19.28, scale = 1/1.61)    age = eˣ seconds 参数根据比特币中花费行为的经验分布拟合得出(Möser 等人)

然后把年龄换算成区块高度(假设出块时间为 2 分钟),并从该区块中随机挑选一个输出。另外还有几条规则:

  • 不使用不足 10 个区块的输出(它们本身也还不能被花费——这是锁定规则);
  • 选择时考虑每个区块中的输出数量(否则“空”区块中的输出会被过于频繁地选中);
  • 丢弃重复的和已经选中的输出。
真实花费的年龄(模型)与所选诱饵的年龄对比。如果两条曲线吻合,真实输入就不会因年龄而暴露。

可能出现的问题

实现缺陷

2021 年,wallet2 的诱饵选择中发现了一个缺陷:对某些输出而言,选中较新诱饵的概率过低,因此花费非常新的输出的交易会显得很突出。缺陷已修复,但修复之前的交易会带着这个特征永远留在区块链上。使用自研诱饵选择算法的第三方钱包也多次被发现“可识别”。

行为与模型不符

该模型是基于 2017 年的比特币数据拟合的。真实的门罗币用户行为有所不同,差异越大,年龄泄露的信息就越多。已有人提出改进方案(例如用门罗币自身的数据拟合分布),而有了 FCMP++,这个问题将从根本上消失。

泛洪攻击

如果有人创建大量自己的输出(2021 年和 2024 年都观察到过此类事件),这些输出就会大量出现在别人的环中。攻击者知道自己的输出不是真实输入,于是可以把它们在心里划掉,从而缩小有效的环大小。

要点

诱饵选择不是密码学,而是统计学。环签名的密码学保证签名本身不会泄露真实输入。但对于从环成员本身的选择中能推断出的信息,它无能为力。在 FCMP++ 中,“环”就是所有输出,根本无需选择。