#ristretto #zero-knowledge #system-api #math #crypto

无std bulletproofs

使用Ristretto实现的纯Rust Bulletproofs

9个稳定版本 (4个主要版本)

5.0.0 2024年6月4日
4.0.0 2021年2月2日
3.0.1 2021年2月2日
2.0.0 2020年1月18日
0.0.0 2018年6月27日

#26 in 密码学

Download history 2667/week @ 2024-05-01 3238/week @ 2024-05-08 3738/week @ 2024-05-15 3535/week @ 2024-05-22 3796/week @ 2024-05-29 3879/week @ 2024-06-05 5997/week @ 2024-06-12 6336/week @ 2024-06-19 6094/week @ 2024-06-26 4230/week @ 2024-07-03 5068/week @ 2024-07-10 4787/week @ 2024-07-17 6870/week @ 2024-07-24 4877/week @ 2024-07-31 4442/week @ 2024-08-07 6422/week @ 2024-08-14

23,468 每月下载量
15 个crate中(直接使用6个)使用

MIT 许可证

1MB
4K SLoC

防弹证明

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

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

该库提供了以下实现:

  • 使用聚合rangeproof结构进行的单个或多个范围的单一党派证明;

  • 在线多方计算,用于在多个党派之间进行rangeproof聚合,使用会话类型来静态强制执行正确的协议流程;

  • 用于表达秩1约束系统的程序化约束系统API,以及证明和验证任意语句的证明(不稳定,与yoloproofs功能一起开发);

  • 聚合约束系统证明的在线多方计算(计划中的未来工作)。

这些证明使用Merlin transcripts实现,允许它们在不改变实现的情况下与其他证明任意组合。

可以在里程碑部分找到Github仓库中的开发路线图。

约束系统API仅提供用于实验,必须通过指定yoloproofs功能来启用。它不受semver兼容性的约束,并且未经通知即可更改

目前,在已发布的crate版本中,yoloproofs功能已被禁用,因此只能通过指定对develop分支的git依赖来使用。这意味着无法使用R1CS API发布crate,因为它**仅限实验使用**。

文档

此功能的用户文档可以在此处找到。此外,该库还包含关于Bulletproofs如何工作的详细说明。这些说明可以在库的内部文档中找到。

比较性能

以下表格给出了在Intel Skylake-X i7-7800X(@3.5GHz,禁用Turbo Boost)上证明和验证64位rangeproof的比较时间。时间以微秒为单位(越低越好),与最快实现的相对速度。

实现 证明(μs) rel 验证(μs) rel
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 (unsafe) 53300 7.30x 4810 4.63x

使用curve25519-dalek的IFMA后端在Cannonlake i3-8121U上提供了1.5倍的速度提升,使得与libsecp相比验证速度提高了**3倍**,与Monero相比提高了**7倍**,但这些处理器尚未普遍可用。

此crate还包含其他基准测试;有关如何运行它们的详细信息,请参阅下方的测试和基准部分。

示例

以下示例展示了如何创建和验证32位rangeproof。

# // 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开发。

依赖关系

~3-5MB
~83K SLoC