a16z:以三要素衡量SNARK性能
本文来自 a16z,原文作者:Justin Thaler,由 Odaily 星球日报译者 Katie 辜编译。
SNARK(简洁的非交互式知识参数)是一种重要的密码原语,用于发现区块链可扩展性(例如 L2 Rollup)和隐私的应用。SNARK 允许某人向不可信验证器 V(例如以太坊区块链)证明他们知道一些数据(例如一批有效交易)。证明这一点的简单方法是将数据发送给 V,然后 V 可以直接检查其有效性。SNARK 实现了同样的效果,但对 V 来说成本更高。特别是SNARK 证明应该比包含数据本身的原始证明更短。
SNARK 的验证成本可能会有所不同,但成果通常都很好。例如,PlonK 的证明在以太坊上的验证成本约为 29 万 gas,而 StarkWare 的证明成本约为 500 万 gas。SNARK 可能适用于区块链之外的各种不同的设置,例如,允许使用快速但不可信的服务器和硬件。
但由于 SNARK 验证通常很便宜,适用性的主要决定因素是 SNARK 证明者 P 的成本。本文中将解释如何估算这些成本,以确定何时合理使用 SNARK,以及未来如何改进 SNARK。值得注意的是,这是一个快速发展的领域,本文中讨论的几个项目正在积极提高其性能。
SNARK 是如何部署的?
在 SNARK 部署中,开发人员通常编写一个计算机程序 ψ,将证明人声称知道的数据 w 作为输入(w 代表验证者),并检查 w 是否有效。例如,在 Rollup 中,程序将检查 w 中的所有交易是否都经过数字签名,是否导致任何帐户余额低于零等。然后通过 SNARK 前端输入程序 ψ,该前端将程序编译成更适合 SNARK 技术应用的格式。这种 SNARK 友好格式称为中间代码(IR)。
通常,IR 是某种等效于 ψ 的电路可满足性实例。这意味着电路 C 以数据 w 作为输入,以及一些通常被称为“非确定性建议”的额外输入,并在 w 上运行 ψ。这些建议输入用于帮助 C 运行 ψ,同时保持 C 较小。例如,每当 ψ 除以两个数 x 和 y 时,商数 q 和余数 r 就可以作为建议提供给 C, C 可以简单地检查 x = qy + r。这种检查比让 C 运行除法算法从头计算 q 和 r 更便宜。
最后,将可满足性电路 SNARK 应用于 C。这称为 SNARK 后端。对于一些高度结构化的问题,如矩阵乘法、卷积和一些图问题,已知的 SNARK 可以避免这种前端/后端范式,从而实现更快的证明。但本文的重点是通用的 SNARK。
正如我们将看到的,SNARK 后端验证成本随着 C 的规模而增长。保持 C 尽可能小是一项挑战,因为电路是一种极为有限的计算格式。它们由门组成,由电线连接。给每个门 g 输入一些值,并对这些值应用一个非常简单的函数。然后,通过 g 发出的导线将结果送入“下游”门。
SNARK 的可扩展性需要多长时间?
关键问题是,相对于简单地对数据重新执行 ψ,SNARK 证明器需要多长时间?答案是 SNARK 的验证程序,是相对于直接的验证者核查。后一个表达式指的是在 P 将 w 发送给 V 的原始证明中,V 通过对 w 执行 ψ 来检查 w 的有效性。
将证明器开销分为“前端开销”和“后端开销”是有利的。如果逐门计算电路 C 的成本是运行 ψ 的 F 倍,那么我们称前端开销为 F。如果将后端验证程序应用于 C 的成本是逐门评估 C 的 B 倍,那么我们称后端开销为 B。总验证程序开销是 F 乘以 B。即使 F 和 B 各自都不大,这个乘法开销也可能很大。
实际上,F 和 B 都可以是 1000 或更大。这意味着相对于直接验证者核查,证明程序的总开销可能是 100 万到 1000 万或更多。在笔记本电脑上运行一秒钟的程序很容易导致 SNARK 验证程序需要数十天或数百天的计算时间(单线程)。幸运的是,这项工作通常在不同程度上是并行的(取决于 SNARK)。
总之,如果你想在今天的应用程序中使用 SNARK,必须满足以下三个条件中的一个:
1.在笔记本电脑上直接核查验证者只需要不到一秒钟的时间。
2.直接验证者核查特别适合在电路中进行,因此前端的开销很小。
3.你愿意等待数天等待 SNARK 验证程序完成,并/或支付巨大的并行计算资源。
本文的其余部分解释了前端和后端开销从何而来,以及我如何对不同的SNARK进行估算。以及未来改善的前景。
区分前端和后端
因为不同的后端支持不同类型的电路,所以完全区分前端和后端是一个挑战。因此,前端可以根据它们期望与之交互的后端而有所不同。
SNARK 后端通常支持所谓的算术电路,这意味着电路的输入是某个有限域的元素,电路的门执行两个域元素的加法和乘法。这些电路大致相当于直线计算机程序(没有分支、条件语句等),这些程序在本质上是代数的,也就是说,它们的原始数据类型是字段元素。
大多数后端实际上支持大部分算术电路,通常称为 Rank-1 约束满