本文档描述了基于哈希的签名聚合的不同方法,包括使用zkVM(如succinctlabs/sp1和openvm-org/openvm)以及直接使用电路(plonky3)。重点介绍了每种方法的源代码位置,以及电路方法的AIR traces的划分和作用。通过将电路分解为多个AIR traces,并使用lookup连接输入/输出,有效地处理非均匀计算,并提供了基准测试结果用于评估性能。
我们使用具有以下参数的 Poseidon2 实例:
可以在这里找到这个特定实例的实现。
succinctlabs/sp1 (基于 plonky3)openvm-org/openvm (基于 plonky3)plonky3为了有效地处理非统一计算,我们将电路拆分为多个 AIR 追踪,并使用查找来连接彼此的输入/输出。
AIR 追踪是:
MainChainMerkleTreeDecompositionRangeCheck
MainMain 主要用于同步其他 AIR 追踪,它做 3 件事:
(sig_idx, msg_hash) 发送到 Decomposition,以确保 x 是从 msg_hash 分解出来的。(sig_idx, parameter) 发送到 Chain,以确保它与其他 AIR 追踪使用相同的 parameter。(sig_idx, parameter, msg_hash, merkle_root) 发送到 MerkleTree,以确保 msg_hash 是从与其他 AIR 追踪相同的 parameter 计算出来的,同时发送到期望的 merkle_root 以检查 sigs[sig_idx]。parameter 和 merkle_root 部分是这个聚合电路的声明,验证者可以通过 FFT 在 \(O(n\log n)\) 的时间内计算它们的多项式求值。

ChainChain 从 Decomposition 接收 x(msg_hash 块),如果 i-th 链的 one_time_sig_i 尚未结束,则计算链的其余部分,然后将 one_time_pk_i 发送到 MerkleTree。
如果链已经结束,我们将忽略它,因此签名的行数可以是恒定的(等于目标和)。
一个 x = (0, 2, 1, 3, 3, 0, ..., 1, 3, 3) 的示例追踪可能如下所示:

MerkleTreeMerkleTree 接收 2 件事:
Chain 接收 one_time_pk_i,其中 x_i 尚未结束,并将它们与 one_time_pk_i(其中 x_i 已经结束)哈希到 merkle_leaf_hash 中,然后计算 merkle_root 以供稍后使用。(parameter, merkle_root, msg_hash) 作为同步,其中 merkle_root 是从 merkle_leaf_hash 和 siblings 计算出来的,parameter 用于所有可调整的哈希,msg_hash 是在下一个相邻行中单独计算的。一个 epoch = 0b0...01 的示例追踪可能如下所示:

DecompositionDecomposition 接收 msg_hash 作为 values,并计算
(((values[4] * P) + values[3]) * P + ...) * P + values[0],然后将其分解为基 2w 块,并将非结束块发送到 Chain。
一个 x = (0, 2, 1, 3, 3, 0, ..., 1, 3, 3) 的示例追踪可能如下所示:

RangeCheckRangeCheck 填充了范围 0..212,以从 Decomposition 接收 limb 作为范围检查。
有关更多详细信息,请参见 https://hackmd.io/@tcoratger/SyWbmVPckx。
124(KoalaBear 的 4 度扩展)256 / R该基准测试聚合了 8192 个签名,要重现,请在 <repo>/circuit 中运行以下脚本:
sh bench.sh
python3 render_table.py
R |
T |
PT |
TP |
PS |
PM |
VT |
|---|---|---|---|---|---|---|
1 |
4 |
5.33 s |
1536 |
1.68 MB |
5.76 GB |
94.04 ms |
1 |
8 |
3.00 s |
2729 |
1.68 MB |
5.78 GB |
99.68 ms |
1 |
16 |
2.65 s |
3086 |
1.68 MB |
5.17 GB |
94.55 ms |
1 |
24 |
2.19 s |
3745 |
1.68 MB |
5.93 GB |
96.09 ms |
2 |
4 |
8.59 s |
953 |
930.96 kB |
8.91 GB |
49.09 ms |
2 |
8 |
4.98 s |
1644 |
933.96 kB |
8.81 GB |
59.41 ms |
2 |
16 |
4.24 s |
1932 |
933.71 kB |
8.97 GB |
72.45 ms |
2 |
24 |
3.36 s |
2439 |
933.96 kB |
12.48 GB |
50.08 ms |
3 |
4 |
14.99 s |
546 |
672.30 kB |
16.07 GB |
53.88 ms |
3 |
8 |
8.75 s |
936 |
671.24 kB |
16.27 GB |
35.08 ms |
3 |
16 |
7.22 s |
1134 |
670.96 kB |
16.18 GB |
40.86 ms |
3 |
24 |
6.17 s |
1327 |
671.02 kB |
16.21 GB |
34.79 ms |
R: Log 1/rate T: 线程数 PT: 证明时间 TP: 吞吐量 (sig/s) PS: 证明大小 PM: 峰值证明内存 VT: 验证时间
- 原文链接: hackmd.io/@han/hash-sig-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!