
OP Stack Rollupのプロセスおよび対応コードの詳細解説
TechFlow厳選深潮セレクト

OP Stack Rollupのプロセスおよび対応コードの詳細解説
OP Stackは、Optimismを支える標準化され、共有され、オープンソースの開発スタックであり、Optimism Collectiveによってメンテナンスされています。
執筆:Rayer
Optimism Bedrock は OP Stack の現在のバージョンです。Bedrock バージョンは、プロダクション品質の Optimistic Rollup ブロックチェーンを起動するためのツールを提供します。現時点では、OP Stack の各層の API は依然としてスタックの Rollup 構成と密接に結合しています。
Op-stack の主な rollup 処理は以下の2つのサービスによって担われます。
-
op-batcher:一定間隔で sequencer 上のトランザクション内容を読み取り、これを L1 チェーン上のデータ可用性(DA)レイヤーにロールアップします。
-
op-proposer:トランザクションの状態をコントラクトにロールアップします。
Rollup アーキテクチャ
op-batcher
op-batcher 実行フローチャート

loadBlocksInfoState 実行ロジック
loadBlocksInfoState は、前回読み取ったブロック以降のすべてのブロック、つまりまだ読み取られていないブロックを読み取ります。
その全体的なフローは以下の通りです。

コードは以下の通り:



loadBlocksIntoState が実行する処理
1. sequencer 内の同期ステータスを取得します。
2. 153 行目:関数calculateL2BlockRangeToStoreを呼び出します。
-
calculateL2BlockRangeToStore は、提出が必要な最新の L2 の開始および終了ブロック番号を取得・判定します。開始ブロックは 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] チャンネルに記録します。
-
429 行目:
l1Tip:現在の L1 tip を L1BlockRef として取得します。渡されたコンテキストがライフサイクルコンテキストであると仮定し、内部でネットワークトイムアウトを使用してラップします。 -
434 行目:
recordL1Tip:前の L1BlockRef を l1Tip で取得した最新の L1BlockRef に更新します。 -
437 行目:
TxData:ロールアップが必要なトランザクションデータを収集します。TxData は L1 に次に提出すべきトランザクションデータを返します。現在、各トランザクションは1フレームのみ使用します。保留中のチャンネルが満杯の場合、L1 への完全送信が成功するまでそのチャンネルの残りフレームのみを返します。保留中のフレームがない場合、io.EOF を返します。 -
447 行目:
sendTransaction:トランザクションをレイヤー1に送信し、その送信ステータスを receiptCh chan TxReceipt[T] チャンネルに更新します。sendTransaction は指定された「データ」を使ってトランザクションを作成し、バッチ受信箱アドレスに提出します。現在は下位の「txmgr」を利用してトランザクションの送信とガス価格管理を行っています。これはブロッキングメソッドであり、同時に呼び出してはいけません。
handleReceipt
handleReceipt は、チャネルからトランザクションの処理ステータスを取得し、正常に処理されたトランザクションをチャネルから削除します。
コードは以下の通り:
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 を計算・取得しています。コードの呼び出しフローは上図を参照してください。注:ここでは1ブロックごとに stateRoot を提出するのではなく、SUBMISSION_INTERVAL 設定値に基づき複数ブロックの stateRoot をまとめて計算し、最終的に L2OutputOracle コントラクトに提出します。
send Transaction
-
sendTransaction:output を使って stateRoot 提出用のトランザクションを構築し、これをレイヤー1チェーンに提出します。以下はトランザクションのパッケージングデータの詳細です。
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))
コードは以下の通り:

TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News















