技术 › FCMP++

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++ 对输入进行重随机化。

树中的一个输出

树中的每个输出都是一个三元组:

( O, I, C )    其中   I = Hp(O) O —— 输出的一次性公钥,I —— “key image 生成元”,C —— 金额承诺

一个交易输入

交易不再引用某个输出,而是公布这个三元组用随机数 r 重随机化后的版本:

Õ = O + r_o·T    Ĩ = I + r_i·U    R = r_i·V + r_r·T    C̃ = C + r_c·G T、U、V —— 对数未知的额外生成元

每个新点看起来都是随机的。外人无法判断它来自哪个输出。

输出 (O, I, C) 链上几乎所有 输出之一 + r 输入 (Õ, Ĩ, R, C̃) 经过重随机化, 公布在交易中 成员证明 “这是根为 ρ 的 树中某个叶子的 重随机化” SA+L “我知道 Õ 的 x, y, 且 key image L = x·I”

证明 1:成员证明

所有度过 10 个区块锁定期的输出都被加入一棵大树——Curve Tree。每个节点都会计算树根。交易引用一个树根(某个最近区块时的树状态),并以零知识的方式证明:

  • 存在一个叶子 (O, I, C),以及一条从它到根的路径;
  • 公布的 (Õ, Ĩ, R, C̃) 是它的有效重随机化。

该证明使用 Generalized Bulletproofs——Bulletproofs 的推广版本,用于证明基于向量承诺的任意算术电路。证明大小随输出数量按对数增长(更准确地说,随树的深度增长,而深度非常小:每一层都分出几十个子节点)。详见 Generalized Bulletproofs 与除子。

证明 2:SA+L

在 FCMP++ 中,输出的一次性公钥形如

O = x·G + y·T 对于所有旧的(RingCT)输出,y = 0

花费授权 + 可关联性(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、除子、新的曲线。每一部分都可能藏有漏洞;需要认真审查。
  • 对硬件钱包和性能较弱的设备负担更重。
  • 元数据(输入/输出数量、时间、手续费)仍然可见。