利用异步和同步可组合性来解决流动性碎片化问题

本文探讨了以太坊 L2 之间的碎片化问题,提出通过更快地桥接原生资产、快速消息传递或者使链实现同步可组合性来解决。文章还介绍了一种新的协议 CIRC,用于 L2 链之间的快速异步和同步可组合性,旨在实现跨链应用程序像在统一链上一样互操作,同时不牺牲多链的优势。

L2 通过水平扩展吞吐量、启用新的执行环境、降低交易成本和减少交易延迟,丰富了以太坊生态系统。但如今的 L2 就像孤立的系统,而不是以太坊 L1 之上的一个统一层。特别是,这导致了跨链的 流动性 碎片化。修复这种碎片化是 Espresso 的使命 —— 构建一个未来,所有 L2 链上的应用程序都可以像一个统一链的一部分一样进行互操作, 而不影响拥有多个独特链的优势。

本文探讨了如何通过更快地桥接原生资产、快速消息传递,或在更大程度上,通过使链 同步可组合 来解决 L2 碎片化问题。无论是异步还是同步,链之间的桥接代币都必须是直接的(而不是通过第三方流动性提供商),并在目标链上提供代币的规范版本(而不是桥接包装的版本)。L2 碎片化也可以通过重新设计应用程序来解决,使其仅对跨链消息起作用,在其他链上运行代币,并完全消除跨链资产转移的需要。

我们还提供了一个原创协议 CIRC,用于 L2 链之间快速异步和同步的可组合性。

当今 L2 桥接的问题和流动性碎片化

对于大多数资产(如 ETH 或 DAI),今天在以太坊 L2 链之间转移它们——而最终并没有在目标链上获得包装资产——既昂贵又耗时。它需要首先将资产从一条链提取到 L1 上,然后将其存入第二条链。对于 Optimistic Rollup 来说,这需要几天时间,而对于 ZK Rollup 来说,则需要几个小时。即使对于未来承诺拥有快速 ZK 结算证明的链来说,由于以太坊最终性的延迟,这至少也需要 12-15 分钟。USDC、WBTC 或 Ethena 等特殊代币是例外,它们拥有中心化的资产发行者。但是,这些发行者并非与所有 L2 链都合作。通过 CCTP 桥接 USDC 仍然需要 12-15 分钟,因为它在等待 L1 的最终确认。

在 L2 链之间转移资产的摩擦促使每个链复制其他链提供的服务,从而导致流动性碎片化以及其他后果。大多数链需要向其用户提供这样一种基本功能,即能够交换资产(即,提供像 AMM 这样的去中心化交易所)。

AMM 提供了 L2 之间流动性碎片化最明显的例子之一。当 AMM 具有更大的流动性(即,更大的储备池)时,交易滑点较低,这对用户来说更好。当每个 L2 都有其自己的 AMM 副本时,这迫使流动性提供者将其资本分散在 AMM 的流动性池中,而不是将其全部集中在一个地方。这种冗余导致所有 AMM 为用户提供更糟糕的体验。

从理论上讲,快速桥接应该有助于解决这个问题。如果用户可以将资产快速桥接到具有高 AMM 流动性的 L2,在那里进行交易,然后将新的资产桥接回来,那将消除每个 L2 拥有自己的 AMM 的需要。

如今使用最广泛的桥依赖于被称为求解器的第三方流动性提供商,以解决通过 L1 桥接的延迟和成本问题。但是,这些所谓的 基于意图的桥 本身也存在流动性碎片化问题,因为它们要求求解器在桥的两侧都持有原生版本的资产,并根据需要进行重新平衡。这是流程:

  1. 希望将资产从一条链桥接到另一条链的用户首先授权一笔交易,将代币托管在源链上。
  2. 这些代币被锁定在一个特殊的托管合约中,只有在求解器使用跨链消息传递协议验证了求解器已向第二条链上的用户支付了所需数量的代币(减去费用)后,该合约才会将代币释放给求解器。
  3. 当求解器认为用户的托管交易已成功时,它会在第二条链上向用户付款。如果它信任第一条链的排序器,它可能会在几秒钟内实现用户的意图,尽管它会承担风险以提供更好的用户体验。
  4. 在向用户付款后,求解器可以从第一条链上的托管合约中提取代币,但可能需要等待很长时间,具体取决于所使用消息传递协议的延迟。

在以太坊 L2 链上的合约来说,最安全的消息传递协议是通过 L1 本身从另一个以太坊 L2 链读取消息。这不需要 L1 交易。大多数 L2 链会定期将其状态 Merkle 根发布到 L1,并且还可以访问最新的 L1 状态 Merkle 根。因此,这些 L2 链上的任何一个合约都可以验证有关另一个 L2 链过去状态的 Merkle 证明,包括它创建的任何消息。一个示例实现是 RIP-7755。以这种方式安全地传递消息需要等待发送链的状态根完成结算,这至少需要 12-15 分钟(仅用于 L1 最终确定此信息),对于今天的大多数 Rollup 来说,最多需要几天时间。

其他消息传递协议(如 UMA、LayerZero、Hyperlane 和 Wormhole)依赖于其他安全假设,如链下预言机或多重签名委员会,但最终无法比 L1 最终确认所需的 12-15 分钟更快地安全证明消息。

依赖于求解器的桥并不能充分解决 DEX 流动性碎片化问题。要理解原因,请考虑这样一种情况:用户在一个小型 Rollup 上持有 ETH,但希望将其 ETH 交换为 DAI。由于该 Rollup 没有太多流动性,因此用户被迫将其 ETH 桥接到更大的 Rollup(让我们以 Base 为例)以获取流动性。流程如下所示:

  1. 用户付费给求解器以将其 ETH 桥接到 Base
  2. 在 Base 上,用户将其 ETH 兑换为 DAI
  3. 然后,用户付费给求解器,将 DAI 桥接回其小型 Rollup

在这种情况下,求解器需要在小型 Rollup 和 Base 上持有足够大的 ETH 和 DAI 储备,并且实际上是在运营交易所、充当做市商以及使用 Base 上的交易价格作为价格预言机!这种“桥接”是虚构的。求解器不妨直接促进交易,从用户那里接收 ETH 并向用户提供 DAI,所有这些都在小型 Rollup 上进行。求解器可以选择它希望如何在其他地方异步重新平衡其他交易所,或者它希望如何使用来自其他交易所的信息来确定它愿意在特定 L2 上提供的汇率(例如,这可以通过使用中心化交易所以及 L2 DEX 协议来完成)。

迈向更快的桥接和消除碎片化流动性

以快于 15 分钟甚至理想情况下几秒钟的速度传递消息,要么要求链信任彼此的排序器,要么采用替代协议来快速确认各个 L2 上的交易完成情况。这些替代方案的示例包括:具有经济抵押的排序器的 L2,如果提供不正确的确认,将会被罚没;或者更好的是,由经济抵押的验证器运行的 BFT 共识协议(例如,Espresso 网络)。与可验证的状态证明(例如,ZK 或 TEE)相结合,BFT 共识验证器不需要执行交易,只需最终确定其顺序即可,以防止 L2 排序器在最终发布到以太坊 L1 时发生含糊不清的情况。以这种方式引入 BFT 协议是对 L2 链今天结算方式的改变,但也是迈向排序器去中心化的第一步。

链本身也可以乐观地接受来自不受信任的排序器的低延迟消息,并在结算时发现差异——这就是 CIRC 背后的设计原则,CIRC是我们前面提到的用于链之间协调和预测消息传递的与堆栈无关的标准。

CIRC,即协调的跨 Rollup 通信(Coordinated Inter-Rollup Communication),其灵感来自 Brendan Farmer 早期关于聚合区块链以支持 AggLayer文章,并且也反映在新的 OP 互操作协议 中。它将实时消息验证的问题推给了 Rollup 运营商(他们有动机防止重组),而不是通过链逻辑本身或通过引入新的安全假设来处理。Rollup 运营商仍然需要检查可验证的状态证明和快速 BFT 确认,以便他们对 Rollup 的状态有高度的实时信心(就像他们今天通常所做的那样,而不是等待结算时间)。

稍后我们将更详细地介绍我们的 CIRC 设计。它支持更快的异步消息传递,甚至在与协调区块构建机制(例如,共享排序)相结合时,还支持同步消息传递,所有这些最终都由 L1 保护。

快速消息传递的一个直接结果是,基于意图的桥中的求解器可以更快地在源链上收回其资金。这使他们能够更快地重新平衡并提高其资本效率。但是,如前所述,更快的消息传递本身并不能立即解决流动性碎片化问题。

解决流动性碎片化的一种方法是通过共享的 L1 桥。例如,这可以作为其自身的专用 L2 链来实现,所有资产都从 L1 存入该链,然后提取到 L1。这个专用的“桥接链”为每个存入的资产维护一个会计表,记录哪个 L2 链当前持有该资产。当它收到来自 L1 的、发往特定 L2 用户账户的存款时,它会更新该表并发送一条消息,指示目标 L2 将该资产铸造到用户的账户中。将资产发送到不同 L2 上的账户的用户会创建一个交易,该交易会触发一条消息发送到桥接链,桥接链会更新会计表并发送一条消息,指示新的目标 L2 铸造该资产。从这些连接的 L2 之一提取到 L1 的任何资产也类似地通过桥接链。这样,在一个 L2 上直接从 L1 或从参与共享桥的任何其他 L2 收到的资产都是同质化的。特别是,如果这些 L2 链中只有一个运行 DEX,那么任何其他 L2 上的用户都可以快速桥接其资产,进行交换并桥接回来,而无需依赖第三方求解器为交易提供流动性。

所有共享此 L1 桥的 L2 都将依赖于 L1 桥链的安全性,无论是为了其处理的资产的安全还是为了提款的活跃性。因此,鉴于当今 Rollup 设计的多样性以及它们所做的安全/用户体验权衡,很难想象所有 Rollup 堆栈上的所有 L2 都共享一个 L1 桥来存入所有代币。

但是,L1 桥的设计目标可以按以下方式概括。通过足够快的消息传递,资产可能根本不需要在链之间桥接。正如 L1 上的每个资产都由一个唯一的代币合约管理一样,每个 L2 资产都可以存在于由代币合约开发者选择的唯一 L2 链上。例如,虽然 OP 自然会在 Optimism 上运行,ARB 会在 Arbitrum 上运行,ZK 会在 ZKSync 上运行,但 MakerDAO 开发者会选择(或部署)一个链作为 DAI 的规范 L2。托管 DEX 的 L2 链根本不需要有任何原生代币合约!相反,DEX 可以列出存在于其他 L2 链上的代币的交易对。

例如,Polygon zkEVM 上的 AMM 应用程序可以管理由 Arbitrum One 跟踪的 ARB 储备和由 OP Mainnet 跟踪的 OP 储备。要将 ARB 兑换为 OP,用户会将交易发送到 Polygon AMM,其中包含授权交易的签名,该交易将 ARB 存入由外部 Polygon AMM 控制的 Arbitrum One 上的特殊账户。此交易将导致 Polygon AMM 计算兑换价格,并向 Arbitrum One 发送一条消息以触发存款,等待一条消息返回确认成功,最后向 Optimism 发送一条消息,将计算出的 OP 数量从 AMM 的账户转移到用户的账户。从技术上讲,Polygon AMM 不会等待消息响应,而是后续 Polygon zkEVM 区块中的交易会消耗来自 Arbitrum One 的消息响应并生成 OP 的消息。在此示例中,Polygon AMM 的作用是对所有用户兑换交易进行线性化和排序,而 OP Mainnet 和 Arbitrum One 则处理代币在储备账户和用户账户之间的实际转移。

最后,流动性碎片化在有些方面表现出来,只能通过同步可组合性来解决。一个例子是闪电贷的流动性。在闪电贷中,资产从流动性池中借出,用于为其他应用程序中的操作提供资金(例如,AMM 中的套利交易),并在同一交易中返回。要使此操作在不同 L2 链上的流动性池和应用程序之间工作,需要这些不同链上的所有相关操作(包括它们之间传递的消息)都作为一次 ACID 交易发生,这就是我们接下来定义同步可组合性的方式。

同步和异步可组合性之间的区别

我们将同步可组合性定义为在不同链上部署的应用程序之间执行单个逻辑 ACID 交易的能力。ACID 属性是数据库中独立执行之间互操作的黄金标准,使其可用于组合独立执行的 L2。

ACID 框架下同步和异步可组合性之间有两个关键区别:隔离性和原子性。

隔离性

我们将 逻辑交易 定义为执行预期任务(或意图)所需的用户操作的抽象集合(即,交易集合)。这些交易不都需要与单个链相关联。

另一方面,物理交易 是提交到特定链的单独交易,它们以某种方式执行用户操作。单个逻辑交易可能由多个物理交易组成。

在异步组合的情况下,单个逻辑交易必须分成两个或多个部分,这些部分被单独和顺序地排序。任意数量的交易可以按顺序排列在不同部分之间,并且这些中间交易可以读取异步意图的中间状态。因此,异步组合放弃了 ACID 交易保证的一个重要原则:隔离性,即即使单独的交易同时运行,结果状态也好像每个交易都是单独按顺序执行的,外部各方无法读取交易的任何中间状态。

考虑以下示例:Alice 想要发送给 Bob X 个 ETH 以换取 Y 个 USDC。Alice 的资金在链 A 上,Bob 的资金在链 B 上。

在异步情况下,此逻辑交换交易必须分成多个物理交易:

  1. Alice 必须首先锁定她在链 A 上的资金,并规定如果在某个预定时间段后这些资金尚未被申领,她可以收回这些资金。
  2. Bob 必须将 Y 个 USDC 发送到 Alice 的地址(在链 B 上)。
  3. Bob 可以申领他的 ETH。

但是,请考虑由于此逻辑交易不具有隔离性而可能发生的情况:

  1. Alice 锁定 X 个 ETH,这导致 ETH 的价格上涨。
  2. Bob 看到此价格变化,并决定以高于 Y/X 的价格出售 X 个 ETH,然后以约定的兑换价格 Y/X 从 Alice 处“购回”ETH。

这种套利机会之所以存在,是因为交易所可以在异步上下文中观察到逻辑交易交换中间可用 ETH 的变化并对此做出反应。

另一方面,同步可组合性通过确保在逻辑交易中间不能按顺序排列外部物理交易来保证隔离性。在上面的示例中,在同步组合下,没有人能够观察到交换的中间状态。交易所将无法观察到 Alice 的交易引起 ETH 供应的变化,直到整个逻辑交易完成。

原子性

虽然可以使用复杂的跨链流通过异步组合来实现一定程度的原子性,但异步可组合性通常不强制执行原子性(ACID 中的 A)。相反,作为跨链流一部分的单个 L2 链上的交易在异步可组合性中是 顺序地 执行的,并且不保证整个序列将成功。此外,如果没有快速确认层,以异步方式执行跨链交易会导致比同步执行慢得多的确认时间。

相反,同步可组合性强制执行每个 L2 链状态的原子结算。跨链区块在一个 L1 交易中结算,从而保证整个逻辑交易成功执行或回滚。

如何实现同步可组合性

实现同步可组合性需要三个组成部分:

1. 聚合结算

首先,同步可组合性要求各链 原子地 结算——这意味着跨越多个 L2 的多个交易的结算发生在单个 L1 交易中。这需要将多个 L2 上的结算决策聚合到 单一的全有或全无决策 中。聚合结算是创建原子跨链交易的关键组成部分。

聚合结算层 [1] 在结算 L2 之前执行两个有效性检查:首先,它检查每个 L2 对于特定输入(即,特定交易排序)的执行有效性。其次,它检查跨 Rollup 的一致性(即,跨链的输入和输出对是否匹配)。只有在两个条件都通过时,聚合结算层才会结算每个 L2。[2]

2. 协调

聚合结算层 验证 链之间的条件依赖关系,但协调决定了这些条件依赖关系是什么。协调发生在聚合结算之前。

同步组合优于原子执行的标志是链能够依赖其他链的状态。具体来说,它是一个链的状态转换函数将另一个链的状态转换函数的输出作为输入的能力。协调是将正确的输入传递到每个链以确定输出的过程。

同步可组合性创建了共享状态的抽象。L2 可以被建模为传统并发编程中的进程。这些进程使用通道在彼此之间传递状态,但每个进程都有自己的本地状态。在此类比中,协调就像执行整个程序的内核——它记录执行期间在流程之间传递的状态,并输出此数据以供以后使用。

最自然的协调器是共享排序器。共享排序器已经同时为多个链排序和执行交易,这意味着它们已经在记录每个链的输入和输出数据。但是,存在一些协议(例如 CIRC),可以对其进行调整以允许不共享排序器的链之间进行同步组合。

3. 确认层

参与同步可组合性的各方不一定相互信任。这就是为什么聚合结算层必须验证每个链的正确性并验证链之间状态的一致性的原因。但是首先,这些检查所需的数据必须在不可逆的、中立的地方得到确认。

一种基本方法是将以太坊用作此确认层。链 A 和 B 的共享排序器会将排序的区块数据以及每个链的输入/输出消息发布到 L1。一旦 L1 完成,链 A 和 B 将使用此数据来彼此独立地执行其区块,并且最终将执行证明发布到聚合结算层。链排序器无法开始构建它们的下一个区块,直到前一个区块在以太坊上 确认,这会将 L2 区块时间增加一个数量级。

以太坊可以用作确认层,但它速度慢且成本高昂。相反,我们可以通过使用快速但中立的确认层(例如,Espresso 网络)来大大提高延迟和降低成本。高性能的确认层能够提供同步可组合性和更快的异步可组合性。

推出 CIRC

最后,我们提出了 CIRC,即我们的协调跨 Rollup 通信协议。可组合性要求链使用标准协议进行通信。这类似于当今互联网的基础 TCP、HTTP 或 SSH 通信标准。CIRC 定义了这样一个消息传递标准,并提供了一种潜在的算法,该算法使用消息传递标准来强制实施异步或同步可组合性。CIRC 具有以下理想属性:

  • L2 无需更改其现有的 VM。实施和消息处理可以通过部署在每个链上的智能合约来完成。
  • 该协议允许链之间并行证明。在彼此之间互操作的 L2 可以单独执行和证明状态转换。
  • 该协议在密码学上是可强制执行的。它不依赖于经济安全或用于安全性的罚没机制。
  • 消息传递协议不对消息的内容施加任何格式,也不对如何解释这些消息施加任何约束。因此,CIRC 自然地支持各种 VM。

下面我们简要介绍该协议。首先,我们描述消息传递标准本身,它是一种在与其他工作流程结合使用时用于实现可组合性的工具。其次,我们描述了使用此标准来实现同步或异步可组合性的这样的工作流程。

有关 CIRC 的更详细说明,请阅读我们在 Espresso 研究论坛上的 简短论文

消息传递标准

每个同步可组合的链都使用 邮箱 智能合约来容纳输入和输出消息。收件箱存储发送到该链的所有消息,发件箱存储从该链发送的所有消息。

邮箱中的消息存储在哈希映射中。此映射的键由以下各项组成:源链 ID、目标链 ID、发送者地址、接收者地址、会话标识符标签。前四个字段将消息路由到正确的位置。会话标识符 字段表示所有链之间共享的特定执行上下文,而 标签 字段区分同一执行上下文中的消息。哈希映射的值是消息内容本身,它没有指定的格式。

交易本身有权通过函数调用直接写入发件箱智能合约。收件箱智能合约由协调器(例如,共享排序器)写入。任何地址都可以从收件箱读取。从一条链发送的所有消息必须最终出现在另一条链的邮箱中。但是,不需要任何智能合约实际读取其收件箱中的每条消息。

只要每个链的邮箱符合 CIRC 标准,邮箱就可以用任何语言或 VM 编写并保持兼容性。

用于同步和异步可组合性的工作流程

每个 Rollup 区块的收件箱由协调器填充,每个 Rollup 的发件箱由交易对发件箱智能合约的调用填充。为此,协调器使用标准并行执行算法一起执行 Rollup 区块。当协调器到达发送消息到另一条链的交易时,协调器会将此消息写入另一条链的收件箱。

协调器将每个链的交易数据和所有链的收件箱总集发布到确认层(例如,Espresso 网络)。

所有链都共享 L1 上的结算合约,这是聚合结算所要求的(图 1 中的步骤 5)。此合约:

  1. 使用发布到确认层的区块数据作为输入,验证每个链的执行是有效的结果。这包括验证声明的发件箱是此执行的结果。
  2. 验证所有链的收件箱和发件箱集合是否一致。更准确地说,结算合约验证所有收件箱的并集等于所有发件箱的并集。

如果这些条件中的任何一个不为真,则结算合约拒绝结算所涉及的所有链的区块。

为了说明 CIRC 设计背后的直觉,请考虑一个原子的、跨链的、火车-酒店预订场景:火车票在 Rollup A 上出售,酒店房间在 Rollup B 上出售。用户希望在两者上都进行全有或全无的预订。让我们演练一下此示例如何与 CIRC 协议一起使用:

  1. 用户向链 A 和 B 的共享排序器发送两个交易:
    • 链 A 上的 Tx1 购买火车票,然后将购买成功的消息写入链 A 的发件箱。在 同一个 交易中,链 A 还从链 B 读取一条消息,表明酒店预订也已成功。
    • 链 B 上的 Tx2 读取火车票已成功预订的消息。然后它预订一个酒店房间,并将一条消息写回链 A,说酒店已成功预订。
  2. 共享排序器为两个 Rollup 构建一个区块。在执行上述两个交易时,共享排序器能够确定在链之间传递的消息的内容。
  3. 共享排序器构建的区块被发送到像 Espresso 网络这样的快速确认层。
  4. 一旦区块数据得到确认,每个 Rollup 的证明者和完整节点都可以从确认层读取数据并执行交易。
  5. 最后,L1 上的聚合结算合约接受来自证明者或完整节点的 Rollup 证明以及来自确认层的邮箱状态。它验证证明并进行邮箱一致性检查。成功验证后,聚合结算层会更新 L1 上两个 Rollup 的状态。

上面的示例说明了如何在需要原子性的同步可组合场景中使用 CIRC。但是,可以对 CIRC 进行调整以启用异步可组合性。

要阅读 CIRC 短篇论文并加入讨论,请访问 Espresso 研究论坛


  1. 聚合结算层可以用于 ZK Rollup 和 Optimistic Rollup。↩︎

  2. 在这篇文章中,我们将聚合结算描述为,如果验证失败则拒绝整个 L2 区块。Espresso 正在研究仅拒绝不一致状态而不是整个区块的方法。↩︎

  • 原文链接: hackmd.io/@EspressoSyste...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
EspressoSystems
EspressoSystems
江湖只有他的大名,没有他的介绍。