[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-10-huff-zhan-guanli-dup-swap":3},{"article":4,"author":55},{"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":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":35,"related_articles":36},"d3000000-0000-0000-0000-000000000110","a0000000-0000-0000-0000-000000000032","Deep EVM #10：Huff栈管理——takes()、returns()和dup\u002Fswap的艺术","deep-evm-10-huff-zhan-guanli-dup-swap","掌握EVM栈机器：可视化栈状态、有效使用dup1-16和swap1-16，以及在Huff中保持栈平衡的构建模式。","## 栈是你唯一的工作空间\n\n在Huff中，没有变量。你的工作空间就是EVM栈——一个1024元素的后进先出数据结构。每个元素是256位（32字节）。\n\n## dup和swap操作码\n\n### dup1到dup16\ndup操作码复制栈中某个位置的元素到栈顶：\n- dup1：复制栈顶元素\n- dup2：复制栈顶第二个元素\n- dup16：复制栈顶第16个元素\n\n### swap1到swap16\nswap操作码交换栈顶元素与栈中另一个位置的元素：\n- swap1：交换栈顶两个元素\n- swap2：交换第1个和第3个元素\n\n## 深度16限制\n\nEVM的dup和swap只能达到16层深度。这意味着如果你需要访问栈中更深位置的数据，必须使用内存作为临时存储或重新组织你的代码。\n\n## 栈可视化\n\n每行代码后注释栈状态是Huff开发的关键实践：\n\n```huff\n#define macro EXAMPLE() = takes(0) returns(1) {\n    0x01              \u002F\u002F [1]\n    0x02              \u002F\u002F [2, 1]\n    add               \u002F\u002F [3]\n    dup1              \u002F\u002F [3, 3]\n    0x0a              \u002F\u002F [10, 3, 3]\n    mul               \u002F\u002F [30, 3]\n    swap1             \u002F\u002F [3, 30]\n    add               \u002F\u002F [33]\n}\n```\n\n## 常见栈模式\n\n### 保存和恢复值\n```huff\n\u002F\u002F 需要同一个值多次使用\ndup1              \u002F\u002F 复制值\n\u002F\u002F ... 使用原值 ...\n\u002F\u002F 稍后使用副本\n```\n\n### 栈清理\n```huff\npop               \u002F\u002F 丢弃不需要的栈顶元素\n```\n\n## 调试栈错误\n\n栈下溢和上溢是Huff中最常见的bug。使用Foundry的调试器逐步追踪栈状态可以帮助定位问题。\n\n## 总结\n\n掌握Huff的栈管理是编写正确、高效的EVM字节码的基础。通过注释栈状态、善用dup\u002Fswap操作码、理解16层深度限制，你可以构建复杂的链上逻辑而不需要变量名的抽象。","\u003Ch2 id=\"\">栈是你唯一的工作空间\u003C\u002Fh2>\n\u003Cp>在Huff中，没有变量。你的工作空间就是EVM栈——一个1024元素的后进先出数据结构。每个元素是256位（32字节）。\u003C\u002Fp>\n\u003Ch2 id=\"dup-swap\">dup和swap操作码\u003C\u002Fh2>\n\u003Ch3>dup1到dup16\u003C\u002Fh3>\n\u003Cp>dup操作码复制栈中某个位置的元素到栈顶：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>dup1：复制栈顶元素\u003C\u002Fli>\n\u003Cli>dup2：复制栈顶第二个元素\u003C\u002Fli>\n\u003Cli>dup16：复制栈顶第16个元素\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>swap1到swap16\u003C\u002Fh3>\n\u003Cp>swap操作码交换栈顶元素与栈中另一个位置的元素：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>swap1：交换栈顶两个元素\u003C\u002Fli>\n\u003Cli>swap2：交换第1个和第3个元素\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"16\">深度16限制\u003C\u002Fh2>\n\u003Cp>EVM的dup和swap只能达到16层深度。这意味着如果你需要访问栈中更深位置的数据，必须使用内存作为临时存储或重新组织你的代码。\u003C\u002Fp>\n\u003Ch2 id=\"\">栈可视化\u003C\u002Fh2>\n\u003Cp>每行代码后注释栈状态是Huff开发的关键实践：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro EXAMPLE() = takes(0) returns(1) {\n    0x01              \u002F\u002F [1]\n    0x02              \u002F\u002F [2, 1]\n    add               \u002F\u002F [3]\n    dup1              \u002F\u002F [3, 3]\n    0x0a              \u002F\u002F [10, 3, 3]\n    mul               \u002F\u002F [30, 3]\n    swap1             \u002F\u002F [3, 30]\n    add               \u002F\u002F [33]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">常见栈模式\u003C\u002Fh2>\n\u003Ch3>保存和恢复值\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F 需要同一个值多次使用\ndup1              \u002F\u002F 复制值\n\u002F\u002F ... 使用原值 ...\n\u002F\u002F 稍后使用副本\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>栈清理\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-huff\">pop               \u002F\u002F 丢弃不需要的栈顶元素\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">调试栈错误\u003C\u002Fh2>\n\u003Cp>栈下溢和上溢是Huff中最常见的bug。使用Foundry的调试器逐步追踪栈状态可以帮助定位问题。\u003C\u002Fp>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>掌握Huff的栈管理是编写正确、高效的EVM字节码的基础。通过注释栈状态、善用dup\u002Fswap操作码、理解16层深度限制，你可以构建复杂的链上逻辑而不需要变量名的抽象。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.102481Z","Deep EVM #10：Huff栈管理——dup、swap和栈纪律","掌握Huff中的EVM栈管理：dup1-16、swap1-16、深度16限制、常见模式和栈错误调试。","huff栈管理 evm",null,"index, follow",[22,27,31],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000017","Huff","huff","区块链",[37,43,49],{"id":38,"title":39,"slug":40,"excerpt":41,"locale":12,"category_name":35,"published_at":42},"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":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":35,"published_at":48},"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":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":35,"published_at":54},"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":56,"slug":57,"bio":58,"photo_url":19,"linkedin":19,"role":59,"created_at":60,"updated_at":60},"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"]