ブロックチェーンMar 28, 2026
Deep EVM #8:純粋なYulでのトークンスワップ構築
OS
Open Soft Team
Engineering Team
理論から実践へ
過去7つの記事で、EVMの包括的な理解を構築しました:オペコードとスタックマシン、メモリモデル、ガスメカニクス、セキュリティプリミティブ、Yul構文、メモリ管理、ループ最適化。今回はすべてをまとめます。
コントラクト:SimpleSwap
コントラクトは1つのことを行います:Uniswap V2ペアを通じて正確な量のトークンAをトークンBにスワップ。2つの関数を公開:
swap(address pair, address tokenIn, uint256 amountIn, uint256 amountOutMin, address to)— スワップ実行owner()— コントラクトオーナーを返す
Solidityバージョン(参照)
クリーンで読みやすいSolidityの参照実装を示した後、Yulバージョンを構築します。
純粋なYulバージョン
純粋なYulバージョンでは:
- コンストラクタ:オーナーをスロット0に保存
- 関数セレクタの抽出とswitch文によるルーティング
- アクセス制御:オーナーのみ
- Calldataパース:アドレスの20バイトマスク
- ERC20 transfer:非標準トークン(USDT)対応
- getReserves()呼び出し
- token0()呼び出しでスワップ方向決定
- Uniswap V2公式による出力量計算
- スリッページチェック
- スワップ実行とリバートデータフォワーディング
行ごとのガス比較
| カテゴリ | 節約 |
|---|---|
| 関数ディスパッチ | 39ガス |
| アクセス制御 | 105ガス |
| ERC-20転送 | 240ガス |
| getReserves呼び出し | 189ガス |
| token0呼び出し | ~120ガス |
| 算術 | 142ガス |
| スワップ呼び出し | 275ガス |
| デプロイメントサイズ | ~60%小さいバイトコード |
| 合計ランタイム節約 | ~1,110ガス |
典型的なUniswap V2スワップ(約110,000ガス)で1,110ガスの節約は約1%の改善です。しかし、1日に数千回のスワップを実行するMEVボットの場合:
1,110ガス * 30 gwei * $3,000/ETH = $0.0999/スワップ
$0.0999 * 1,000スワップ/日 = $99.90/日
$99.90 * 365 = $36,463/年
デプロイメントコスト
| メトリクス | Solidity | Yul |
|---|---|---|
| ランタイムバイトコード | ~1,200バイト | ~480バイト |
| デプロイメントガス | ~240,000 | ~96,000 |
| 節約 | — | 60%小さく、60%安い |
純粋なYulコントラクトのセキュリティ考慮事項
- すべてのcalldataを検証 — アドレスを20バイトにマスク
- すべての戻り値をチェック
- 非標準トークンを処理
- リエントランシーガードを手動実装
- 算術オーバーフロー — Yulはチェックしない
- メモリ破損 — メモリレイアウトを慎重に追跡
シリーズのまとめ
このシリーズの主なポイント:
- EVMは256ビットワードのスタックマシン
- ストレージは高価 — 新規エントリに20000ガス、コールド読み取りに2100
- ガス最適化はアーキテクチャ的 — ストレージパッキング、calldata > メモリ、アクセスリスト
- セキュリティは実行フローの理解から — CEIパターン、リエントランシーガード
- Yulはオペコードレベルの制御を読みやすい構文で提供
- メモリ管理は手動 — フリーメモリポインタ、スクラッチスペース
- ループはすべてを乗算 — まずループ本体を最適化
- 純粋なYulは最適化されたSolidityより1-5%のガス節約
EVMはシンプルなマシンです。そのルールをマスターすれば、オンチェーン計算をマスターできます。