[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-7-yul-gas-kouritsu-loop-jouken":3},{"article":4,"author":58},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":38,"related_articles":39},"d4000000-0000-0000-0000-000000000107","a0000000-0000-0000-0000-000000000042","Deep EVM #7：Yulでのガス効率的なループと条件分岐","deep-evm-7-yul-gas-kouritsu-loop-jouken","YulでのEVMループと条件分岐の最適化：forループのガス解析、switch vs if、unchecked算術、ループアンローリング、SolidityとYulの反復パターンのベンチマーク。","## ループがガスの墓場である理由\n\nほとんどのスマートコントラクトで、最大のガス消費者はイテレーションです。100要素の配列をループする関数は、本体を100回実行します — そして本体内のすべてのオペコードが100倍されます。ループ内の不必要なSLOAD 1つで10,000〜210,000ガスのコストがかかります。\n\n## Yul Forループの解剖\n\n```yul\nfor { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F 本体\n}\n```\n\nイテレーションあたりのループオーバーヘッド：\n- 条件チェック：23ガス\n- ポストイテレーション：6ガス\n- ジャンプバック：11ガス\n- **合計：イテレーションあたり40ガス**\n\n## ベンチマーク結果（100要素）\n\n| メソッド | イテレーションあたりガス | 合計（100要素） | Solidityとの節約 |\n|---------|-------------------|---------------|----------------|\n| Solidity（チェック付き） | ~73 | 7,300 | ベースライン |\n| Solidity（unchecked） | ~53 | 5,300 | 27% |\n| Yul | ~43 | 4,300 | 41% |\n\n## Switch vs If\n\nYulには2つの条件構文があります。正しいものを使用してください。\n\n### If（単一条件）\n条件チェックに20ガス。\n\n### Switch（複数条件）\n各ケースにチェック22ガス。N個のケースの場合、最悪ケースはN * 22ガス。\n\n**最適化：頻度順にケースを並べる。** 最も呼び出される関数セレクタを最初にチェック。\n\n## Yulでのunchecked算術\n\nYulのすべての算術はデフォルトでuncheckedです。オーバーフローやアンダーフローのリバートはありません。\n\n安全な場合：ループカウンタ、配列インデックス計算、比較後の減算。\n\nオーバーフローチェックが必要な場合：\n```yul\nfunction safeAdd(a, b) -> c {\n    c := add(a, b)\n    if lt(c, a) { revert(0, 0) }\n}\n```\n\n## ループアンローリング\n\n4倍アンローリングにより、要素あたりのオーバーヘッドが~13ガスに削減：\n\n```yul\nfunction sumUnrolled(offset, length) -> total {\n    let end := add(offset, mul(length, 0x20))\n    let endAligned := sub(end, mod(mul(length, 0x20), 0x80))\n    for { } lt(offset, endAligned) { offset := add(offset, 0x80) } {\n        total := add(total, calldataload(offset))\n        total := add(total, calldataload(add(offset, 0x20)))\n        total := add(total, calldataload(add(offset, 0x40)))\n        total := add(total, calldataload(add(offset, 0x60)))\n    }\n    for { } lt(offset, end) { offset := add(offset, 0x20) } {\n        total := add(total, calldataload(offset))\n    }\n}\n```\n\n## ループ内のスタック深度の最小化\n\nループ本体を浅く保つ。ヘルパー関数を使用してスタック深度を削減。\n\n## 早期終了パターン\n\nYulの`leave`文は関数の即座の終了 — 検索ループの早期終了に使用。\n\n## ビット操作によるループ代替\n\nループをビット演算で置き換えられる場合があります（ポピュレーションカウントなど）。\n\n## まとめ\n\nYulでのループ最適化は巧妙なトリックではなく、ループ本体内のすべてのオペコードの正確なガスコストを理解し、無駄を体系的に排除することです。ストレージ読み取りをキャッシュし、タイトなループをアンロールし、早期終了し、イテレーションよりビット演算を優先してください。","\u003Ch2 id=\"\">ループがガスの墓場である理由\u003C\u002Fh2>\n\u003Cp>ほとんどのスマートコントラクトで、最大のガス消費者はイテレーションです。100要素の配列をループする関数は、本体を100回実行します — そして本体内のすべてのオペコードが100倍されます。ループ内の不必要なSLOAD 1つで10,000〜210,000ガスのコストがかかります。\u003C\u002Fp>\n\u003Ch2 id=\"yul-for\">Yul Forループの解剖\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">for { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F 本体\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>イテレーションあたりのループオーバーヘッド：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>条件チェック：23ガス\u003C\u002Fli>\n\u003Cli>ポストイテレーション：6ガス\u003C\u002Fli>\n\u003Cli>ジャンプバック：11ガス\u003C\u002Fli>\n\u003Cli>\u003Cstrong>合計：イテレーションあたり40ガス\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"100\">ベンチマーク結果（100要素）\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>メソッド\u003C\u002Fth>\u003Cth>イテレーションあたりガス\u003C\u002Fth>\u003Cth>合計（100要素）\u003C\u002Fth>\u003Cth>Solidityとの節約\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Solidity（チェック付き）\u003C\u002Ftd>\u003Ctd>~73\u003C\u002Ftd>\u003Ctd>7,300\u003C\u002Ftd>\u003Ctd>ベースライン\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Solidity（unchecked）\u003C\u002Ftd>\u003Ctd>~53\u003C\u002Ftd>\u003Ctd>5,300\u003C\u002Ftd>\u003Ctd>27%\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Yul\u003C\u002Ftd>\u003Ctd>~43\u003C\u002Ftd>\u003Ctd>4,300\u003C\u002Ftd>\u003Ctd>41%\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"switch-vs-if\">Switch vs If\u003C\u002Fh2>\n\u003Cp>Yulには2つの条件構文があります。正しいものを使用してください。\u003C\u002Fp>\n\u003Ch3>If（単一条件）\u003C\u002Fh3>\n\u003Cp>条件チェックに20ガス。\u003C\u002Fp>\n\u003Ch3>Switch（複数条件）\u003C\u002Fh3>\n\u003Cp>各ケースにチェック22ガス。N個のケースの場合、最悪ケースはN * 22ガス。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>最適化：頻度順にケースを並べる。\u003C\u002Fstrong> 最も呼び出される関数セレクタを最初にチェック。\u003C\u002Fp>\n\u003Ch2 id=\"yul-unchecked\">Yulでのunchecked算術\u003C\u002Fh2>\n\u003Cp>Yulのすべての算術はデフォルトでuncheckedです。オーバーフローやアンダーフローのリバートはありません。\u003C\u002Fp>\n\u003Cp>安全な場合：ループカウンタ、配列インデックス計算、比較後の減算。\u003C\u002Fp>\n\u003Cp>オーバーフローチェックが必要な場合：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">function safeAdd(a, b) -&gt; c {\n    c := add(a, b)\n    if lt(c, a) { revert(0, 0) }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">ループアンローリング\u003C\u002Fh2>\n\u003Cp>4倍アンローリングにより、要素あたりのオーバーヘッドが~13ガスに削減：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">function sumUnrolled(offset, length) -&gt; total {\n    let end := add(offset, mul(length, 0x20))\n    let endAligned := sub(end, mod(mul(length, 0x20), 0x80))\n    for { } lt(offset, endAligned) { offset := add(offset, 0x80) } {\n        total := add(total, calldataload(offset))\n        total := add(total, calldataload(add(offset, 0x20)))\n        total := add(total, calldataload(add(offset, 0x40)))\n        total := add(total, calldataload(add(offset, 0x60)))\n    }\n    for { } lt(offset, end) { offset := add(offset, 0x20) } {\n        total := add(total, calldataload(offset))\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">ループ内のスタック深度の最小化\u003C\u002Fh2>\n\u003Cp>ループ本体を浅く保つ。ヘルパー関数を使用してスタック深度を削減。\u003C\u002Fp>\n\u003Ch2 id=\"\">早期終了パターン\u003C\u002Fh2>\n\u003Cp>Yulの\u003Ccode>leave\u003C\u002Fcode>文は関数の即座の終了 — 検索ループの早期終了に使用。\u003C\u002Fp>\n\u003Ch2 id=\"\">ビット操作によるループ代替\u003C\u002Fh2>\n\u003Cp>ループをビット演算で置き換えられる場合があります（ポピュレーションカウントなど）。\u003C\u002Fp>\n\u003Ch2 id=\"\">まとめ\u003C\u002Fh2>\n\u003Cp>Yulでのループ最適化は巧妙なトリックではなく、ループ本体内のすべてのオペコードの正確なガスコストを理解し、無駄を体系的に排除することです。ストレージ読み取りをキャッシュし、タイトなループをアンロールし、早期終了し、イテレーションよりビット演算を優先してください。\u003C\u002Fp>\n","ja","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.862886Z","YulでのEVMループ最適化：forループのガス解析、switch vs if、unchecked算術、ループアンローリング、SolidityとYulのベンチマーク。","Yul ガス効率 ループ",null,"index, follow",[21,26,30,34],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity",{"id":35,"name":36,"slug":37,"created_at":25},"c0000000-0000-0000-0000-000000000018","Yul","yul","ブロックチェーン",[40,46,52],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":38,"published_at":45},"d0000000-0000-0000-0000-000000000602","Ethereumインターオペラビリティレイヤー：55以上のL2が一つのチェーンになる方法","ethereum-interoperability-layer-55-l2-hitotsu-no-chain","Ethereumには55以上のLayer 2ロールアップがあり、流動性とユーザー体験が断片化しています。Ethereumインターオペラビリティレイヤー — クロスロールアップメッセージング、共有シーケンサー、ベースドロールアップを組み合わせて — それらを一つのコンポーザブルネットワークに統合することを目指しています。","2026-03-28T10:44:44.721589Z",{"id":47,"title":48,"slug":49,"excerpt":50,"locale":12,"category_name":38,"published_at":51},"d0000000-0000-0000-0000-000000000601","ロールアップを超えるZK証明：Ethereumでの検証可能なAI推論","rollup-wo-koeru-zk-shomei-ethereum-kensho-kanou-ai-suiron","ゼロ知識証明はもはや単なるスケーリングツールではありません。2026年、zkMLはオンチェーンでの検証可能なAI推論を実現し、ZKコプロセッサは重い計算をオフチェーンで実行してオンチェーンで検証し、SP1やJoltなどの新しい証明システムが実用化を推進しています。","2026-03-28T10:44:44.716908Z",{"id":53,"title":54,"slug":55,"excerpt":56,"locale":12,"category_name":38,"published_at":57},"d0000000-0000-0000-0000-000000000578","EIP-7702実践ガイド：Pectra後のスマートアカウントフロー構築","eip-7702-jissen-gaido-pectra-go-sumaato-akaunto-furoo-kouchiku","EIP-7702により、任意のEthereum EOAが単一トランザクション内でスマートコントラクトとして一時的に動作可能になりました。バッチトランザクション、ガススポンサーシップ、ソーシャルリカバリーの実装方法を解説します。","2026-03-28T10:44:43.184719Z",{"id":13,"name":59,"slug":60,"bio":61,"photo_url":18,"linkedin":18,"role":62,"created_at":63,"updated_at":63},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]