ブロックチェーンMar 28, 2026
Deep EVM #10:Huffスタック管理 — takes()、returns()、dup/swapの技術
OS
Open Soft Team
Engineering Team
スタックマシンのメンタルモデル
EVMはスタックマシンです。レジスタも名前付き変数もありません — 32バイトワードの後入れ先出しスタック、1024スロット深、だけです。すべてのオペコードがこのスタックにプッシュ、ポップ、またはアイテムを再配置します。
DUP:スタックアイテムの複製
EVMはDUP1からDUP16を提供。DUPnは先頭からn番目のアイテムをコピーしてスタックにプッシュ。ガスコスト:すべてのDUPnに3ガス。
DUPは非破壊的読み取りのツールです。多くのオペコードは引数を消費するため、後で値が必要な場合はDUPしてから消費オペコードに渡します。
SWAP:スタックの並べ替え
SWAP1からSWAP16を提供。SWAPnは先頭アイテムを(n+1)番目のアイテムと交換。ガスコスト:すべてのSWAPnに3ガス。
深さ16の制限
DUPとSWAPは16の深さまでしか到達できません。位置17以降の値は単一のオペコードではアクセスできません。
深いスタックの戦略:
- ロジックを再構造化して必要な値をトップ近くに保つ
- メモリをスクラッチスペースとして使用(3+3=6ガス vs DUPの3ガス)
- マクロを小さなものに分割
一般的なパターン
パターン1:消費操作を通じて値を保持
DUPしてから消費オペコードに渡す。
パターン2:3アイテムのローテーション
swap2 swap1 // [a,b,c] -> [c,a,b]
パターン3:不要なスタックアイテムのクリーンアップ
swap1 pop // [result, garbage] -> [result]
パターン4:ペアの複製
dup2 dup2 // [a,b] -> [a,b,a,b]
スタック可視化の規律
Huffを書く際のルール:
- すべての行にコメント — 実行後のスタック状態
- takes/returnsを検証 — エントリとエグジットでスタックアイテムをカウント
- すべてのブランチをトレース — JUMPIの両方のパスが有効なスタック状態
- スタックドリフトに注意 — ループ本体がプッシュとポップを完全にバランスさせない場合
まとめ
スタック管理はHuff開発のコアスキルです。非破壊的読み取りにDUP、並べ替えにSWAP、深さ16を超える値にメモリ。すべての行にスタック状態をコメント。すべてのブランチを検証。