snarkjs入门指南:从零开始构建你的第一个零知识证明电路
2026/5/7 20:32:30 网站建设 项目流程

snarkjs入门指南:从零开始构建你的第一个零知识证明电路

【免费下载链接】snarkjszkSNARK implementation in JavaScript & WASM项目地址: https://gitcode.com/gh_mirrors/sn/snarkjs

snarkjs是一个强大的JavaScript和Web Assembly实现的zkSNARK库,支持Groth16、PLONK和FFLONK等零知识证明方案。本指南将带你逐步完成从零开始构建零知识证明电路的全过程,无需深厚的密码学背景,只需基本的命令行操作能力。

📋 准备工作:环境搭建

安装Node.js

确保你的系统已安装Node.js(建议LTS版本,v18及以上)。检查版本:

node -v

若未安装,可从Node.js官网下载最新版。

安装snarkjs

通过npm全局安装snarkjs:

npm install -g snarkjs@latest

验证安装是否成功:

snarkjs --help

你将看到所有可用命令列表,包括Groth16、PLONK和FFLONK相关操作。

安装circom编译器

零知识证明电路需要使用circom语言编写,安装方法:

# 参考官方文档:https://docs.circom.io/getting-started/installation

🔧 从零开始:创建第一个电路

1. 创建工作目录

mkdir snarkjs_example && cd snarkjs_example

2. 编写电路代码

创建一个简单的乘法电路circuit.circom

pragma circom 2.0.0; template Multiplier() { signal input a; // 私有输入 signal input b; // 私有输入 signal output c; // 输出 c <== a * b; // 约束:c必须等于a乘以b } component main = Multiplier();

这个电路实现了两个数的乘法运算,且不会泄露输入值。

3. 编译电路

使用circom编译电路,生成必要的中间文件:

circom --r1cs --wasm --sym circuit.circom

编译后会生成:

  • circuit.r1cs:电路约束系统
  • circuit.wasm: witness生成器
  • circuit.sym:符号文件(用于调试)
  • circuit_js/:包含WebAssembly相关文件

4. 查看电路信息

snarkjs r1cs info circuit.r1cs

输出应类似:

[INFO] snarkJS: Curve: bn-128 [INFO] snarkJS: # of Wires: 3 [INFO] snarkJS: # of Constraints: 1 [INFO] snarkJS: # of Private Inputs: 2 [INFO] snarkJS: # of Public Inputs: 0 [INFO] snarkJS: # of Outputs: 1

🎯 可信设置:生成证明密钥

1. 下载预计算的powers of tau文件

snarkjs支持使用公开的可信设置仪式结果,无需自己进行多 party 计算:

# 下载适合小电路的ptau文件(支持2^14=16384个约束) wget https://storage.googleapis.com/zkevm/ptau/powersOfTau28_hez_final_14.ptau

文件哈希验证:eeefbcf7c3803b523c94112023c7ff89558f9b8e0cf5d6cdcba3ade60f168af4a181c9c21774b94fbae6c90411995f7d854d02ebd93fb66043dbb06f17a831c1

2. 电路特定设置(PLONK示例)

PLONK方案不需要电路特定的可信仪式,直接使用通用的powers of tau:

snarkjs plonk setup circuit.r1cs powersOfTau28_hez_final_14.ptau circuit_final.zkey

生成的circuit_final.zkey包含证明和验证密钥。

✨ 生成证明与验证

1. 创建输入文件

创建input.json

{"a": "3", "b": "4"}

这里我们要证明知道两个数相乘等于12,而不泄露这两个数。

2. 计算witness

snarkjs wtns calculate circuit_js/circuit.wasm input.json witness.wtns

witness包含电路中所有信号的值,可通过以下命令验证:

snarkjs wtns check circuit.r1cs witness.wtns

3. 生成证明

snarkjs plonk prove circuit_final.zkey witness.wtns proof.json public.json

生成两个文件:

  • proof.json:零知识证明数据
  • public.json:公开输出(本例中为["12"]

4. 验证证明

首先导出验证密钥:

snarkjs zkey export verificationkey circuit_final.zkey verification_key.json

然后验证证明:

snarkjs plonk verify verification_key.json public.json proof.json

若输出[INFO] snarkJS: OK,则证明验证成功!

🚀 进阶应用:部署到区块链

生成Solidity验证合约

snarkjs zkey export solidityverifier circuit_final.zkey verifier.sol

生成的verifier.sol是一个以太坊智能合约,可直接部署到区块链。

模拟链上验证

snarkjs zkey export soliditycalldata public.json proof.json

输出的calldata可直接用于调用智能合约的verifyProof函数。

💡 常见问题与解决方案

内存不足问题

在资源受限环境中,可使用单线程模式:

const result = await snarkjs.groth16.prove(zkey, wtns, undefined, {singleThread: true});

浏览器中使用

snarkjs可直接在浏览器中运行,需引入构建好的snarkjs.min.js

<script src="snarkjs.min.js"></script> <script> // 浏览器中生成证明示例 async function generateProof() { const { proof, publicSignals } = await snarkjs.plonk.fullProve( { a: 3, b: 4 }, "circuit.wasm", "circuit_final.zkey" ); console.log("Proof:", proof); } </script>

📚 学习资源

  • 官方文档:README.md
  • 电路示例:test/circuit/
  • PLONK实现:src/plonk.js
  • Groth16实现:src/groth16.js

通过本指南,你已掌握使用snarkjs构建零知识证明应用的基本流程。从零开始的电路设计、可信设置到证明生成与验证,snarkjs提供了完整的工具链,让零知识证明技术变得简单易用。现在就尝试构建你自己的隐私保护应用吧!

【免费下载链接】snarkjszkSNARK implementation in JavaScript & WASM项目地址: https://gitcode.com/gh_mirrors/sn/snarkjs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询