[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-2-memori-moderu-stack-storage-calldata":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-000000000102","a0000000-0000-0000-0000-000000000042","Deep EVM #2：メモリモデル — スタック、メモリ、ストレージ、Calldata","deep-evm-2-memori-moderu-stack-storage-calldata","EVMの4つのデータロケーション — スタック、メモリ、ストレージ、calldata — のコスト、動作、メモリ拡張式の詳細な解説。","## データが存在できる4つの場所\n\nEVMは4つの異なるデータロケーションを提供し、それぞれコスト、ライフタイム、アクセスパターンが根本的に異なります。間違ったものを選ぶことが、スマートコントラクトで過剰なガス消費の最も一般的な原因です。\n\n| ロケーション | ライフタイム | 読み取りコスト | 書き込みコスト | サイズ |\n|------------|------------|-------------|-------------|------|\n| スタック | 現在のオペコード | 0（DUP: 3） | 0（PUSH: 3） | 1024ワード |\n| メモリ | 現在のコールコンテキスト | MLOAD: 3* | MSTORE: 3* | 拡張可能 |\n| ストレージ | 永続（ブロックチェーン） | SLOAD: 2100\u002F100 | SSTORE: 20000\u002F2900\u002F100 | 2^256スロット |\n| Calldata | 現在のコールコンテキスト | CALLDATALOAD: 3 | 読み取り専用 | トランザクション入力 |\n\n*メモリコストは操作あたり3ガス+二次拡張コスト。\n\n## スタック：高速だが小さい\n\nスタックはEVMのワーキングメモリです。すべての算術、比較、論理演算がスタックから読み書きします。最大1024要素、各32バイト幅です。\n\n実際には、DUPとSWAPオペコードが16要素までしか到達できないため、16スロット以上を使用することはまれです。スタックアクセスは基本的に無料（PUSH\u002FDUP\u002FSWAP操作に3ガス）です。\n\n## メモリ：安価だが一時的\n\nメモリはバイトアドレス可能な配列で、空から始まり必要に応じて拡張されます。現在のコールコンテキストの間のみ持続します。\n\n### フリーメモリポインタ\n\nSolidityはメモリの最初の128バイトを特別な目的に予約します：\n\n| オフセット | 目的 |\n|----------|------|\n| 0x00-0x3f | スクラッチスペース（ハッシュに使用） |\n| 0x40-0x5f | フリーメモリポインタ |\n| 0x60-0x7f | ゼロスロット |\n| 0x80+ | フリーメモリ（割り当てはここから開始） |\n\n### メモリ拡張コスト\n\nメモリが高価になるポイントがここです。ガスコストはMSTORE\u002FMLOADあたり3ガスだけでなく、現在の最高水準を超えてメモリにアクセスすると、二次拡張コストが課されます。\n\n公式（イエローペーパーより）：\n\n```\nmemory_cost = (memory_size_words^2 \u002F 512) + (3 * memory_size_words)\n```\n\n| 使用メモリ | コスト |\n|-----------|-------|\n| 32バイト（1ワード） | 3ガス |\n| 1 KB（32ワード） | 98ガス |\n| 10 KB（320ワード） | 1160ガス |\n| 100 KB（3200ワード） | 29600ガス |\n| 1 MB（32000ワード） | 2,001,000ガス |\n\n## ストレージ：永続だが高価\n\nストレージはEVMの永続キーバリューストアです。各コントラクトは2^256個の32バイトスロットを持つ独立したストレージスペースを持ちます。\n\n### Solidityのストレージレイアウト\n\n```solidity\ncontract StorageLayout {\n    uint256 public x;       \u002F\u002F スロット0\n    uint256 public y;       \u002F\u002F スロット1\n    address public owner;   \u002F\u002F スロット2（パック：20バイト）\n    bool public paused;     \u002F\u002F スロット2（パック：1バイト、同スロット！）\n    mapping(address => uint256) public balances;  \u002F\u002F スロット3（ベース）\n}\n```\n\n### ストレージパッキング\n\nSolidityは可能な場合、複数の小さな変数を1つの32バイトスロットにパックします。これは重要な最適化です。\n\n## Calldata：読み取り専用で安価\n\nCalldataはトランザクションまたはコールと共に送信される入力データです。読み取り専用で、アクセスは安価（CALLDATALOADに3ガス）です。\n\n## 一時ストレージ（EIP-1153）\n\nEIP-1153（Cancunアップグレード、2024年3月）は、**TSTORE**と**TLOAD**の2つの新しいオペコードを導入しました。一時ストレージは通常のストレージと似ていますが、トランザクション終了時に自動的にクリアされます。\n\n- TLOADとTSTOREの両方に100ガス\n- トランザクション完了後にクリア\n- 同一トランザクション内のコールフレーム間でアクセス可能\n\nリエントランシーロックに最適 — TSTOREでフラグを設定、TLOADでチェック。20000ガスのSSTOREコストが不要。\n\n## 実践的最適化：適切なロケーションの選択\n\n1. **スタックに置けるか？** スタックを使用。マージナルコストゼロ。\n2. **16以上の値が必要？** メモリを使用。\n3. **読み取り専用の入力データ？** Calldataを使用。32バイトの読み取りあたり3ガス。\n4. **トランザクション間で永続化が必要？** ストレージを使用。新規エントリに20000+ガスを予算。\n5. **コールフレーム間で永続化が必要だがトランザクション間では不要？** 一時ストレージを使用。100ガス。\n\n## まとめ\n\nEVMのメモリモデルは見かけ上シンプルです — 4つのロケーションに明確なトレードオフ。しかし、コストの差は膨大です：スタックのADDは3ガス、SSTOREは20000ガス。これらのコストを直感的レベルで理解することが、ガス効率の良いコントラクトとガスを浪費するコントラクトの違いです。","\u003Ch2 id=\"4\">データが存在できる4つの場所\u003C\u002Fh2>\n\u003Cp>EVMは4つの異なるデータロケーションを提供し、それぞれコスト、ライフタイム、アクセスパターンが根本的に異なります。間違ったものを選ぶことが、スマートコントラクトで過剰なガス消費の最も一般的な原因です。\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>ロケーション\u003C\u002Fth>\u003Cth>ライフタイム\u003C\u002Fth>\u003Cth>読み取りコスト\u003C\u002Fth>\u003Cth>書き込みコスト\u003C\u002Fth>\u003Cth>サイズ\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>スタック\u003C\u002Ftd>\u003Ctd>現在のオペコード\u003C\u002Ftd>\u003Ctd>0（DUP: 3）\u003C\u002Ftd>\u003Ctd>0（PUSH: 3）\u003C\u002Ftd>\u003Ctd>1024ワード\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>メモリ\u003C\u002Ftd>\u003Ctd>現在のコールコンテキスト\u003C\u002Ftd>\u003Ctd>MLOAD: 3*\u003C\u002Ftd>\u003Ctd>MSTORE: 3*\u003C\u002Ftd>\u003Ctd>拡張可能\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>ストレージ\u003C\u002Ftd>\u003Ctd>永続（ブロックチェーン）\u003C\u002Ftd>\u003Ctd>SLOAD: 2100\u002F100\u003C\u002Ftd>\u003Ctd>SSTORE: 20000\u002F2900\u002F100\u003C\u002Ftd>\u003Ctd>2^256スロット\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Calldata\u003C\u002Ftd>\u003Ctd>現在のコールコンテキスト\u003C\u002Ftd>\u003Ctd>CALLDATALOAD: 3\u003C\u002Ftd>\u003Ctd>読み取り専用\u003C\u002Ftd>\u003Ctd>トランザクション入力\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>*メモリコストは操作あたり3ガス+二次拡張コスト。\u003C\u002Fp>\n\u003Ch2 id=\"\">スタック：高速だが小さい\u003C\u002Fh2>\n\u003Cp>スタックはEVMのワーキングメモリです。すべての算術、比較、論理演算がスタックから読み書きします。最大1024要素、各32バイト幅です。\u003C\u002Fp>\n\u003Cp>実際には、DUPとSWAPオペコードが16要素までしか到達できないため、16スロット以上を使用することはまれです。スタックアクセスは基本的に無料（PUSH\u002FDUP\u002FSWAP操作に3ガス）です。\u003C\u002Fp>\n\u003Ch2 id=\"\">メモリ：安価だが一時的\u003C\u002Fh2>\n\u003Cp>メモリはバイトアドレス可能な配列で、空から始まり必要に応じて拡張されます。現在のコールコンテキストの間のみ持続します。\u003C\u002Fp>\n\u003Ch3>フリーメモリポインタ\u003C\u002Fh3>\n\u003Cp>Solidityはメモリの最初の128バイトを特別な目的に予約します：\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>オフセット\u003C\u002Fth>\u003Cth>目的\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>0x00-0x3f\u003C\u002Ftd>\u003Ctd>スクラッチスペース（ハッシュに使用）\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>0x40-0x5f\u003C\u002Ftd>\u003Ctd>フリーメモリポインタ\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>0x60-0x7f\u003C\u002Ftd>\u003Ctd>ゼロスロット\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>0x80+\u003C\u002Ftd>\u003Ctd>フリーメモリ（割り当てはここから開始）\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>メモリ拡張コスト\u003C\u002Fh3>\n\u003Cp>メモリが高価になるポイントがここです。ガスコストはMSTORE\u002FMLOADあたり3ガスだけでなく、現在の最高水準を超えてメモリにアクセスすると、二次拡張コストが課されます。\u003C\u002Fp>\n\u003Cp>公式（イエローペーパーより）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>memory_cost = (memory_size_words^2 \u002F 512) + (3 * memory_size_words)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>使用メモリ\u003C\u002Fth>\u003Cth>コスト\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>32バイト（1ワード）\u003C\u002Ftd>\u003Ctd>3ガス\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>1 KB（32ワード）\u003C\u002Ftd>\u003Ctd>98ガス\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>10 KB（320ワード）\u003C\u002Ftd>\u003Ctd>1160ガス\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>100 KB（3200ワード）\u003C\u002Ftd>\u003Ctd>29600ガス\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>1 MB（32000ワード）\u003C\u002Ftd>\u003Ctd>2,001,000ガス\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">ストレージ：永続だが高価\u003C\u002Fh2>\n\u003Cp>ストレージはEVMの永続キーバリューストアです。各コントラクトは2^256個の32バイトスロットを持つ独立したストレージスペースを持ちます。\u003C\u002Fp>\n\u003Ch3>Solidityのストレージレイアウト\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">contract StorageLayout {\n    uint256 public x;       \u002F\u002F スロット0\n    uint256 public y;       \u002F\u002F スロット1\n    address public owner;   \u002F\u002F スロット2（パック：20バイト）\n    bool public paused;     \u002F\u002F スロット2（パック：1バイト、同スロット！）\n    mapping(address =&gt; uint256) public balances;  \u002F\u002F スロット3（ベース）\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>ストレージパッキング\u003C\u002Fh3>\n\u003Cp>Solidityは可能な場合、複数の小さな変数を1つの32バイトスロットにパックします。これは重要な最適化です。\u003C\u002Fp>\n\u003Ch2 id=\"calldata\">Calldata：読み取り専用で安価\u003C\u002Fh2>\n\u003Cp>Calldataはトランザクションまたはコールと共に送信される入力データです。読み取り専用で、アクセスは安価（CALLDATALOADに3ガス）です。\u003C\u002Fp>\n\u003Ch2 id=\"eip-1153\">一時ストレージ（EIP-1153）\u003C\u002Fh2>\n\u003Cp>EIP-1153（Cancunアップグレード、2024年3月）は、\u003Cstrong>TSTORE\u003C\u002Fstrong>と\u003Cstrong>TLOAD\u003C\u002Fstrong>の2つの新しいオペコードを導入しました。一時ストレージは通常のストレージと似ていますが、トランザクション終了時に自動的にクリアされます。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>TLOADとTSTOREの両方に100ガス\u003C\u002Fli>\n\u003Cli>トランザクション完了後にクリア\u003C\u002Fli>\n\u003Cli>同一トランザクション内のコールフレーム間でアクセス可能\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>リエントランシーロックに最適 — TSTOREでフラグを設定、TLOADでチェック。20000ガスのSSTOREコストが不要。\u003C\u002Fp>\n\u003Ch2 id=\"\">実践的最適化：適切なロケーションの選択\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>スタックに置けるか？\u003C\u002Fstrong> スタックを使用。マージナルコストゼロ。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>16以上の値が必要？\u003C\u002Fstrong> メモリを使用。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>読み取り専用の入力データ？\u003C\u002Fstrong> Calldataを使用。32バイトの読み取りあたり3ガス。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>トランザクション間で永続化が必要？\u003C\u002Fstrong> ストレージを使用。新規エントリに20000+ガスを予算。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>コールフレーム間で永続化が必要だがトランザクション間では不要？\u003C\u002Fstrong> 一時ストレージを使用。100ガス。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">まとめ\u003C\u002Fh2>\n\u003Cp>EVMのメモリモデルは見かけ上シンプルです — 4つのロケーションに明確なトレードオフ。しかし、コストの差は膨大です：スタックのADDは3ガス、SSTOREは20000ガス。これらのコストを直感的レベルで理解することが、ガス効率の良いコントラクトとガスを浪費するコントラクトの違いです。\u003C\u002Fp>\n","ja","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.840781Z","EVMメモリモデルの詳細：スタック、メモリ、ストレージ、calldata、一時ストレージ、メモリ拡張コスト式。","EVM メモリモデル",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-000000000014","Solidity","solidity","ブロックチェーン",[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"]