原文链接:Optimistic Rollups: the present and future of Ethereum scaling
我们听到了很多关于ZK Rollups的讨论,说它是智能合约系统的未来。对此我们不同意 —— 这篇文章解释了原因。本文借鉴了我们从运行一个开放的、安全的、与EVM兼容的L2链(Arbitrum)中获得的实践经验,Arbitrum有数百个dapp,数十万用户和数百万交易。
我们将Arbitrum打造为一个Optimistic Rollup(OR),因为我们相信OR是满足用户对安全、无信任、兼容EVM的L2的现实需求的最佳方式。我们选择Optimistic而不是ZK是因为Optimistic固有的可扩展性和成本优势;今天我们仍然会做出同样的选择。要了解原因,请继续阅读。
(By Michael Johnson — originally posted to Flickr as Apples & Oranges — They Don’t Compare, CC BY 2.0, https://commons.wikimedia.org/w/index.php?curid=4289506)
是的,这篇文章很长,而且有的地方很技术化。人们对于理想公链的需求很简单,但想要解释提供这些优势所需的技术就需要我们去了解一些细节。我们希望技术社区能够理解我们的观点。
如果你不想读完这篇文章(我们不怪你!),这里有一个简短的概要。
让我们从Ethereum开始。以太坊用户通过交易来部署智能合约或与智能合约互动。我们可以用几种不同的方式来思考以太坊交易:一方面,可以把它看作是一个不透明的数据块;但如果你看过它的内容,就知道交易当然远不止这些。交易是一个请求,要求智能合约做一些事情:记录一些信息,移动一些资产,等等。
当一个交易发布到以太坊上时,有两件重要的事情发生:首先,交易会被接受,以太坊对一组有序的交易达成共识;第二,以太坊执行这些交易并计算出结果的状态更新。
让每个以太坊节点执行每笔交易是很昂贵的,而Rollups是一类扩展解决方案,大大减轻了这种负担。交易的实际执行不在以太坊上进行,而是转移到第二层(“L2”)的环境上。
但等一下 ——Rollups应该是由以太坊来保障的。这意味着我们需要以太坊以某种方式保证交易执行的正确性,尽管它发生在L2环境上。那么,以太坊一层网络如何给rollup状态盖章确认呢?
一句话,答案是:证明。Rollups状态使用专门的证明向以太坊一层网络证明其正确性,允许以太坊一层网络在不执行交易的情况下验证正确性。
这些证明看起来很神奇:允许以太坊验证rollup状态,而无需实际执行。你可能想知道这些证明是什么样子的,以及它们在实践中是如何实现的。而这正是各种类型的Rollups的区别所在。
ZK Rollups使用有效性证明 validity proofs。ZK依赖于某一方发布一个简洁的加密证明,证明该方知道一个有效的链的特定结束状态。这需要证明方执行该链,以便知道如何构建证明,然后通过一系列复杂的加密操作来构建。该证明由链上L1合约检查。ZK证明是简洁的,而且验证的成本很低,可以由以太坊交易完成。
Optimistic Rollups使用一种不同类型的证明:欺诈证明fraud proofs。正如他们的名字所暗示的,Optimistic Rollups是乐观的,因为当他们将更新的状态发布到以太坊时,他们根本不需要发布任何证明。任何人都可以发布一个rollup块,其中包含关于执行某些交易的正确结果的声明。其他节点执行相同的交易,如果他们不同意第一个节点的主张,可以发布一个挑战。一个有效的争端协议可以解决任何分歧,保证正确的一方赢得挑战。各方都有强烈的动机只发布正确的声明,而不去挑战不正确的声明,所以在普通情况下,所有节点只需执行所有的交易,证明代码就不需要被调用了。这整个过程是由L1合约管理的。
好吧,那么哪种类型的rollup更好呢?在这篇文章的其余部分,我们将在几个维度上比较ZK和Optimistic Rollups,并解释为什么我们相信未来是属于Optimistic Rollups的,而像Arbitrum这样的Optimistic Rollups本质上更具有可扩展性。
也许Optimistic Rollups和ZK之间最关键的区别是成本。
Optimistic Rollups要求节点简单地执行合约。例如,如果一个合约做了一个添加操作,节点就做这个添加操作。
另一方面,ZK需要产生一个复杂的加密证明,需要数百或数千次昂贵的椭圆曲线操作,来在证明中包括该添加操作。ZK的每一个合约中的每一条指令都包含这种成本。需要对每条指令进行复杂的加密证明,而不是仅仅执行指令,这对ZK来说是一个固有的成本劣势,而且是一个很大的劣势。
ZK的倡导者有时会争辩说,只有一方需要创建证明,而Optimistic Rollups要求系统有许多节点。但如果你正在运行一个大规模的链,无论你使用哪种证明系统,它都会有许多节点。真正的链需要许多节点来服务于非变异性的调用,搜索事件日志,向用户显示交易数据,为用户提供提取资金回到L1所需的数据,等等。一个乐观的链的安全依赖于这些节点做他们已经需要做的事情 — 执行交易和跟踪链的正确状态。
另一方面,对于ZK来说,构建昂贵的基于椭圆曲线的证明是一个非常大的额外成本。为了有希望实现大规模的ZK证明,你需要特殊用途的硬件设备或大规模的并行计算 — 或者两者都需要。这是很昂贵的。
结论:Optimistic系统具有固有的、巨大的成本优势。
在建立Arbitrum时,我们的一个重要考虑是与EVM的兼容性。Arbitrum与EVM完全兼容;它有相同的RPC接口,接受与EVM相同的字节码。这意味着在实践中,任何为以太坊编写的代码都可以在Arbitrum上开箱即用。
我们已经运行开放的、与EVM兼容的链(包括测试网)一年多了,我们已经了解到真正的兼容是多么具有挑战性。第一个95%的兼容性并不难,但这在实践中还不够好,做得更好既需要大量的艰苦工作,也需要一个不碍事的产品架构。
在兼容性方面,ZK系统的情况各不相同。有些人无视它作为遗留的工具,鼓励人们学习他们的自定义语言。
有些ZK系统并不试图去兼容。对于那些不关心兼容性的开发者和用户来说,这很好。
我们并不是在说,在一个崭新的链上世界里,EVM是客观上最好的方案。我们只是认为,考虑到已经与EVM合作的开发者、代码和开发者工具的数量,EVM有很多实际的优势。一个部署在以太坊上的项目,想要扩展到一个rollup,不得不用新的语言重写他们的代码,委托新的安全审计,并维护多个代码库,这很麻烦,也很容易出错。但即使对于还没有编写任何代码的新项目,EVM的兼容性也是一个很大的优势,因为它允许这些项目利用围绕EVM存在的代码、工具和人才库。
一些ZK项目正在努力开发EVM的兼容版本,但尽管有模糊的说法,我们目前为止还没看到有任何代码发布,可以允许人们在ZK rollup上运行EVM合约。现有的初级系统有很大的不兼容性。例如,一个声称与EVM兼容的ZK系统未能实现ADDMOD、SMOD、MULMOD、EXP、SELFDESTRUCT和CREATE2操作码;正在考虑取消对XOR、AND和OR的支持;不支持标准交易格式;不支持任何预编译;并可能限制一个交易中合同调用的数量。而且,似乎与ZK模型存在根本性的不兼容,保证了即使在最好的情况下,ZK EVM的兼容性也会有几页的细则,而不支持由Optimistic Rollups实现的完全兼容性。
值得澄清的是,今天有几个特定应用的ZK系统的例子存在(例如Zcash、ZKSync 1.0、Loopring)。而且这些系统中确实有一些运作良好。核心区别在于,这些都是为特定的应用进行了微调和特别优化,非常适合于ZK的实现。目前不存在的是一个通用的编译器,可以实现以一种兼容的方式从EVM到ZK的线路。虽然有一些团队声称正在进行这项工作,但没有公开的代码,也没有用户定义的ZK-EVM合同的证明成本的基准。根据我们的知识和所有公开可用的数据,我们认为它们将是非常昂贵的。
结论:只有Optimistic支持完全的EVM兼容性,而且成本最低。
在设计Arbitrum时,我们的一个关键属性是无需信任的可见性。简单来说,无需信任的可见性意味着任何人都可以看到或推导出链的内容,而不需要中心化的一方的帮助。重要的是,这不仅意味着每个人都可以看到偶尔的状态快照 ——这意味着每个人都可以看到链的全部历史—— 它是如何达到当前状态的。一个可用的链让任何人都可以运行一个支持非变异调用的节点,搜索事件历史,并看到每一笔交易 ,而不需要依赖一个中心化的数据提供者。无信任的可见性是使之成为可能的原因。
直截了当地说,外面的一些ZK系统在可见性方面偷工减料,并试图绕过他们没有提供完整的区块链功能这一事实。当你听到关于 “压缩”的话题时,请注意分辨。他们是在说他们正在对链上的内容进行更有效的编码(Arbitrum也做到了,而且在我们的Nitro版本中会做得更好)?还是在说,链上的部分历史内容根本就没有被提供,除非中心化的数据提供者愿意以后与你分享?回顾一下,ZK证明只证明了证明者知道一条有效的链。证明者并没有告诉你这个链是什么,即使你有足够的数据来验证证明,你也可能没有足够的数据来重建这个链的历史。
举个例子,假设Alice提交了一个支付给Bob 1 ETH的交易,而Bob提交了一个支付给Charlie 1 ETH的交易,在快速连续的过程中。后来你验证了一个证明,Alice比之前少了1个ETH,Bob的余额没有变化,而Charlie比之前多了1个ETH。
但是发生了什么?Alice给了Bob吗?Bob给了Charlie吗?也许Alice直接支付给了Charlie。也许Alice销毁了一个ETH,Charlie被别人支付了。也许Diana是中间人,而不是Bob。Bob从区块链上寻找证据,但由于一些ZK-rollups不提供链的可见性,他无法分辨。
许多智能合约应用需要的不仅仅是知道一个偶尔的检查点。他们需要知道链的情况——知道发生了什么以及最终状态是如何达到的。ZK Rollups有时会吹嘘比Optimistic Rollups更好的 “压缩”,但隐藏链上的数据使得只有验证者自己知道,这样的过程不是压缩,而是删除重要数据。如果一个ZK提供方说他们 “不需要 ”发布链的交易历史记录,其实他们真正要说的是他们不保证链的可见性。放弃链的可见性保证不是我们愿意作出的妥协。
结论:Optimistic系统以最小的成本提供无信任的可见性。
当考虑一个rollup系统时,一个关键的要求是它是否提供无信任、及时的最终确认。简单地说,这意味着在你提交一个交易后,该交易的结果应该被你和其他所有人及时和确定地知道,并且没有人能够改变或撤销它。
在我们看来,实现及时交易确认的最佳方式是将交易的排序与交易的执行分开。排序产生一个最终的候选交易序列(proposed transactions),而执行则按照该序列尝试执行交易。如果交易的执行是确定的,就像在Arbitrum上一样,那么最终确定交易的顺序就是最终确定结果,因为结果是交易顺序的确定函数。如果每个人都知道交易的顺序,那么每个人都可以轻易地确定结果。
最终确定一个序列需要将该序列发布到L1链上,其中包含足够的信息,以使任何人都能自己执行交易,以便无需信任地知道结果。理想的rollup是尽可能频繁地将序列的交易数据发布到L1链上。
在optimistic的系统中,向L1链发布数据的开销很小,事实上Arbitrum通常每隔一分钟左右就会向L1链发布有顺序的交易数据,为用户提供快速的最终结果,并保证没有人可以撤销他们的交易。每隔一小时左右就会有一个新的optimistic的结果断言,但是由于序列已经被最终确定,而且执行是确定的,这并不会减慢最终结果。
原则上,ZK系统可以以类似的方式运行;也就是说,将交易的排序与它们的验证分开,排序交易可以频繁地发布到L1 ,验证可以在以后进行,进行有效性证明。然而,以这种方式运行的ZK-rollup需要向L1链发布基本上与optimistic系统发布的数据相同的数据;上面讨论的(所谓)“压缩 ”技术都无法使用。为了使这些 “压缩 ”技术发挥作用,每次发布一批L2交易时,必须在同一个L1交易中实时证明L2交易序列的有效性。
因此,寻求采用所吹嘘的 “压缩 ”技术的ZK-rollup有两个选择:
1)每隔一分钟左右发布有顺序的交易和执行证明:这保留了快速的最终性,但需要每隔一分钟在链外生成一个ZK证明并在L1链上验证。在链上发布ZK证明的成本估计在50万到500万gas之间,取决于当时的实施情况。
2)每小时将排序的交易与证明一起发布。这使ZK证明的检查成本保持合理,但它将最终时间延长到一个小时。在用户向ZK提供方提交交易和在链上发布交易之间的一小时内,用户不能保证他们的交易甚至会被包括在内,而只是相信提供方的说法。
如果我们要建立一个ZK系统,我们会发现这两个选项是不可接受的 —— 第一个选项太昂贵,第二个选项不能及时提供最终结果。所以我们最终会在ZK版本的Arbitrum中使用相同类型的序列器(sequencer),并在发布与我们optimistic版本基本相同的数据。
如果你听到有人吹嘘说ZK可以把几个小时的数据压缩到一个点上,那就要警惕了。如果他们只是在一个很长的时间段结束后才发布一个点的数据,那么这意味着他们在这段时间内没有提供最终确认的数据。
结论:实际考虑迫使optimistic和ZK系统以同样的方式处理及时的交易终结性。
无信任的存活性意味着任何人都可以强迫系统正常执行。(无信任的安全属性确保执行是正确的)。
Optimistic rollup允许任何节点声明一个正确的执行。提出这一要求只需要该节点执行链上的交易,然后存入一笔资金,在协议确认该要求后可以退还。
在ZK系统中,进展要求任何节点都能创建并发布一个ZK证明,用来推进链的状态更替。证明过程必须使用任何人都可以获得的硬件和软件来实现。因此,证明过程必须不需要建立或购买外部的、特殊用途的硬件,也不需要进行大规模的并行计算。必须有一个在普通设备上构建合适的ZK证明的途径。一个不提供这些的ZK提供者,或者没有发布为他们的系统产生证明的代码的ZK提供者,不能提供无信任的状态更替,系统也没有有效性的保证。他们的系统是中心化的,因为只有拥有特殊设备的各方才能强制更新。(目前还不清楚先进的ZK rollup提供方的证明是否可以让普通用户也能够进行验证)。
结论:在一个optimistic的系统中,更容易提供无需信任的进程。
ZK rollup确实有优势的一个领域是当它涉及到与以太坊的桥接。Optimistic的系统会产生预期的一周延迟,以将资金从滚存转移到L1,而ZK rollup存允许在ZK证明被发布到L1后立即进行桥接。在实践中,这并不是一个很大的区别,因为Optimistic rollup用户可以利用快速的桥接服务,以低延迟将L2资金换成L1资金。因此,ZK的优势主要是它的用户可以避免支付桥接服务(它们在价格上相互竞争)的小额费用。而这并不是必须的:现在有很多实时快速的桥接服务,提供从Arbitrum即时提款的服务。
需要强调的是,ZK Rollups的桥接优势是相当小的:它只用于从L2桥接回以太坊。曾几何时(约2019年),许多人认为Rollups将提供一个缓慢的推出,有一两个活的dapp。在这个世界上,Rollup用户会不断发现自己在L1和L2之间来回桥接。但这并不是我们目前所处的世界。Arbitrum有一个繁荣的生态系统,有数以百计的dapps横跨Defi的每一个角落,许多用户被桥接到Arbitrum并长期留在那里。此外,在用户跨越多个链的程度上,他们不仅仅是去以太坊。他们也会去其他L1和侧链,对于这种直接的桥接,ZK Rollups比Optimistic Rollups没有优势。
结论:ZK系统在桥接L1方面有轻微的优势,但由于快速桥接和多链使用模式,在实践中大多被缓解。
对比Optimistic和ZK系统,我们认为Optimistic系统是明显的赢家。Optimistic的成本更低,与EVM和现有工具完全兼容,在实践中唯一真正的缺点是在没有快速桥接服务的情况下,L1桥接的速度更慢。ZK的其他所谓优势需要牺牲链的可见性或最终时间,我们认为这不是用户想要的妥协。
*这些都不可能改变。*与EVM兼容的合约执行的ZK证明仍将比Optimistic执行昂贵得多,而且实现保证进度、链的交易可见性和去中心化的要求也将保持优势。尽管我们愿意在事情可能发生变化时将Arbitrum切换到基于ZK的执行,但我们不认为这样的改变会发生。
最后,我们要提醒大家注意。现在有一种趋势,就是人们将Arbitrum今天提供的服务与ZK系统说他们将来提供的服务进行比较。但是这种比较没有什么意义。如果我们比较今天的系统,像Arbitrum这样的Optimistic卷轴是唯一支持开放部署一般智能合约的系统。或者,如果我们比较的是未来的系统,那么我们应该将Arbitrum的未来与未来的ZK系统进行比较。我们正在不断地改进Arbitrum ——例如,我们即将发布的Nitro版本包括更低的成本和更优化的链上数据无损压缩。我们正在孜孜不倦地改进Arbitrum,将成本降低到理论上的极限。正如我们在这篇文章中所展示的,我们相信,当考虑到目前存在的系统以及它们各自的理论极限时,Optimistic Rollups是明显的赢家。