ERC-7511 最小代理:把 PUSH0 塞进代理字节码能省多少 Gas 图 1
ERC-7511 最小代理:把 PUSH0 塞进代理字节码能省多少 Gas · 图 1

ERC-7511 最小代理:把 PUSH0 塞进代理字节码能省多少 Gas

为什么一枚 NFT 合集要依赖”代理”

以太坊上每份合约代码都要按字节付部署费。如果每个新合集都完整部署一份逻辑合约,光是代码就吃掉一大笔 Gas,而且同一套逻辑被反复复制。代理合约的思路很朴素:部署一个极小的转发壳子,把调用原样转给一份共享的逻辑合约(也叫实现合约),壳子只负责保存状态和指向。ERC-1167 把这种壳子压缩成固定字节码,多年来被大量用于批量部署。ERC-7511 要解决的是剩下的那一点冗余:在 PUSH0 出现之后,那段固定代码里有一个操作码是多余的。

PUSH0 从哪里来,为什么能省

PUSH0 由 EIP-3855 引入,随上海升级生效。它把零压入栈,而不像过去那样用 PUSH1 0x00 这样的两字节指令表达零。ERC-7511 的作者把最小代理从第一性原理重写了一遍,效果记在规范的摘要里:部署时省约 200 Gas,运行时每次调用省 5 Gas,运行时代码长度减少 1 字节。少一字节意味着部署时按字节计费的 calldata 与代码存储都轻了一点,5 Gas 则发生在每一次调用转发的路径上。

规范给出的标准运行时字节码是:

365f5f375f5f365f73bebebebebebebebebebebebebebebebebebebebe5af43d5f5f3e5f3d91602a57fd5bf3

其中第 9 到第 28 字节(含两端)替换成主实现合约的 20 字节地址,整段代码长 44 字节。对照反汇编能看到省费的来源:两条 DUP(各花 3 Gas)被两条 PUSH0(各 2 Gas)替代,被删掉的是一条多余的 SWAP。这类改动不涉及任何权限或所有权语义,读起来更像是”同一件事换了个更短的写法”。

和 ERC-1167、ERC-1967 各管什么

三者容易被混在一起说。ERC-1167 定义”固定地址的最小代理”,用的是不含 PUSH0 的老写法;ERC-7511 是它在 PUSH0 之后的优化版本,规范里明确写明了依赖关系,两者功能等价,只是字节码不同。ERC-1967 管的是另一件事:把实现合约地址存放在约定的存储槽里,方便区块浏览器和工具识别代理,它关心”能不能查清楚壳子背后是谁”,不关心壳子多省。一个合集如果只写了 ERC-1167 或 ERC-7511 的转发壳,却没有按 ERC-1967 之类约定存放实现地址,那么浏览器上看到的就只是一个普通合约地址。

用之前值得核对的三件事

第一,确认 ERC-7511 的当前状态。它在 ERC 仓库里的状态是 Draft(草稿),创建于 2023 年 9 月 4 日,依赖 ERC-1167、ERC-211 与 ERC-3855。草稿意味着没有经过完整的标准化流程收尾,工具与浏览器对它的识别程度取决于各家实现,不能把它当成”官方钦定”的通用标准来宣传。

第二,确认网络支持 PUSH0。PUSH0 是上海升级之后才存在的操作码,一条从未升级的链或测试网会直接把这串字节码判为无效代码,部署失败同样要付 Gas。

第三,也是最重要的一件:确认壳子背后那份实现合约由谁控制。最小代理只解决省钱问题,它不改变权限结构。如果实现合约可升级、可暂停、带黑名单,这些能力仍然作用在所有由它服务的 NFT 上,与壳子省了多少 Gas 毫无关系。判断一枚”用最小代理部署的 NFT”是否值得长期持有,答案几乎全部在实现地址与管理员地址的归属上,而不是省费技巧上。

它解决不了什么

部署壳子之前的两分钟自查

普通持有人不需要会写代理,但有两条自查值得固化:第一,打开合集地址的”Read Contract”或等价页,若代码区只有四十余字节,就到实现地址去看源码是否验证、作者是否与官方渠道一致;第二,把工厂地址记进持仓笔记——同一份工厂部署出来的合集共享同一实现,工厂或实现方若调整默认模板,新部署的项目会一起变。把壳子、实现、工厂三个地址都收进资产档案,比收藏任何教程链接都更能支撑日后核验。

省下的 5 Gas 相对 NFT 交易本身的转账与铸造成本属于零头,真正被 ERC-7511 改变的只有部署环节的字节开销。把它当作”更安全的代理标准”来理解是常见误读:安全属性与 ERC-1167 完全相同,风险面也完全相同。本文为协议机制科普,不构成任何投资建议。