快速上手
这一页带你走最短路径,把 proof 成功送进 zkVerify,并拿到“验证完成”的反馈。你会看到最小输入是什么、Kurier 和 zkVerifyJS 的区别是什么,以及一条验证闭环跑通之后会看到什么结果。如果你想最快跑通,通常 Kurier 更简单;如果你一开始就需要直接控制链上交互,就用 zkVerifyJS。
为了避免卡在环境配置,这里只保留必要步骤。你需要准备三样东西:proof、vk、public inputs。Kurier 路线会先注册 vk,zkVerifyJS 路线直接在链上提交验证。
如果你想先看一个已经跑起来的例子,可以直接打开 zkEscrow 演示地址。这个示例页能帮助你先建立对整条验证闭环的直觉。
路线 A:Kurier(REST API)
Kurier 需要 API Key。你需要先申请 Key,然后把它放进 .env 里。
API_KEY=your_kurier_api_key
注册 vk 的最小请求结构如下(示例为 groth16):
const regParams = {proofType: "groth16",proofOptions: { library: "snarkjs", curve: "bn128" },vk: key}const regResponse = await axios.post(`${API_URL}/register-vk/${process.env.API_KEY}`, regParams)
提交 proof 的最小结构如下(示例为 ultrahonk):
const params = {proofType: "ultrahonk",vkRegistered: true,chainId: 11155111,proofData: {proof: proof.proof,publicSignals: proof.pub_inputs,vk: vk.vkHash || vk.meta.vkHash}}const requestResponse = await axios.post(`${API_URL}/submit-proof/${process.env.API_KEY}`, params)
提交后用 job-status 轮询状态,直到 Finalized:
const jobStatusResponse = await axios.get(`${API_URL}/job-status/${process.env.API_KEY}/${requestResponse.data.jobId}`)if (jobStatusResponse.data.status === "Finalized") {// verified}
路线 B:zkVerifyJS(直接与链交互)
zkVerifyJS 需要一个 seed phrase 来签名交易,并且账户里要有 tVFY 用来支付交易费。
SEED_PHRASE="this is my seed phrase i should not share it with anyone"
启动会话并提交验证请求:
const session = await zkVerifySession.start().Volta().withAccount(process.env.SEED_PHRASE)await session.verify().groth16({ library: Library.snarkjs, curve: CurveType.bn128 }).execute({proofData: { vk: key, proof: proof, publicSignals: publicInputs },domainId: 0})
常见卡点
最常见的问题是把 vk 或 public inputs 传错格式,导致验证结果一直不出来。Kurier 路线可以先确认 register-vk 是否成功写回 vk hash,再提交 proof;zkVerifyJS 路线则需要确认账户里有 tVFY 否则交易不会被链接受。