实践指南:构建一个零知识证明 DApp [译]

实践指南:构建一个零知识证明 DApp [译]
零知识证明
DApp
circom
snarkjs
本文将构建一个zk-dApp(零知识证明 DApp),以证明用户是否属于某个特定组,而无需透露用户具体是谁。

阅读本文前,最好先对以下内容有所了解:

public-key cryptography
circom 及 snarkjs 使用
truffle使用
ethers 连接合约
前言
在过去的几个月中,我在以太坊eth上利用了零知识证明(尤其是zk-SNARKs)创建了几个简单的dApp。

我在创建DApp时,几乎没有什么零知识证明资料可供参考,因此我想在博客文章中分享一下创建一个零知识证明 dApp的经验。

这篇博客文章的目的是充当一个实践指南,以帮助读者建立他们的第一个零知识dApp。

注意:此博客文章假定读者对公钥加密有基本的了解,以及知晓如何部署合约和在 JavaScript 中与合约交互。

概述
我们将构建一个zk-dApp,以证明用户是否属于某个特定组,而无需透露用户具体是谁。

此 zk-dApp 的用户流程如下图:

实践指南:构建一个零知识证明 DApp [译]

图 1: Zk-dApp身份验证-用户流程图
开发的流程有以下几个步骤:

编写零知识电路
生成用于验证零知识电路的Solidity代码库
编写智能合约逻辑,并集成步骤 2生成的 Solidity 代码库
部署合约.
本地生成证明,并在链上进行验证。
开发环境搭建及工具
就像如今不需要了解HTTP协议来进行Web开发一样,零知识dApp开发具有足够现代的工具,可以使不一定具有密码学数学背景的开发者(例如:我)利用零知识证明构建应用程序 。

以下是我推荐的开发语言和工具:

使用JavaScript/TypeScript 开发 DApp,本身有丰富的生态以及对以太坊eth也有非常好的支持
使用Solidity 开发智能合约,足够成熟、社区很好
使用Truffle 部署合约
使用Circom 开发零知识证明电路
零知识证明电路
我们的目标是创建一个电路:该电路可以判别输入的私钥是否对应于输入的公钥集合之一。

电路中,当且仅当私钥对应于其中一个公钥(约束)时才构造证明。电路的伪代码如下:

// 请注意,私钥是标量值(int) // 而公钥是空间中的一个点(Tuple[int, int]) const zk_identity = (private_key, public_keys) => { // derive_public_from_private 是一个用来返回私钥对应公钥的函数 derived_public_key = derive_public_from_private(private_key) for (let pk in public_keys): if derived_public_key === pk: return true return false }
现在&#

你可能感兴趣的:(区块链)