Deep EVM #9:Huff言語入門 — マクロ、ラベル、生のオペコード
Engineering Team
Huffが存在する理由
Solidityは素晴らしい抽象化です — そうでなくなるまでは。100バイトのランタイムバイトコードに収まるコントラクト、パックされたジャンプテーブルでO(1)の関数ディスパッチ、または1日に何百万回も実行されるホットパスから200ガスを削減する必要がある場合、より低レベルなものが必要です。それがHuffです。
Huffは薄いマクロシステムを持つ低レベルEVMアセンブリ言語です。変数も型も、裏で最適化するコンパイラもありません。書いたものがそのままオンチェーンに載ります — オペコードごとに。
マクロ vs 関数
マクロ(#define macro)
マクロはすべてのコールサイトでインライン展開されます。JUMPオーバーヘッドなし、追加ガスなし。ガスクリティカルなコードのデフォルトかつ推奨の選択肢です。
関数(#define fn)
関数は実際のJUMP/JUMPDESTペアを生成します。呼び出しあたり約22の追加ガスでバイトコードサイズを節約します。
ラベルとジャンプデスティネーション
Huffのラベルは名前付きJUMPDESTロケーションです。コンパイラがコンパイル時に具体的なバイトコードオフセットに解決します。
takes()とreturns()
マクロと関数のtakes(n)とreturns(m)アノテーションは、ブロックが消費・生成するスタックアイテム数を示すドキュメントとコンパイラヒントです。
定数とストレージスロット
#define constant VALUE_SLOT = 0x00
#define constant OWNER_SLOT = 0x01
定数はPUSH命令としてインライン展開されます。ガスコストゼロ — 純粋に構文的です。
Huffを使うべき場合
- ガスが最優先制約 — 100ガスが収益性を決定するMEVコントラクト
- バイトコードサイズが重要 — CREATE2ファクトリでデプロイされるコントラクト
- カスタムディスパッチが必要 — ジャンプテーブル、非標準ABIエンコーディング
- EVMを学習中 — 生のオペコードを書くことがEVMを最もよく教える
それ以外はSolidityを書き、solc --asmでコンパイラ出力を確認してください。
まとめ
HuffはEVMバイトコードへの直接回線を、正気を保つのに十分な抽象化で提供します。マクロはゼロオーバーヘッドでコードを再利用。ラベルはジャンプオフセットの簿記を処理。takes/returnsアノテーションはスタックエラーを早期に発見します。