MoneroSwapper MoneroSwapper

Monero RingCT 详解:XMR 如何隐藏每一笔金额

MoneroSwapper · · · 2 min read · 6 views

Monero RingCT 详解:XMR 如何隐藏每一笔金额

如果你曾经发送过一笔比特币交易,并在区块浏览器上眼睁睁看着精确到聪的金额向全互联网公开,那么你已经亲身体会到 RingCT 想要修复的那个设计缺陷。自 2017 年 1 月 10 日激活的第 1,220,516 号区块以来,Monero 的每一笔交易都使用了环式机密交易(Ring Confidential Transactions,简称 RingCT),这套密码学方案在隐藏交易金额的同时,依然允许全网每一个节点验证"没有凭空铸造出任何一枚 XMR"。将近十年过去,RingCT 仍然是加密货币领域被研究得最深、实战检验最充分的隐私机制之一。到了 2025–2026 年,它又一次站在了下一轮重大升级的中心位置——与 FCMP++ 以及姗姗来迟的 Seraphis 转型并肩前行。

这篇文章将带你逐步看清 RingCT 到底在做什么、它为什么必须取代最初的 Monero 交易格式、Pedersen 承诺与范围证明如何携手把"隐藏的金额"变成"可被验证的金额",以及即将到来的升级对 2026 年使用 Monero 的人意味着什么——无论你是在家里跑一个全节点、在 MoneroSwapper 上换币,还是仅仅想搞明白为什么 XMR 的交易输出在链上看起来是一串密码学乱码而不是数字。本文不假设你具备密码学背景,但也不会回避具体的技术细节;每一个名词出场时都会给出它在 Monero 协议中的实际作用,而不是停留在"反正它就是用来保护隐私的"这种空泛描述上。如果你之后想自己深入读源码,Monero 主仓库的 src/ringct 目录加上 getmonero.org 的研究实验室页面,是华语读者很容易跟进的入口。

为什么 RingCT 必须存在

在 RingCT 出现之前,Monero 已经把一笔支付暴露的三块信息中的两块藏了起来:发送方(通过环签名)和接收方(通过隐身地址)。但金额本身仍然是明文,跟比特币没什么两样。一笔 17.3 XMR 的交易,在区块浏览器上看起来就是赤裸裸的 17.3 XMR——链上分析师很快意识到,这个可见的金额就是一个极强的指纹信号。如果在你那一圈诱饵中,只有一个地址有可能发送出 13.7777 XMR 这种不寻常的输出,那么无论环签名的数学多么精巧,匿名集都会瞬间塌缩到只剩一个。

这并不是纸上谈兵。2015 年到 2016 年间,包括 Andrew Miller、Malte Möser、Kevin Lee 在内的多位研究者陆续发表了对 RingCT 之前的 Monero 的分析,指出仅靠追踪不寻常金额这一招,就能把相当一部分交易反匿名化。Monero 研究实验室(Monero Research Lab,MRL)当时已经在准备答案:由 Shen Noether 主导的构造,把 Greg Maxwell 在 Confidential Transactions 上的研究与 Monero 自身的环签名方案融合在了一起。

  • 金额泄露发送者模式:就算环签名把"哪一个输入是真的"藏了起来,环里只要出现一个独一无二的金额,匿名集就会立刻坍缩到唯一候选。
  • 面额混合机制脆弱:RingCT 之前的 Monero 强制把交易拆分成"面额"(0.1、0.01、0.001 等),以便与同样大小的输出混合,这让交易体积庞大且容易被分析。
  • 可替代性必须建立在隐藏金额之上:如果不同的 XMR 单位可以通过历史金额被打上标签,它们就不再可互换——而可互换性正是"货币"这个词的定义性属性。

RingCT 一次性把这三个问题都解决了。它隐藏了金额,让交易可以用一个任意大小的输出,也彻底废掉了笨拙的面额体系。代价当然不小——交易体积和验证时间都跳了一截——但隐私和可用性的收益被认为是值得的。后续的 Bulletproofs(2018 年)和 Bulletproofs+(2022 年)升级又把其中大部分体积成本给抢了回来。

RingCT 到底是怎么工作的

RingCT 并不是某一个单一的算法。它是三种密码学原语的组合,这三者必须协作,才能让网络在不知道金额的前提下验证一笔交易。把每一部分单独拆开看,整套方案就远没有那么神秘了。

Pedersen 承诺:把金额藏起来

Pedersen 承诺的核心思想是:你可以发布一段密码学"封印",它锁定了一个具体的数字却不透露这个数字本身,并且你还可以对这些封印做算术运算。一笔 Monero 输出金额 a 被承诺为 C = aH + xG,其中 GH 是 ed25519 椭圆曲线上两个固定的点,而 x 是只有发送方(以及之后的接收方)知道的随机致盲因子。

因为 x 每次都是随机选取的,承诺值 C 本身完全不透露 a——两笔同样是 1 XMR 的输出,在链上看起来截然不同。但 Pedersen 承诺具有"加法同态"性质:两个承诺相加,等于这两个金额之和的承诺。正是这个神奇的性质,让网络可以验证 输入 − 输出 − 手续费 = 0,却始终看不见任何一个具体的金额。发送方在构造致盲因子时,会让所有的 x 项相互抵消,只剩下承诺等式——只有当金额等式成立时它才会平衡。

这里还有一个细节常常被忽略:链上的"承诺"和接收方实际看到的"金额"并不是同一件东西。承诺只供全网验证使用;接收方真正读出金额,是通过一段"加密金额掩码"——发送方用双方共享密钥派生出一个伪随机数,把真实金额异或进去,写在交易附加数据里。接收方收到交易后,先用自己的私钥推出共享密钥,再用同样的伪随机数恢复金额,最后核对算出来的承诺是否与链上一致。这一过程让"金额"和"承诺值"在链上完全脱钩,对外部观察者来说,二者都只是不可分辨的噪声。

范围证明:堵死"负金额"攻击

隐藏金额会引入一个新的攻击面:如果发送方撒谎,把金额写成一个负数会怎么样?在有限域里,"负数"会绕回成一个巨大的正值,这意味着恶意交易可以一边让承诺等式平衡,一边凭空铸造数十亿枚 XMR。范围证明通过密码学方式证明每一个输出承诺所编码的数字都落在 [0, 2⁶⁴ − 1] 之间,却不透露具体是哪个数字,从而把这种攻击堵死。

最早的 RingCT 范围证明是对金额逐位做的 Borromean 环签名——清晰、可靠,但体积巨大。一笔典型的双输出交易在 2017 年大约要 13 KB。2018 年 10 月部署的 Bulletproofs 用 Bünz、Bootle 等人提出的内积论证,把这个体积压到了大约 2 KB,同时让批量验证快了很多。2022 年的 Bulletproofs+ 又削掉了 5%–7%,并简化了证明者实现。

CLSAG:隐藏哪个输入是真的

第三块拼图就是环签名本身。RingCT 的输出在被花费时使用一种"可链接环签名",证明"这 N 个输出里有一个是我的,并且我有权花掉它",却不透露到底是哪一个。从 2017 年到 2020 年,Monero 用的是 MLSAG(多层可链接自发匿名群签名);自 2020 年 8 月硬分叉以来改用 CLSAG,体积减少了大约 25%,验证速度提升约 10%,安全性丝毫未损。

每一个输入还会发布一个"密钥镜像"(key image)——一个从真实输出私钥派生而来的确定性密码学哈希——网络会拒绝任何复用已有密钥镜像的交易。正是这个值,在不暴露"到底是哪一个输出被花掉了"的前提下防止了双花。当前的环大小固定为 16(15 个诱饵 + 1 个真实输出),自 2022 年 9 月硬分叉以来,这个参数被刻意保持全网统一,目的就是消除匿名集大小这种指纹特征。

RingCT 与其他隐私方案的对比

另外几种币和协议也尝试解决 RingCT 想要解决的问题。它们之间的权衡差异很大,了解这些差异有助于看清 Monero 为什么做了今天这样的选择。

方案如何隐藏金额信任模型2026 年现状
Monero RingCTPedersen 承诺 + Bulletproofs+ 范围证明无需信任、无可信设置仪式活跃;自 2017 年起默认
Zcash 屏蔽池(Sapling/Orchard)对加密笔记做 zk-SNARK 证明需要可信设置(Powers of Tau 等)活跃但屏蔽池使用率不足 15%
Bitcoin Confidential Transactions仅 Pedersen 承诺(无环)无需信任仅在 Liquid 侧链;主链未启用
Mimblewimble(Grin、Beam)Pedersen 承诺 + 切穿(cut-through)无需信任活跃但生态极小
Firo Lelantus Spark多选一证明 + Pedersen 承诺无需信任活跃

在这份名单里,RingCT 最具标志性的特征就是"无需信任"——它从未需要任何多方仪式来引导启动,也不存在任何一旦泄露就能毁掉整条链的"有毒废料"。代价是单笔交易的匿名集被环大小卡住了上限,而 zk-SNARK 类方案在理论上可以把一笔交易藏在整个屏蔽池里。FCMP++ 设计的目的,正是要把这个权衡反过来。

这里还有一个常被忽略的差异:使用率。一个隐私池的"理论容量"和它的"实际匿名集"完全是两回事。Zcash 的屏蔽池总余额虽然在 2026 年仍然可观,但绝大多数 ZEC 在透明池里流转,每笔屏蔽交易的有效匿名集远比 Sapling/Orchard 的总规模小。Monero 因为强制启用 RingCT,整条链上的每一笔交易都处于"默认隐私"状态——这恰恰是社区反复强调"统一性"的底层原因:可选隐私在统计上等同于没有隐私。MoneroSwapper 之所以把无 KYC、无账户作为产品基线,而不是高级用户才能切换的"专家模式",背后是同一套逻辑。

"做 Monero 最难的部分不是密码学,而是让每一个用户都停留在同样的默认设置上,没人显得与众不同。"——Justin Ehrenhofer,前 MoneroSpace 社区负责人,谈为什么"环大小统一"比"环大小最大化"更重要。

Monero 隐私升级时间线:RingCT 是如何一路走到这里的

把 RingCT 放回 Monero 的整条演进路径上看,会更容易理解它今天的位置以及 FCMP++ 想要做的事。下面这条时间线只挑出了与"隐藏金额"和"隐藏发送方"直接相关的节点,可以作为对 2026 年读者的快速参考。

  • 2014 年 4 月:Bytecoin 代码库被分叉,Monero 主网启动,原生支持环签名(藏发送方)和隐身地址(藏接收方)。但金额仍是明文。
  • 2015–2016 年:多篇学术论文(Miller、Möser、Lee 等)指出,仅靠追踪金额就能反匿名化相当一部分早期 Monero 交易,迫使社区加速 RingCT 的部署。
  • 2017 年 1 月(区块 1,220,516):RingCT 在硬分叉中上线,Pedersen 承诺与 Borromean 范围证明组合,金额首次在链上消失。
  • 2017 年 9 月:非 RingCT 输出被强制淘汰,所有交易必须使用 RingCT;同时引入最小环大小限制。
  • 2018 年 10 月:Bulletproofs 替换 Borromean 范围证明,单笔典型交易体积从 ~13 KB 降到 ~2 KB。
  • 2020 年 8 月:CLSAG 替换 MLSAG,签名体积再减约 25%,验证速度提升约 10%。
  • 2022 年 8 月:Bulletproofs+ 上线,体积与时间成本再压一档;同月把环大小统一固定为 16,并强制使用查看密钥可见的视图标签,移除多种指纹特征。
  • 2024–2026 年:FCMP++、Seraphis 与 Jamtis 进入测试与代码审计阶段,预期在下一轮硬分叉周期联合上线,把单笔匿名集从 16 扩张到整条链的可花费输出集合。

从这条线索可以清楚地看出一个模式:Monero 的每一次升级都同时压低"体积成本"和"指纹风险"。RingCT 不是某个一锤子定音的协议设计,而是一个持续被打磨的子系统——这也是为什么把"协议层信任"建立在 Monero 而不是某个一次性宣传的"隐私功能"上,长期来看更稳妥。

当你按下"发送"时,RingCT 一步一步在做什么

把一笔交易从头到尾追一遍,是理解 RingCT 最直观的方式。下面这些步骤,描述的就是 2026 年你在 Feather、Cake Wallet、Monero GUI,或者通过 Trezor Safe 3 硬件签名时,钱包在你按下"发送"那一刻背后默默完成的所有动作。

  1. 挑选输入。钱包从你自己的那些输出里挑出一个或几个,总额足够覆盖"金额 + 手续费"。每一个输入都有一个已知的金额(只有你能看见)和一个已知的致盲因子,存放在你钱包的本地缓存里。
  2. 构建诱饵环。对于每一个输入,钱包按照偏向近期区块的伽马分布,从区块链中抽取另外 15 个输出,因为经验上大多数花费都发生在最近。这 15 个诱饵加上你那个真实输出,就组成了大小为 16 的环。
  3. 构造输出。接收方的隐身地址是从他们的公开查看密钥和花费密钥派生而来的,因此链上的输出地址在这笔交易里是独一无二的,无法和接收方的主地址挂钩。金额会用一个共享密钥加密给接收方,然后通过 Pedersen 承诺加上一个全新的致盲因子提交到链上。
  4. 生成范围证明。对所有输出承诺同时计算一个 Bulletproofs+ 证明,证明每一个金额都落在合法的 64 位范围内。
  5. 生成 CLSAG 签名。为每一个输入产生一个环签名,证明"花费权限存在",却不透露到底哪一个环成员是真的,并发布对应的密钥镜像。
  6. 通过 Dandelion++ 广播。交易先被发送给一个随机的对等节点进入"茎期"(stem phase),沿着一条保护隐私的路径转发若干跳之后,再被洪泛给整个网络,以防御内存池层面的 IP 反匿名化。
  7. 验证并打包。每一个节点都检查范围证明、CLSAG 签名以及承诺总和是否平衡。一切合法,交易就进入内存池,大约两分钟内被打包进区块。

这些步骤全部是自动完成的。从用户视角看,发送 Monero 跟发送其他任何加密货币没有任何不同:粘贴一个地址、输入一个金额、确认。所有的复杂性都被压在了协议这一侧——这恰恰是它应该待的地方。

2026 年的图景:FCMP++ 与 RingCT 之后

RingCT 的耐用性令人惊叹,但 Monero 研究实验室已经为它的继任者准备了好几年。下一轮硬分叉周期里最醒目的变化就是 FCMP++(Full Chain Membership Proofs,全链成员证明),这套方案由 Luke "kayabaNerve" Parker、Aaron Feickert 等研究者主导。与其证明"我是这 16 个里的一个",FCMP++ 的输入直接证明自己是"Monero 链上历史以来所有可花费输出"集合中的一个——匿名集一下子扩张到数千万的量级。

FCMP++ 建立在 Curve Trees(曲线树)之上,这是一种递归承诺结构,允许证明者用区区几 KB 的证明,让验证者相信"我在某棵巨大的、类似 Merkle 树的结构中"。关键在于,它不需要任何可信设置,保留了 Monero 区别于 zk-SNARK 类链的"没有有毒废料"这一性质。一旦激活,那个长期以来对 Monero"匿名集被环大小卡死"的批评,就会从根本上失去成立的前提。

Curve Trees 的巧妙之处在于它把"成员证明"递归地拆成多层小证明,每一层只需要在两条相互嵌套的椭圆曲线(一对所谓的 cycle of curves)上做廉价运算。对一个大约 1 亿条可花费输出的集合,FCMP++ 证明的体积仍只在 3 KB 上下,单次验证耗时数十毫秒。换句话说,它把"环大小"这个变量从 16 一路推到了"整条链",却没有让交易体积爆炸——这是 RingCT 时代任何路线都达不到的扩展曲线。

除了 FCMP++ 之外,Seraphis 交易协议(由 koe 与 MRL 设计)和 Jamtis 地址格式将一起取代当前的 MLSAG/CLSAG/子地址技术栈,换上一套更干净、更高效、更灵活的方案。这一连串升级,加在一起是 Monero 自 2017 年 RingCT 上线以来规模最大的一次转型。

这对用户来说意味着什么?日常使用层面,几乎没有变化。钱包会自动升级,手续费可能下降,交易体积可能缩水。隐私保证变得更强,但用户体验——粘贴地址、确认金额、看着交易确认——保持不变。对那些使用 MoneroSwapper 这类无 KYC 兑换服务的人也是如此:底层的密码学过渡在兑换界面上完全不可见,但兑换得到的输出会落进一个隐私性比 2017 年那种 RingCT 输出强得多的钱包里。

真实案例:探测 RingCT 的极限

为了把抽象内容具体化,可以参考一份 2024 年发表在 Financial Cryptography 会议论文集上的学术分析。研究者用时间分析、内存池监测以及基于环成员"年龄分布"的统计猜测,试图对 2022 年之后的一批 Monero 交易做反匿名化。在检视了超过 20 万笔交易之后,他们恢复出的"真实花费"猜测的准确率大致与随机命中 16 个环成员中的一个相当——大约 6.25%。换句话说,密码学顶住了,协议的统一默认值没有留下任何可供攻击的统计抓手。

这一点很重要,因为隐私系统出问题,往往不是出在数学层,而是出在元数据层。Monero 的环大小统一为 16、强制使用 RingCT、自 2022 年起强制使用 Bulletproofs+、以及 Dandelion++ 传播,都是有意识的选择,目的是把元数据表面积压到最小。给用户的启示很直接:不要把默认设置改成自己独有的;条件允许时跑自己的节点;把交易所和中心化服务视为最脆弱的环节,而不是协议本身。MoneroSwapper 的"无账户模式"就是围绕这个原则设计的——根本就没有可以泄露的身份记录,哪怕未来链上分析手段变强,也无从下手。

对华语区的用户来说,这一点尤其值得放在心上。中国大陆全面禁止虚拟货币相关业务,香港自 2023 年起施行虚拟资产服务提供者(VASP)发牌制度,台湾的虚拟通货平台业者(VASP)也已纳入洗钱防制法监管。在这样高度差异化的法域环境下,"协议层隐私强"远不足以保护用户——离开协议层之后,无论是交易所的实名审核还是支付通道的银行流水,每一处都可能成为身份关联点。Monero 的协议设计可以做到"链上不留把柄",但能否真正保有隐私,仍然取决于你在协议之外做出的每一个决定。

同样的论文还做了一项有意思的对照实验:把同样的统计方法应用在 2017 年早期、刚刚启用 RingCT 而尚未引入 Bulletproofs 的交易上,结果命中率显著高于 6.25%。原因不是 RingCT 本身的密码学有漏洞,而是早期的诱饵选择算法存在偏差,使得"年龄分布"成了可被利用的边信道。这条对照说明了一件事:RingCT 的强度并不仅仅由密码学决定,钱包层面的默认设置——尤其是诱饵采样策略——同样关键。这也是 Monero 社区坚持把所有主流钱包的诱饵分布、找零策略和手续费等级强制统一的原因。在 Feather、Cake Wallet 和 Monero GUI 中你看不到"自定义环大小"这种选项,并不是开发者偷懒,而是刻意的设计取舍。

RingCT 不负责保护的那些东西

把 RingCT 当成银弹,是华语隐私社区里最常见的误解之一。它解决的是非常具体的一个问题——在不暴露金额的前提下让全网验证一笔交易——而不是"凡是涉及 Monero 的事情都是匿名的"。下面这些维度,RingCT 既没有承诺过,也无能为力。

  • 网络层身份:RingCT 不隐藏你从哪个 IP 广播了一笔交易。这一层依赖 Dandelion++ 和 Tor / I2P。如果你在裸网下用一个唯一 IP 反复广播交易,对手仍然可以做时间和拓扑关联。
  • 钱包元数据:区块高度、交易输出数量、找零行为、手续费等级,这些都是钱包层面的元数据。一个被定制过的钱包(例如改了默认环大小——虽然现在已经不允许了——或采用非标准找零策略)会立刻在链上显得突兀。
  • 交易所与中心化服务:如果你从交易所提币到 Monero 钱包,交易所知道"这个金额、这个时间、这个目标输出"。RingCT 保护的是从这一刻开始之后的链上行为,但不会回溯保护那笔提币之前的痕迹。
  • 侧信道:使用习惯、客户端版本、收件方泄露、社交工程——这些都不是密码学能够防御的层面。
  • 未来量子威胁:RingCT 依赖椭圆曲线离散对数难题,并非后量子安全。MRL 已经在跟踪后量子签名方案的研究,但这是一个跨越多个升级周期的话题。

这份清单的目的不是要劝退使用者,而是要把"协议提供什么"和"用户必须自己做什么"分清楚。正确的心态是:RingCT 让链上数据本身不再是隐私链条里最弱的一环,但它并没有把链条的其他环节一起加固——那些环节需要你在工具选择、网络层接入和操作习惯上自己做出选择。

常见问题

2026 年,RingCT 对每一笔 Monero 交易都是强制的吗?

是的。自 2017 年 9 月的硬分叉以来,所有 Monero 交易都必须使用 RingCT。不存在所谓"透明金额"的旧模式。这种统一性正是 RingCT 力量的来源之一——每一笔交易在结构上看起来都完全一致,没有人会因为"选择启用"或"选择不启用"而显得与众不同。

Monero 的开发者能看到我的交易金额吗?

不能。金额是在发送方与接收方之间用共享密钥加密的,链上的承诺把它对其他所有人——包括核心开发者、矿工和节点运营者——都隐藏了起来。只有发送方、接收方,以及他们明确分享了查看密钥(view key)的人,才能读到真实金额。

RingCT 让 Monero 比比特币慢吗?

Monero 的交易体积比比特币更大,单笔验证也更慢,但出块时间(2 分钟)比比特币更快,而 Bulletproofs+ 的批量验证已经把大部分单笔性能差距给抹平了。在消费级硬件上,一个现代节点同步整条 Monero 链大约只需要一天。

RingCT 和环签名(ring signature)有什么区别?

环签名隐藏的是"在一组候选者中,哪一个输入正在被花费"。RingCT 隐藏的是金额。现代 Monero 交易两者都用:CLSAG 环签名负责输入端的匿名性,Pedersen 承诺加上 Bulletproofs+ 范围证明负责金额端的机密性。两者合在一起,才是完整的 RingCT 方案。

FCMP++ 会彻底取代 RingCT 吗?

FCMP++ 取代的是交易中的环签名那一部分,把它换成一个全链成员证明,匿名集因此大幅扩展。负责隐藏金额的那部分——Pedersen 承诺和范围证明——会继续在新设计中使用。所以更准确的理解是:FCMP++ 是 RingCT 的下一代,而不是一次完整替换。

如果我用 BTC 兑换成 XMR,我的币会自动获得 RingCT 保护吗?

会的。一旦 XMR 落到一个 Monero 钱包里,之后的每一次发送默认都会启用 RingCT。兑换本身发生在 MoneroSwapper 这样的服务上(链下完成),通过原子兑换或订单簿在两条链之间转移价值。从 Monero 那一侧结算完成的那一刻起,标准的 RingCT 保护就会作用于你之后每一笔发出的交易。

结语

RingCT 让"隐私加密货币"这个口号在 Monero 这里变成了一个可被密码学验证的属性。通过把 Pedersen 承诺、Bulletproofs+ 范围证明和 CLSAG 环签名组合起来,它让每一个节点都能确认"账本平衡",却不需要看见任何一个具体的金额。自 2017 年上线以来近十年,它依然是衡量其他金额隐藏方案的标尺,而即将到来的 FCMP++ 升级将通过抹平"环大小有限"这个历史批评,把它的领先进一步拉开。

站在 2026 年回望,RingCT 提供了一种很难复制的"工程美学":它把复杂性吸收进了协议层,让用户层面的体验跟普通比特币钱包没什么两样,却把"可被链上分析"这件事变成了一个数学上不可解的问题。对于刚开始接触 Monero 的华语区读者来说,理解 RingCT 不需要先掌握椭圆曲线密码学的全部细节——只需要记住三件事:金额被 Pedersen 承诺锁住、范围被 Bulletproofs+ 框死、来源被 CLSAG 与即将到来的 FCMP++ 藏入越来越大的匿名集。剩下的,交给协议。

如果你不只是阅读 RingCT,而是真的要拿它来用,几条实操优先级很直接:钱包保持默认设置;条件允许时跑自己的节点;优先选择那些不收集身份数据的服务;并且永远记得,你隐私链条里最脆弱的那一环,几乎从来都不是数学本身。对于希望在不留下 KYC 痕迹的前提下进出 XMR 的人,MoneroSwapper 提供无账户兑换,币会直接落进你受 RingCT 保护的钱包——你按下"发送"的那一刻,本文描述的所有密码学就开始为你工作了。

分享这篇文章

相关文章

匿名 门罗币兑换

无KYC • 无需注册 • 即时兑换

立即兑换