技术 › 多少钱?
范围证明与 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–2018 | Borromean | 约 13 KB | 每个比特一个单独的承诺 + 一个环签名,证明“这个承诺对应 0 或 2ⁱ”。大小呈线性。 |
| 2018 年 10 月 – 2022 年 8 月 | Bulletproofs | 约 700 字节 | 内积论证:大小呈对数,多个输出聚合为一个证明。 |
| 2022 年 8 月至今 | Bulletproofs+ | 约 600 字节 | 改进版本(加权内积):更小、更快。 |
2018 年切换到 Bulletproofs 后,交易缩小了约 10 倍,手续费也随之降低了同样的幅度。这是门罗币历史上最引人注目的升级之一。
Bulletproofs 的工作原理(直观理解)
- 证明者用一个向量 Pedersen 承诺,同时承诺比特向量
a_L和向量a_R = a_L − 1。 - 验证者(通过哈希,即 Fiat–Shamir 变换)发送随机挑战值
y, z。全部 64 个“是一个比特”的条件和“求和”条件被合并成一个内积方程⟨l, r⟩ = t。随机挑战值保证了:不满足所有原始条件,就无法伪造这个合并后的方程。 - 长度为 n 的向量内积通过递归来证明:每一步都用一个新的挑战值把向量“对折”,经过
log₂ n步后每个向量只剩一个数。每一步发送 2 个点——因此大小呈对数增长。
聚合:对于 m 个输出,向量长度为 64·m,而大小只增加 2·log₂ m 个点。这就是为什么门罗币把每笔交易的输出数量上限设为 16,并填充到 2 的幂次。
优点与缺点
+
- 无需可信设置(不同于 Zcash Sprout/Sapling 中的 zk-SNARK)。
- 只依赖离散对数难题——与门罗币其余部分的假设相同。
- 紧凑且可聚合。
- 可以把许多证明放在一起检查(批量验证)。
−
- 验证时间与比特数成线性关系——在区块验证时间中占相当大的比重。
- 不抗量子:量子计算机能破坏 Pedersen 承诺的绑定性(从而凭空印钱),不过隐藏性仍然保持。
与 FCMP++ 的联系
FCMP++ 使用同一技术的推广版本——Generalized Bulletproofs(广义 Bulletproofs)——来证明所有输出构成的树中的一条路径。理解 Bulletproofs 是理解 FCMP++ 证明的良好基础。