Archives
multi-chain-settlement
L2 至 L1 的消息传递

L2 至 L1 的消息传递

概述

L2 至 L1 的消息传递由 L2 触发的 L1 交易实现。(资产转移基于此机制)

Rooch 具备多链资产结算的能力,对于不同角色的 L1 (仲裁链/结算链)来说,其流程一致,均为:

  1. 初始化交易:由用户在 L2 发起 L2 to L1 请求。
  2. 证明交易:由用户在 L1 提交交易包含证明,证明 L2 状态的变更。
  3. 确认交易:由用户在 L1 提交交易确认,L1 在验证后执行 L2 请求的 L1 交易。

仲裁链/结算链在 L2 至 L1 的消息传递中的核心区别在于背后的验证机制:

  1. 仲裁链:L2 由验证节点直接通过 L1 上的仲裁合约验证。
  2. 结算链:由 L2 轻节点合约辅助验证节点通过 L1 上的仲裁合约验证。(更详细的说明见下文)

初始化交易

  1. 用户通过调用 l2_stub 中的 call_remote 函数发起 L2 to L1 请求,所需参数包括:

    1. action: 编码后的 L1 上的合约调用信息
  2. l2_stub 将调用 rooch_transportsend_l2_to_l1 函数完成 L2 上的事件记录,参数包括:

    1. msg_sequence
    2. msg_sender
    3. action
  3. send_l2_to_l1 在完成检查后,发出 L2ToL1Event 事件,其中包括:

    1. msg_sequence
    2. msg_sender
    3. action
    4. from: send_l2_to_l1 的 发起者。在这里是 l2_stub
    5. L2ToL1Event_version: event 版本号

证明交易

在包含 L2ToL1Event 事件的 L2 区块的根被提交到 L1 后,用户可提交证明交易。

证明生成

这是一个关于 L2ToL1Event Merkle Trie 包含证明,生成它有多种方式,我们只需要保证其根与 L1 上记录相匹配即可。

此工作在链下完成。

发起证明交易

在 L1 上通过 rooch_transport 发起 prove_l2_to_l1 交易以验证我们在链下生成的证明是否与 L1 上的记录的 L2 output 相匹配。

确认交易

在挑战期结束后,用户可提交确认交易。

在 L1 上通过 rooch_transport 发起 finalize_l2_to_l1 交易以验证证明交易顺利通过了挑战期。在检查完成后,将调用 action

结算链验证机制

让我们先从 Rollups 的因果关系模型出发来探索安全结算本质,对于 L2 至 L1 的消息传递,其模型如下:

  1. 因:L2 上交易
  2. 果:L2 output
  3. 因果(消息)媒介:proposer
  4. 观察者:verifier

对于仲裁链,我们已有完整的欺诈证明机制,而因果关系不依赖观察者,因此只需要一个诚实的观察者(verifier)即可保障因果关系已被正确建立。

为让结算链与仲裁链等效,我们需要构建一致的因果关系,对于结算链,则意味着如下前置条件:

  1. 相同媒介完成结果记录:proposer 需要在结算链上记录 L2 output Multi-chain Proposer
  2. 相同的观察者验证结果记录:通过 L2 上的 L1 轻节点完成 L1 结果记录在 L2 的确认,实现 verifier 的观察。 Multi-chain State Verification