[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-2-neicun-moxing-zhan-cunchu-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},"d3000000-0000-0000-0000-000000000102","a0000000-0000-0000-0000-000000000032","Deep EVM #2：内存模型——栈、内存、存储和Calldata","deep-evm-2-neicun-moxing-zhan-cunchu-calldata","深入解析EVM的四个数据位置——栈、内存、存储和calldata——它们的成本、行为以及容易让开发者措手不及的内存扩展公式。","## 数据可以存放的四个位置\n\nEVM提供四个不同的数据位置，每个在成本、生命周期和访问模式上有着根本性差异。选择错误的位置是智能合约过度gas消耗的最常见原因。\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 gas加上二次扩展成本。\n\n## 栈：快速但小巧\n\n栈是EVM的工作内存。每次算术、比较和逻辑操作都从栈中读写。它最多容纳1024个元素，每个32字节宽。\n\n在实践中，你很少使用超过16个栈槽，因为DUP和SWAP操作码只能达到16个元素深度。\n\n## 内存：便宜但短暂\n\n内存是一个按字节寻址的数组，起始为空并按需扩展。它仅在当前调用上下文期间持续存在。\n\n### 空闲内存指针\n\nSolidity保留内存的前128字节用于特殊目的。0x40-0x5f处的**空闲内存指针**追踪下一个可用的内存地址。\n\n### 内存扩展成本\n\n内存的gas成本不仅是每次MLOAD\u002FMSTORE的3 gas——当访问超出当前最高水位线的内存时，会收取二次扩展成本：\n\n```\nmemory_cost = (memory_size_words^2 \u002F 512) + (3 * memory_size_words)\n```\n\n## 存储：永久但昂贵\n\n存储是EVM的持久化键值存储。每个合约有其独立的2^256个32字节槽的存储空间。\n\n### Solidity中的存储布局\n\nSolidity按顺序将状态变量分配到存储槽，并在可能时将多个小变量打包到同一个槽中。\n\n## Calldata：只读且便宜\n\nCalldata是交易或调用发送的输入数据。它是只读的，访问便宜（CALLDATALOAD消耗3 gas）。\n\n## 瞬态存储（EIP-1153）\n\nEIP-1153（Cancun升级，2024年3月）引入了TSTORE和TLOAD操作码。瞬态存储类似普通存储，但在交易结束时自动清除。每次TLOAD和TSTORE仅消耗100 gas。\n\n## 总结\n\nEVM的内存模型看似简单——四个有明确取舍的位置。但成本差异巨大：栈ADD消耗3 gas而SSTORE消耗20000 gas。深刻理解这些成本是区分gas高效合约与gas浪费合约的关键。","\u003Ch2 id=\"\">数据可以存放的四个位置\u003C\u002Fh2>\n\u003Cp>EVM提供四个不同的数据位置，每个在成本、生命周期和访问模式上有着根本性差异。选择错误的位置是智能合约过度gas消耗的最常见原因。\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 gas加上二次扩展成本。\u003C\u002Fp>\n\u003Ch2 id=\"\">栈：快速但小巧\u003C\u002Fh2>\n\u003Cp>栈是EVM的工作内存。每次算术、比较和逻辑操作都从栈中读写。它最多容纳1024个元素，每个32字节宽。\u003C\u002Fp>\n\u003Cp>在实践中，你很少使用超过16个栈槽，因为DUP和SWAP操作码只能达到16个元素深度。\u003C\u002Fp>\n\u003Ch2 id=\"\">内存：便宜但短暂\u003C\u002Fh2>\n\u003Cp>内存是一个按字节寻址的数组，起始为空并按需扩展。它仅在当前调用上下文期间持续存在。\u003C\u002Fp>\n\u003Ch3>空闲内存指针\u003C\u002Fh3>\n\u003Cp>Solidity保留内存的前128字节用于特殊目的。0x40-0x5f处的\u003Cstrong>空闲内存指针\u003C\u002Fstrong>追踪下一个可用的内存地址。\u003C\u002Fp>\n\u003Ch3>内存扩展成本\u003C\u002Fh3>\n\u003Cp>内存的gas成本不仅是每次MLOAD\u002FMSTORE的3 gas——当访问超出当前最高水位线的内存时，会收取二次扩展成本：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>memory_cost = (memory_size_words^2 \u002F 512) + (3 * memory_size_words)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">存储：永久但昂贵\u003C\u002Fh2>\n\u003Cp>存储是EVM的持久化键值存储。每个合约有其独立的2^256个32字节槽的存储空间。\u003C\u002Fp>\n\u003Ch3>Solidity中的存储布局\u003C\u002Fh3>\n\u003Cp>Solidity按顺序将状态变量分配到存储槽，并在可能时将多个小变量打包到同一个槽中。\u003C\u002Fp>\n\u003Ch2 id=\"calldata\">Calldata：只读且便宜\u003C\u002Fh2>\n\u003Cp>Calldata是交易或调用发送的输入数据。它是只读的，访问便宜（CALLDATALOAD消耗3 gas）。\u003C\u002Fp>\n\u003Ch2 id=\"eip-1153\">瞬态存储（EIP-1153）\u003C\u002Fh2>\n\u003Cp>EIP-1153（Cancun升级，2024年3月）引入了TSTORE和TLOAD操作码。瞬态存储类似普通存储，但在交易结束时自动清除。每次TLOAD和TSTORE仅消耗100 gas。\u003C\u002Fp>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>EVM的内存模型看似简单——四个有明确取舍的位置。但成本差异巨大：栈ADD消耗3 gas而SSTORE消耗20000 gas。深刻理解这些成本是区分gas高效合约与gas浪费合约的关键。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:25.855586Z","深入解析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-000000000599","Ethereum互操作层：55+个L2如何成为一条链","ethereum-hucaozuoceng-55-l2-chengwei-yitiao-lian","Ethereum有55+个Layer 2 rollup，碎片化了流动性和用户体验。Ethereum互操作层 — 结合跨rollup消息传递、共享排序器和based rollup — 旨在将它们统一为一个可组合的网络。","2026-03-28T10:44:44.539584Z",{"id":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"d0000000-0000-0000-0000-000000000598","ZK证明超越Rollups：Ethereum上的可验证AI推理","zk-zhengming-chaoyue-rollups-ethereum-keyanzheng-ai-tuili","零知识证明不再仅仅是扩容工具。在2026年，zkML实现了链上可验证的AI推理，ZK协处理器将繁重计算移至链下并在链上验证，而SP1和Jolt等新证明系统使其变得实用。","2026-03-28T10:44:44.534954Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":34,"published_at":53},"d0000000-0000-0000-0000-000000000575","EIP-7702实战：Pectra之后构建智能账户流程","eip-7702-shizhan-pectra-zhihou-goujian-zhineng-zhanghu-liucheng","EIP-7702允许任何Ethereum EOA在单笔交易中临时充当智能合约。以下是如何使用新的账户抽象原语实现批量交易、gas赞助和社交恢复。","2026-03-28T10:44:42.997040Z",{"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"]