メインコンテンツへスキップ
ブロックチェーンMar 28, 2026

Deep EVM #11:Huffジャンプテーブル — Solidityオーバーヘッドなしのo(1)関数ディスパッチ

OS
Open Soft Team

Engineering Team

Solidityのディスパッチャの問題

Solidityコントラクトを呼び出すと、EVMが最初に実行するのが関数ディスパッチャです。Solidityはcalldataの最初の4バイトを各既知セレクタと比較する線形if-elseチェーンを生成します。

N個の関数を持つコントラクトではO(N)です。各比較に約22ガスかかります。20個の関数を持つコントラクトは、ディスパッチだけで最大440ガスを浪費します。

ジャンプテーブルアプローチ:O(1)

ジャンプテーブルは、比較ではなく算術を使用して関数セレクタをコードオフセットに直接マッピングします。CPU アーキテクチャから借用した概念です。

コンセプト:

  1. Calldataから関数セレクタを抽出(4バイト)
  2. セレクタからジャンプデスティネーションを算術計算
  3. そのデスティネーションに直接JUMP

比較なし、分岐なし、関数数に関係なく定数時間。

ガス比較

関数数Solidity(if-else)Solidity(二分探索)Huffジャンプテーブル
222-44ガス22-44ガス15ガス
822-176ガス22-88ガス15ガス
3222-704ガス22-132ガス15ガス

ジャンプテーブルのコストは定数:CALLDATALOAD(3) + SHR(3) + 算術(3-6) + JUMP(8) = ~15-18ガス。

バニティセレクタのマイニング

ジャンプテーブルアプローチには予測可能なルーティングバイトを持つ関数セレクタが必要です。Foundryのcast sigやカスタムRustツールで互換性のあるセレクタをブルートフォースできます。

バイトコードサイズへの影響

アプローチランタイムバイトコードデプロイガス
Solidity(8関数)~800バイト160,000ガス
Huffジャンプテーブル(8関数)~200バイト40,000ガス

まとめ

ジャンプテーブルはSolidityのO(N)ディスパッチチェーンをO(1)の計算されたジャンプに置き換えます。ガス節約は数百万回のコールで複合され、MEVボットやDEXルーターに有意義な優位性を提供します。