ブロックチェーン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 アーキテクチャから借用した概念です。
コンセプト:
- Calldataから関数セレクタを抽出(4バイト)
- セレクタからジャンプデスティネーションを算術計算
- そのデスティネーションに直接JUMP
比較なし、分岐なし、関数数に関係なく定数時間。
ガス比較
| 関数数 | Solidity(if-else) | Solidity(二分探索) | Huffジャンプテーブル |
|---|---|---|---|
| 2 | 22-44ガス | 22-44ガス | 15ガス |
| 8 | 22-176ガス | 22-88ガス | 15ガス |
| 32 | 22-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ルーターに有意義な優位性を提供します。