概述OPStack是标准化、共享和开源的开发堆栈,为Optimism提供支持,由OptimismCollective维护。OptimismBedrock是OPStack的当前版本。Bedrock版本提供了用于启动生产质量的OptimisticRollup区块链的工
OP Stack 是标准化、共享和开源的开发堆栈,为 Optimism 提供支持,由 Optimism Collective 维护。
Optimism Bedrock 是 OP Stack的当前版本。 Bedrock 版本提供了用于启动生产质量的 Optimistic Rollup 区块链的工具。此时,OP Stack不同层的 API 仍然与Stack的 Rollup 配置紧密耦合。
Op-stack主要的rollup由两个服务来承担。
loadBlocksInfoState负责读取,从前一次读取的块开始的所有块,即还未读取的块。
其整体流程如下
代码如下:
loadBlocksIntoState完成了以下动作
calculateL2BlockRangeToStore
函数
loadBlockIntoState函数获取区块
AddL2Block
函数将区块加到 channelManager 的 blocks []*types.Block 中。L2BlockToBlockRef
从 L2 块引用源中提取基本的 L2BlockRef 信息,根据区块号判断必要时回退到创世信息publishStateToL1 将队列中的所有交易提交到L1,直到队列中没有交易或者出现错误为止。
代码如下:
publishTxToL1
。publishTxToL1是提交单个交易到L1的逻辑,publishTxToL1 方法获取要提交的数据数据构建交易发送到 Layer1 网络,并将发送出去的交易扔到 receiptCh chan TxReceipt[T] channel 里面。
l1Tip
:获取当前 L1 提示作为 L1BlockRef。 假定传递的上下文是生命周期上下文,因此它在内部使用网络超时进行包装。recordL1Tip
:将上一个 L1BlockRef 更换成 l1Tip 获取到的最新的 L1BlockRefTxData
:收集需要 rollup 的交易数据;TxData 返回应提交给 L1 的下一个 tx 数据。 目前,每个事务仅使用一帧。 如果待处理的通道已满,则仅返回该通道的剩余帧,直到成功完全发送到 L1。 如果没有挂起的帧,它将返回 io.EOF。sendTransaction
将交易发送到一层,并把交易发送状态更新到 receiptCh chan TxReceipt[T] channel 里面;sendTransaction 使用给定的“数据”创建交易并将其提交到批处理收件箱地址。 它目前使用底层的“txmgr”来处理交易发送和价格管理。 这是一种阻塞方法。 不应同时调用它。handleReceipt 获取从 channel 处理交易的状态,并将成功处理的交易从 channel 里面移除。
代码如下:
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"
}
代码如下:
FetchCurrentBlockNumber
,获得当前区块的区块号FetchOutput
去 L2 上获取需要提交的 stateRootFetchCurrentBlockNumber代码如下:
FetchOutput代码如下:
OutputAtBlock
: 根据块高获取 output, 里面包含 stateRoot,这里最终是调用 eth_getProof 去计算并获取 stateRoot,代码调用流程可以参考上图。 提示: 这里并不是一个块提交一次 stateRoot, 而是根据 SUBMISSION_INTERVAL 配置的值来计算一批块的 stateRoot,最终将 stateRoot 提交到 L2OutputOracle 合约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))
代码如下:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!