[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-6-yul-memori-kanri-mstore-mload":3},{"article":4,"author":54},{"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":34,"related_articles":35},"d4000000-0000-0000-0000-000000000106","a0000000-0000-0000-0000-000000000042","Deep EVM #6：Yulメモリ管理 — mstore、mload、フリーメモリポインタ","deep-evm-6-yul-memori-kanri-mstore-mload","Yulでのメモリ管理をマスター：フリーメモリポインタ、手動ABIエンコーディング、外部コールデータの構築、ガスクリティカルなコントラクトのメモリ効率パターン。","## ガベージコレクタなしのメモリ管理\n\nYulでは、あなたがメモリマネージャです。アロケータも、ガベージコレクタも、境界チェックもありません。メモリはMLOADとMSTOREで読み書きするフラットなバイト配列です。間違ったオフセットに書き込むと、自分のデータを破損させます。\n\nこのレベルの制御こそが、Yulをガス最適化に強力にし、同時に危険にしている理由です。\n\n## MSTORE、MLOAD、MSTORE8\n\n```yul\n\u002F\u002F MSTORE(offset, value) — オフセットに32バイトを書き込む\nmstore(0x00, 0xdeadbeef)\n\n\u002F\u002F MLOAD(offset) — オフセットから32バイトを読み取る\nlet value := mload(0x00)\n\n\u002F\u002F MSTORE8(offset, value) — 1バイトを書き込む\nmstore8(0x00, 0xff)\n```\n\n重要な詳細：MSTOREはビッグエンディアンで書き込みます。\n\n## フリーメモリポインタ（0x40）\n\nSolidityはオフセット0x40のフリーメモリポインタを値0x80で初期化します。使用可能なメモリは0x80から開始し、0x00-0x7fは予約されています。\n\n### Yulでのメモリ割り当て\n\n```yul\nfunction allocate(size) -> ptr {\n    ptr := mload(0x40)\n    mstore(0x40, add(ptr, size))\n}\n```\n\n### フリーメモリポインタを無視する場合\n\n純粋なYulコントラクト（Solidityなし）では、フリーメモリポインタを完全に無視し、メモリを手動で管理できます。多くのMEVボットがこれを行います。\n\n## YulでのABIエンコードCalldata構築\n\n最も一般的なYulタスクの1つは、外部コール用のcalldataの構築です。`transfer(address,uint256)`コールを構築する例を示します。\n\nスクラッチスペース（0x00）にcalldataを格納し、call、リターンチェック — これがMEVボットでのガス効率的なトークン転送の標準パターンです。\n\n## メモリ効率的なハッシュ\n\nKeccak256ハッシュは頻繁な操作です。Yulでは何がハッシュされるかを正確に制御できます：\n\n```yul\nfunction getMappingSlot(key, baseSlot) -> slot {\n    mstore(0x00, key)\n    mstore(0x20, baseSlot)\n    slot := keccak256(0x00, 0x40)\n}\n```\n\nスクラッチスペース（0x00-0x3f）をハッシュに使用するのは、フリーメモリポインタを進める必要がないため、一般的なパターンです。\n\n## パターン：Returndataフォワーディング\n\n```yul\nlet success := call(gas(), target, value, inOffset, inSize, 0, 0)\nlet size := returndatasize()\nreturndatacopy(0x00, 0x00, size)\nswitch success\ncase 0 { revert(0x00, size) }\ndefault { return(0x00, size) }\n```\n\nこのパターンはプロキシコントラクトの標準です。\n\n## 実例：Uniswap V2リザーブの取得\n\n```yul\nfunction getReserves(pair) -> reserve0, reserve1 {\n    mstore(0x00, 0x0902f1ac00000000000000000000000000000000000000000000000000000000)\n    let success := staticcall(gas(), pair, 0x00, 0x04, 0x00, 0x60)\n    if iszero(success) { revert(0, 0) }\n    reserve0 := mload(0x00)\n    reserve1 := mload(0x20)\n}\n```\n\nこれがMEVボットがプールリザーブを読み取る方法です：最小メモリ使用の単一staticcall、ABIデコーディングオーバーヘッドなし。\n\n## まとめ\n\nYulでのメモリ管理は手動で、精密で、パワフルです。この記事のパターン — スクラッチスペースの使用、calldata構築、ハッシュ計算、returndataフォワーディング — は、すべてのガス最適化スマートコントラクトの構成要素です。","\u003Ch2 id=\"\">ガベージコレクタなしのメモリ管理\u003C\u002Fh2>\n\u003Cp>Yulでは、あなたがメモリマネージャです。アロケータも、ガベージコレクタも、境界チェックもありません。メモリはMLOADとMSTOREで読み書きするフラットなバイト配列です。間違ったオフセットに書き込むと、自分のデータを破損させます。\u003C\u002Fp>\n\u003Cp>このレベルの制御こそが、Yulをガス最適化に強力にし、同時に危険にしている理由です。\u003C\u002Fp>\n\u003Ch2 id=\"mstore-mload-mstore8\">MSTORE、MLOAD、MSTORE8\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F MSTORE(offset, value) — オフセットに32バイトを書き込む\nmstore(0x00, 0xdeadbeef)\n\n\u002F\u002F MLOAD(offset) — オフセットから32バイトを読み取る\nlet value := mload(0x00)\n\n\u002F\u002F MSTORE8(offset, value) — 1バイトを書き込む\nmstore8(0x00, 0xff)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>重要な詳細：MSTOREはビッグエンディアンで書き込みます。\u003C\u002Fp>\n\u003Ch2 id=\"0x40\">フリーメモリポインタ（0x40）\u003C\u002Fh2>\n\u003Cp>Solidityはオフセット0x40のフリーメモリポインタを値0x80で初期化します。使用可能なメモリは0x80から開始し、0x00-0x7fは予約されています。\u003C\u002Fp>\n\u003Ch3>Yulでのメモリ割り当て\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yul\">function allocate(size) -&gt; ptr {\n    ptr := mload(0x40)\n    mstore(0x40, add(ptr, size))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>フリーメモリポインタを無視する場合\u003C\u002Fh3>\n\u003Cp>純粋なYulコントラクト（Solidityなし）では、フリーメモリポインタを完全に無視し、メモリを手動で管理できます。多くのMEVボットがこれを行います。\u003C\u002Fp>\n\u003Ch2 id=\"yul-abi-calldata\">YulでのABIエンコードCalldata構築\u003C\u002Fh2>\n\u003Cp>最も一般的なYulタスクの1つは、外部コール用のcalldataの構築です。\u003Ccode>transfer(address,uint256)\u003C\u002Fcode>コールを構築する例を示します。\u003C\u002Fp>\n\u003Cp>スクラッチスペース（0x00）にcalldataを格納し、call、リターンチェック — これがMEVボットでのガス効率的なトークン転送の標準パターンです。\u003C\u002Fp>\n\u003Ch2 id=\"\">メモリ効率的なハッシュ\u003C\u002Fh2>\n\u003Cp>Keccak256ハッシュは頻繁な操作です。Yulでは何がハッシュされるかを正確に制御できます：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">function getMappingSlot(key, baseSlot) -&gt; slot {\n    mstore(0x00, key)\n    mstore(0x20, baseSlot)\n    slot := keccak256(0x00, 0x40)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>スクラッチスペース（0x00-0x3f）をハッシュに使用するのは、フリーメモリポインタを進める必要がないため、一般的なパターンです。\u003C\u002Fp>\n\u003Ch2 id=\"returndata\">パターン：Returndataフォワーディング\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">let success := call(gas(), target, value, inOffset, inSize, 0, 0)\nlet size := returndatasize()\nreturndatacopy(0x00, 0x00, size)\nswitch success\ncase 0 { revert(0x00, size) }\ndefault { return(0x00, size) }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>このパターンはプロキシコントラクトの標準です。\u003C\u002Fp>\n\u003Ch2 id=\"uniswap-v2\">実例：Uniswap V2リザーブの取得\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yul\">function getReserves(pair) -&gt; reserve0, reserve1 {\n    mstore(0x00, 0x0902f1ac00000000000000000000000000000000000000000000000000000000)\n    let success := staticcall(gas(), pair, 0x00, 0x04, 0x00, 0x60)\n    if iszero(success) { revert(0, 0) }\n    reserve0 := mload(0x00)\n    reserve1 := mload(0x20)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>これがMEVボットがプールリザーブを読み取る方法です：最小メモリ使用の単一staticcall、ABIデコーディングオーバーヘッドなし。\u003C\u002Fp>\n\u003Ch2 id=\"\">まとめ\u003C\u002Fh2>\n\u003Cp>Yulでのメモリ管理は手動で、精密で、パワフルです。この記事のパターン — スクラッチスペースの使用、calldata構築、ハッシュ計算、returndataフォワーディング — は、すべてのガス最適化スマートコントラクトの構成要素です。\u003C\u002Fp>\n","ja","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.858078Z","Yulメモリ管理をマスター：フリーメモリポインタ、手動ABIエンコーディング、calldata構築、ガスクリティカルなEVMコントラクトのメモリ効率パターン。","Yul メモリ管理",null,"index, follow",[21,26,30],{"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-000000000018","Yul","yul","ブロックチェーン",[36,42,48],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":34,"published_at":41},"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":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"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":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":34,"published_at":53},"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":55,"slug":56,"bio":57,"photo_url":18,"linkedin":18,"role":58,"created_at":59,"updated_at":59},"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"]