零知识证明:STARKs vs SNARKs
Posted szuwaterbrother
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零知识证明:STARKs vs SNARKs相关的知识,希望对你有一定的参考价值。
新技术之间的冲突
纵观历史,总是有类似的技术在同一时间上市,它们寻求相似的结果,但以不同的方式解决问题。当这种市场现象发生时,我们应该尝试客观地评估每项技术。
由于 STARK 阵营和 SNARK 阵营都对各自的技术充满热情,我们认为对这两种技术进行客观比较会很有趣。
零知识证明
零知识证明的想法最初是在1980年的一份学术论文中——《交互性证明系统的知识复杂度》中被提出。论文中提到:证明者可以在不披露信息本身的情况下向验证者证实信息的真实性。
从更技术的角度说,ZKP 是证明者与验证者两方之间的一个协议,证明者可以在不透露证明本身之外任何信息的前提下,让验证者确认某项证明是有效的。这是证明的“零知识”部分——没有知识或信息可以支持这条证明,除了证明本身。这听起来毫无道理,也似乎是不可能的。正是如此,这些技术才更加重要。
经常拿来解释 ZKP 的例子是一个名叫《寻找 Waldo》的游戏。证明者如何利用零知识来向验证者证明他知道 Waldo 在图中的哪个地方。一般的情况来说,证明者只需要在图上指出 Waldo 的位置即可,或者说 Waldo 在红白条纹的帐篷旁边,这样通过提供知识来向验证者证明他确实知道 Waldo 在哪儿。
但是如果用零知识的方法,证明者需要拿出一张纸,在中间剪个洞,并将洞放在 Waldo 上面来展示给验证者。这样,验证者可以看到 Waldo,知道证明者说的是真的,而且过程中也没有任何知识/信息的泄露。
STARK 与 SNARK
当今市场上最引人注目的两种零知识技术是 zk-STARKs 和 zk-SNARKs。两者都是双方证明知识的方法的缩写:zk-STARK代表零知识可扩展透明知识论证,zk-SNARK代表零知识简洁非交互式知识论证。这篇文章将深入探讨从文化和技术角度探讨这两种不同的零知识技术之间的核心差异。此外,这两种零知识技术本质上都是非交互的,这意味着代码可以自主部署和运行。
以下是两者对比的数据表格
zk-SNARK 的未来
zk-SNARKs 是匿名加密交易的有用工具。但它们也有助于为隐私币以外的越来越多的其他应用程序提供动力。例如,Celo 是一种加密货币协议,专注于移动支付,并渴望创造一个更具包容性的金融世界。
Mohan 特别指出了 zk-SNARKs 如何帮助发展中国家的人们。
“如果我们现在考虑这些人如何能够使用加密货币,这几乎是不可能的,他们没有使用 Metamask,而是将 10,000 美元投入到一个随机的 DeFi 项目中,”他说。Mohan 补充说,使用 zk-SNARKs,手机用户可以立即与区块链同步——保留与加密相同的无需许可属性,但这种属性不具备高度技术能力的设备上。
尽管有他们的承诺,zk-SNARKs 仍然非常小众。即使在像加密这样的高科技行业,很多人也不知道他们是什么。但随着越来越多的公司开始采用这项技术,这种情况可能会发生变化。
其中包括Aleo,这是一家最近从蓝筹风险投资公司筹集了 2800 万美元的初创公司,旨在构建工具,让 Web 开发人员将零知识证明集成到各种 Internet 应用程序中——该项目承诺让消费者在不泄露信息的情况下浏览 Web大量个人数据。
🚀 Aleo定义了互联网的新标准。它采用创新的方法来保障安全、隐私和数据所有权。用户不再需要牺牲他们永远无法返回的信息,Web 服务也不会冒他们的个人数据的风险。
服务提供商必须管理在存储、处理或披露不当时可能危及其业务的机密数据。
Aleo介绍
使用 zk-SNARKs 的可编程零知识证明:第 3 部分
之前,我们已经展示了如何使用称为零知识密钥声明证明 (ZKKSP) 的技术为以下声明构建零知识证明 (ZKP)。
基本上,它证明了不仅证明者知道给定公钥的密钥,而且还证明知道给定摘要的秘密哈希,而不会泄露秘密。
虽然 ZKKSP 有效,但它有一个严重的限制:它只适用于一种特定形式的声明,即秘密是给定公钥的私钥,也是给定哈希的原像。
目前尚不清楚如何将其扩展为稍作修改的声明,例如,除了作为私钥和原像之外,私钥也是偶数。此外,提出它需要密码学的专利级知识,例如 ∑ 协议和承诺方案。
使用 zkSNARKs 的 ZKKSP
我们通过利用 zkSNARKs 的可编程性来重新实现 ZKKSP。我们简单地将第 2 部分中使用的椭圆曲线点乘法和散列库结合起来。生成的 Circom 代码如下所示:
// library circuits from https://github.com/0xPARC/circom-ecdsa
include "lib-circom-ecdsa/ecdsa.circom";
include "../node_modules/circomlib/circuits/sha256/sha256.circom";
include "../node_modules/circomlib/circuits/bitify.circom";
// `n`: chunk length in bits for a private key
// `k`: chunk count for a private key
template Main(n, k)
// n * k == 256
assert(n * k >= 256);
assert(n * (k-1) < 256);
// little-endian
signal private input privkey[k];
signal public input pubkey[2][k];
signal public output privkeyHash[k];
// get pubkey from privkey
component privToPub = ECDSAPrivToPub(n, k);
for (var i = 0; i < k; i++)
privToPub.privkey[i] <== privkey[i];
// verify input pubkey
signal pub_x_diff[k];
signal pub_y_diff[k];
for (var i = 0; i < k; i++)
pub_x_diff[i] <-- privToPub.pubkey[0][i] - pubkey[0][i];
pub_x_diff[i] === 0;
pub_y_diff[i] <-- privToPub.pubkey[1][i] - pubkey[1][i];
pub_y_diff[i] === 0;
// calculate sha256 of privkey
component sha256 = Sha256(256);
for (var i = 0; i < k; i++)
for (var j =0; j < n; j++)
// change privkey to big-endian as sha256 input
sha256.in[i * n + j] <-- (privkey[k-1-i] >> (n-1-j)) & 1;
// set output
component b2n[k];
for (var i = 0; i < k; i++)
b2n[i] = Bits2Num(n);
for(var j = 0; j < n; j++)
// `b2n` input is little-endian in bits, `sha256` out is big-endian in bits
b2n[i].in[n-1-j] <== sha256.out[i * n + j];
privkeyHash[i] <== b2n[i].out;
component main public [pubkey] = Main(64, 4);
和以前一样,我们在第 15
行使用 ECDSAPrivToPub
从第 14
行的私钥派生出一个公钥(注意它被声明为私有)。然后我们使用第 3
行导入的 sha256
库中的 Sha256
对相同的私钥进行哈希处理,以确保结果与第 17
行的给定哈希匹配。我们刚刚“编程” 实现了 ZKKSP,不需要高级密码学的先验知识。此外,由于 zkSNARKs 的可组合性,我们可以轻松地对其进行扩展以添加对秘密的约束,例如,秘密是偶数。
可以在这里找到一个测试。
以上是关于零知识证明:STARKs vs SNARKs的主要内容,如果未能解决你的问题,请参考以下文章
零知识证明ZK-SNARKs的Circom 电路和 Snarks (翻译)
零知识证明ZK-SNARKs的Circom 电路和 Snarks (翻译)