FCMP++:概述
全链成员证明 + 花费授权 + 可关联性——一个和整条区块链一样大的环
FCMP++ 用两个证明取代了环签名。成员证明:“我正在花费的重随机化输出是所有输出构成的树中的一个叶子”(Curve Trees + Generalized Bulletproofs)。SA+L(花费授权 + 可关联性):“我知道这个输出的私钥,这是它的 key image”(一个广义 Schnorr 协议)。匿名集是区块链上的每一个输出。
本页是概述。之后循序渐进:输入重随机化 → SA+L → Curve Trees → Generalized Bulletproofs 与除子 → Carrot → 迁移。
逐字拆解这个名字
- FCMP——Full-Chain Membership Proof(全链成员证明):证明某个输入是链上所有输出之一。很多人都有过这个想法;Curve Trees 构造(Campanelli、Hall-Andersen、Kamp,2022 年)让它变得切实可行。
- ++——门罗币特有的补充:花费授权与可关联性证明(SA+L),旨在提供前向保密,并为新功能留出空间。这一构造的作者是 Luke Parker(kayabaNerve);项目通过 CCS 由社区资助。
核心问题:不能展示是哪个叶子
如果我们只是证明“我的输出 O 在树中”,就得展示 O——那样一切都暴露了。我们需要证明的是某个与 O 绑定、却与随机数无法区分的东西属于这棵树。为此,FCMP++ 对输入进行重随机化。
树中的一个输出
树中的每个输出都是一个三元组:
一个交易输入
交易不再引用某个输出,而是公布这个三元组用随机数 r 重随机化后的版本:
每个新点看起来都是随机的。外人无法判断它来自哪个输出。
证明 1:成员证明
所有度过 10 个区块锁定期的输出都被加入一棵大树——Curve Tree。每个节点都会计算树根。交易引用一个树根(某个最近区块时的树状态),并以零知识的方式证明:
- 存在一个叶子
(O, I, C),以及一条从它到根的路径; - 公布的
(Õ, Ĩ, R, C̃)是它的有效重随机化。
该证明使用 Generalized Bulletproofs——Bulletproofs 的推广版本,用于证明基于向量承诺的任意算术电路。证明大小随输出数量按对数增长(更准确地说,随树的深度增长,而深度非常小:每一层都分出几十个子节点)。详见 Generalized Bulletproofs 与除子。
证明 2:SA+L
在 FCMP++ 中,输出的一次性公钥形如
花费授权 + 可关联性(Spend Authorization + Linkability)证明:
- 签名者知道满足
Õ = x·G + (y + r_o)·T的x和y——即花费的权利; - 公布的 key image 为
L = x·I,其中I是借助R从Ĩ中“解开”的——即可关联性(没有双花)。
这是一个广义 Schnorr 协议——与普通签名(s = α − c·x)思路相同,只是同时针对多个秘密和多个方程。key image 的形式与 RingCT 中相同,都是 x·Hp(O),因此旧的 key image 依然能防止双花。详见 SA+L。
为什么要 y·T:前向保密
假设 20 年后量子计算机能够求解离散对数。对 RingCT 而言,这将是一场隐私灾难:给定一个 key image I = x·Hp(P),就能检验它属于哪个输出,从而揭开所有旧的环。
在 FCMP++ 中,公钥 O 在一个独立的生成元 T 上还有第二个秘密 y。即使找出了所有对数,对手看到的也是 L 与任何输出都是一致的:对每个候选输出,都存在一对匹配的 (x, y)。因此花费历史仍然是隐藏的(只要对手不知道接收方的地址)。量子对手仍然可以伪造新的交易——这需要将来另做一次升级来解决。
重要的说明:这只对 y ≠ 0 的输出有效,也就是按新规则创建的输出。旧的 RingCT 输出的 y = 0,对于它们,量子对手可以把 x 求出为 O 的对数,从而检验 L = x·Hp(O)。旧币能获得很大的匿名集,但得不到抗量子的前向保密。
承诺与收支平衡——保持不变
伪输出 C̃ = C + r_c·G 的作用与 RingCT 中相同:收支平衡 Σ C̃ = Σ C_out + fee·H,输出金额由 Bulletproofs+ 保证。一次性地址和金额加密则通过 Carrot 实现(与旧地址兼容)。
与 RingCT 对比
| RingCT(CLSAG) | FCMP++ | |
|---|---|---|
| 匿名集 | 16 | 树中的所有输出(数亿个) |
| 诱饵选择 | 需要,是泄露的来源之一 | 不需要 |
| 交易中的输出引用 | 每个输入 16 个索引 | 树根(通过一个区块引用) |
| 输入大小 | 约 0.7 KB | 更大,约为几 KB 量级 |
| 验证 | 快 | 开销明显更高,但适合批量验证 |
| 抗量子前向保密 | 否 | 是(针对新输出的花费) |
| 密码学假设 | Ed25519 上的离散对数 | Ed25519 + Helios/Selene 上的离散对数 |
| 新功能 | —— | 支出查看密钥、更简单的多重签名、为交易链式构建打下基础 |
确切的大小和验证时间取决于最终参数;当前的数字公布在开发和审计报告中。
优点与缺点
+
- 消除了 RingCT 弱点清单上几乎所有的攻击。
- 针对量子对手的前向保密。
- 无需可信设置。
- 向后兼容:旧输出、地址和助记词照常可用。
- 为新的钱包功能开辟了道路。
−
- 交易更大、开销更高 → 手续费和节点负载更高。
- 大量新的密码学:Curve Trees、Generalized Bulletproofs、除子、新的曲线。每一部分都可能藏有漏洞;需要认真审查。
- 对硬件钱包和性能较弱的设备负担更重。
- 元数据(输入/输出数量、时间、手续费)仍然可见。