[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-7-yul-gas-gaoxiao-xunhuan-tiaojian":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},"d3000000-0000-0000-0000-000000000107","a0000000-0000-0000-0000-000000000032","Deep EVM #7：Yul中的Gas高效循环和条件语句","deep-evm-7-yul-gas-gaoxiao-xunhuan-tiaojian","优化Yul中的EVM循环和条件：for循环gas剖析、switch vs if、unchecked算术、循环展开和基准测试。","## for循环的Gas剖析\n\nYul中的for循环由四部分组成：初始化、条件、后续操作和循环体。每个部分的gas成本可以精确计算。\n\n```yul\nfor { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n    \u002F\u002F 循环体\n}\n```\n\n每次迭代消耗：\n- lt比较：3 gas\n- add递增：3 gas\n- JUMPI条件跳转：10 gas\n- JUMP循环开始：8 gas\n\n## switch vs if\n\nYul没有else关键字。对于多分支逻辑，使用switch：\n\n```yul\nswitch selector\ncase 0xa9059cbb { \u002F* transfer *\u002F }\ncase 0x70a08231 { \u002F* balanceOf *\u002F }\ndefault { revert(0, 0) }\n```\n\nswitch生成跳转表比嵌套if更高效。\n\n## unchecked算术\n\nYul中所有算术默认不检查溢出。这是一个特性，不是bug——它让你完全控制何时需要安全检查：\n\n```yul\n\u002F\u002F 当你确定不会溢出时\nlet result := add(a, b)  \u002F\u002F 无溢出检查，节省~40 gas\n```\n\n## 循环展开\n\n当迭代次数已知时，展开循环可以消除跳转开销：\n\n```yul\n\u002F\u002F 替代3次迭代的循环\nlet sum := add(mload(0x00), mload(0x20))\nsum := add(sum, mload(0x40))\n```\n\n每次消除的跳转节省约18 gas。\n\n## 实际基准测试\n\n在实际MEV机器人代码中，优化循环可以节省数千gas。关键是测量而非猜测——使用Foundry的gas快照来量化每次优化的影响。\n\n## 总结\n\n在Yul中优化循环和条件是gas敏感合约的核心技能。理解for循环剖析、善用switch、利用unchecked算术以及在适当时展开循环，可以显著降低合约的执行成本。","\u003Ch2 id=\"for-gas\">for循环的Gas剖析\u003C\u002Fh2>\n\u003Cp>Yul中的for循环由四部分组成：初始化、条件、后续操作和循环体。每个部分的gas成本可以精确计算。\u003C\u002Fp>\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>lt比较：3 gas\u003C\u002Fli>\n\u003Cli>add递增：3 gas\u003C\u002Fli>\n\u003Cli>JUMPI条件跳转：10 gas\u003C\u002Fli>\n\u003Cli>JUMP循环开始：8 gas\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"switch-vs-if\">switch vs if\u003C\u002Fh2>\n\u003Cp>Yul没有else关键字。对于多分支逻辑，使用switch：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">switch selector\ncase 0xa9059cbb { \u002F* transfer *\u002F }\ncase 0x70a08231 { \u002F* balanceOf *\u002F }\ndefault { revert(0, 0) }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>switch生成跳转表比嵌套if更高效。\u003C\u002Fp>\n\u003Ch2 id=\"unchecked\">unchecked算术\u003C\u002Fh2>\n\u003Cp>Yul中所有算术默认不检查溢出。这是一个特性，不是bug——它让你完全控制何时需要安全检查：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F 当你确定不会溢出时\nlet result := add(a, b)  \u002F\u002F 无溢出检查，节省~40 gas\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">循环展开\u003C\u002Fh2>\n\u003Cp>当迭代次数已知时，展开循环可以消除跳转开销：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yul\">\u002F\u002F 替代3次迭代的循环\nlet sum := add(mload(0x00), mload(0x20))\nsum := add(sum, mload(0x40))\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>每次消除的跳转节省约18 gas。\u003C\u002Fp>\n\u003Ch2 id=\"\">实际基准测试\u003C\u002Fh2>\n\u003Cp>在实际MEV机器人代码中，优化循环可以节省数千gas。关键是测量而非猜测——使用Foundry的gas快照来量化每次优化的影响。\u003C\u002Fp>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>在Yul中优化循环和条件是gas敏感合约的核心技能。理解for循环剖析、善用switch、利用unchecked算术以及在适当时展开循环，可以显著降低合约的执行成本。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:25.890665Z","优化Yul中的EVM循环：for循环gas剖析、switch vs if、unchecked算术、循环展开和基准测试。","Yul gas高效循环",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-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":47,"title":48,"slug":49,"excerpt":50,"locale":12,"category_name":38,"published_at":51},"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":53,"title":54,"slug":55,"excerpt":56,"locale":12,"category_name":38,"published_at":57},"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":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"]