FABRKNT
Inside Revm — EVM エンジンを読む
Revmの心臓部
レッスン 1 / 17·CONTENT7 分15 XP
コース
Inside Revm — EVM エンジンを読む
レッスンの役割
CONTENT
順序
1 / 17

レッスン0 — Inside Revm へようこそ

問い

これは RethLab の 3 つの独立した中級ティアコースの 1 つ。Revm は Rust 製 EVM クライアントすべての 実行エンジン。Reth・Hyperliquid の HyperEVM・Berachain の bera-reth・Tempo — 「うちは Revm を使う」と言うチェーンは全部同じ Opcode ループ・ガス会計・状態読み出しを走らせている。どこから始め、何を前提に読むか?

注: このコースのコード断片は「実行可能な最小例」と「構造説明のための概念スニペット(... を含む)」が混在する。... を含むものはそのまま実行する用途ではない。

原理(最小モデル)

  • 3 中級コース: Inside Revm(ここ)/ Inside Reth(Staged Sync・ExEx・SDK)/ Inside Alloy(Provider・Network・Signer)。受講順は自由、Revm が一番下層なので推奨スタート。
  • 3 トピックチェーン構造: add Opcode + マクロ / 命令ディスパッチテーブル + カスタム Opcode / Database トレイト。各々 buildup → walkthrough → quiz → drill の 4 連。
  • 追加 3 レッスン: テスト(state test / EOF / execution-spec)+ 並列実行(block-stm)+ JIT/AOT(revmc)。
  • 読み方: 別タブで bluealloy/revm を開き、レッスンで主張する全ソース箇所を実ファイルで照合。「読んでうなずいた」を信用しない、ドリルで証明する。
  • 前提知識: EVM 内部(バイトコード dispatch loop、stack/memory/calldata/storage、cold/warm gas (EIP-2929)、CALL/DELEGATECALL/STATICCALL)+ 中級 Rust(generics + trait bounds、?Sizeddyn TraitArc<T>unsafemacro_rules!)。

具体例

このコースで触る revm ソース:

// 1. crates/interpreter/src/instructions/arithmetic.rs (L1-L4)
pub fn add<IT: ITy, H: ?Sized>(context: Ictx<'_, H, IT>) -> Result {
    popn_top!([op1], op2, context.interpreter);
    *op2 = op1.wrapping_add(*op2);
    Ok(())
}

// 2. crates/interpreter/src/instructions.rs (L5-L8)
const fn instruction_table_impl<WIRE: InterpreterTypes, H: Host>() -> InstructionTable<WIRE, H> {
    let mut table = [Instruction::unknown(); 256];
    table[ADD as usize] = Instruction::new(arithmetic::add);
    // ...
}

// 3. crates/database-interface/src/lib.rs (L9-L12)
#[auto_impl(&mut, Box)]
pub trait Database {
    type Error: DBErrorMarker;
    fn basic(&mut self, address: Address) -> Result<Option<AccountInfo>, Self::Error>;
    fn code_by_hash(&mut self, code_hash: B256) -> Result<Bytecode, Self::Error>;
    fn storage(&mut self, address: Address, index: StorageKey) -> Result<StorageValue, Self::Error>;
    fn block_hash(&mut self, number: u64) -> Result<B256, Self::Error>;
}

3 トピック、各 ~10 行のソース、それぞれ buildup + walkthrough + quiz + drill で計 12 レッスン。終わりにホットパス全行を読み、各ピースが何をしているか自分の言葉で説明できる。

セットアップ — 一度だけ

レッスン 1 の前に、別ウィンドウで:

  1. git clone https://github.com/bluealloy/revm
  2. rustc --version でモダンなツールチェーン確認
  3. cargo install cargo-expand(Expert の手続きマクロで欲しい)
  4. セカンドモニタか分割端末でソース参照

「Find in repo」プロンプトはリポを実際に開いていなければ機能しない。

失敗例(誤解)

「Revm = フルクライアント」— 間違い。Revm は 実行エンジンのみ、状態は持たない。状態は Database トレイト経由で外部供給される(L9-L12 で組み立てる)。Reth / Hyperliquid / Tempo は revm をラップして P2P + DB + コンセンサスを足す。

「Inside Reth から先に読むべき」— 間違いではないが、Revm が一番下層(Reth は revm の型を使う、Alloy も revm の primitive を使う)。Reth から始めても OK だが、Revm が固まってから Reth に戻ったほうが「なぜこの型なのか」が腑に落ちる。

「読むだけで身に付く」— 致命的。各トピックチェーンの 4 番目(ドリル)が「読んだことを本当に解いた証明」。読んでうなずく → 1 日後に再現できない、が中級を壊す失敗モード。ドリルは飛ばさない

ステップで組み立てる

Step 1: セットアップを完了

revm clone + ツールチェーン + cargo-expand + 2 モニタ。これがないと「Find in repo」プロンプトが機能しない。

Step 2: トピック 1(add Opcode)— L1 → L4

buildup → walkthrough → quiz → drill。add を素朴版から本物まで 5 ステップで積み上げ、マクロ popn_top! を読み、進行をゲートするクイズ、最後にコンセンサスをわざと壊して直すドリル。

Step 3: トピック 2(命令ディスパッチテーブル)— L5 → L8

256 スロット const テーブルを組み立て、カスタム Opcode を 3 行で配線、3 注意点(コンセンサス互換 / ガス価格 / 検証性)を学び、ドリルでフォークを出荷。

Step 4: トピック 3(Database トレイト)— L9 → L12

4 メソッド + 関連型 + auto_impl を組み立て、仲間トレイト(DatabaseRef / DatabaseCommit)と 3 本番実装を読み、ドリルで ZeroDb を実装して revm の状態読みを観察。

Step 5: 追加 3 レッスン — L13 → L15

テスト(state test / EOF / execution-spec)+ 並列実行(block-stm)+ JIT/AOT(revmc)。コンセンサスクリティカルなテスト規律 + 性能フロンティア。

Step 6: ファイナルクイズ — L16

3 トピックチェーンの構造的事実を確認。3 中級コース(Revm・Reth・Alloy)完走に向けたゲート。

答え合わせ

  • Revm を 1 番下層に置く理由: Reth は revm の型(AddressU256B256Database トレイト)を前提に組まれる、Alloy も revm の primitive を使う → Revm の型システムは Rust EVM スタック全体の語彙の土台。Revm を固めてから Reth に行くと「なぜこの型なのか」が腑に落ちる。
  • ドリル必須の理由: 中級を壊す失敗モード = 「読んでうなずいた」を 1 日後に再現できない。各トピック 4 番目(ドリル)が「本当に解いた証明」 = 別端末で revm に手を入れ、テストを走らせ、出力を読み、観測したことを書き留める = 記憶への定着
  • 追加 3 レッスンの位置づけ: コア(L1-L12)は revm のホットパス読み。L13-L15 は「revm をどう信頼するか(テスト)+ スループットの先(並列 + JIT)」 = コア以後の世界を覗く窓。

合格基準

  • 3 中級コース(Revm・Reth・Alloy)の関係と受講順自由を即答できる。
  • 3 トピックチェーン構造(add / dispatch / Database)+ 各 4 連(buildup → walkthrough → quiz → drill)を言える。
  • セットアップ 4 項目(revm clone + ツールチェーン + cargo-expand + 2 モニタ)を即答できる。
  • 中級を壊す失敗モード(読みうなずき → 再現不能)とドリル必須の理由を 1 文で説明できる。
  • 前提知識(EVM 内部 5 項目 + 中級 Rust 4 項目)を即答できる。

まとめ(3行)

  • Inside Revm = RethLab 3 中級コースの 1 つ、Revm は Rust EVM スタックの実行エンジン(Reth / Hyperliquid / Tempo 等全部同じソースを走らせる)。
  • 3 トピックチェーン(add Opcode + マクロ / 命令ディスパッチテーブル + カスタム Opcode / Database トレイト)各 buildup → walkthrough → quiz → drill の 4 連 + テスト + 並列 + JIT/AOT + 最終クイズ = 17 レッスン。
  • セットアップ 4 項目(revm clone + ツールチェーン + cargo-expand + 2 モニタ)必須、ドリルは飛ばさない、読みうなずきを信用しない。