#bulletproofs #ristretto #zero-knowledge #zero-knowledge-proofs #system-api #crypto

nightly wedpr_l_bulletproofs

使用Ristretto实现的纯Rust Bulletproofs

2个稳定版本

使用旧的Rust 2015

1.0.5 2021年9月7日
1.0.4 2021年8月13日

#1807 in 加密学

21 每月下载次数
2 个crate中使用 (通过 wedpr_l_crypto_zkp_range_…)

MIT 许可证

1MB
3K SLoC

包含 (压缩文件,280KB) aggregated-range-proof.sketch

Bulletproofs

有史以来最快的Bulletproofs实现,具有单个和聚合范围证明、强类型多党计算以及用于证明任意陈述的编程约束系统API(开发中)。

此库使用Ristretto实现Bulletproofs,使用curve25519-dalek中的ristretto255实现。当使用curve25519-dalek AVX2后端的并行公式时,它可以比基于原始libsecp256k1的Bulletproofs实现快约两倍地验证64位rangeproofs。

此库提供了以下实现:

  • 单个或多个范围的单一党派证明,使用聚合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) 相对
我们的(avx2) ristretto255 7300 1.00x 1040 1.00x
我们的(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 bulletproofs;
# use 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 而不是稳定版。

您可以使用 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开发。

依赖项

~4.5MB
~78K SLoC