Plonky2 Verifier
settlementPlonky2Pallet
Statement hash components
- context:
keccak256(b"plonky2") - vk:
keccak256(vk.encode()) - pubs:
keccak256(pubs)
Verifier 实现
假设已构建好 plonky2 电路并生成证明:
let data = builder.build::<C>();let proof = data.prove(pw)?;
Verification Key
Plonky2 需 GateSerializer 序列化 VerifierCircuitData,请使用 ZKVerifyGateSerializer,反序列化亦基于此。
use plonky2_verifier::ZKVerifyGateSerializer;let vk_bytes = data.verifier_data().to_bytes(&ZKVerifyGateSerializer)?;
Proof
let mut proof_bytes = Vec::new();proof_bytes.write_proof(&proof.proof)?;
Public Inputs
Plonky2 将 Proof 与 Pubs 放在一个结构中,zkVerify 需拆分。
let mut pubs_bytes = Vec::new();pubs_bytes.write_usize(proof.public_inputs.len())?;pubs_bytes.write_field_vec(proof.public_inputs.as_slice())?;
Config
Plonky2 的 plonk 配置基于泛型(哈希算法、field 等,见 config.rs)。zkVerify 仅支持两种预设:Keccak + Goldilocks 与 Poseidon + Goldilocks。
因此 Vk 使用自定义 JSON 格式:
{"config": "Poseidon","bytes": "392093829392..."}
其中 bytes 为上述 vk_bytes 的十六进制编码,config 仅可取 Keccak 或 Poseidon。
可使用提供的 CLI 工具将 Vk 转成 zkVerify 支持的格式,参阅 plonky2-converter。
Result
若 proof 无法反序列化(InvalidProofData)或验证失败(VerifyError),submitProof extrinsic 会报错。