3 个稳定版本
4.4.1 | 2023 年 4 月 3 日 |
---|---|
4.0.0 | 2021 年 7 月 2 日 |
2.1.0 | 2020 年 12 月 1 日 |
在 密码学 中排名 #854
每月下载量 2,315 次
1MB
4K SLoC
Bulletproofs
迄今为止最快的 Bulletproofs 实现,具有单个和聚合范围证明、强类型多方计算以及用于证明任意陈述的可编程约束系统 API(开发中)。
此库使用 Ristretto 实现 Bulletproofs,使用 curve25519-dalek
中的 ristretto255
实现。当在 并行公式 中使用 curve25519-dalek
AVX2 后端时,它验证 64 位 rangeproofs 的速度比原始的基于 libsecp256k1
的 Bulletproofs 实现快约两倍。
此库提供以下实现:
-
单个或多个范围的单方证明,使用聚合 rangeproof 构造;
-
在线多方计算,用于多个参与者之间的 rangeproof 聚合,使用 会话类型 静态强制正确的协议流程;
-
可编程约束系统 API,用于表达秩 1 约束系统,并证明和验证任意陈述的证明(不稳定,正在开发中,具有
yoloproofs
功能); -
聚合约束系统证明的在线多方计算(计划中的未来工作)。
这些证明使用 Merlin 转录 实现,允许它们与其他证明任意组合,而无需进行实现更改。
开发路线图可以在 里程碑 部分找到,该部分位于 Github 仓库 中。
约束系统 API 仅提供用于 实验,必须通过指定 yoloproofs
功能来启用。它不受 semver 兼容性的覆盖,并且 将在不预先通知的情况下更改。
目前,在 crate 的发布版本中已禁用 yoloproofs
功能,因此只能通过指定 develop
分支的 git 依赖项来使用。这意味着无法使用 R1CS API 发布 crate,因为它仅适用于 实验。
文档
此功能的用户文档可以在 此处找到。此外,该库还包含关于 Bulletproofs 如何工作的详细笔记。这些笔记可以在库的 内部文档 中找到
- 如何 工作 Bulletproofs;
- 如何 工作范围证明协议;
- 如何 工作内积证明协议;
- 如何 工作聚合协议;
- Bulletproof 约束系统证明的工作方式(开发中);
- 约束系统缩减的工作方式(开发中);
- 聚合约束系统证明的工作方式(未来工作)。
比较性能
以下表格提供了在 Intel Skylake-X i7-7800X (@3.5GHz,Turbo Boost 已禁用) 上进行 64 位范围证明的证明和验证的比较时间。时间以微秒(越低越好)表示,与最快实现的速度相比。
实现 | 组 | 证明(μs) | 相对 | 验证(μs) | 相对 |
---|---|---|---|---|---|
ours (avx2) | ristretto255 | 7300 | 1.00x | 1040 | 1.00x |
ours (u64) | ristretto255 | 11300 | 1.54x | 1490 | 1.43x |
libsecp+endo | secp256k1 | 14300 | 1.96x | 1900 | 1.83x |
libsecp-endo | secp256k1 | 16800 | 2.30x | 2080 | 2.00x |
Monero | ed25519 (不安全) | 53300 | 7.30x | 4810 | 4.63x |
使用 curve25519-dalek
IFMA 后端在 Cannonlake i3-8121U 上提供了 1.5 倍的速度提升,将验证速度提升到 libsecp 的 3 倍,比 Monero 高 7 倍,但这些处理器尚未普遍可用。
此 crate 还包含其他基准测试;有关如何运行它们的详细信息,请参阅下面的 测试和基准 部分。
示例
以下示例展示了如何创建和验证 32 位范围证明。
# // The #-commented lines are hidden in Rustdoc but not in raw
# // markdown rendering, and contain boilerplate code so that the
# // code in the README.md is actually run as part of the test suite.
#
# extern crate rand;
# use rand::thread_rng;
#
# extern crate curve25519_dalek;
# use curve25519_dalek::scalar::Scalar;
#
# extern crate merlin;
# use merlin::Transcript;
#
# extern crate tari_bulletproofs;
# use tari_bulletproofs::{BulletproofGens, PedersenGens, RangeProof};
#
# fn main() {
// Generators for Pedersen commitments. These can be selected
// independently of the Bulletproofs generators.
let pc_gens = PedersenGens::default();
// Generators for Bulletproofs, valid for proofs up to bitsize 64
// and aggregation size up to 1.
let bp_gens = BulletproofGens::new(64, 1);
// A secret value we want to prove lies in the range [0, 2^32)
let secret_value = 1037578891u64;
// The API takes a blinding factor for the commitment.
let blinding = Scalar::random(&mut thread_rng());
// The proof can be chained to an existing transcript.
// Here we create a transcript with a doctest domain separator.
let mut prover_transcript = Transcript::new(b"doctest example");
// Create a 32-bit rangeproof.
let (proof, committed_value) = RangeProof::prove_single(
&bp_gens,
&pc_gens,
&mut prover_transcript,
secret_value,
&blinding,
32,
).expect("A real program could handle errors");
// Verification requires a transcript with identical initial state:
let mut verifier_transcript = Transcript::new(b"doctest example");
assert!(
proof
.verify_single(&bp_gens, &pc_gens, &mut verifier_transcript, &committed_value, 32)
.is_ok()
);
# }
构建
要成功编译,您需要安装 nightly Rust 而不是 stable。
您可以使用 rustup 安装 nightly Rust
rustup default nightly
测试和基准
使用 cargo test
运行测试。使用 cargo bench
运行基准。此 crate 使用 criterion.rs 进行基准测试。
功能
yoloproofs
功能启用对排名 1 约束系统证明的支持。它是 不稳定且不适合部署,并且 仅提供用于测试。
avx2_backend
功能启用 curve25519-dalek
的 AVX2 后端,该后端使用 并行公式 实现曲线算术。要使用它进行 Bulletproofs,target_cpu
必须支持 AVX2
RUSTFLAGS="-C target_cpu=skylake" cargo bench --features "avx2_backend"
Skylake-X CPU的AVX2寄存器数量是双倍。要使用它们,请尝试
RUSTFLAGS="-C target_cpu=skylake-avx512" cargo bench --features "avx2_backend"
这可以防止AVX2并行字段乘法代码中的溢出,但会导致其他地方的代码生成更差 ¯\_(ツ)_/¯
关于
这是一个由Interstellar资助的研究项目,由Henry de Valence、Cathie Yun和Oleg Andreev开发。
依赖项
~3–4.5MB
~80K SLoC