文章转载来源:wesely
原文作者:StarkWare 核心工程主管Gidi Kaempfer
TL;DR
由 Cairo 提供支持的递归证明现已正式投入运营(译者注:Cairo 是StarkWare推出的用于生成通用计算的 STARK 证明的生产级平台,同时也是用STARK于计算的编程语言)。这标志着 STARK 对 L2 扩展能力的重大提升,它能通过单一证明实现以太坊的交易笔数数倍的增长。
目前,STARK的扩展是通过将几万甚至几十万笔交易 "rolling up(汇总) "到一个证明中来实现的,这个证明会最终被写入以太坊L1,通过递归,类似这样的证明都可以被 "rolling up "到一个单一的证明中去。
这种方法现在已经用于众多基于Cairo的构建的应用程序中,比如:运行在StarkEx(StarkWare的SaaS扩展引擎)和StarkNet(无许可rollup)上的应用程序。。
自2020年3月在Mainnet上完成第一次STARK证明以来,下述事件共同发展塑造了STARKs的发展。
2020年6月,首个基于StarkEx的扩展解决方案部署在以太坊主网上。StarkEx拥有一个支持在链下执行计算并生成STARK-proof的验证器,以及一个在链上来验证此证明的验证器,由于第一次部署的完全由StarkWare的工程师“手动”完成,因此也极大地限制了StarkEx的运行速度,最终我们意识到,我需要一种编程语言来支持一般计算的证明,于是Cairo诞生了。
2020年夏天,Cairo第一次出现在以太坊主网之上。Cairo是CPU Algebraic Intermediate Representation的缩写(中央处理器代数中介码(AIR)),并包含单个 AIR 来验证这个 “CPU” 的指令集。Cairo为更复杂的商业逻辑、更多样化计算语句打开了大门,并以一种更快、更安全的方式进行编码验证。Cairo程序可以证明单个应用程序执行的逻辑,而且一个Cairo程序也可以是多个此类应用程序的串联——即SHARP。
SHARP是一个共享验证程序,它可以从几个独立的应用程序中提取相关交易数据,并在一个STARK-proof软件中进行验证。不同应用程序可以合并它们的交易批次,以更快地填满了stark -proof池,这样会提高交易的速度。所以下一个前沿领域是:递归证明,它不仅适用某些写死的编码逻辑,而且也是针对一般性的计算。
要了解递归证明的全部好处,我们首先要了解 SHARP 是如何执行(非递归)证明的。下图 描绘了一个典型的非递归流程:
一个典型的非递归证明流程
在这里,状态说明(statements)会随着时间汇总,当达到容量(或时间)阈值时,将生成一个大的组合状态说明(也称为Train),只有在收到所有单独的状态说明后,才会验证这个组合状态说明,而这个证明需要很长的时间来进行验证(是单独证明每个状态说明所需时间的总和)。
验证非常大的状态说明最终会受到可用计算资源(如内存)的限制。在递归之前,这实际上是STARK证明中限制可扩展性的阻碍。
使用STARK证明,证明一个状态所花费的时间与执行该状态所花费的时间大致呈线性关系。如果执行一个状态(statements)需要花费T时间,那么验证证明大约需要log(T)时间,这被称为“对数压缩”。换句话说,使用STARKs,你花在验证状态上的时间要比计算执行状态的时间少得多。
Cairo支持通用的计算状态,这些状态可以由STARK验证,也可以由相应的STARK验证器验证。
这就是执行递归的优势所在:我们可以用同样的方式编写一个Cairo程序来证明数千个交易的正确性,我们也可以编写一个Cairo程序来验证多个STARK证明。我们可以生成一个证明来证明多个“上游”证明的有效性,这就是我们所说的递归证明。
由于对数压缩和大致线性的关系,STARK的验证需要相对较短的时间(预计在不久的将来只需要几分钟)。
在实现递归时,SHARP可以在状态数据到达时就对其进行证明,它们的证明可以在各种模式中一次又一次地合并成为递归证明,直到在某个时间节点上,将产生的最终递归证明提交给L1链上验证者。下图描述了一个典型这样的流程:
一个典型的递归证明流程
在这个例子中,四个状态声明被发送到 SHARP(可能来自四个不同的来源),这些状态声明都是平行证明的,然后,每对证明都由递归验证器(一个验证 STARK 证明的 Cairo 程序)进行验证,并为此生成下一个证明,而这个证明(Proof12或Proof34)说明了前两个证明已被证实。接下来,通过递归验证器语句再次合并两个证明,最终生成了一个证明了四个原始状态的证明--Proof123。然后,该证明在主链上提交,并由 Solidity 验证者智能合约进行验证。
当我们实现了将多个证明 "压缩 "为一个,这意味着每个交易的链上验证成本降低(每个声明可包含多笔交易)。
使用递归证明,可以消除限制证明的计算资源障碍(例如内存),让每个有限规模的状态声明都可以被单独证明。因此,当使用递归时,递归的组合状态可以不受限,让每笔交易的成本减少几个数量级。
在实践过程中,减少的成本还取决于你可接受的延迟(以及交易到达的速度)。此外,由于每个证明通常还伴随着一些输出,如链上数据,因此,与单个证明一起写入链上的数据量是有限的。尽管如此,将成本降低一个数量级完全是可以实现的。
递归证明模式减少了证明大量状态数据的延迟,这主要是以下两个因素的结果:
目前,我们正在积极地开发和优化证明递归验证的延迟。我们希望在几个月内能达到几分钟这个量级。因此,一个高效的SHARP可以提供从几分钟到几个小时的不等延迟,这主要取决于每笔交易与链上成本的权衡,这也表明SHARP的延迟得到了很大意义的改善。
Cairo中的递归验证器也向StarkNet的提交证明提供了应用可能,因为该声明可以被嵌入到StarkNet智能合约中,这就允许在公共的StarkNet(一个L2网络)上实现L3的部署
递归模式非常适用于L3的证明的聚合,即通过L2上的一个证明来验证即可,因此这也实现了某种意义上的以太坊性能超扩展。
递归证明为希望进一步想要降低成本和提升性能的平台与应用程序提供了更多契机。
每个STARK都证明了应用于某种输入声明的正确性,这种输入被称为 "公共输入"(Cairo中被称为 "程序输出")。从概念上讲,STARK递归将两个输入的证明压缩为一个,虽然证明的数量减少了,但源头的数量是保持不变,而这些输入通常被用于应用程序或者L1上的状态更新(如,更新一个状态根或执行链上的提款)。
如果允许递归声明是应用感知的,即识别应用程序本身的一些语义,那它既可以将两个证明压缩为一个,也可以将两个输入合并为一个,结果语句可以根据应用程序的语义验证输入组合的有效性,因此命名为应用递归(Applicative Recursion),这能大幅降低链上验证器的复杂性。
应用递归示例
首先,声明1证明了从A到B的状态更新,声明2证明了从B到C的进一步更新。声明1和声明2的证明可以合并成第三个声明,它直接证明了从A到C的状态更新。通过类似的逻辑,人们可以显著地减少状态更新的成本。
应用性递归的另一个重要例子是压缩多个证明的汇总数据。例如,对于想StarkNet 这样的 Validity Rollup,L2 上的每个存储更新也作为 L1 上的传输数据包含在内,以确保数据可用性。其实,我们没有必要在同一个存储元素发送多个更新,因为数据可用性只需要那些经过了验证交易的最终值。这种优化已经在单个StarkNet区块内实现。通过为每个区块生成证明,应用递归可以跨多个L2 的区块汇总压缩此数据,这可以显着降低成本,使L2上的块间隔更短,还不牺牲L1可扩展性。
值得注意的是,应用性递归可以与前面描述非应用性递归相结合,这两个优化是彼此独立的。
STARK验证器的复杂性取决于它被设计来验证的语句种类。特别是对于Cairo语句,验证器的复杂度取决于Cairo语言中允许的特定元素,更具体地说,取决于支持的内建程序(如果我们用CPU来比喻Cairo,那么内建程序就相当于CPU中的微电路)。
Cairo语言不断发展,提供越来越多有用的内置程序,而递归验证器只需要使用这些内置插件的一部分,通过在递归验证器中支持的完整语言,递归SHARP可以成功地支持Cairo中的任何语句。
L1 solididity验证器只需要验证递归证明,而不需要最新的内置代码,换句话说,我们把不断升级的复杂语句的验证被下放到L2,只是让L1验证器来验证更简单、更稳定的状态数据。
在没有递归之前,将多个状态数据汇总到一个证明中的计算能力受限于可用计算实体的计算能力。
有了递归,就不再需要证明这种极其庞大的组合证明,因此,可以使用更小、更便宜和更多的计算实体(尽管可能比大型单体证明者需要更多的计算实体)。这使得可以在更多的物理和虚拟环境中部署验证器成为可能。
通用计算的递归证明现在正在服务多个生产系统,包括 StarkNet。
在持续的优化之下,递归证明将会提供更高吞吐量、更低GAS费、更低延迟性,并为L3 和应用递归带来新的机会。目前,递归验证器还在进一步优化中,随着时间的推移将会提供更好的性能和成本效益。
来源:wesely
发布人:暖色
声明:该文观点仅代表作者本人,不代表火讯财经立场。火讯财经系信息发布平台,仅提供信息存储空间服务。
如文章涉及侵权, 请及时致函告之,本站将第⼀时间删除⽂章。邮箱:840034348@qq.com