レッスン2 — OP Standard Bridge(canonical な L2 deposit/withdrawal)
問い
すべての OP Stack chain(Optimism、Base、Mode、Worldchain、Zora)が同じ bridge を走らせる。各 chain が個別に multisig や validator を立てない。rollup 自身のコンセンサスが bridge の trust アンカー。これが canonical な「trustless L1↔L2」リファレンス。Bridge は rollup へのインタフェース、trust は rollup にある — その構造は?
原理(最小モデル)
- Bridge は rollup インタフェースで trust は rollup 側. Multisig も guardian もない、rollup コンセンサスが強制。
- Deposit = 強制 inclusion で trustless. L1 contract がイベント発火 → L2 sequencer が ~1 時間以内に処理必須 → 未処理なら誰でも強制 inclusion。
- Withdrawal = 7 日チャレンジ期間で遅延. State root 提出 ~1h ごと + チャレンジ 7 日 + prove + finalize 2 段階 → 合計 ~7 日。
- 5 contract 構成. L1StandardBridge + L2StandardBridge + OptimismPortal + L2OutputOracle + L1CrossDomainMessenger。Bridge は asset interface、その下が汎用 messenger。
- Standard Bridge と Native Bridge の併存. ERC20 マッピング(要登録)vs ETH 直接。
- Fast withdrawal market が UX 解. 第三者 LP が 7 日リスク引き受け + 手数料、Across / Hop / Connext。trustless bridge 上の金融商品。
- ExEx パターンで bridge イベントを取り込み. op-bridge example が
sol!+decode_raw_logで型安全イベント取り込み。
具体例
Deposit フロー:
sequenceDiagram
participant User
participant L1Bridge as L1StandardBridge (Ethereum)
participant Inbox as OptimismPortal (Ethereum)
participant L2 as L2 chain
participant L2Bridge as L2StandardBridge (Optimism)
User->>L1Bridge: depositERC20(token, amount)
L1Bridge->>Inbox: depositTransaction(...)
Note over Inbox: DepositInitiated イベント発火
L2->>L2: Sequencer が L1 イベントを読む
L2->>L2Bridge: finalizeBridgeERC20(user, token, amount)
L2Bridge->>User: Wrapped token を user に mint
Withdrawal フロー:
sequenceDiagram
participant User
participant L2Bridge as L2StandardBridge (Optimism)
participant Output as L2OutputOracle (Ethereum)
participant L1Bridge as L1StandardBridge (Ethereum)
User->>L2Bridge: withdraw(token, amount)
L2Bridge->>L2Bridge: User の wrapped token を burn
Note over L2Bridge: WithdrawalInitiated イベント発火
L2->>Output: State root 提出 (~1 時間ごと)
Note over Output: 7 日間チャレンジ期間
User->>L1Bridge: proveWithdrawal(proof, output)
L1Bridge->>L1Bridge: Withdrawal の Merkle proof 検証
L1Bridge->>L1Bridge: チャレンジ期間待ち
User->>L1Bridge: finalizeWithdrawal()
L1Bridge->>User: L1 トークン転送
5 contract(ethereum-optimism/optimism の packages/contracts-bedrock/):
| Contract | 役割 |
|---|---|
L1StandardBridge.sol | L1 側ユーザ入口(deposit)+ 出口(withdraw) |
L2StandardBridge.sol | L2 側ミラー — withdrawal で wrapped token burn |
OptimismPortal.sol | クロスドメインメッセージ用 L1 inbox/outbox |
L2OutputOracle.sol | L1 上に L2 state root commitment 保存 |
L1CrossDomainMessenger.sol | 汎用メッセージパッシング(トークン以外も) |
Withdrawal 遅延の 3 要因:
- State root 提出: ~1 時間ごと(設定可能)
- チャレンジ期間: 7 日(fraud proof のため)
- 2 段階確定: prove + finalize(別々の tx)
合計 ~7 日。
Fast withdrawal market:
- L2 で withdrawal 観測
- ただちに L1 トークン送金(手数料差し引き)
- 7 日待つ
- 期間経過後に L1 で withdrawal クレーム
LP = withdrawal リスク(state proof 失敗)引き受け + 手数料獲得。Across / Hop / Connext が運営。
ExEx パターン(op-bridge example より):
sol!(L1StandardBridge, "l1_standard_bridge_abi.json");
use crate::L1StandardBridge::{
ETHBridgeFinalized, ETHBridgeInitiated, L1StandardBridgeEvents,
};
// 各ブロックを監視 → bridge イベントを decode → 自前 DB に保存
// 反対側の bridge contract がこの index に問い合わせ
失敗例(誤解)
「OP Standard Bridge は multisig を信頼する」— 間違い。Bridge は rollup コンセンサス を信頼するだけ。Multisig は介在しない。「trustless = rollup 自身が安全な範囲で trustless」。
「Withdrawal 7 日は技術的限界」— 間違い。設計選択(optimistic rollup の fraud proof window)。ZK rollup なら数時間。7 日は fraud proof 提出窓口で、これがなければ sequencer の嘘を検知できない。
「Standard Bridge と Native Bridge は同じ」— 間違い。Standard = ERC20 マッピング(要登録、L1/L2 アドレス対応付け)、Native = ETH + OP トークン直接。登録なしの ERC20 は bridge 不可。
🛑 予測。 Ethereum → Optimism に 1 ETH deposit すると ~2 分で反映。1 ETH 引き出しは Ethereum 側で再び使えるまでどれだけかかるか? なぜ?(答え: ~7 日。理由 3 段: ① state root 提出 ~1h ごと、② 7 日チャレンジ期間(fraud proof window)、③ 2 段階確定(prove + finalize の別 tx)。deposit は強制 inclusion で trustless(rollup コンセンサスが L1 イベントを ~1h 以内に取り込み強制)、withdrawal は fraud proof window が必要(sequencer が L2 state について嘘ついた場合に誰でも fraud proof で reject できるよう待つ)。trustless だが速度差は構造的。)
ステップで組み立てる
Step 1: Deposit vs Withdrawal の非対称
Deposit = ~2 分 trustless(強制 inclusion)/ Withdrawal = 7 日(fraud proof window)。
Step 2: 5 contract を即答
L1StandardBridge / L2StandardBridge / OptimismPortal / L2OutputOracle / L1CrossDomainMessenger。Bridge は asset interface、その下が汎用 messenger。
Step 3: Withdrawal 遅延 3 要因
State root 提出 + チャレンジ 7 日 + 2 段階確定。
Step 4: Fast withdrawal market
第三者 LP が 7 日リスク引き受け + 手数料、trustless bridge 上の金融商品。
Step 5: ExEx でイベント取り込み
sol! + decode_raw_log で型安全イベント取り込み、自前 indexer / bridge に流す。
Step 6: Tempo↔Ethereum に当てはめる
Tempo = OP Stack でないスタンドアロン L1 → OP Standard Bridge そのまま不可、パターンのみ適用。必要:
- Tempo Standard Bridge(両側 Solidity)
- Tempo 上で Ethereum light client
- Ethereum 上で Tempo light client(難しい方)
- ZK light client 本番化までは CCIP の領域
答え合わせ
- Deposit が trustless な理由: L1 contract がイベント発火 → L2 sequencer が ~1h 以内に取り込み必須 → 未処理なら誰でも強制 inclusion → rollup コンセンサスが強制。Sequencer の善意ではなく rollup ルールが trust 担保。
- Withdrawal 7 日の正当化: fraud proof window。sequencer が「L2 state は X」と嘘の state root を提出した場合、誰でも 7 日以内に fraud proof を提出して reject 可能。これがなければ L1 が sequencer を信用するだけ → multisig と同等。7 日 = optimistic セキュリティの代価。
- Bridge と Native Bridge の使い分け: ETH = Native(OP Stack のネイティブ assetなので直接)、他 ERC20 = Standard(L1/L2 トークンアドレス登録 + マッピング、登録なしは bridge 不可)。Standard が「任意トークン用」、Native が「特権 asset 用」。
合格基準
- Deposit vs Withdrawal の trust モデルと時間を即答できる。
- 5 contract を役割で言える。
- Withdrawal 遅延 3 要因を順に言える。
- Fast withdrawal market が trustless bridge + 金融商品の構造であることを説明できる。
- ExEx パターンで bridge イベントを取り込む
sol!+decode_raw_logを書ける。
まとめ(3行)
- OP Standard Bridge = canonical「trustless L1↔L2」、Multisig も guardian もなし、rollup コンセンサスが trust アンカー。
- Deposit ~2 分(強制 inclusion)vs Withdrawal ~7 日(fraud proof window)= optimistic セキュリティの代価、5 contract(L1/L2 Standard + Portal + OutputOracle + CrossDomainMessenger)。
- ExEx +
sol!で bridge イベントを型安全に取り込み、Tempo は OP パターンを参照しつつ独自 Standard Bridge + 双方向 light client + 暫定 CCIP。