售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
在本教程中,将指导您创建第一个零知识的zkSnark电路。它将介绍写电路的各种技术,并向您展示如何在以太网广场[1]上创建证书并执行链外和链上验证。
1.安装工具
1.1先决条件
需要在计算机中安装Node.js,并且Node.js的最新稳定版本(或8.12.0)可以正常工作。但是,如果您安装最新版本的Node.js(10.12.0),您将看到显著的性能改进。这是因为最新版本本身包含大型整数库。snarkjs库将利用这些特性(如果可用的话)将性能提高10倍。).
1.2 circom和snarkjs的安装
运行:
npm安装-g循环
npm安装-g snarkjs
2.使用电路
让我们创建一个电路来证明你能分解一个数!
2.1创建电路目录
1.创建因子目录。教程中的所有文件都将放在这个目录下。
mkdir因子
cd因子
在真实的电路中,您可能需要创建一个包含电路目录的git存储库和一个包含所有测试的测试目录,以及用于构建所有电路的脚本。
1.使用以下命令创建circuit.circom文件:
模板乘数(){
信号专用输入a;
信号专用输入b;
信号输出c;
c==a*b。
}
主要成分=乘数();
该电路有两个专用输入信号,即a和b,以及一个输出c。
该电路的作用是将强制信号c变成a * b的值。
在声明了乘数模板之后,我们用一个名为main的组件实例化了它。
注意:编译电路时,必须有一个名为main的组件。
2.2编译电路
现在,我们要编译电路。运行以下命令:
circom电路. circom -r电路. r1cs
将电路编译成一个名为circuit.rlcs的文件
3.将编译后的电路放入snarkjs。
既然电路已经编译好了,我们将继续使用snarkjs。
通过输入snarkjs - help,我们可以随时访问snarkjs帮助。
3.1查看电路信息
要显示电路信息,您可以运行:
snarkjs info -r circuit.r1cs
# Wires: 4
#约束3360 1
#私人输入: 2
#公共输入: 0
#输出3360 1
您也可以通过运行以下命令来打印电路约束:
snarkjs print constraints-r circuit . r1cs
3.2使用snarkjs启动配置
立即启动电路运行配置:
snarkjs设置
默认的snarkjs将查找并使用circuit.r1cs我们也可以使用-r circuit r1csFile来指定一个电路文件。
安装程序将输出两个文件:providing _ key.json和verification _ key.json。
3.3。计算的见证
在创建任何证明之前,我们需要计算所有匹配(所有)电路约束的电路信号。
Snarkjs将帮助我们计算这些。我们需要提供一个包含输入的文件,该文件将执行电路并计算所有中间信号和输出。这组信号是“见证”。
零知识证明证明你知道一组匹配所有约束的信号(见证),但不揭示任何信号(除了公共输入和输出)。
例如,假设你想证明你能分解33,这意味着你知道两个数字A和B,然后把它们乘以33。
因此,你想证明你知道3和11。(当然,你总是可以用1和数字本身作为A和B,我们稍后会处理这个问题。)
让我们创建一个input.json文件:
{'a': 3,' b': 11}
现在计算证人:
snarkjs calculatewitness
此时,将生成包含所有信号的witness.json,并可以打开查看。
翻译者注意:如果提示:错误:没有这样的文件或目录,打开“电路。wasm”错误:没有这样的文件或目录,打开“电路。wasm”
只需使用circom circuit . circom-wccircuit . wasm生成一个电路。
生成证明
既然我们已经生成了证人信息,我们就可以创建证据了。
snarkjs证明
默认情况下,此命令使用prooving _ key.json和witness.json文件生成proof.json和public.json。
JSON文件包装了实际的证明。public.json文件将只包含公共输入和输出值。
检定证书
验证证书运行命令:
snarkjs验证
好的
该命令使用verification _ key.json、proof.json和public.json来验证有效性。
这里我们证明我们知道一个见证,公共输入和输出匹配public.json文件中的输入和输出。
如果验证通过,将输出“确定”,否则将显示“无效”。
生成可靠性验证器
snarkjs generateverifier
这个命令将使用verification_key.json并生成一个可靠的[2]代码文件
你可以复制验证器. sol代码来重新混合[3]进行部署。
验证者包括两个契约:配对和验证者。您只需要部署验证者契约。
您可以使用测试网络,如林克比、科万或罗斯坦,或者您可以使用Javascript虚拟机。也许在某些浏览器中,验证需要很长时间,页面可能会挂起,请知道。
链式验证的证明
上面生成的验证者契约有一个视图函数[4]验证证明,如果证明和输入正确,它将返回真。
最后一步中部署的验证者契约有一个名为verifyProof的视图函数。
为了方便调用,snarkjs可以通过输入以下命令来生成调用的参数:
snarkjs generatecall
该命令的输出被复制到Remix中的VerifyProduct方法的参数字段,调用VerifyProduct。
如果一切正常,该方法应该返回true。
如果参数中只有任何一位被更改,检查结果可能会返回false。
漏洞修复
签名提到了一个漏洞,现在我们将通过添加一些额外的约束来修复电路。
我们不得不接受1作为任何值。这里,我们使用0的不可逆性质,即,(a-1)不可逆。
如果A是1,(a-1)*inv=1是不可能的,inv由1/(a-1)计算。
修改电路:
模板乘数(){
信号专用输入a;
信号专用输入b;
信号输出c;
信号inva
信号invb
inva-1/(a-1);
(a-1)* inva===1;
inv b-1/(b-1);
(b-1)* invb===1;
c==a*b。
}
主要成分=乘数();
circom语言的优点之一是==可以分为两个动作:-和===。
运算符只为信号指定一个值,而不创建任何约束。
===运算符在不赋值的情况下添加约束。
这个电路的另一个问题是运算可以在Zr中进行,所以我们还必须确保乘法不会溢出。这可以通过二进制化输入并检查范围来解决。让我们把它留到以后的教程中。
探索更多
阅读我们的代码库[5]了解更多关于circom的功能。
我们已经写了一些基本的电路,如二进制,比较器,EDD有限公司,哈希,Merkletrees等。可以在circomlib[6]中找到,更多的电路正在开发中。
摘要
对于开发人员来说,没有什么比使用有缺陷的编译器更糟糕的了。它仍然是编译器的早期阶段,所以有许多错误和许多工作需要做。
如果您有任何问题,请联系我们。哪怕是一小段代码来修复一个错误。
最后,享受零知识证明[7]!
原始链接:https://iden3.io/blog/circom-and-snarkjs-tutorial2.html
翻译由链接社区和手机网络赞助和支持。
参考
[1]以太网广场: https://learnblockchain.cn/categories/ethereum/
[2]实: https://learnblockchain.cn/docs/solidity/
[3]雷米: https://learnblockchain.cn/tags/Remix
[4]视图视图功能: https://learnlockhair.cn/docs/solidity/contracts/functions.html? #视图
[5]代码库: https://github.com/iden3/circom
[6]大约: https://github.com/iden3/circomlib
[7]零知识证明: https://learnblockchain.cn/categories/zero
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!