systemslibrarian/crypto-lab-bulletproofs
GitHub: systemslibrarian/crypto-lab-bulletproofs
基于 ristretto255 的浏览器端 Bulletproofs 零知识范围证明教学演示,支持单值与聚合证明、内积论证可视化及篡改检测。
Stars: 0 | Forks: 0
# crypto-lab-bulletproofs
## 简介
Bulletproofs 是一种简短的非交互式零知识证明,用于证明一个承诺值位于给定范围内,它不需要可信设置,且证明大小与范围呈对数关系。它们可以归结为基于 ristretto255 的内积论证。其安全模型在离散对数假设下是计算安全的;在随机预言机模型中,其可靠性通过 Fiat-Shamir 启发式实现。
## 何时使用
- **机密交易**,当你需要证明金额非负且不泄露具体数值时——其证明大小比原始的 OR 证明要小好几个数量级。
- **任何需要范围证明且无需可信设置仪式的协议**——与 Groth16 不同,它不会产生有毒废弃物。
- **聚合多值证明**,对数级的证明大小优势会在此叠加——可以在一个不到 1 KB 的证明中包含数十个值。
- **请勿使用** 当你需要常数大小的证明时——无论电路大小如何,Groth16 证明的大小都是三个群元素,在 BLS12-381 上为 192 字节,在 BN254 上(压缩后)为 128 字节;而 Bulletproofs 的大小会随着 `log(range × count)` 增长。
- **请勿使用** 当验证时间比证明时间更重要时——其验证过程的时间复杂度为 O(n),而非次线性。
- **请勿用于生产环境**——这是一个从头开始编写的教学实现;它没有经过安全审计,不提供任何常数时间保证,绝不能用于保护真实资产。
## 在线演示
**[systemslibrarian.github.io/crypto-lab-bulletproofs](https://systemslibrarian.github.io/crypto-lab-bulletproofs/)**
用户可以承诺一个 64 位值,在 ristretto255 上生成实时的范围证明并进行验证,检查 Fiat-Shamir 挑战和每个组件的证明大小,运行*批量*多值流程,将其大小与理论上的聚合 Bulletproof 进行比较,并观察当承诺值超出合法范围时,作弊模式会被拒绝。
该演示被构建为一次引导式旅程——实时的 **Commit → Prove → Verify → Explore** 步骤指示器会跟踪你当前的位置——并对其解释进行了分层,使得初次访问者和专业的密码学家都能有所收获。**“验证者检查的内容”** 面板从通俗易懂的声明开始,过渡到“该值是其各个位乘以 2 的幂的累加和”,最后通过一个 *Show the algebra* 开关展示了验证者的两个完整方程式,其中每个符号(`T₁`, `T₂`, `τₓ`, `μ`, `δ(y,z)`, `t̂`)都带有悬停提示说明。**“从比特到单一内积”** 面板通过从你输入值的实时位和挑战中推导出真实向量 `l = a_L − z·1ⁿ` 和 `r`,将位网格与折叠视图联系起来,明确展示了*为什么* 64 个位约束会坍缩为一个单一的内积。随后,折叠视图会以**动画形式**展示 log₂(64) = 6 轮折叠过程如何逐轮缩小。
### 补充说明
- 单值范围证明是完整的 Bünz 等人 2018 年协议 2,包含了 `H' = y^{-i} H` 基变换和绑定到 transcript 的 IPA。
- 针对二的幂次方批量大小实现了一个**真正的聚合 Bulletproof**(协议 2 §4.3)——即用 *m* 个值生成一个对数级大小的证明,例如当 m=8 时为 864 字节,而单独批量验证为 5376 字节。
- 在单值证明和聚合证明的参考验证器旁,还实现了一个**单一 MSM 批量验证器**,并在 UI 中作为第二个“Verify”按钮公开。
- 证明可以被**导出为十六进制字节并重新验证**,这证明了 Bulletproofs 是非交互式的。
- **确定性种子模式**将随机数生成器替换为 SHA-512 计数器 PRNG,使得致盲因子和证明能够按位重现(仅用于教学/测试)。
- **手动篡改面板**可以翻转 `t̂` 的一位,并显示这两个验证器都会拒绝。
- **作弊面板**解释了其自身的逻辑:它并排显示了对你超出范围的值的承诺与证明者实际能够证明的承诺(`v mod 2⁶⁴`),并高亮显示了不同的十六进制半字节,因此这种拒绝读起来就像是绑定性失败,而不是“证明者只是拒绝处理大数字”。
- **位网格**标记了 24 位滑块可以触达的位与完整的 64 位证明范围之间的区别,并带有说明文字指出证明始终覆盖 `[0, 2⁶⁴)`。
- **基准测试面板**测量了单值证明以及 *m* = 1, 2, 4, 8 时的聚合证明的生成和验证时间。
- 单值流程中显示的所有证明大小均是从实际序列化的证明字节中测量得出的,而不是套用公式计算。
## 潜在问题
- 范围证明只能证明承诺值在范围内;它并不能说明该值*是什么*或其含义。应用逻辑仍必须将承诺绑定到正确的金额/账户,否则有效的证明可能会授权错误的行为。
- 验证过程是线性的 (O(n)),且聚合成本随 `log(range × count)` 增长;逐个验证大量证明速度很慢,因此通常需要大规模的批量验证。
- Fiat-Shamir 的可靠性依赖于对完整 transcript 进行哈希处理。如果没有将挑战绑定到每一个公共输入(生成元、承诺、先前的消息),就会导致证明面临被伪造的风险。
- 实现并不自动具备常数时间特性;通过时序泄露致盲因子或标量可能会危及承诺值的隐藏性。
- 盲因子的随机性较弱或重复使用会破坏隐藏性和零知识特性。
## 实际应用
- Monero 使用 Bulletproofs(以及 Bulletproofs+)进行机密交易范围证明,在证明交易金额非负的同时隐藏金额。
- 类似 MimbleWimble 的区块链(如 Grin 和 Beam)使用无需可信设置的范围证明来保持金额的机密性。
- 储备金证明和机密资产系统使用范围证明来表明余额在有效范围内,而无需披露实际数字。
- 更一般地说,任何需要在不泄露隐藏值的情况下证明其位于有效范围内(年龄、余额、限制)的场景,都是 Bulletproof 范围证明的潜在用例。
## 如何在本地运行
```
git clone https://github.com/systemslibrarian/crypto-lab-bulletproofs
cd crypto-lab-bulletproofs
npm install
npm run dev
```
## 相关演示
- [crypto-lab-snark-arena](https://systemslibrarian.github.io/crypto-lab-snark-arena/) — Groth16/PLONK zk-SNARKs,这是与 Bulletproofs 形成对比的常数大小证明。
- [crypto-lab-stark-tower](https://systemslibrarian.github.io/crypto-lab-stark-tower/) — zk-STARKs,另一种透明的(无需可信设置的)证明系统。
- [crypto-lab-zk-arena](https://systemslibrarian.github.io/crypto-lab-zk-arena/) — SNARK 和 STARK 证明系统的并排比较。
- [crypto-lab-zk-proof-lab](https://systemslibrarian.github.io/crypto-lab-zk-proof-lab/) — Schnorr 承诺和 Fiat-Shamir,这些证明背后的基础构件。
- [crypto-lab-commit-gate](https://systemslibrarian.github.io/crypto-lab-commit-gate/) — Pedersen 承诺,范围证明所基于的隐藏承诺方案。
## 测试
```
npm test # crypto suite + serialization + aggregate + batch-verifier + headless UI smoke test
npm run build # production build (type-checks, then bundles)
```
CI 会在每次推送时运行:参见 [`.github/workflows/ci.yml`](.github/workflows/ci.yml)。
*这是 [Crypto Lab](https://crypto-lab.systemslibrarian.dev/) 套件中 170 多个浏览器演示之一。*
*“所以,你们或吃或喝,无论做什么,都要为荣耀神而行。” —— 哥林多前书 10:31*
标签:AI工具, Bulletproofs, Ristretto255, WebAssembly, 加密教学, 密码学, 手动系统调用, 暗色界面, 自动化攻击, 范围证明, 零知识证明