在这个教程中,我们将学习如何开发一个基于以太坊的零知识身份证明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关注打赏
热门博文
- DevOps实践教程 华为云 系列教程2021 合集
- ❤️Python Django网站开发 2021年最新版教程 合集❤️
- ❤️java多线程并发编程入门 教程合集❤️
- ❤️区块链Hyperledger Fabric 老版本 1.1.0 快速部署安装 教程合集❤️
- ❤️Docker教程小白实操入门 教程合集❤️
- ❤️微信小程序 云开发 教程合集(视频+图文)免费❤️
- C++ boost::asio::io_service创建线程池thread_group简单实例
- C++ error: ‘shared_ptr’ was not declared in this scope
- git 代码回滚回退到指定版本 并 提交
- C++ 得到map中最后一个元素