3 个稳定版本

4.4.1 2023 年 4 月 3 日
4.0.0 2021 年 7 月 2 日
2.1.0 2020 年 12 月 1 日

密码学 中排名 #854

Download history 34/week @ 2024-03-20 43/week @ 2024-03-27 63/week @ 2024-04-03 21/week @ 2024-04-10 1/week @ 2024-04-24

每月下载量 2,315

MIT 许可证

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 如何工作的详细笔记。这些笔记可以在库的 内部文档 中找到

比较性能

以下表格提供了在 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