1. 首页
  2. 区块链手艺

零常识证实 circom 及 snarkjs 入门教程[译]

在本教程里将指导您创建第一个零常识 zkSnark电路。它将先容各类编写电路的手艺,并向您揭示若何创建证实并在以太坊[1]上遏制链外和链上考证。

1. 装配东西

1.1 先决前提

需要在电脑中装配Node.js,Node.js 的最新的动摇版本(或8.12.0)能够或许或许或许一般使命。不过,假设您装配了今后的最新版本的Node.js(10.12.0),将会看到光鲜明显的功效晋升。这是因为最新版本本身包含大数库(Big Integer Libraries)。 snarkjs 库会利用这些特征(假设可用的话),从而将功效前进10倍(!)。

1.2 装配 circom 和 snarkjs

运行:

npm install -g circom
npm install -g snarkjs

2. 利用 circuit

让咱们创建一个电路,去证实你能够或许或许或许因式分化一个数字!

2.1 创建一个电路目次

1.创建一个 factor 目次,教程里的统统文件都将放在这个上面

mkdir factor
cd factor

在实在的电路中,您能够或许或许或许需要创建一个 git 堆栈,此中包含circuits目次和一个包含统统测试的test目次,和用于构建统统电路的剧本。

1.利用上面的内容创建一个 circuit.circom 文件:

template Multiplier() {
   signal private input a;
   signal private input b;
   signal output c;
   c <== a*b;
}

component main = Multiplier();

这个电路有2个 private 输出旌旗灯号,名为 a 和 b ,另有一个输出 c.

电路做的任务是让逼迫旌旗灯号 c 为 a*b 的值。

在申明 Multiplier 模板以后, 咱们利用名为main的组件实例化它。

寄望:编译电路时,必需一向有一个名为main的组件。

2.2 编译电路

现在,咱们豫备编译电路。运行以下号令

circom circuit.circom -r circuit.r1cs

将电路编译为名为circuit.rlcs的文件

3. 将编译后的电路放入 snarkjs

现在电路曾编译好了,咱们将延续利用snarkjs。

咱们随时能够或许或许或许颠末输出snarkjs –help 来访问snarkjs的辅佐

3.1 查抄电路有关的信息

要显现电路的信息,能够或许或许或许运行:

> snarkjs info -r circuit.r1cs
# Wires: 4
# Constraints: 1
# Private Inputs: 2
# Public Inputs: 0
# Outputs: 1

还能够或许或许或许颠末运行以下号令来打印电路的束缚:

snarkjs printconstraints -r circuit.r1cs

3.2 用 snarkjs 启动设置装备摆设

现在为电路运行启动设置装备摆设:

snarkjs setup

默认 snarkjs 将寻觅和利用 circuit.r1cs. 咱们也能够或许或许或许用 -r <circuit r1csFile> 来指定一个电路文件。

setup 将输出2 个文件: proving_key.json and verification_key.json

3.3. 计较见证(witness)

在创建任何证实之前,咱们需要计较与(统统)电路束缚匹配的统统电路旌旗灯号。

snarkjs会帮咱们计较这些。咱们需要供给一个包含输出的文件,它将履行电路并计较统统两端旌旗灯号和输出。这组旌旗灯号便是“见证”。

零常识证实证实你知道一组与统统束缚匹配的旌旗灯号(见证),但不泄露任何旌旗灯号(大众输出和输出除外)。

比方,想像一下,你想证实自己能够或许或许或许因式分化33,这象征着你知道两个数 a 和 b ,将它们相乘为 33。

因此,您想证实自己知道3和11。(固然,你能够或许或许或许一向利用1 和 数字本身作为 a 和 b,咱们稍后将措置此成就。)

让咱们创建一个input.json 文件:

 {“a”: 3, “b”: 11}

现在计较见证:

snarkjs calculatewitness

这时候会天生包含统统旌旗灯号的见证文件witness.json , 能够或许或许或许掀开看一看。

译者注,假设碰到提醒 :Error: ENOENT: no such file or directory, open ‘circuit.wasm’ ERROR: Error: ENOENT: no such file or directory, open ‘circuit.wasm’

就用 circom circuit.circom -w circuit.wasm天生一个 circuit.wasm 在履行一次见证。

天生证实

现在咱们曾天生了见证信息,咱们能够或许或许或许创建证实了。

snarkjs proof

这个号令默认会利用 prooving_key.json和 witness.json 文件去天生 proof.json 和 public.json

proof.json 文件包好了理论的证实。而 public.json 文件将仅包含公然的输出和输出值。

考证证实

考证证实运行号令:

> snarkjs verify
OK

这个号令会利用 verification_key.json, proof.json 和 public.json 来考证有效性。

这里咱们证实咱们知道一个见证,见证着大众输出和输出与public.json文件中的输出和输出匹配。

假设考证颠末会输出OK, 不然会显现 INVALID 。

天生 Solidity 考证者

snarkjs generateverifier

这个号令将利用到 verification_key.json 并天生一个 solidity[2] 代码文件: verifier.sol 。

能够或许或许或许复制verifier.sol代码到 remix[3] 遏制安排。

verifier.sol 包含两个合约:Pairings 和 Verifier, 你只需要安排Verifier 合约。

能够或许或许或许利用Rinkeby,Kovan或Ropsten等测试网,也能够或许或许或许利用Javascript VM,或许在某些浏览器中,考证会花很长功夫,并且能够或许或许或许会挂起页面,请晓得。

链上考证证实

上面天生的 Verifier 合约有一个 view 视图函数[4] verifyProof, 假设证实和输出准确,这个函数会前去 true .

The verifier contract deployed in the last step has a view function called verifyProof.

为了便利挪用,能够或许或许或许利用snarkjs颠末输出以下号令来天生挪用的参数:

snarkjs generatecall

这号令的输出复制到 Remix 中的 verifyProof 方式的 parameters 字段中,挪用 verifyProof ,

假设统统一般,方式应当前去 true。

假设仅变动参数中的任何位,则能够或许或许或许检讨效果前去 false 。

马脚修复

署名提到了一个马脚,现在来颠末增加一些额外的束缚修来电路。

咱们束缚不蒙受 1 作为任何一个值,这里利用 0 不可逆的特征,即(a-1) 不可逆。

假设 a 是 1 则 (a-1)*inv = 1 是不能够或许或许或许建立的, 颠末 1/(a-1) 来计较 inv 。

批改电路:

template Multiplier() {
   signal private input a;
   signal private input b;
   signal output c;
   signal inva;
   signal invb;

   inva <– 1/(a-1);
   (a-1)*inva === 1;
   invb <– 1/(b-1);
   (b-1)*invb === 1;

   c <== a*b;
}

component main = Multiplier();

circom 语言的一个好处是能够或许或许或许把<== 分为两个行动 : <– 和 === 。

<– 和 –> 操纵符运算符只为旌旗灯号分派一个值,而不创建任何束缚。

=== 操纵符增加束缚而不分派值。

该电路另有另外一个成就,那便是该运算能够或许或许或许在 Zr 中使命,因此咱们还必需保障乘法不会溢出。这能够或许或许或许颠末二进制化输出并检讨规模来修复,让咱们留着在以后的教程里先容。

探讨更多

浏览咱们的 代码库[5] 懂得更多 circom 的特征。

咱们写好了一些底子的电路,如:binaritzations、comparators, eddsa, hashes, merkle trees 等等,能够或许或许或许在circomlib[6] 找到,另有更多电路在开辟中。

小结

对开辟职员而言,不甚么比利用buggy 编译器更糟糕的了。现在仍是是编译器的初期阶段,因此存在很多毛病,并且需要完成很多使命。

若有任何成就,请与咱们接洽。哪怕是一小段修复 bug 的代码。

最后,享受零常识证实[7]!

原文链接:http://iden3.io/blog/circom-and-snarkjs-tutorial2.html

本译文失掉 登链社区 及 Cell Network 帮助撑持。

References

[1] 以太坊: http://learnblockchain.cn/categories/ethereum/
[2] solidity: http://learnblockchain.cn/docs/solidity/
[3] remix: http://learnblockchain.cn/tags/Remix
[4] view 视图函数: http://learnblockchain.cn/docs/solidity/contracts/functions.html?#view
[5] 代码库: http://github.com/iden3/circom
[6] circomlib: http://github.com/iden3/circomlib
[7] 零常识证实: http://learnblockchain.cn/categories/zero

首创文章,作者:区块腾,如若转载,请说明来由:http://asongge.com/0031129.html 《零常识证实 circom 及 snarkjs 入门教程[译]》

颁发批评

电子邮件地点不会被公然。 必填项已用*标注

接洽咱们

在线征询:

邮件:快乐飞艇一到十名怎么玩:[email protected]

任务时候:周一至周五,9:30-18:30,节沐日歇息

快乐飞艇做任务靠谱吗 快乐飞艇综合走势图 快乐飞艇开奖结果 快乐飞艇官网 快乐飞艇app首页 熊猫乐园快乐飞艇 快乐飞艇开奖 华创投资快乐飞艇靠谱吗 快乐飞艇计划 快乐飞艇技巧 快乐飞艇开奖记录天天 快乐飞艇彩票