您当前的位置: 首页 >  区块链
  • 0浏览

    0关注

    1477博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

区块链 solidity 零知识证明DApp开发实践【身份证明/以太坊】

软件工程小施同学 发布时间:2022-02-16 14:08:31 ,浏览量:0

在这个教程中,我们将学习如何开发一个基于以太坊的零知识身份证明DApp, 学习如何开发Circom零知识电路、如何生成并方法Solidity零知识验证智能合约, 以及如何利用Javascript在链下生成零知识证据,并在教程最后提供完整的源代码下载。

区块链开发教程链接: 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple

1、零知识身份证明DApp概述

我们将开发一个零知识应用来证明一个用户属于特定的群组 而无需透露用户的具体信息,使用流程如下图所示:

我们的开发过程分为以下几个步骤:

  • 开发零知识电路
  • 生成用于验证零知识电路的Solidity库
  • 开发智能合约并集成上述Solidity库
  • 本地生成证据并在链上进行验证
2、零知识证明以太坊DApp开发环境搭建

就像你不需要完全理解HTTP协议也可以开发web应用一样,已经有很多 工具可以帮助开发基于零知识的DApp而无需密码学或数学基础。

我推荐如下的开发语言和工具链:

  • JavaScript/TypeScript:应用采用javascript/typescript开发,因为这两者在以太坊生态中得到很好的支持
  • Solidity: 智能合约用Solidity开发,因为它很成熟并且社区很好
  • Truffle:使用Truffle作为智能合约开发和部署框架
  • Circom:使用Circom来开发零知识证明电路
3、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             
关注
打赏
1665320866
查看更多评论
立即登录/注册

微信扫码登录

0.0643s