查看原文
其他

Celestia研究员分析6种Rollup变体:Sequencer=聚合器+Header生成者

NashQ 极客 Web3 2023-08-02
作者:NashQ,Celestia研究员
原文标题:Redefining Sequencers: Understanding the Aggregator and the Header Producer

编译:Faust,极客Web3

译者注:出于让Rollup模型更容易理解、更方便剖析的目的,Celestia研究员NashQ将Rollup的定序器(Sequencer)分成了两个逻辑实体——聚合器和Header生成者。同时,他将交易排序过程分为了三个逻辑步骤:包含、排序和执行(inclusion, ordering, and execution)。

在这种分析思路引导下,主权Rollup的6大重要变体更加清晰易懂。NashQ细致讨论了不同Rollup变体的抗审查性和活性,还探讨了每种Rollup变体的节点在信任最小化状态下的最低配置(就是指要达到Trustless状态,Rollup用户至少要运行哪些类型的节点)。

虽然本文是站在Celestia的视角解析Rollup,与以太坊社区分析Rollup模型的方式有所不同,但考虑到以太坊Rollup与Celestia主权Rollup的诸多互通之处,以及后者日益增强的影响力,对于以太坊爱好者而言,此文也极其值得一读。

什么是Rollup?

Rollup是将其“交易数据”发布到另一个区块链并继承其共识和数据可用性的区块链。

为什么我特意使用“交易数据”这个词而不是“区块”呢?这涉及到rollup区块和rollup数据之间的区别,最简洁的rollup只需要像下文中第一种变体那样的rollup数据。

Rollup区块是一种数据结构,它表示某个区块高度下的区块链账本。Rollup区块由rollup数据和rollup header组成。其中,Rollup数据可以是一批交易,或一批交易间的状态变化。

变体1:悲观Rollup / Based Rollup

构建Rollup的最简单方法是让用户将交易发布到另一个区块链上,我们将后者称为共识和数据可用性层(DA-Layer),在下面我会简称为DA层(译者注:近似于以太坊社区常说的Layer1)。

在我要介绍的第一种Rollup变体中,Rollup网络的节点必须重新执行DA层包含的Rollup交易,以检查账本的最终状态。这便是悲观Rollup!

悲观Rollup是一种只支持全节点的Rollup,这些全节点需要重新执行Rollup账本包含的所有交易以检查其有效性。

但在这种情况下,谁充当了Rollup的定序器Sequencer?实际上除了Rollup的全节点以外,没有任何实体执行过Rollup账本包含的交易。一般来讲,定序器会聚合交易数据,并生成一个Rollup header。但上文所说的悲观Rollup没有Rollup header!

为了方便讨论,我们可以将定序器拆分为两个逻辑实体:聚合器Aggregator和Header生成者。要生成Rollup Header,必须先执行交易,完成状态转换再计算得到对应的Header。但对于聚合器,它不需要完成状态转换,就可以进行聚合步骤。

排序Sequencing就是“聚合 + 创建Rollup Header ”的过程 。

聚合aggregation是将交易数据批量打包为一个批次Batch的步骤。一个批次一般包含很多笔交易(译者注:Batch就是Rollup区块中除Header以外的那部分数据)。

Header生成步骤则是创建Rollup Header的过程。Rollup Header是关于Rollup区块的元数据,至少包含了对该区块中交易数据的commitment(译者注:这里说的commitment是指对交易处理结果正确性的承诺)。

通过上述视角,就可以看出Rollup的各部分组件都由谁来充当。首先来看聚合器Aggregator这部分。前面提及的悲观Rollup没有Header生成过程,用户将交易直接发布到DA层上,这意味着DA层网络实质就充当了聚合器。

所以,悲观Rollup就是将聚合步骤委托给DA层的Rollup变体,它没有定序器Sequencer。有时候这类Rollup被称为“based rollup”。

Based Rollup具备和DA层相同的抗审查性及活性(活性衡量系统对用户请求的反馈速度)。此类Rollup的用户如果要达到信任最小化(最接近Trustless)的状态,至少要运行一个DA层网络的轻节点,及Rollup网络的全节点。

变体2:使用共享聚合器的悲观汇总

让我们讨论一下使用共享聚合器的悲观汇总。这个构思由Evan Forbes在其关于共享定序器设计的论坛帖子中提出。其关键假设是,共享定序器是为交易排序的唯一正规途径。Evan如此解释共享定序器的好处:

“为了达到与Web2等效的用户体验,共享定序器可提供快速生成的Soft Commitment(不是很可靠的保障)。这些Soft Commitment提供了关于最终的交易次序的一些保障(就是承诺交易次序不会改变),并且可让Rollup账本状态更新的步骤提前进行(但此时还没完成最终确定Finalize)。

一旦Rollup区块数据确认发布到了基础层Base Layer(此处应指DA层),Rollup账本的状态更新就完成了最终敲定Finalize。”

上述Rollup变体仍然隶属于悲观Rollup范畴,因为这类Rollup系统中只有全节点,没有轻节点。每个Rollup节点都要执行所有的交易,来保证账本状态更新的有效性。因为这类Rollup没有轻节点,就不需要Rollup Header,也就不需要Header生成者。(译者注:一般而言,一条区块链的轻节点不需要同步完整的区块,只接收区块头即可)

由于没有Rollup Header生成这个步骤,上述Rollup的共享定序器可以不必执行交易进行状态更新(生成Header的先决条件),而只包含聚合交易数据的过程。所以我更倾向将其称为共享聚合器shared aggregator。

在这种变体中,Rollup用户在信任最小化状态下,至少需要运行

DA层轻节点+ 共享聚合器网络的轻节点 + Rollup全节点。

此时,需要通过共享聚合器网络的轻节点来验证发布的aggregator header(这里指的不是Rollup Header)。上面提到,共享聚合器承担了交易排序的工作,它在发布的aggregator header中,包含了一个密码学commitment,对应着DA层上它发布的Batch。

这样一来,Rollup节点运行者可以确认,自己从DA层收到的批次Batch,是由共享聚合器创建的,而非其他人。

(因为上文包含的内容比较晦涩,可再看一遍示意图)

包含Inclusion是将交易包含到区块链中的过程。

排序Ordering是指将交易按照特定顺序在区块链中排列的过程。

执行Execution是指处理区块链中的交易,完成状态更新的过程。

由于共享聚合器承担了包含和排序的工作,Rollup的抗审查性就取决于它。

如果假设L_ss是共享聚合器的活性,L_da是DA-Layer的活性,那么该Rollup模型的活性就是L = L_da && L_ss。换句话说,如果两个部分中任意一个存在活性故障,则Rollup也存在活性故障。

为简单起见,我将活性作为一个bool值来考察。如果共享聚合器故障了,Rollup就无法继续运转。如果DA层网络故障了,共享聚合器可以继续为Rollup区块提供Soft Commitment。但此时,Rollup的各项属性将完全取决于共享聚合器网络,而后者的各项属性往往远不及原本的DA层。

让我们来继续探讨上述Rollup方案的抗审查性:

在该方案中,DA层不能对某些笔特定的交易进行审查(译者注:交易审查往往可以拒绝让某些交易上链),它只能针对共享聚合器提交的整个交易批次Batch展开交易审查(拒绝让某个Batch包含进DA层)。

但按照Rollup的工作流程,共享聚合器在向DA层提交交易批次Batch时,早已完成了交易排序,不同批次间的顺序也定完了。所以,DA层的这种交易审查,除了延迟Rollup的账本最终性确认外,没有其他作用。

综上,我认为抗审查性的重点,是确保没有任何一个实体可以控制或操纵系统内的信息流通,而活性则涉及维护系统的功能和可用性,即使存在网络中断和对抗行为。虽然这与当前主流的学术定义冲突,但我仍然会使用我所阐述的概念定义。

变体 3:基于Based Rollup和共享聚合器的悲观Rollup

尽管共享聚合器为用户和社区带来了好处,但我们仍应避免过度依赖它,并且要允许用户从共享聚合器撤出至DA层。我们可以将前面介绍的两种Rollup变体组合,在使用共享聚合器的同时,允许用户直接向DA层提交交易。

我们假设,最终的Rollup交易序列取决于共享聚合器提交的交易序列,以及用户在DA层区块中直接提交的Rollup交易。我们将这称作Rollup的分叉选择规则。

聚合在这里分成了两步。首先,共享聚合器发挥作用,聚合一些交易。然后,DA层可以将共享聚合器提交的批次Batch和用户直接提交的交易进行聚合。

此时的抗审查性分析要更复杂些。DA层网络节点可能在下一个 DA层区块出块前,对共享聚合器提交的Batch进行审查,在知晓了Batch内的交易数据后,DA层节点可以提取MEV价值,先用自己在Rollup网络上的账户发起抢跑交易,并将其抢先包含至DA层区块,之后才包含Rollup共享聚合器提交的Batch。

显然,第三类Rollup变体的soft commitment保障的交易次序最终确定性,要比前面提到的第二类Rollup变体更脆弱。在这种情况下,共享聚合器将MEV价值拱手送给了DA层节点。对此,我建议读者观看关于利用有利可图的审查 MEV 的研究讲座。

目前已经有一些设计方案出现,以降低DA层网络节点执行此类MEV交易的能力,例如“重组窗口期”功能,这会使得Rollup网络用户直接向DA层提交的交易被延迟执行。Sovereign Labs 在其名为 Based Sequencing with Soft Confirmations 的设计提案中详细描述了这一点,其中提出了“首选定序器”的概念。

由于MEV问题取决于Rollup选择的聚合器方案,以及 rollup分叉选择规则,某些方案将不泄漏MEV给DA层,而一些方案将泄漏部分或全部MEV给DA层,但这是另一个话题。

至于活性,这种rollup 方案比仅允许共享聚合器向DA层提交交易的方案更具优势。如果共享聚合器出现活性故障,用户仍然可以向 DA层提交交易。

最后,让我们谈谈信任最小化下的Rollup用户最低配置:

至少要运行 DA层轻节点 + 共享聚合器轻节点 + Rollup 全节点。

此时,仍然需要验证共享聚合器发布的aggregator header,使得rollup 全节点能够根据分叉选择规则区分交易批次。

变体4:Optimistic Based Rollup和中心化的Header生成者

让我们讨论一种被称为Based Optimistic Rollup 的变体及中心化的Header生成器。这种方案使用 DA层聚合Rollup交易,但引入了一个中心化的Header生成器来生成Rollup Header,以启用 Rollup 轻节点。

Rollup 轻节点可以通过单轮欺诈证明,间接检查 Rollup交易的有效性。轻节点会对Rollup Header的生成者持乐观态度,并在欺诈证明窗口期结束后进行最终确认。另一种可能是,它从诚实的全节点那里接收到欺诈证明,得知Header生成者提交了有错误的数据。

我不打算在此文详细介绍单轮欺诈证明的工作原理,因为这超出了本文涉及的范围。单轮欺诈证明的好处是可以将欺诈证明窗口期从7天缩短到一定程度,具体的数值有待确定,但数量级比传统的乐观rollup更小。轻节点可以通过Rollup全节点组成的P2P网络获取欺诈证明,而不需要等待后续的争议过程,因为所有的判据都在单个欺诈证明中完整的提供了。

上述Rollup模型使用 DA层作为聚合器,并继承了它的审查抗性。此时的DA层负责包含和排序交易。中心化的Header生成者将从DA层中读取Rollup交易序列,并据此构建对应的Rollup Header。Header生成者将把Header和Stateroot发布到 DA层。这些Stateroot是创建欺诈证明时所必需的。简而言之,聚合器负责包含和排序交易,Header生成器会执行交易更新状态得到Stateroot。

假设DA层(此时它也充当了Rollup的聚合器)是足够去中心化的,并具有良好的抗审查性。此外,Header生成器不能更改聚合器发布的Rollup交易序列。现在,如果将Header生成器去中心化,带来的唯一好处是更好的活性,但Rollup的其他属性与第一种变体Based Rollup相同。

如果Header生成器发生活性故障,Rollup 也会发生活性故障。轻节点将无法跟进Rollup账本的进度,但全节点可以。此时,变体4所描述的Rollup退化成了变体1描述的Based Rollup。显然,变体4描述的信任最小化最低配置是:

DA层轻节点+Rollup轻节点。

变体5:Based ZK-Rollup和去中心化的Prover Market

我们已经讨论了悲观Rollup(Based Rollup)和乐观Rollup,现在是时候考虑ZK-Rollup了。最近Toghrul做了一个关于聚合器(Sequencer)和Header生成器(Prover)分离的演讲(Sequencer-Prover Separation in Zero-Knowledge Rollups)。在这种模型中,将交易作为Rollup数据而非State Diff进行发布要更容易处理,所以我会着重于讨论前者。变体5是一个基于zk-rollup的去中心化Prover Market。

到目前为止,你应该对Rollup的工作原理比较熟悉了。变体5将聚合器角色委托给了DA层节点,由后者进行包含和排序交易的工作。我会引用 Sovereign-Labs 的文档,它对变体5中一笔交易的生命周期进行了很好的解释:

用户发布一个新的数据块到L1链(DA层)上。一旦这些数据块在L1链上被最终确定,它就在逻辑上具备最终性(不可更改)。L1链的区块进入最终确定阶段(就是不可回滚)后,Rollup的全节点会扫描这些区块,按照次序处理所有与Rollup有关的数据块,生成最新的Rollup状态根Stateroot。此时,从Rollup全节点的角度来看,这些数据块已经完成了最终确定。

在这个模型中,Header生成者由去中心化的Prover Market充当。

Prover证明者节点(在ZKVM内运行的全节点)的工作过程与普通的Rollup全节点有类似的地方——扫描DA层区块链并按次序处理所有Rollup交易批次——生成对应的零知识证明并将其发布到DA层链上。(如果Rollup系统想激励Prover证明者,要让后者将生成的ZK证明发到DA层链上,否则就无法确定哪个Prover率先提交了ZK证明)。一旦某个交易批次对应的ZK证明被发布到链上,该交易批次在全体Rolup节点(包括轻节点)眼中就完成了最终确定。

(因为涉及的概念比较多,可以再看一遍示意图)

变体5具备和DA层一样的抗审查性。去中心化的Prover Market不能对Rollup交易展开审查,因为DA层上已经确定了规范的交易次序,只是为了获得更好的活性及创建激励市场,所以才将Header生成器(这里指Prover)去中心化。

这里的活性是 L = L_da && L_pm(Prover的活性)。如果Prover Market的激励不一致,或者出现活性故障,Rollup轻节点将无法同步区块链进度,但Rollup的全节点可以,对于全节点而言,这只不过又回退到了变体1所说的Based Rollup/悲观Rollup。这里的信任最小化最低配置与乐观Rollup情况下相同,即

DA层轻节点+Rollup轻节点。

变体6:混合型Based Rollup+中心化的乐观Header生成者+去中心化Prover

我们仍然让DA层节点充当Rollup的聚合器,并委托其进行包含和排序交易的工作。

正如你从下图中看到的,ZK Rollup 和乐观Rollup都采用DA层上相同的有序交易批次,作为Rollup账本来源。这是我们可以同时使用两个证明系统的原因:DA层上的有序交易批次本身并不受证明系统的影响。

先谈一下最终性。从 Rollup 全节点的角度来看,当 DA层自身的区块完成最终敲定时,其包含的Rollup交易批次也是最终确定不可更改的了。但是我们更关心轻节点视角下的最终性。假设中心化的Header生成者抵押了一些资产,并在生成的Rollup Header上签名,连带将计算出的Stateroot提交到 DA层。

与前面的变体4一样,轻节点将乐观地信任Header生成者,相信它发布的Header没错,并等待来自全节点网络的欺诈证明。如果欺诈证明的窗口期结束了,全节点网络还没发布欺诈证明,从 Rollup 轻节点的角度来看,Rollup 区块就完成了最终确定。

关键之处在于,如果我们可以获得一个 ZK证明,就不必再等待欺诈证明窗口期结束。除了单轮欺诈证明,我们可以用ZK证明取代欺诈证明,并丢掉恶意的Header生成器生成的错误Header!

当轻节点接收到对应某个Rollup交易批次的ZK证明时,这个批次就会完成最终确定。

现在我们有了快速的Soft Commitment和快速的最终性Finality。

变体6仍然具有与 DA层等同的抗审查性,因为它是基于 DA层的。对于活性,我们将有 L = L_da && (L_op || L_pm),这意味着我们增加了活性保证。如果中心化的Header生成器或去中心化的Prover Market二者之一有活性故障,我们可以退化到二者中的另一种方案。

此种变体中,用户信任最小化的最低配置是:

一个 DA层轻节点 + 一个 Rollup 轻节点。

摘要:

1.我们将Rollup的关键角色——定序器Sequencer拆分为两个逻辑成分:

聚合器和Header生成器。

2.我们将Sequencer的工作分为三个逻辑过程:包含、排序和执行。

3.悲观rollup和based rollup 是一种东西。

4.根据需求,您可以选择不同的聚合器和Header生成器方案。

5.这篇文章中介绍的每个Rollup变种都遵循了相同的设计模式:

最后,我还有一些想法。请您思考:

经典的Rollup(指以太坊Rollup)如何归类到上述的变体之中?

在所有变体中,我们只让聚合器负责包含+排序,Header生成器来执行交易。如果聚合器仅负责包含交易,Header生成器负责排序和执行交易,该怎么做?考虑到引入链上拍卖步骤,我们可以把这三步工作彻底分开吗?

什么是共享Header生产者/Header Producer Market?

谁捕获了MEV价值?用户能把它拿回来吗?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存