跳到主要内容

生成证明

本指南介绍如何生成可由 zkVerify 验证的兼容证明。可通过下方标签查看各证明类型的操作步骤。

我们将用 Circom 实现一个简单的哈希验证电路,并通过 zkVerify 验证。电路接受一个私有输入和一个公共输入,检查公共输入是否等于私有输入的 Poseidon 哈希。

步骤

  • 编写 circom 电路,下载产物并生成证明
  • 在 zkVerify 注册 verification key
  • 验证 zk 证明并获取证明凭证
  • 在以太坊上验证证明凭证

本教程使用对新手友好的 zkRepl 创建电路,不深入 Circom DSL,只展示必要代码。电路包含一个公共输入和一个私有输入,使用 Poseidon 哈希;需从 circomlib 引入相关库。

电路示例如下:

pragma circom 2.1.6;
include "circomlib/poseidon.circom";
template Example () {
// Getting the inputs needed for our circuit
signal input a; // Actual Message
signal input b; // Poseidon hash of the message
component hash = Poseidon(1); // Creating our Poseidon component with one input
hash.inputs[0] <== a;
log(hash.out);
assert(b == hash.out); // Checking if the input hash is same as calculated hash
}
component main { public [ b ] } = Example();

在 zkRepl 可生成用于证明的电路产物。编译并生成产物时需提供初始输入,修改下方注释的输入片段即可:

/* INPUT = {
"a": "5",
"b": "19065150524771031435284970883882288895168425523179566388456001105768498065277"
} */

在 zkRepl 编译电路并获取产物。生成证明时,点击结果页的 groth16 选项,获取生成证明所需的 snarkjs 嵌入。下载 main.groth16.html 作为证明生成器,用浏览器打开即可。

alt_text

在页面填写输入并生成证明,将 proof 保存为 proof.json,公共信号保存为 public.json,提交 zkVerify 验证时会用到。同时下载 main.groth16.vkey.json。

alt_text

生成 proof 后,你可以通过多种方式在 zkVerify 上完成验证。推荐的方式是使用 Kurier。你也可以任选以下方式之一进行验证:

  1. 使用 Kurier
  2. 使用 zkVerifyJS package
  3. 使用 Polkadot.js frontend
  4. 使用 subxt Rust crate