原文:An overview of Scroll's architecture —— Scroll
译者:Xiang|W3.Hitchhiker
Scroll 是一个 EVM 等效的 zkRollup,用于扩展以太坊。从技术上讲,Scroll 是建立在两个主要部分之上的。核心部分是 zkEVM,用于证明 2 层 EVM 执行的正确性。一年多来,我们一直在与以太坊基金会的隐私和扩展探索小组(PSE)一起公开构建它。但是要将 zkEVM 变成以太坊上的一个完整的 zkRollup,我们还需要围绕它构建一个完整的 L2 架构。
在这篇文章中,我们将概述 Scroll 的整体架构。更具体地说,我们将介绍由中心化排序节点和去中心化证明网络组成的 Scroll 的初始版本。我们致力于在未来实现去中心排序节点集,并将在未来的文章中分享我们的设计。
Scroll 的架构
当前架构由三个基础设施组件组成(参见图 1):
Scroll 节点:从用户交易构造 L2 块,将它们提交到以太坊基础层,并在 L1 和 L2 之间传递消息。
Roller 网络:生成 zkEVM 有效性证明以证明交易被正确执行。
Rollup 合约和桥合约:为 Scroll 交易提供数据可用性,验证 zkEVM 有效性证明,并允许用户在 Ethereum 和 Scroll 之间移动资产。
在下文中,我们将详细介绍这些组件中的每一个的作用。
(图 1:Scroll 的架构)
Scroll 节点
Scroll 节点是应用程序和用户与 scroll 交互的主要方式,里面包括了三个模块:Sequencer(排序器),Coordinator(协调者),Relayer(中继者)。
排序器提供 JSON-RPC 接口并接受 L2 交易,每几秒钟就会从内存池里面检索一批交易来执行,生成新的 L2 区块和新的状态根,新的区块会通知到协调者,同时也会发送新区块的执行追踪,协调者就会从 roller 池中随机挑选 roller 来给区块生成证明。排序器实现基于 Go-Ethereum (Geth),它是最流行的以太坊节点实现之一。通过分叉 Geth,我们可以实现最佳兼容性,并继承了经受住长时间考验的安全性。
一旦生成了一个新的区块,协调者就会收到通知,并从排序器接收这个区块的执行跟踪。然后它将执行跟踪(execution trace)分派给从 Roller 池中随机选择的 Roller 以生成证明。
中继者监视部署在以太坊和 Scroll 上的 Rollup 合约和桥合约。有两个主要职责,第一个是通过监控 rollup 合约来追踪二层区块的状态,包括数据可用性和有效性证明,第二个是监视部署在以太坊和 scroll 上的桥接合约的存取款事件,并且将这些消息从一端中继到另一端。
Roller 网络
Roller 网络中的roller充当的是证明者的角色,负责为zkrollup生成有效性证明。Rollers 预计将利用 GPU、FPGA 和 ASIC 等硬件加速来减少验证时间和验证成本。图 2 显示了 Roller 如何为每个区块生成有效性证明。该过程包括以下步骤:
Rollers首先将从协调者收到区块的执行追踪,将它们转换成电路 witness
为每个 zkevm 电路生成证明
用证明聚合(proof aggregation)将多个 zkevm 的电路证明聚合为单个证明
(图 2:Scroll 的工作流程)
Rollup 合约和桥接合约
Scroll 是通过 Rollup 合约和桥合约连接到以太坊基础层。这些共同确保了 L2 交易的数据可用性,并允许用户在 L1 和 L2 之间传递资产和消息。
Rollup 合约从排序器那里接收 L2 状态根和区块,状态根储存在以太坊状态中,二层区块数据会作为以太坊的 calldata 保存,这是为 scroll 的区块提供了数据可用性,并利用以太坊的安全性来确保包括 Scroll Relayer 在内的索引器可以重建 L2 块。一旦 rollup 合约验证了 L2 区块的有效性证明,就表示这个区块在 scroll 上完成。
桥合约在以太坊和 scroll 上部署,允许用户在 L1 和 L2 之间传递消息,在这个消息传递之上,还要建立无需信任的桥接协议,让用户在两端都可以转移 ERC-20 资产。比如用户从以太坊发送消息或者资产到 Scroll 上,用户在桥合约上可以调用 SendMessage 这个交易,中继者就会索引到这个交易,把它发送到排序器,包含在 L2 区块中,反过来从 Scroll 发送到以太坊上,合约和过程也是类似的。
Scroll 的 zkRollup 是如何工作的?
将这三个架构组件放在一起,我们现在可以解释 Scroll 的 zkRollup 的工作流程,总结在下面的图 3 中。
(图 3:Scroll 的工作流程)
二层的区块是在 scroll 上生成的,提交到以太坊的基础层到确认之前,会经过下面几个步骤:
Scroll 的排序器生成很多块,对于第 i 个区块,排序器生成执行追踪 T 发给协调者,还会将交易数据 D 作为 calldata 提交到以太坊上的 rollup 合约(这一步是为了数据可用性),并将生成的状态根和对交易数据的承诺作为状态提交给 Rollup 合约。
协调者随机选择一个 roller(证明者),为每个区块追踪生成有效性证明,为了高效,可以在不同的 roller 上进行不同区块的证明。
证明者生成证明 P 之后,将证明发回给协调者,每k个块协调者就会重新分配一个证明者,这个证明者会把之前的 k 个证明聚合成一个证明 A。
最后协调者会把聚合证明 A 提交到 rollup 合约,根据排序器提交给 rollup 合约的状态根加上交易数据承诺来验证聚合证明,通过之后就可以确定 L2 上的 i+1 到 i+k 个区块。
图 3 说明了 Scroll 区块将在 L1 上以多步骤过程完成。每个 L2 区块将通过以下三个阶段进行,直到最终确定。
Precommitted
表示一个区块已经被一个排序器提议并发送给 Rollers。虽然 Precommitted 区块还不是 Scroll L2 链的规范部分,因为它们尚未发布在以太坊基础层上,但信任排序器的用户可以选择对其采取预期行动。Committed
表示该区块的交易数据已经发布在以太坊的 rollup 合约上。这确保了区块数据可用,但不能证明它已经以有效的方式执行。Finalized
表明此区块中交易的正确执行已通过验证以太坊链上的有效性证明得到证明。最终区块被认为是 Scroll L2 链的规范部分。
将所有这些放在一起,Scroll 能够在 L2 上执行本机 EVM 字节码,同时从基础层以太坊继承强大的安全保证。在本系列的下一篇文章中,我们将解释开发人员在 Scroll 上部署 dapp 的工作流程以及用户如何与之交互。