在这个教程中,我们将学习如何开发一个基于以太坊的零知识身份证明DApp, 学习如何开发Circom零知识电路、如何生成并方法Solidity零知识验证智能合约, 以及如何利用Javascript在链下生成零知识证据,并在教程最后提供完整的源代码下载。
区块链开发教程链接: 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple
1、零知识身份证明DApp概述我们将开发一个零知识应用来证明一个用户属于特定的群组 而无需透露用户的具体信息,使用流程如下图所示:
我们的开发过程分为以下几个步骤:
- 开发零知识电路
- 生成用于验证零知识电路的Solidity库
- 开发智能合约并集成上述Solidity库
- 本地生成证据并在链上进行验证
就像你不需要完全理解HTTP协议也可以开发web应用一样,已经有很多 工具可以帮助开发基于零知识的DApp而无需密码学或数学基础。
我推荐如下的开发语言和工具链:
- JavaScript/TypeScript:应用采用javascript/typescript开发,因为这两者在以太坊生态中得到很好的支持
- Solidity: 智能合约用Solidity开发,因为它很成熟并且社区很好
- Truffle:使用Truffle作为智能合约开发和部署框架
- Circom:使用Circom来开发零知识证明电路
我们的目标是创建一个电路,该电路可以判别输入的私钥是否对应 于输入的公钥集合之一。该电路的伪代码如下:
1 2 3 4 5 6 7 8 9 10 11
// Note that a private key is a scalar value (int) // whereas a public key is a point in space (Tuple[int, int]) const zk_identity = (private_key, public_keys) => { // derive_public_from_private is a function that // returns a public key given a private key derived_public_key = derive_public_from_private(private_key) for (let pk in public_keys): if derived_public_key === pk: return true return false }
我们现在要开始用circom编写零知识电路了。circom的语法可以查阅 其官方文档。
首先创建项目文件夹并安装必要的依赖包:
1 2 3 4 5 6 7
npm install circom circomlib snarkjs websnark mkdir contracts mkdir circuits mkdir -p build/circuits touch circuits/circuit.circom
现在编写电路文件circuit.circom,首先引入(incluude)必要的基础电路 并定义PublicKey模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
include "../node_modules/circomlib/circuits/bitify.circom"; include "../node_modules/circomlib/circuits/escalarmulfix.circom"; include "../node_modules/circomlib/circuits/comparators.circom"; template PublicKey() { // Note: private key needs to be hashed, and then pruned // to make sure its compatible with the babyJubJub curve signal private input in; signal output out[2]; component privBits = Num2Bits(253); privBits.in关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?