技术 › 多少钱?

范围证明与 Bulletproofs+

在不泄露数值的前提下,证明一个隐藏的数位于 0 到 2⁶⁴ 之间

简而言之

每个输出都要证明其金额 v 位于 [0, 2⁶⁴) 之内。这堵住了“负数金额”的漏洞。门罗币使用 Bulletproofs+(自 2022 年 8 月起):每笔交易一个聚合证明,大小按对数增长——2 个输出约 600 字节。

思路:把数拆成比特

[0, 2⁶⁴) 内的数有 64 个比特:v = b₀·1 + b₁·2 + b₂·4 + … + b₆₃·2⁶³,其中每个 bᵢ ∈ {0, 1}。只要证明 (1) 每个 bᵢ 确实是 0 或 1,并且 (2) 比特的加权和等于 v,那么 v 就必然在范围内。

“是一个比特”这一条件可以写成代数形式:bᵢ·(bᵢ − 1) = 0。于是任务变成:在不泄露这些数的前提下,证明一组隐藏的数满足一组方程。

在门罗币中的演进

时期方案大小(2 个输出)原理
2017–2018Borromean约 13 KB每个比特一个单独的承诺 + 一个环签名,证明“这个承诺对应 0 或 2ⁱ”。大小呈线性。
2018 年 10 月 – 2022 年 8 月Bulletproofs约 700 字节内积论证:大小呈对数,多个输出聚合为一个证明。
2022 年 8 月至今Bulletproofs+约 600 字节改进版本(加权内积):更小、更快。

2018 年切换到 Bulletproofs 后,交易缩小了约 10 倍,手续费也随之降低了同样的幅度。这是门罗币历史上最引人注目的升级之一。

Bulletproofs 的工作原理(直观理解)

  1. 证明者用一个向量 Pedersen 承诺,同时承诺比特向量 a_L 和向量 a_R = a_L − 1。
  2. 验证者(通过哈希,即 Fiat–Shamir 变换)发送随机挑战值 y, z。全部 64 个“是一个比特”的条件和“求和”条件被合并成一个内积方程 ⟨l, r⟩ = t。随机挑战值保证了:不满足所有原始条件,就无法伪造这个合并后的方程。
  3. 长度为 n 的向量内积通过递归来证明:每一步都用一个新的挑战值把向量“对折”,经过 log₂ n 步后每个向量只剩一个数。每一步发送 2 个点——因此大小呈对数增长。
64 个元素 32 16 8 … → 1 每一步:+2 个点(L, R) 步数:log₂(64·m) 大小 ≈ 2·log₂(64·m) 个点 + 常数 m —— 输出数量(聚合)

聚合:对于 m 个输出,向量长度为 64·m,而大小只增加 2·log₂ m 个点。这就是为什么门罗币把每笔交易的输出数量上限设为 16,并填充到 2 的幂次。

优点与缺点

+

  • 无需可信设置(不同于 Zcash Sprout/Sapling 中的 zk-SNARK)。
  • 只依赖离散对数难题——与门罗币其余部分的假设相同。
  • 紧凑且可聚合。
  • 可以把许多证明放在一起检查(批量验证)。

−

  • 验证时间与比特数成线性关系——在区块验证时间中占相当大的比重。
  • 不抗量子:量子计算机能破坏 Pedersen 承诺的绑定性(从而凭空印钱),不过隐藏性仍然保持。
与 FCMP++ 的联系

FCMP++ 使用同一技术的推广版本——Generalized Bulletproofs(广义 Bulletproofs)——来证明所有输出构成的树中的一条路径。理解 Bulletproofs 是理解 FCMP++ 证明的良好基础。