本文主要探讨了以太坊中的Based Rollup的分叉选择规则,分析了re Based Rollup的工作原理及其与主链之间的关系。
以太坊扩展的分叉选择规则
Rollup 工程历史上关注的是状态转换函数 (STF)。这个 STF 驱动了节点和证明系统的工程问题。它保持用户余额和合同,并处理用户交易。我们设计了提前运行的排序器、预确认和其他机制,以预先承诺 STF 的输出。我们还继续在 Verkle tries 和生成的状态的其他复杂声明上投入精力。为了改变节奏,我们希望检查 Rollup 一个未被充分探讨的部分:其分叉选择规则。一旦理解得当,Rollup 的分叉选择规则比状态转换函数更有趣、更有用。
需要一些美观的头图。所以这是一个石堆。石堆在某种程度上类似于 Rollup,因为它们可以自发地进行重组。照片由 Alexandr Gerdt 在 Unsplash 发表。
分叉选择规则 (FCR: Fork-choice rules ) 描述了区块链节点如何Based主观信息建立对链过往历史的信心。1 最简单且最好理解的规则是工作量证明规则:节点必须接受具有最多累积难度的历史记录。2 节点在学习共识相关信息时持续执行分叉选择规则。每个新块、证明或者仅仅是时间的推移可能会导致节点根据某些分叉选择规则更新其主观的链尖视图。
分叉选择规则并不是对链顶的客观评估。它们依赖节点观察到的信息,因此总是主观的。节点不能强制其他节点遵循他们的 FCR,并且在任何给定时间,网络中的不同节点可能根据各自的主观输入对同一 FCR 得出不同的结果。显然,这种情况在块传播期间总是会发生。某些节点可能已接受一个块,但其他节点尚未接收到。因此,这些节点将处于不同的历史记录中,这两者都是主观正确的。随着节点观察到新信息,它们会根据其分叉选择规则更新历史视图。在一个设计良好的网络中(并在缺少长期分离的情况下),节点的主观视图应该随时间收敛。当节点对链的历史有一致的看法时,我们说它们彼此“达成共识”。遵循设计良好的 FCR 的节点最终与其他节点达成共识。3
以太坊有两种官方推荐的分叉选择规则,其中一种也被视为基本协议规则。4 首先,证明者和提议者应使用 LMD-GHOST5 规则的修改版本来确定规范顶端。提议者应Based LMD-GHOST 规则所选的顶端构建他们的块,证明者应仅签署确认其主观顶端的证明。其次,节点必须使用 Casper FFG6 规则来最终确定区块。节点不得接受任何历史记录,只要该区块在其对 Casper FFG 规则的视图下得到确认,就移除了该块。为了符合以太坊协议规则,节点必须遵循 Casper FFG 规则,但可以偏离 LMD-GHOST 规则。7
分叉选择规则允许观察者(如节点)建立对链历史的视图,因此也建立了对链状态的视图。当这种视图以拒绝先前接受的块的方式发生变化时,会发生链重组(“reorg”)。节点必须撤回已被去规范化的块的执行,并执行已被规范化的块。允许的重组深度源自 FCR 的设计。有些 - 如未检查点的 PoW - 允许重组整个链,而其他 - 如 Tendermint 和其他“单槽最终性” FCR - 根本不允许重组。虽然 LMD-GHOST 允许无限深度的重组,但 Casper FFG 不允许。Casper 是强制性的。一旦根据其 Casper FFG FCR 的视图最终确定块,节点将违反协议规则而返回该块。因此,遵循规则的以太坊节点当前支持最大到该深度的重组。8
分叉选择规则还有一些次要用户。例如,轻客户端9假设在不执行状态转换函数的情况下遵循 FCR。然而,更有趣的是 Rollups。作为主链的用户,Rollups 必须遵循某些主 FCR。作为链,Rollups 也有其自己的 FCR。许多 Rollup 的理想特性源于主分叉选择与 Rollup 分叉选择之间的关系。
重组是主观的,因为 FCR 是主观的。由于节点有不同的时钟和视图,某些节点可能会经历重组,而其他节点则不会。为了简化,我们说,当非微不足道的部分节点经历重组时,网络经历了重组。这通常会从已接受的历史中移除个别块(防止其 Casper 验证和最终确认),但很少移除超过 1 或 2 个块。2022 年发生的深度 7 的重组被认为足够显著,以促使深入探索。要移除一个 Casper 验证块,需要发生深度大于等于 32 的重组。这应被视为黑天鹅事件,因此 justification 被节点 RPC 称为“安全的”。
作者说明:
在本说明的其余部分,当我们说“主链进行重组”或“Rollup 进行重组”时,请理解为“当大量主链/rollup 节点在评估分叉选择规则后,接受一个新的历史记录,而该历史记录不是已接受历史记录的严格扩展。”重要的是要记住,重组是完全主观的,但总是使用主观语言是非常笨拙的。
尽管有许多争议,Rollup 实际上是区块链。它们的块形成一个整齐的链,节点用来计算当前状态。Rollup 有分叉选择规则。这可能是一个有争议的说法。我们太习惯于将 Rollup 建模为依赖系统。但是,Rollup 有块形成链体,这是一个必要的结果。必须有一个过程,通过该过程,节点进行身份验证并接受一个新的块。在主链影响该过程的输入的程度上,10 Rollup 必须解决主(host: 即主链)重组产生的历史冲突。我们将首先讨论包含所有现有 Rollup 的类别:主跟随(Host-following ) FCR。然后,我们将考虑没有具体示例的第二个类别。
所有现代 Rollup 都是主跟随( Host-following) 的。对于主跟随 Rollup,所有 Rollup 重组都会被主链重组触发 11 (尽管,这并不意味着主链重组始终导致 Rollup 序列或状态变化 - 更多的内容稍后介绍)。主跟随 Rollup 包括 Arbiturm、Optimism、Taiko、ZkSync 和其他许多。现有的 Rollup 可以分为两种一般类型:Based和提前运行(Run-ahead)。12
Based Rollup 完全遵循主链的分叉选择。对于Based Rollup,每个主链重组都会触发重新提取相应于受影响的主块的 Rollup 历史。新的主历史可能包含不同的交易和排序,因此当 Rollup 节点观察到主重组时,它们会从新的主历史重新推导 Rollup 顺序。然后,它们在新序列上执行 Rollup 状态转换函数以生成新状态,13 并丢弃旧序列和状态转换。这样,每个主重组直接导致 Rollup 重组。
Based Rollup 应被视为完全依赖于主链,因为存在双射关系:所有主重组导致 Rollup 的重组,所有 Rollup 重组都由特定的主重组触发。Based Rollup 与其主链的关系最简单。其他系统增加了复杂性。
提前运行(Run-ahead)的 Rollup 在分叉选择上混淆了界限。提前运行 Rollup - 如 Arbitrum 和 Optimism - 假设 Sequencer 不会产生歧义或虚假执行,并利用这一假设提供包含的预确认和对执行结果的预承诺。由于序列在发布到主链之前已最终确定,因此以太坊重组通常不会导致序列变化。Sequencer 的承诺为节点提供了该序列是不可变的所有必要保证。
这些提前运行的 FCR 仅仅跟随 Sequencer 的签名,而不管主链的行为。如果新的主历史省略了先前承诺的 Rollup 序列,Rollup 必须重新确认它们,但这并不暗示 Rollup 重组,除非 Sequencer 产生了歧义。为了支持桥接,Sequencer 在其批量承诺中引用一个特定的主块。只有在被替代的主块替换为 post-reorg 主链的情况下,Rollup 的序列和状态转换的结果才能改变。Sequencers 延迟这些主承诺以留出安全边际,从而确保这些重组并不常见。15
与Based Rollup 相比,提前运行 Rollup 的序列要求与主 FCR 有显著更多的独立性。提前运行 Rollup 的分叉选择规则应被视为部分主跟随,因为所有 Rollup 重组都是由特定的主重组触发,但并非所有主重组都会导致 Rollup 重组。换句话说,Rollup 重组与主重组间存在单射关系。
我们讨论Based和提前运行 Rollup,因为它们确实存在。我们可以想象其他不严格是Based的或提前运行的完全或部分主跟随 Rollup 分叉选择规则的示例。例如,考虑一个使用滞后 Sequencer 的 Rollup。在这种情况下,Sequencer 在这些交易被提交到主链之后对一组交易进行了排序。首先,用户在一个时期内提交交易数据。在下一个时期,Sequencer 为这些交易选择排序,所有节点执行状态转换。16 如果主重组深度足够以改变提交时期的交易数据,将导致 Rollup 历史的重组。这句话换句话说,该 Rollup 的 FCR 将部分主跟随。
尽管在重组与提前运行和Based设计上几乎没有探索,对于已部署的主跟随 Rollup,我们至少可以检查一些实例。另一主要类的 Rollup 分叉选择规则尚未被探索。
主跟随分叉选择规则仅在主链 FCR 输出变化时才改变其输出。另一方面,对于主观察分叉选择规则,只有 一些 Rollup 重组由主重组触发。 主观察分叉选择规则有条件,使 Rollup FCR 可能会重组,即使主分叉选择规则未重组。17 这似乎反直觉。我们不习惯将 Rollup 历史看作主链历史的独立。然而,这是从主链视角看待 Rollup 历史的方式。
尽管 Rollup 历史必须在任何给定点可从主历史派生,18 Rollup 不需要保证在每个时刻该历史就变成不可改变的。Rollup 有自己的 FCR。Rollup 设计者可以选择不最终确定的 FCR,Rollup 工程师可以编写尊重这样的 FCR 的节点。Rollup 的 FCR 不必是主跟随的。实际上,原始的 Merged Consensus 设计,现代大多数 Rollup 研究的基础,具有主观察分叉选择。这种设计Based主链状态与主链历史重组 Rollup。因为它依赖于合同状态来执行其 FCR 的故障证明要求,有特定情况(有效的故障证明)在主重组缺失的情况下,Rollup 可能会重组。
Rollups 可以利用重组实现有趣的效果。对于 Rollup,更新 FCR 意味着选择一个不同的序列。允许 Rollup 选择新的历史记录有效意味着重新调整过去已发生的事情。分叉选择扩展允许 Rollup 在自己的历史、状态和状态转换上实施追溯性规则。这些规则可以在时间 t+1 进行评估,但会影响发生在时间 t 的操作结果,通过导致 Rollup 历史的重组。
像任何分叉选择规则一样,Rollup 的 FCR 必须仅依赖节点可以观察的信息。此外,Rollup 必须完全能够从主历史推导出来。这给出了额外的约束:Rollup 的 FCR 只能读取从主历史或状态可计算的信息。这确保新的节点仍然可以同步 Rollup。19 这似乎是一个严重的限制,但它提供的灵活性比表面上看得多。任何可以提交给主 DA 或由智能合约生成的信息,都可以被 Rollup FCR 使用。这允许将预言机、zk 或任何计算的故障证明、DEX 价格和 NFT 所有权纳入 Rollup 分叉选择规则,只要它们经过主历史和/或状态。
此外,对于拥有桥接到主链的 Rollup,桥接可能在 Rollup FCR 将 Rollup 历史最终确定到高置信度之前,无法向主链发送消息。FCR 控制 STF 的输入,进而控制桥的输入。20 因此,如果 FCR 重新组织链历史,桥可能已经发送了那些不再是 Rollup 历史的一部分的消息。这将是坏事。Rollup 到主链的桥必须选择一个主观 FCR,并等待这个 FCR 满足。这与之前讨论的关于轻客户端桥接的限制相同,因为 ZK 证明和故障证明桥其实就是一个具象的轻客户端桥。21
Rollup 历史的重组可以用于在不改变交易包含的情况下改变结果。由于 FCR 定义了 Rollup 的历史,它可以Based任何可用的信息以任何确定性方式进行编辑。它可以在 Rollup 的历史中插入任意的状态转换、交易、状态变化、硬分叉等,即使在许多块经过之后。节点必须评估新的历史。22 新的历史不一定与旧的历史有关,只要可以Based主信息确定性推导。这在通过法定应用程序时显得尤为明显。
一个简单且明显有用的例子是允许一个有权限的方回溯否决 Rollup 上的特定交易。这将简单地被设置为某个主合约发出的特定事件,包含要删除的交易 ID。在观察到这样的事件后,Rollup 节点的 FCR 将把 Rollup 的顶端改为一个不包含指定交易的新块。节点将回溯他们的本地历史,直到该交易包含之前,然后重新执行所有交易 除了 指定的交易。这将允许预言机有效“回滚”被攻击的交易或其他链问题,而不需要硬分叉。23
追溯更改历史似乎具有广泛的适用性。24 特定于应用的 Rollup,或愿意追溯特定应用的通用 Rollup,可以通过在分叉选择规则中追溯应用语义,与在通用 Rollup 上托管的应用区分开来。这将允许它们运行扩展多个交易或区块的应用逻辑,以实现仅通过智能合约无法达到的方式。
允许回溯更改历史的 Rollup 可能会考虑延迟承诺其状态,直到 FCR 保证最终性,正如其他生态系统中所做的那样。25 它们可以选择在协议规则排除重组之前延迟计算该根,而不是为可能被更正的序列计算状态根。这将节省每次重组的大量计算,26 允许在相同计算资源下进行更深的重组。然而,延迟承诺将边际延迟Based故障或 zk 证明的桥接。考虑到复杂的权衡,以及这里的主要好处是优化,似乎更深入的研究是必要的。
Rollup 有自己的分叉选择规则,而且可以以任意方式扩展。为什么不引入第三条链的分叉选择规则呢?这将允许 Rollup 与那条链进行特权通信。这在之前已被松散探索,起初似乎造成严重的同步问题。遵循独立链的节点可能对每条链的 FCR 输出有完全不同的看法,并且这些观点可能会永远分歧。然而,我们可以使用与应用相同的技巧来访问主链以外的信息。我们可以简单地通过主链传递信息。
与其直接观察第三条链,我们可以通过智能合约将第三条链的 FCR 的评价引入主链的状态或历史。Rollup FCR 可以读取该智能合约执行的结果。通过这种方式,Rollup 的 FCR 可以访问主链能接入的任何桥接。虽然这似乎解决了问题,但确实带来了一些时间滞后。对 Rollup 的第三方信息的传递延迟将增加主桥接针对第三方链 FCR 的最终化 кезең。27 这感觉不太好。可能有方法在不将第三方链的 FCR 集成到主 CFC 中的情况下改善这一点。可以利用有条件状态或其他本地验证解决方案来加快速度并避免等待。更需要研究。
Rollup 是真实的区块链。它们拥有自己的节点、分叉选择和状态。Rollup 可以回溯时间,并编辑自己的历史和状态。通过仔细选择它们的分叉选择规则,Rollup 可以与主链快速通信,并使它们的应用能够以有用的方式修改链的历史。有明确的关于 FCR-嵌入应用的用例,支持黑客恢复、审查与公正执行保障的。由于过于复杂的提前运行排序和过于简化的Based排序设计,Rollup FCR 的研究已经冷却。使用提前运行或Based排序的 Rollup 放弃了相对竞争对手的巨大优势。
- 原文链接: blog.init4.technology/p/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!