#bulletproofs #zkp #crypto #rangeproofs #zeroknowledge

bp-pp

Rust实现的Bulletproofs++库 - 在离散对数设置中的范围证明协议

2个版本

0.1.1 2024年5月22日
0.1.0 2024年4月1日

#429 in 密码学

MIT 许可证

58KB
1K SLoC

Bulletproofs++在Rust上的实现

License: MIT Pull Requests welcome

⚠️ 请注意 - 此加密库尚未经过审计,因此请自行承担使用风险。

摘要

本Rust库包含了在secp256k1曲线上实现的Bulletproofs++,包括:权重范数线性论证协议、算术电路协议和倒数范围证明。还包含作为倒数范围证明主要用例的u64范围证明协议。

所实现的解决方案在证明一个64位值时比现有的BP和BP+协议有2G个点的优势,并且对于每个证明的更多值,这种优势将会增加。

协议 G F
BP 16 5
BP+ 15 3
我们的BP++ 13 3

此实现使用Merlin转储生成挑战,这是Bulletproofs协议作者推荐的。

所有Proof数据模型都有相应的SerializeProof模型,其中实现了serdeSerializeDeserialize

使用示例

使用测试运行提供的示例

use k256::elliptic_curve::{Group, rand_core::OsRng};
use k256::ProjectivePoint;

use bp_pp::range_proof;
use bp_pp::range_proof::u64_proof::G_VEC_FULL_SZ;
use bp_pp::range_proof::u64_proof::H_VEC_FULL_SZ;
use bp_pp::range_proof::reciprocal::{SerializableProof, self};

fn main() {
    let mut rand = OsRng::default();

    let x = 123456u64; // private value to create proof for.
    let s = k256::Scalar::generate_biased(&mut rand); // blinding value

    // Base points
    let g = k256::ProjectivePoint::random(&mut rand);
    let g_vec = (0..G_VEC_FULL_SZ).map(|_| k256::ProjectivePoint::random(&mut rand)).collect::<Vec<ProjectivePoint>>();
    let h_vec = (0..H_VEC_FULL_SZ).map(|_| k256::ProjectivePoint::random(&mut rand)).collect::<Vec<ProjectivePoint>>();

    let public = range_proof::u64_proof::U64RangeProofProtocol {
        g,
        g_vec,
        h_vec,
    };

    // transcript will be used for challenge generation - to move from interactive to non-interactive protocol.
    // transcript should be the new instance but with same label for prover and verifier. 
    let mut pt = merlin::Transcript::new(b"u64 range proof");
    let proof = public.prove(x, &s, &mut pt, &mut rand);

    // value commitment: `commitment = x*g + s*h_vec[0]`
    let commitment = public.commit_value(x, &s);

    println!("{}", serde_json::to_string_pretty(&reciprocal::SerializableProof::from(&proof)).unwrap());

    let mut vt = merlin::Transcript::new(b"u64 range proof");
    assert!(public.verify(&commitment, proof, &mut vt));
}

依赖项

~10–22MB
~303K SLoC