snarkjs执行plonk setup报zkey file is not groth16错误咨询
错误根因
报错和PLONK setup执行逻辑无关,核心问题是直接复用了Groth16专属的zkey校验命令校验PLONK生成的zkey文件。
snarkjs对不同证明系统的命令做了严格隔离:
- 触发报错的
snarkjs zkey verify逻辑是Groth16协议专用,代码硬编码仅识别protocol字段为groth16的zkey文件,只要检测到其他协议类型就会抛出zkey file is not groth16错误。 - PLONK不存在Groth16定义的Phase2多方计算流程,setup完成后不需要走Groth16体系下的zkey校验逻辑。
修复步骤
修改compile-Multiplier3-plonk.sh脚本,删除原Groth16流程中的snarkjs zkey verify相关代码,替换为PLONK对应的命令集即可:
- PLONK setup执行完成后,使用PLONK专属校验命令验证zkey有效性:
snarkjs plonk verify Multiplier3_plonk/circuit_final.zkey - 后续所有环节统一使用PLONK前缀的命令,禁止跨协议混用Groth16命令:
- 导出验证密钥:
snarkjs plonk export verificationkey Multiplier3_plonk/circuit_final.zkey Multiplier3_plonk/verification_key.json - 生成证明:
snarkjs plonk prove Multiplier3_plonk/circuit_final.zkey witness.wtns proof.json public.json - 验证证明:
snarkjs plonk verify Multiplier3_plonk/verification_key.json public.json proof.json
- 导出验证密钥:
PLONK与Groth16在snarkjs中的编译流程差异
- 共通环节:二者前置的circom电路编译逻辑完全一致,都会生成
.r1cs、.wasm、.sym文件,且复用同一套Powers of Tau生成的ptau文件。 - Setup环节差异:
- Groth16需要分阶段执行:先运行
snarkjs groth16 setup生成初始zkey,再经过多轮Phase2多方贡献,每轮贡献后都需要执行snarkjs zkey verify校验zkey合法性,最终生成可用的circuit_final.zkey。 - PLONK仅需单步执行
snarkjs plonk setup即可直接生成最终可用的zkey,没有Phase2多方贡献环节,也不需要执行Groth16体系下的zkey校验。
- Groth16需要分阶段执行:先运行
- 命令边界:所有
zkey *子命令均为Groth16专属,PLONK全流程命令均以plonk为前缀,二者不可交叉调用。
排查参考资料
- 本地snarkjs CLI帮助文档:终端执行
snarkjs plonk --help可查看所有PLONK相关子命令及参数说明,可直接对照命令列表排查脚本中混用的Groth16命令。 - snarkjs本地源码:查看安装目录下的
cli.cjs文件,可直接看到命令路由逻辑——所有zkey开头的子命令都绑定到Groth16处理模块,plonk开头的子命令绑定到PLONK处理模块。 - zku课程官方示例仓库:参考仓库内提供的PLONK电路编译示例脚本,可直接对照调整自己脚本里的流程顺序和命令。
内容的提问来源于stack exchange,提问作者Tomosuke
相关产品推荐
相关产品推荐

