原标题: ""
拉茨洛·法泽卡斯写的
编译:ChinaDeFi
图片来源:工具生成。
零知识证明技术,尤其是zk-SNARK技术,是加密领域最令人兴奋的技术之一,因为:
我们可以在不泄露的情况下证明具体信息。校样很小,很容易在区块链上验证,所以可以汇总。Rollup是区块链展开解法,其计算是在链下完成的。在给定数量的事务之后,状态将被同步回区块链。这种解决方案可以为我们提供区块链安全和较低的天然气费用,所以我们说zk-Rollup是区块链的理想扩展解决方案。
在本文中,作者将向我们展示如何在JavaScript项目中使用zk-SNARK。
众所周知,我们需要一个电路来产生零知识证明。电路是系统用来计算输出和证明的数学表达式。零知识的证明本身就是我们成功完成计算的证明。
电路可能非常复杂,但幸运的是,有电路编程语言和库可以让我们更容易地编写自己的电路。我们将在本文中使用Circom。Circom是用Rust写的。您可以使用以下命令来安装Rust环境。
curl-proto ' = https '-TLS v1 . 2 https://sh . Rust up . RS-SSF | sh ' = https '-TLS v1 . 2 https://sh . Rust up . RS-SSF | sh安装Rust后,克隆Circom库并构建编译器:
git clone https://github.com/iden3/Circom.gitclone https://github.com/iden3/circom.gitcd circom cargo build-release cargo install-path circom如果这个过程没有错误,那么我们已经安装了circom编译器。
现在我们需要求解Circomlib,这是一个包含许多有用的预定义电路的编程库。因此,创建一个空 project,并使用以下代码安装Circomlib:
现在,我们准备创建电路。它应该是这样的:
pragma circom 2 . 0 . 0;2.0.0;包括“node _ modules/circom lib/circuits/Poseidon . circom”;template PoseidonHasher(){信号输入in;信号输出out分量波塞冬=波塞冬(1);Poseidon . inputs[0]& lt;= = inout & lt= = poseidon.out} component main = PoseidonHasher();这个简单的电路有一个专用的输入和输出信号。我们使用Circomlib中的poseidon哈希计算器来生成输入哈希。利用这个电路,可以证明我们已经知道了给定的原始数据hash,但是不需要公开。
第一步,Circom编译器可以编译电路,生成wa和rlcs文件。
由circom pose _ hasher . circom-wa-r1cs-o ./build生成的wa和rlcs文件可以在build文件夹中找到。要生成证书,我们需要一个证书密钥文件,而要生成这个文件,我们需要一个ptau文件。ptau文件可以由snarkjs生成。或者您可以下载一个预先生成的文件(可以在snarkjs存储库中找到该链接)。至于测试,生成的文件对我们是有利的,但是在我们的生产应用中,建议生成我们自己的ptau。
https://Hermez.s3-EU-West-1.amazonaws.com/powersoftau28 WGET _荷兹_ final _ 12.ptau现在您可以使用电路和ptau文件来生成证明密钥(zkey文件):
NPX蛇JS Groth16设置建立/波塞冬_哈希。R1CS PowerSoftau28 _荷兹_最终_ 12。Ptau电路_ 0000。zkey不建议将这个Zkey文件用于生产,但它对测试有帮助。
现在,我们准备生成证明。这里将使用Snarkjs,所以用下面的命令安装它:
npm i snarkjs证明生成如下:
const { proof,public signals } = await snarkjs . groth 16 . full prove({ in:10 },“build/Poseidon _ hasher _ js/Poseidon _ hasher . wa”,“circuit _ 0000 . zkey”);console.log(公共信号);console.log(证明);输入信号完全通过函数的第一个参数。第二个参数是编译电路,最后一个参数是生成的证明密钥。这个函数反馈电路的输出和证明。
现在我们需要一个可以从证明密钥生成的验证密钥来验证证明。采集方法如下:
NpX snake js zkey导出验证密钥circuit _ 0000 . zkey verification _ key . JSON导出验证密钥circuit _ 0000 . zkey verification _ key . JSON验证码如下:con . ST vKey = on . parse(fs . read file sync(" verification _ key . JSON "));const RES = await snarkjs . groth 16 . verify(v key,publicSignals,proof);if (res === true) {console.log("验证OK ");} else {console.log("无效证明");验证密钥是验证函数的第一个参数,输出和证明是第二个和第三个参数。这个函数的结果是一个简单的布尔值。
在这个例子中,我们使用电路来计算hash,但这并不总是可行的,因为hash会产生一些结果,或者我们的电路看起来如下:
pragma circom 2 . 0 . 0;2.0.0;包括“node _ modules/circom lib/circuits/Poseidon . circom”;template PoseidonHasher(){信号输入in;信号输入哈希;分量波塞冬=波塞冬(1);Poseidon . inputs[0]& lt;= = inhash = = = poseidon.out} component main { public[hash]} = PoseidonHasher();这个电路没有输出,只有两个输入。第一个输入是数据,第二个输入是数据的散列。在模板的最后一行,我们检查散列。只有当给定的散列是给定数据的波塞冬散列时,电路才会成功运行。但是你如何计算海神号的散列值呢?
Circomlib有一个实现可用于此。需要我们安装它:
Npm i circomlibjs现在我们可以用下面的代码来计算:
const Poseidon = await circomlibjs . build Poseidon();const Poseidon = await circomlibjs . build Poseidon();const hash = poseidon。F.toString(波塞冬([10]);console.log(哈希);这个波塞冬函数的结果是Buffer,我们需要转换成数字。在zk-SNARK中,每一次计算都是在有限域中进行的,所以必须使用海神。转换字符串。
Circomlibjs和snarkjs在Node.js和浏览器中运行良好,所以我们可以在客户端生成或验证证书,也可以生成智能合约进行验证。所以我们可以在Solidity代码中使用它来验证证明。
Circomlibjs还有一个智能契约生成器。
这是一个关于在JavaScript中使用zk-SNARK的简短教程。它不是一个完整的教程,你可能还有很多问题。我们可以使用Circom和snarkjs,这些都是有据可查的,我们也可以从Tornado Cash等现有项目中学到很多东西。
温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信(j7hr0a@163.com),我们会及时处理和回复。
原文地址"javascript:calogin,javascript在哪里启用":http://www.guoyinggangguan.com/qkl/178868.html。

微信扫描二维码关注官方微信
▲长按图片识别二维码