RingCT 的弱点
门罗币如今的隐私在哪些方面还不完美——而这正是 FCMP++ 要解决的
在 RingCT 中,金额和接收方受到密码学的保护。而发送方只受统计学保护:“16 选 1”。几乎所有已知的攻击都遵循同一思路:从环中排除诱饵,或按概率权衡各个候选。下面按从最广为人知到最隐蔽的顺序介绍主要的几种。
模型:有效环大小
只有当 16 个成员都同样可信时,一个 16 成员的环才真正提供 16 种可能。任何一点外部信息都会减小有效环大小。如果观察者能划掉 10 个诱饵,就只剩“6 选 1”。如果还能对剩下的进行权衡——就成了“很可能是这个”。
1. 连锁反应(历史问题)
2016 年之前,允许不带诱饵的交易(环大小为 1)。这样的输入会准确暴露被花费的是哪个输出。而如果这个输出曾在别人的环中被用作诱饵,就可以在那里把它划掉。这可能使另一个环变得确定无疑,如此往复——形成连锁反应。2017 年的研究表明,很大一部分早期输入就是这样被去匿名化的。
现状:通过禁止无诱饵的环并转向 RingCT(RingCT 输出只与 RingCT 输出混合)已经解决。但旧输出仍记得它们的历史。
2. 输入年龄
如果诱饵的年龄分布与人们真实的花费习惯不符,真实输入就会显得突出。经典的“最新的就是真的”启发式方法在早期交易上非常有效。详见诱饵选择。
现状:通过伽马分布得到缓解,但只要还需要选择诱饵,就无法彻底解决。
3. EAE 攻击(Eve–Alice–Eve)
Eve(比如某个交易所)向 Alice 付款,之后 Alice 又把钱发回给 Eve(同一个交易所,可能经过几笔中间交易)。Eve 知道链条起点处自己的输出,也知道终点处自己的输出。如果她在中间交易的环中看到了“自己的”输出,而且时间上说得通,她就能以很高的概率把发送和接收关联起来。
现状:对中心化服务而言,这是最实用的攻击之一。可以通过自我转账(churning,间隔一段时间转给自己)来缓解,但只有 FCMP++ 才能可靠地解决。
4. 泛洪攻击(黑弹珠)
攻击者大量制造包含自己输出的交易。按照诱饵选择规则,这些输出开始出现在其他用户的环中。攻击者知道它们是“空的”,于是把它们划掉。在某段时间内,他的输出所占比例越大,其他所有人的有效环就越小。2021 年和 2024 年都出现过此类垃圾交易事件;估算显示,在此期间有效环大小明显下降。
现状:受到成本(手续费)和动态区块大小的限制。FCMP++ 将彻底消除它:当“环”是整条区块链时,攻击者所占的比例微不足道。
5. 输入合并
如果一笔交易花费 5 个输入,那就是 5 个环,而且已知这五个环的真实成员都属于同一个人。如果观察者发现这些环中包含来自同一笔过去交易的输出,这就是一个强烈的信号,说明它们是真实输入(随机选择诱饵不太可能产生这样的巧合)。
现状:这是环固有的问题。FCMP++ 会大大削弱它(每个输入都是“全体中的一个”),但输入的数量仍然可见。
6. 交易元数据
- 输入和输出的数量:1→2 很常见,15→1 就很显眼(合并零钱)。
- 手续费:非标准的手续费会暴露非标准的钱包。
- 时间:收到资金后立即发出的交易会暴露真实输入的年龄。
- tx_extra:非标准字段、排列顺序、附加公钥——都是“钱包指纹”。
- 解锁时间:非标准的取值曾经很显眼(在较新的规则中已移除)。
现状:FCMP++ 几乎不涉及这一点——这是钱包的职责:统一的行为,统一的格式。
7. 网络层
第一个转发某笔交易的节点很可能就是它的发起者。门罗币使用 Dandelion++:交易先悄悄地沿着一串随机节点传递(“茎”阶段),之后才广播给所有节点(“绒毛”阶段)。此外还支持 Tor/I2P。如果你使用别人的远程节点,它能看到你的 IP 和发送时间。
现状:这在链外,FCMP++ 帮不上忙。请使用自己的节点或 Tor。
总结:FCMP++ 解决了什么
| 弱点 | RingCT | FCMP++ |
|---|---|---|
| 连锁反应 | 历史问题 | 不适用 |
| 诱饵年龄 | 已缓解 | 已消除 |
| EAE | 有效 | 已消除(链上) |
| 泛洪攻击 | 有效 | 实际上已消除 |
| 输入合并 | 有效 | 大大削弱 |
| 元数据(输入/输出数量、手续费、时间) | 可见 | 可见 |
| 网络(IP) | Dandelion++/Tor | 不变 |
下一篇:FCMP++ 是如何运作的。