[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-3-lijie-gas-heyue-chengben":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-000000000103","a0000000-0000-0000-0000-000000000032","Deep EVM #3：理解Gas——你的合约为何如此昂贵","deep-evm-3-lijie-gas-heyue-chengben","精确剖析EVM gas成本：固有gas、EIP-2929冷热访问、退款机制以及经过验证的能节省真金白银的优化模式。","## Gas不是抽象概念\n\n开发者经常将gas视为一个模糊的\"成本\"指标。实际上，gas是一个精确定义的资源核算系统，有确切的公式。每个操作码、每字节calldata、每次存储访问都有在黄皮书和后续EIP中确定性定义的gas成本。\n\n理解这些成本将gas优化从猜测变为工程。\n\n## 固有Gas：基线\n\n在你的合约代码执行任何操作码之前，交易已经消耗了gas。这就是**固有gas**：\n\n```\nintrinsic_gas = 21000                           \u002F\u002F 基础交易成本\n             + 16 * nonzero_calldata_bytes       \u002F\u002F 每个非零字节\n             + 4 * zero_calldata_bytes            \u002F\u002F 每个零字节\n             + access_list_cost                   \u002F\u002F 如果有EIP-2930访问列表\n             + 32000 (如果是合约创建)              \u002F\u002F 仅CREATE交易\n```\n\n## EIP-2929：访问列表革命\n\nEIP-2929引入了每笔交易的访问集合。首次触及地址或存储槽时是\"冷\"的，需要支付冷访问附加费。后续访问是\"热\"的，价格便宜。\n\n### 冷 vs 热Gas成本\n\n| 操作码 | 冷 | 热 | 节省 |\n|--------|------|------|------|\n| SLOAD | 2100 | 100 | 2000 |\n| SSTORE | +2100冷附加费 | 仅基础成本 | 2100 |\n| CALL | 2600 | 100 | 2500 |\n\n## SSTORE：最复杂的操作码\n\nSSTORE的gas成本取决于三个因素：原始值（交易开始时）、当前值和新值。\n\n关键洞察：**将零槽设置为非零消耗20000 gas**，而**修改现有非零槽消耗2900 gas**（热访问）。这7倍的差异解释了为什么初始化映射代价高昂。\n\n## 真正重要的优化模式\n\n### 1. 在内存中缓存存储读取\n每次SLOAD消耗100-2100 gas。如果多次读取同一个槽，请缓存它。\n\n### 2. 打包存储变量\n将多个变量放在同一个槽中 = 一次SLOAD而非多次。\n\n### 3. 使用calldata而非memory接收外部参数\n\n### 4. 短路昂贵的操作\n\n### 5. 安全时使用unchecked算术\n\n### 6. 使用自定义错误替代require字符串\n\n### 7. 最小化calldata中的非零字节\n对MEV机器人来说至关重要。\n\n## 总结\n\nGas优化不是微优化算术操作码——而是最小化存储访问和外部调用。节省最多gas的模式是架构性的：存储打包、缓存、calldata使用和访问列表优化。","\u003Ch2 id=\"gas\">Gas不是抽象概念\u003C\u002Fh2>\n\u003Cp>开发者经常将gas视为一个模糊的“成本“指标。实际上，gas是一个精确定义的资源核算系统，有确切的公式。每个操作码、每字节calldata、每次存储访问都有在黄皮书和后续EIP中确定性定义的gas成本。\u003C\u002Fp>\n\u003Cp>理解这些成本将gas优化从猜测变为工程。\u003C\u002Fp>\n\u003Ch2 id=\"gas\">固有Gas：基线\u003C\u002Fh2>\n\u003Cp>在你的合约代码执行任何操作码之前，交易已经消耗了gas。这就是\u003Cstrong>固有gas\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>intrinsic_gas = 21000                           \u002F\u002F 基础交易成本\n             + 16 * nonzero_calldata_bytes       \u002F\u002F 每个非零字节\n             + 4 * zero_calldata_bytes            \u002F\u002F 每个零字节\n             + access_list_cost                   \u002F\u002F 如果有EIP-2930访问列表\n             + 32000 (如果是合约创建)              \u002F\u002F 仅CREATE交易\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"eip-2929\">EIP-2929：访问列表革命\u003C\u002Fh2>\n\u003Cp>EIP-2929引入了每笔交易的访问集合。首次触及地址或存储槽时是“冷“的，需要支付冷访问附加费。后续访问是“热“的，价格便宜。\u003C\u002Fp>\n\u003Ch3>冷 vs 热Gas成本\u003C\u002Fh3>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>操作码\u003C\u002Fth>\u003Cth>冷\u003C\u002Fth>\u003Cth>热\u003C\u002Fth>\u003Cth>节省\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>SLOAD\u003C\u002Ftd>\u003Ctd>2100\u003C\u002Ftd>\u003Ctd>100\u003C\u002Ftd>\u003Ctd>2000\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>SSTORE\u003C\u002Ftd>\u003Ctd>+2100冷附加费\u003C\u002Ftd>\u003Ctd>仅基础成本\u003C\u002Ftd>\u003Ctd>2100\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>CALL\u003C\u002Ftd>\u003Ctd>2600\u003C\u002Ftd>\u003Ctd>100\u003C\u002Ftd>\u003Ctd>2500\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"sstore\">SSTORE：最复杂的操作码\u003C\u002Fh2>\n\u003Cp>SSTORE的gas成本取决于三个因素：原始值（交易开始时）、当前值和新值。\u003C\u002Fp>\n\u003Cp>关键洞察：\u003Cstrong>将零槽设置为非零消耗20000 gas\u003C\u002Fstrong>，而\u003Cstrong>修改现有非零槽消耗2900 gas\u003C\u002Fstrong>（热访问）。这7倍的差异解释了为什么初始化映射代价高昂。\u003C\u002Fp>\n\u003Ch2 id=\"\">真正重要的优化模式\u003C\u002Fh2>\n\u003Ch3>1. 在内存中缓存存储读取\u003C\u002Fh3>\n\u003Cp>每次SLOAD消耗100-2100 gas。如果多次读取同一个槽，请缓存它。\u003C\u002Fp>\n\u003Ch3>2. 打包存储变量\u003C\u002Fh3>\n\u003Cp>将多个变量放在同一个槽中 = 一次SLOAD而非多次。\u003C\u002Fp>\n\u003Ch3>3. 使用calldata而非memory接收外部参数\u003C\u002Fh3>\n\u003Ch3>4. 短路昂贵的操作\u003C\u002Fh3>\n\u003Ch3>5. 安全时使用unchecked算术\u003C\u002Fh3>\n\u003Ch3>6. 使用自定义错误替代require字符串\u003C\u002Fh3>\n\u003Ch3>7. 最小化calldata中的非零字节\u003C\u002Fh3>\n\u003Cp>对MEV机器人来说至关重要。\u003C\u002Fp>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>Gas优化不是微优化算术操作码——而是最小化存储访问和外部调用。节省最多gas的模式是架构性的：存储打包、缓存、calldata使用和访问列表优化。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:25.863489Z","精确剖析EVM gas：固有gas、EIP-2929冷热访问、SSTORE成本、退款机制以及经过验证的优化模式。","EVM gas优化",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"]