证明提交流程
流程如下:
-
证明提交方(rollup / zkApp)通过对应验证 pallet 的
submitProofextrinsic 提交证明。证明叶子value为:leaf_digest = keccak256(keccak256(verifier_ctx), hash(vk), version_hash(proof), keccak256(public_inputs_bytes))为计算上述
leaf_digest(即 statement),每个 verifier 需定义:verifier_ctx(a unique byte sequence)- verification key 的哈希方式
- 若有版本控制,verifier 的版本哈希获取方式
- 如何从 public inputs 提取字节序列
Delivery owner 需确保价格随时间正确更新。
-
若证明有效,将触发携带 statement 的
<VerifierPallet>::ProofVerified事件;否则交易报错。 -
失败交易同样会被打包,提交者需支付手续费,以防止 DoS。
域隔离的聚合
首先执行以下检查:
- 未提供域标识则不进行聚合
- 指定域存在但不可接受新证明时,发出
CannotAggregate事件 - 提交者余额不足以支付自身的聚合费用份额时,同样发出
CannotAggregate事件
全部通过后:
- 从提交者钱包扣留其聚合费用份额
- 触发
Aggregate::NewProof事件,包含证明statement摘要、域标识domainId、聚合标识aggregationId - 当前聚合完成时触发
Aggregate::AggregationComplete事件 - 提交者等待携带
domainId、aggregationId的Aggregate::NewAggregationReceipt,记录事件所在区块B - 提交者可通过
aggregate_statementPathRPC 获取提交证明的 Merkle 路径,需提供:at:事件所在区块Bdomain_idaggregation_idstatement
Pallets
为满足需求开发了如下 pallet: