
游戏厅捕鱼机漏洞打法(游
原文标题:《Zero-Knowledge Proofs Using SnarkJS and Circom》
撰文:Laszlo Fazekas
编译:ChinaDeFi

图片来源:由Maze AI工具生成
零知识证明技术,尤其是 zk-SNARK 技术是加密领域最令人兴奋的技术之一,因为:
Rollup 是一种区块链扩展解决方案,其计算是在链下完成的,在给定数量的交易后,状态将同步回区块链,这种解决方案可以为我们提供区块链的安全性和更低的 gas 费,所以我们说 zk-Rollup 是区块链的理想扩展解决方案。
在本文中,作者会向我们展示如何在 JavaScript 项目中使用 zk-SNARK。
众所周知,我们需要一个电路来生成零知识证明。电路是系统用来计算输出和证明的数学表达式。零知识证明本身就是我们已经成功完成计算的证明。
电路可能会非常复杂,但好在有电路编程语言和库可以让我们比较轻松的编写自己的电路。在本文中我们会使用 Circom。Circom 是用 Rust 编写的。可以使用以下命令来安装 Rust 环境。
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh'=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh安装完 Rust 后,克隆 Circom 存储库并构建编译器:
git clone https://github.com/iden3/circom.gitclone https://github.com/iden3/circom.gitcd circomcargo build --releasecargo install --path circom如果这过程中没有差池,那么我们已经安装好了 Circom 编译器。
现在还需要解决 Circomlib,Circomlib 是一个包含许多有用的预定义电路的编程库。因此,创建一个空项目,并使用以下代码安装 Circomlib:
npm initinitnpm i circomlib现在,我们已经为创建电路做好了准备,下面是它应该看起来的样子:
pragma circom 2.0.0;2.0.0;include "node_modules/circomlib/circuits/poseidon.circom";template PoseidonHasher() {signal input in;signal output out;component poseidon = Poseidon(1);poseidon.inputs[0] <== in;out <== poseidon.out;}component main = PoseidonHasher();这个简单的电路,有一个专用输入和一个输出信号。我们正在使用 Circomlib 中的 poseidon 哈希计算器来生成输入 hash。使用此电路,可以证明我们已经知道给定的原始数据 hash,但不需要透露它。
在第一步中,可以通过 Circom 编译器来编译电路,该编译器将生成一个 wasm 和 rlcs 文件。
circom poseidon_hasher.circom --wasm --r1cs -o ./build生成的 wasm 和 rlcs 文件在构建文件夹中可用。要生成证明,我们需要一个证明密钥文件,而要生成这个文件,我们就需要一个 ptau 文件。该 ptau 文件可以由 snarkjs 生成。或者也可以下载一个预生成的文件(可以在 snarkjs 存储库中找到链接)。关于测试,生成的文件对我们有些好处,但在我们生产应用程序中,建议生成自己的 ptau。
wget https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_12.ptau现在可以使用电路和 ptau 文件生成证明密钥(zkey 文件):
npx snarkjs grotp6 setup build/poseidon_hasher.r1cs powersOfTau28_hez_final_12.ptau circuit_0000.zkey不建议将此 zkey 文件用于生产,但对于测试,它对我们有帮助。
现在,我们已经准备好生成证明了。这其中会用到 snarkjs,所以用下面的命令进行安装:
npm i snarkjs证明生成如下所示:
const { proof, publicSignals } = await snarkjs.grotp6.fullProve({ in: 10 },"build/poseidon_hasher_js/poseidon_hasher.wasm","circuit_0000.zkey");console.log(publicSignals);console.log(proof);输入信号在函数的第一个参数中传递 fullProve。第二个参数是编译电路,最后一个参数是生成的证明密钥。该函数反馈电路的输出和证明。
免责声明:数字资产交易涉及重大风险,本资料不应作为投资决策依据,亦不应被解释为从事投资交易的建议。请确保充分了解所涉及的风险并谨慎投资。OKEx学院仅提供信息参考,不构成任何投资建议,用户一切投资行为与本站无关。

和全球数字资产投资者交流讨论
扫码加入OKEx社群
industry-frontier