1个不稳定发布
0.1.0 | 2021年6月9日 |
---|
#1623 in 加密学
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的commitment
和proof
,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结构示例
图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