http://www.7klian.com

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

这里我们证明我们知道一个见证,见证着民众输入和输出与public.json文件中的输入和输出匹配。
npm install -g circom
还可以通过运行以下呼吁来打印电路的约束:
   signal invb;
[3] remix: https://learnblockchain.cn/tags/Remix
cd factor
# Private Inputs: 2
这个呼吁将利用到 verification_key.json 并生成一个 solidity[2] 代码文件: verifier.sol 。
snarkjs calculatewitness
mkdir factor
}
> snarkjs info -r circuit.r1cs
> snarkjs verify
snarkjs proof
# Outputs: 1
   signal private input a;
这时会生成包括所有信号的见证文件witness.json , 可以打开看一看。
在建设任何证明之前,我们需要计较与(所有)电路约束匹配的所有电路信号。
此刻我们已经生成了见证信息,我们可以建设证明白。
verifier.sol 包括两个合约:Pairings 和 Verifier, 你只需要陈设Verifier 合约。
setup 将输出2 个文件: proving_key.json and verification_key.json
可以复制verifier.sol代码到 remix[3] 举办陈设。
就用 circom circuit.circom -w circuit.wasm生成一个 circuit.wasm 在执行一次见证。
让我们建设一个电路,去证明你可以或许因式解析一个数字!
译者注,假如碰着提示 :Error: ENOENT: no such file or directory, open ‘circuit.wasm’ ERROR: Error: ENOENT: no such file or directory, open ‘circuit.wasm’
默认 snarkjs 将寻找和利用 circuit.r1cs. 我们也可以用 -r <circuit r1csFile> 来指定一个电路文件。
snarkjs printconstraints -r circuit.r1cs
我们随时可以通过输入snarkjs –help 来会见snarkjs的辅佐
生成 Solidity 验证者
对付开拓人员而言,没有什么比利用buggy 编译器更糟糕的了。此刻依旧是编译器的早期阶段,因此存在很多错误,,而且需要完成很多事情。
将电路编译为名为circuit.rlcs的文件
   signal private input b;
1. 安装东西
circom circuit.circom -r circuit.r1cs
1.2 安装 circom 和 snarkjs
上面生成的 Verifier 合约有一个 view 视图函数[4] verifyProof, 假如证明和输入正确,这个函数会返回 true .
# Public Inputs: 0
   signal output c;
snarkjs generatecall
验证证明运行呼吁:
如有任何问题,请与我们接洽。哪怕是一小段修复 bug 的代码。
1.利用下面的内容建设一个 circuit.circom 文件:
template Multiplier() {
原文链接:https://iden3.io/blog/circom-and-snarkjs-tutorial2.html
这个呼吁会利用 verification_key.json, proof.json 和 public.json 来验证有效性。
3.1 查察电路有关的信息
[7] 零常识证明: https://learnblockchain.cn/categories/zero

假如一切正常,要领应该返回 true。
假如仅变动参数中的任何位,则可以查抄功效返回 false 。
在真实的电路中,您大概需要建设一个 git 客栈,个中包括circuits目次和一个包括所有测试的test目次,以及用于构建所有电路的剧本。
该电路尚有另一个问题,那就是该运算可以在 Zr 中事情,因此我们还必需担保乘法不会溢出。这可以通过二进制化输入并查抄范畴来修复,让我们留着在之后的教程里先容。
要显示电路的信息,可以运行:
可以利用Rinkeby,Kovan或Ropsten等测试网,也可以利用Javascript VM,也许在某些欣赏器中,验证会花很长时间,而且大概会挂起页面,请知晓。
[4] view 视图函数: https://learnblockchain.cn/docs/solidity/contracts/functions.html?#view
这个电路有2个 private 输入信号,名为 a 和 b ,尚有一个输出 c.
   c <== a*b;
circom 语言的一个长处是可以把<== 分为两个行动 : <– 和 === 。
我们约束不接管 1 作为任何一个值,这里利用 0 不行逆的特性,即(a-1) 不行逆。
2.1 建设一个电路目次
snarkjs setup
我们写好了一些根基的电路,如:binaritzations、comparators, eddsa, hashes, merkle trees 等等,可以在circomlib[6] 找到,尚有更多电路在开拓中。
摸索更多
3. 将编译后的电路放入 snarkjs
proof.json 文件包好了实际的证明。而 public.json 文件将仅包括果真的输入和输出值。
让我们建设一个input.json 文件:
为了利便挪用,可以利用snarkjs通过输入以下呼吁来生成挪用的参数:
运行:

在本教程里将指导您建设第一个零常识 zkSnark电路。它将先容各类编写电路的技能,并向您展示如何建设证明并在[1]长举办链外和链上验证。
   signal private input a;
component main = Multiplier();
此刻为电路运行启动设置:
裂痕修复
留意:编译电路时,必需始终有一个名为main的组件。
小结
OK
   inva <– 1/(a-1);
snarkjs会帮我们计较这些。我们需要提供一个包括输入的文件,它将执行电路并计较所有中间信号和输出。这组信号就是“见证”。
这个呼吁默认会利用 prooving_key.json和 witness.json 文件去生成 proof.json 和 public.json
[1] 以太坊: https://learnblockchain.cn/categories/ethereum/
此刻电路已经编译好了,我们将继承利用snarkjs。
2.2 编译电路
本译文获得 登链社区 及 Cell Network 赞助支持。
References
   (b-1)*invb === 1;
}
假如 a 是 1 则 (a-1)*inv = 1 是不行能创立的, 通过 1/(a-1) 来计较 inv 。
The verifier contract deployed in the last step has a view function called verifyProof.
# Constraints: 1
template Multiplier() {
npm install -g snarkjs
在声明 Multiplier 模板之后, 我们利用名为main的组件实例化它。
零常识证明证明你知道一组与所有约束匹配的信号(见证),但不透露任何信号(民众输入和输出除外)。
电路做的工作是让强制信号 c 为 a*b 的值。
阅读我们的 代码库[5] 相识更多 circom 的特性。
最后,享受零常识证明[7]!
链上验证证明
需要在电脑中安装Node.js,Node.js 的最新的不变版本(或8.12.0)可以正常事情。不外,假如您安装了当前的最新版本的Node.js(10.12.0),将会看到明显的机能晋升。这是因为最新版本自己包括大数库(Big Integer Libraries)。 snarkjs 库会操作这些特性(假如可用的话),从而将机能提高10倍(!)。
snarkjs generateverifier
# Wires: 4
假如验证通过会输出OK, 不然会显示 INVALID 。
   signal inva;
[2] solidity: https://learnblockchain.cn/docs/solidity/
生成证明
修改电路:
component main = Multiplier();
1.建设一个 factor 目次,教程里的所有文件都将放在这个下面
签名提到了一个裂痕,此刻来通过添加一些特另外约束修复电路。
此刻,我们筹备编译电路。运行以下呼吁:
因此,您想证明本身知道3和11。(虽然,你可以始终利用1 和 数字自己作为 a 和 b,我们稍后将处理惩罚此问题。)
验证证明
   signal private input b;
[5] 代码库: https://github.com/iden3/circom
3.3. 计较见证(witness)
=== 操纵符添加约束而不分派值。
<– 和 –> 操纵符运算符只为信号分派一个值,而不建设任何约束。
[6] circomlib: https://github.com/iden3/circomlib
1.1 先决条件
   invb <– 1/(b-1);
   signal output c;
这呼吁的输出复制到 Remix 中的 verifyProof 要领的 parameters 字段中,挪用 verifyProof ,
   (a-1)*inva === 1;
2. 利用 circuit
3.2 用 snarkjs 启动设置
譬喻,想像一下,你想证明本身可以或许因式解析33,这意味着你知道两个数 a 和 b ,将它们相乘为 33。
   c <== a*b;
 {“a”: 3, “b”: 11}
此刻计较见证:

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。