#range-proof #third-party #privacy #hash-chains #range-proofs #sparse-tree

hashwires

HashWires是一个由可信第三方颁发的凭证的区间证明系统

1个不稳定发布

0.1.0 2021年6月9日

#1623 in 加密学

MIT许可证

295KB
1K SLoC

HashWires 🐙 :: 发放凭证的区间证明

这是Rust对HashWires: Hyperefficient Credential-Based Range Proofs中描述的区间证明方案的实现,该方案被Privacy Enhancing Technologies (PETS) 2021会议接受,由Konstantinos Chalkias and Shir Cohen and Kevin Lewi and Fredric Moezinia and Yolan Romailler提出。有关HashWires工作原理的更简化演示可在ZKProof博客文章中找到。

HashWires是一种基于哈希的区间证明协议,适用于存在可信第三方(通常为凭证颁发者)可以生成承诺的场景。我们将其称为“基于凭证”的区间证明(CBRPs)。它改进了通常仅限于小间隔范围的微支付哈希链解决方案,实现了证明生成和验证时间的指数级加速。在证明大小和计算成本方面,我们表明HashWires与Bulletproofs在32位和64位数值方面都具有可比性。

尽管CBRPs在灵活性方面不如通用零知识区间证明,但我们提供了一系列应用,在这些应用中,凭证颁发者可以利用HashWires为私有值提供区间证明,而无需依赖重型加密工具和假设。

潜在应用

  • KYC区间证明(例如,年龄证明)
  • 2D/3D位置区间证明(你可以
  • 收入证明(例如,向房东证明)而不透露确切的银行账户余额或工资单薪水
  • 时间戳区间(例如,用于数字证书)
  • 顶级%排名(例如,在线竞赛排名)
  • 成分的%区间(例如,在食品和化学品产品中,表明合规性,但无需透露配方)
  • 微支付(例如,逐步可赎回的现金支票)
  • 拍卖系统,其中投标人希望隐藏他们的可用资金(因为这会泄露他们可以走多远的信息)

注意:HashWires中使用的承诺不是同态的,因此不能用于在区块链应用中添加机密金额。

文档

假设Alice是一个可信的发行者,Bob正在请求为其年龄(他43岁)生成一个HashWires承诺。Carol是一个验证者,她应该确信Bob的年龄大于21岁。他们都同意使用以下定义:base: u32,它定义了每个哈希链的长度,以及max_number_bits: usize,它表示在这个用例中支持的最大数的位数。

给定Bob的年龄value: BigUint,Alice选择一个seed: [u8],并为这个承诺实例化一个Secret,代码如下:let secret = Secret::<Blake3>::gen(&seed, &value);。这个secret可以使用任何哈希函数(在这个例子中我们使用Blake3)。

Alice现在可以生成一个承诺,代码如下:let commitment = secret.commit(base, max_number_bits);。目前这个包只能支持集合{2, 4, 16, 256}中的base。如果需要,可以使用let commitment_bytes = commitment.serialize();序列化承诺,并将其提供给Bob(实际上由Alice的密钥签名)。

Bob现在可以生成一个范围证明,代码如下:let proof = secret.prove(base, max_number_bits, &threshold);,其中threshold: BigUint是Carol请求的挑战(范围值)(在我们的例子中是21)。

给定HashWires的commitmentproof,Carol可以通过以下方式验证范围证明的声明:commitment.verify(&proof, &threshold);,如果失败,将返回一个HwError

一个完整的循环prove_and_verify测试示例

// A full HashWires cycle with serialized outputs.
fn prove_and_verify(
    base: u32,
    max_number_bits: usize,
    value: &BigUint,
    threshold: &BigUint,
) -> Result<(), HwError> {
    // Pick a random 32-byte seed.
    let mut rng = OsRng;
    let mut seed = vec![0u8; 32];
    rng.fill_bytes(&mut seed);

    // Generate secret.
    let secret = Secret::<Blake3>::gen(&seed, &value);

    // Generate and serialize commitment.
    let commitment = secret.commit(base, max_number_bits)?;
    let commitment_bytes = commitment.serialize();

    // Generate and serialize a HashWires proof.
    let proof = secret.prove(base, max_number_bits, &threshold)?;
    let proof_bytes = proof.serialize();

    // Verify a range proof over a commitment.
    commitment.verify(&proof, &threshold)?;
    Commitment::<Blake3>::deserialize(&commitment_bytes, base)
        .verify(&Proof::deserialize(&proof_bytes)?, &threshold)
}

HashWires结构示例

HashWires快照 图1. 以4为基的数字312的HashWires承诺结构的全快照。注意,可塑性保护仍在进行中。

性能

HashWires的性能取决于3个参数:所选的基数、支持的最大数和底层哈希函数。

基准测试在2.4 GHz 8核心Intel Core i9 CPU、32GB RAM的MacBook Pro上进行。如图所示,在所选的Intel CPU中,Blake3的性能优于SHA2。虽然确实在支持SHA扩展的AMD Ryzen架构中,BLAKE3只比硬件加速的SHA-256略快。另一个有趣的结果是,由于证明生成内部重新生成承诺来计算最终的树包含证明,因此它比承诺创建略贵。

具有和没有AVX2支持的Bulletproofs、以及用于64位整数、不同基数和哈希函数的HashWires之间的效率比较(单位:微秒)。

方案 承诺生成 证明生成 证明验证
Bulletproofs 71 12099 1555
Bulletproofs AVX2 36 6516 938
HashWires b16 SHA2-256 274 278 84
HashWires b256 SHA2-256 651 656 619
HashWires b16 Blake3 101 103 31
HashWires b256 Blake3 260 263 230

贡献者

此代码的原始作者是Konstantinos Chalkias(《@kchalkias》),Kevin Lewi(《@kevinlewi》)和Yolan Romailler(《@AnomalRoil》)。要了解如何为此项目做出贡献,请参见此文档(《see this document》)。

免责声明

该软件仍在开发中,尚未经过审计。使用风险自负。

许可协议

本项目遵循MIT许可协议

使用条款

隐私政策

依赖项

~6MB
~118K SLoC