L2 至 L1 的消息传递
概述
L2 至 L1 的消息传递由 L2 触发的 L1 交易实现。(资产转移基于此机制)
Rooch 具备多链资产结算的能力,对于不同角色的 L1 (仲裁链/结算链)来说,其流程一致,均为:
- 初始化交易:由用户在 L2 发起 L2 to L1 请求。
- 证明交易:由用户在 L1 提交交易包含证明,证明 L2 状态的变更。
- 确认交易:由用户在 L1 提交交易确认,L1 在验证后执行 L2 请求的 L1 交易。
仲裁链/结算链在 L2 至 L1 的消息传递中的核心区别在于背后的验证机制:
- 仲裁链:L2 由验证节点直接通过 L1 上的仲裁合约验证。
- 结算链:由 L2 轻节点合约辅助验证节点通过 L1 上的仲裁合约验证。(更详细的说明见下文)
初始化交易
-
用户通过调用
l2_stub中的call_remote函数发起 L2 to L1 请求,所需参数包括:action: 编码后的 L1 上的合约调用信息
-
l2_stub将调用rooch_transport的send_l2_to_l1函数完成 L2 上的事件记录,参数包括:msg_sequencemsg_senderaction
-
send_l2_to_l1在完成检查后,发出L2ToL1Event事件,其中包括:msg_sequencemsg_senderactionfrom:send_l2_to_l1的 发起者。在这里是l2_stub。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 的消息传递,其模型如下:
- 因:L2 上交易
- 果:L2 output
- 因果(消息)媒介:proposer
- 观察者:verifier
对于仲裁链,我们已有完整的欺诈证明机制,而因果关系不依赖观察者,因此只需要一个诚实的观察者(verifier)即可保障因果关系已被正确建立。
为让结算链与仲裁链等效,我们需要构建一致的因果关系,对于结算链,则意味着如下前置条件:
- 相同媒介完成结果记录:proposer 需要在结算链上记录 L2 output
- 相同的观察者验证结果记录:通过 L2 上的 L1 轻节点完成 L1 结果记录在 L2 的确认,实现 verifier 的观察。