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

2020-06-02 21:13 栏目:经验之谈 来源:网络整理 查看()

在本教程中,将指导您创建第一个零知识的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

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发