在这个教程中,我们将学习如何开发一个基于以太坊的零知识身份证明DApp, 学习如何开发Circom零知识电路、如何生成并方法Solidity零知识验证智能合约, 以及如何利用Javascript在链下生成零知识证据,并在教程最后提供完整的源代码下载。
1、零知识身份证明DApp概述
我们将开发一个零知识应用来证明一个用户属于特定的群组 而无需透露用户的具体信息,使用流程如下图所示:
我们的开发过程分为以下几个步骤:
- 开发零知识电路
- 生成用于验证零知识电路的Solidity库
- 开发智能合约并集成上述Solidity库
- 本地生成证据并在链上进行验证
2、零知识证明以太坊DApp开发环境搭建
就像你不需要完全理解HTTP协议也可以开发web应用一样,已经有很多 工具可以帮助开发基于零知识的DApp而无需密码学或数学基础。
我推荐如下的开发语言和工具链:
- JavaScript/TypeScript:应用采用javascript/typescript开发,因为这两者在以太坊生态中得到很好的支持
- Solidity: 智能合约用Solidity开发,因为它很成熟并且社区很好
- Truffle:使用Truffle作为智能合约开发和部署框架
- Circom:使用Circom来开发零知识证明电路
3、CIRCOM零知识电路开发:判断私钥是否匹配公钥集
我们的目标是创建一个电路,该电路可以判别输入的私钥是否对应 于输入的公钥集合之一。该电路的伪代码如下:
1 | // Note that a private key is a scalar value (int) |
我们现在要开始用circom编写零知识电路了。circom的语法可以查阅 其官方文档。
首先创建项目文件夹并安装必要的依赖包:
1 | npm install circom circomlib snarkjs websnark |
现在编写电路文件circuit.circom,首先引入(incluude)必要的基础电路 并定义PublicKey模板:
1 | include "../node_modules/circomlib/circuits/bitify.circom"; |
PublicKey模板的作用是在babyJubJub曲线上找出私钥(电路输入)对应的公钥(电路输出)。 注意在上面的电路中,我们将输入私钥声明为私有信号,因此在生成的证据中不会包含 任何可以重构该输入私钥的信息。
一旦完成上述的基础模块,现在就可以构建我们的零知识证明电路的主逻辑了 —— 验证 指定的用户是否属于一个群组:
1 | include ... |
现在我们编译、设置并生成该电路的Solidity验证器:
1 | $(npm bin)/circom circuits/circuit.circom -o build/circuits/circuit.json |
注意我们使用groth协议生成证明密钥和验证密钥,因为我们希望使用websnark来生成证据, 因为websnark要比snarkjs性能好的多。
一旦完成上面的环节,我们就已经实现了零知识证明逻辑。下面的部分我们将 介绍如何使用生成的Solidity零知识验证合约。
4、Solidity零知识验证合约
在完成零知识电路的设置之后,会生成一个名为Verifier.sol的solidity库。如果 你查看这个文件的内容,就会看到其中包含如下的函数:
1 | ... |
这是用于验证零知识证据有效性的辅助函数。verifyProof函数接收4个参数,但是 我们只关心其中表示电路公共输入的input参数,我们将使用它在智能合约代码中 验证用户的身份。让我们看一下具体的实现代码:
1 | pragma solidity 0.5.11; |
我们创建一个新的合约ZkIdentity.sol,它继承自生成的Verifier.sol, 有一个包含2个成员公钥的初始群组,以及一个名为isInGroup的函数,该函数 首先验证电路的公开输入信号与智能合约中的群组一致,然后返回对输入 证据的验证结果。
逻辑并不复杂,不过的确也满足了我们的目标:验证一个用户属于特定 的群组而无需透露用户是谁。
在继续下面的部分之前,需要先部署合约到链上。
5、用JavaScript生成零知识证据并与智能合约交互
一旦我们完成了零知识电路并实现了智能合约逻辑,就可以生成证据 并调用智能合约的isInGroup方法进行验证了。
下面的伪代码展示了如何生成证据并利用智能合约进行验证,你可以 访问这里 查看完整的js代码:
1 | // Assuming below already exists |
运行js代码就可以证明你属于一个群组而无需透露你是谁!
教程的完整代码下载地址。
原文链接:A Practical Guide To Building Zero Knowledge dApps
汇智网翻译整理,转载请标明出处