外链论坛

 找回密码
 立即注册
搜索
查看: 55|回复: 1

详解 OP Stack Rollup 流程及对应代码

[复制链接]

2304

主题

140

回帖

9921万

积分

论坛元老

Rank: 8Rank: 8

积分
99211939
发表于 2024-7-27 22:21:42 | 显示全部楼层 |阅读模式

原文作者:Rayer

原文源自:登链社区

Optimism Bedrock 是 OP Stack 的当前版本。Bedrock 版本供给了用于起步生产质量的 Optimistic Rollup 区块链的工具。此时,OP Stack 区别层的 API 仍然与 Stack 的 Rollup 配置紧密耦合。

Op-stack 重点的 rollup 由两个服务来承担。

op-batcher:负责将每隔一段时间读取 sequencer 上的交易内容,rollup 到链上 DA op-proposer:负责将交易状态 rollup 到合约。 Rollup 架构

op-batcher

op-batcher 执行流程图

loadBlocksInfoState 执行规律

loadBlocksInfoState 负责读取,从前一次读取的块起始的所有块,即还未读取的块。

其整体流程如下

代码如下:

loadBlocksIntoState 完成为了以下动作

1、获取 sequencer 中的同步状态

2、153 行,调用calculateL2BlockRangeToStore函数

calculateL2BlockRangeToStore 获取并判断需要提交的最新 L2 的 start 和 end 块号,初始的区块为 L2 当前安全的最高块,结束区块为 L2 当前最高的不安全的区块。

3、164 行,拿到提交的起始块和结束区块之后,从初始区块起始获取区块信息,调用loadBlockIntoState 函数获取区块

loadBlockIntoState 检测区块信息以及 geth 信息,无误后,在 200 行,调用 AddL2Block 函数将区块加到 channelManager 的 blocks *types.Block 中。

4、165 行至 168 行,校验区块是不是需要重新提交,若需要,将 l.lastStoredBlock 置成 eth.BlockID{};173 行,否则就将 l.lastStoredBlock 置成 eth.ToBlockID(block);latestBlock 置成 block;

5、177 行,L2BlockToBlockRef 从 L2 块引用源中提取基本的 L2BlockRef 信息,按照区块号判断必要时回退到创世信息

publishStateToL1 执行规律

publishStateToL1 将队列中的所有交易提交到 L1,直到队列中交易显现错误为止。

代码如下:

1、publishStateToL1 会循环将队列里的交易发送到 Layer1 网络。

2、377 行调用publishTxToL1。

publishTxToL1 是提交单个交易到 L1 的规律,publishTxToL1 办法获取要提交的数据数据构建交易发送到 Layer1 网络,并将发送出去的交易扔到 receiptCh chan TxReceipt[T] channel 里面。

429 行,l1Tip:获取当前 L1 提示做为 L1BlockRef。假定传递的上下文是生命周期上下文,因此呢它在内部运用网络超时进行包装。 434 行,recordL1Tip:将上一个 L1BlockRef 更换成 l1Tip 获取到的最新的 L1BlockRef437 行,TxData:收集需要 rollup 的交易数据;TxData 返回复提交给 L1 的下一个 tx 数据。日前每一个事务仅运用一帧。倘若待处理的通道已满,则仅返回该通道的剩余帧,直到成功完全发送到 L1。倘若挂起的帧,它将返回 io.EOF。 447 行,sendTransaction 将交易发送到一层,并把交易发送状态更新到 receiptCh chan TxReceipt[T] channel 里面;sendTransaction 运用给定的「数据」创建交易并将其提交到批处理收件箱位置。它日前运用底层的「txmgr」来处理交易发送和价格管理。这是一种阻塞办法不该同期调用它。

handleReceipt

handleReceipt 获取从 channel 处理交易的状态,并将成功处理的交易从 channel 里面移除。

代码如下:

op-proposer

执行流程图

仔细执行流程

FetchNextOutputInfo

FetchNextOutputInfo: 获取 L2 上的区块的 output,方便后续组装提交。返回的 output 结构如下:

type OutputResponse struct {Version Bytes32 json:"version"OutputRoot Bytes32 json:"outputRoot"BlockRef L2BlockRef json:"blockRef"WithdrawalStorageRoot common.Hash json:"withdrawalStorageRoot"StateRoot common.Hash json:"stateRoot"Status *SyncStatus json:"syncStatus"}

代码如下:

224 行,NextBlockNumber:获取下一批次需要提交的区块区间,区间计算为 latestBlockNumber + SUBMISSION_INTERVAL SUBMISSION_INTERVAL 的值能够安排 L2OutputOracle 合约的时候指定。230 行,调用FetchCurrentBlockNumber,得到当前区块的区块号 236 行至 241 行, 上面检测完 nextCheckpointBlock 符合规则之后,调用FetchOutput去 L2 上获取需要提交的 stateRoot

FetchCurrentBlockNumber 代码如下:

1、254 行,SyncStatus:获取 L2 块的 SafeL2 和 FinalizedL2 的状态和块信息,

FetchOutput 代码如下:

2、279 行,OutputAtBlock: 按照块高获取 output, 里面包括 stateRoot,这儿最后是调用 eth_getProof 去计算并获取 stateRoot,代码调用流程能够参考上图。提示: 这儿并不是一个块提交一次 stateRoot, 而是按照 SUBMISSION_INTERVAL 配置的值来计算一批块的 stateRoot,最后将 stateRoot 提交到 L2OutputOracle 合约

send Transaction

sendTransaction:运用 output 构建 stateRoot 提交交易,将交易提交到一层链, 下面是交易打包的数据细节

return abi.Pack( "proposeL2Output", output.OutputRoot, new(big.Int).SetUint64(output.BlockRef.Number), output.Status.CurrentL1.Hash, new(big.Int).SetUint64(output.Status.CurrentL1.Number))

代码如下:返回外链论坛:www.fok120.com,查看更加多

责任编辑:网友投稿

回复

使用道具 举报

0

主题

510

回帖

3

积分

新手上路

Rank: 1

积分
3
发表于 5 天前 | 显示全部楼层
可以发布外链的网站 http://www.fok120.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-9-8 12:42 , Processed in 0.072231 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.