本文档描述了基于哈希的签名聚合的不同方法,包括使用zkVM(如succinctlabs/sp1和openvm-org/openvm)以及直接使用电路(plonky3)。重点介绍了每种方法的源代码位置,以及电路方法的AIR traces的划分和作用。通过将电路分解为多个AIR traces,并使用lookup连接输入/输出,有效地处理非均匀计算,并提供了基准测试结果用于评估性能。
我们使用具有以下参数的 Poseidon2 实例:
可以在这里找到这个特定实例的实现。
succinctlabs/sp1
(基于 plonky3
)openvm-org/openvm
(基于 plonky3
)plonky3
为了有效地处理非统一计算,我们将电路拆分为多个 AIR 追踪,并使用查找来连接彼此的输入/输出。
AIR 追踪是:
Main
Chain
MerkleTree
Decomposition
RangeCheck
Main
Main
主要用于同步其他 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)\) 的时间内计算它们的多项式求值。
Chain
Chain
从 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)
的示例追踪可能如下所示:
MerkleTree
MerkleTree
接收 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
的示例追踪可能如下所示:
Decomposition
Decomposition
接收 msg_hash
作为 values
,并计算
(((values[4] * P) + values[3]) * P + ...) * P + values[0]
,然后将其分解为基 2w
块,并将非结束块发送到 Chain
。
一个 x = (0, 2, 1, 3, 3, 0, ..., 1, 3, 3)
的示例追踪可能如下所示:
RangeCheck
RangeCheck
填充了范围 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!