メインコンテンツへスキップ
ブロックチェーン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以降の値は単一のオペコードではアクセスできません。

深いスタックの戦略:

  1. ロジックを再構造化して必要な値をトップ近くに保つ
  2. メモリをスクラッチスペースとして使用(3+3=6ガス vs DUPの3ガス)
  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を書く際のルール:

  1. すべての行にコメント — 実行後のスタック状態
  2. takes/returnsを検証 — エントリとエグジットでスタックアイテムをカウント
  3. すべてのブランチをトレース — JUMPIの両方のパスが有効なスタック状態
  4. スタックドリフトに注意 — ループ本体がプッシュとポップを完全にバランスさせない場合

まとめ

スタック管理はHuff開発のコアスキルです。非破壊的読み取りにDUP、並べ替えにSWAP、深さ16を超える値にメモリ。すべての行にスタック状態をコメント。すべてのブランチを検証。