EIP-2930访问列表何时能省Gas? 图 1
EIP-2930访问列表何时能省Gas? · 图 1

访问列表常被简化成“提前告诉以太坊会访问哪些地址,所以可以省Gas”。这句话只说了一半。EIP-2930确实会把列出的账户和存储槽预热,但交易要为每个地址和每个storage key先付一笔内在Gas;只有这些项目随后真的被访问,节省的冷访问成本才可能超过预付费用。

Type 1交易多了什么

EIP-2930定义0x01类型交易。它仍使用gasPrice,而不是EIP-1559的maxFeePerGas与maxPriorityFeePerGas;主要新增chainId和accessList。访问列表由若干地址组成,每个地址又可带一组32字节存储键。

这不是授权清单,也不会限制合约只能访问这些状态。未列出的账户和槽仍可访问,只是第一次按冷访问计费。列出的条目则在执行开始时进入已访问集合。

冷与暖是一次交易内的状态

EIP-2929提高首次访问某些账户和存储槽的成本,并把之后的重复访问按暖访问处理。这里的“暖”只在本次交易执行期间有效,不会因为上一笔交易访问过就永久便宜。

项目首次未预热已预热或已访问accessList预付
账户地址冷账户访问2600 Gas暖访问100 Gas每地址2400 Gas
存储槽冷SLOAD合计2100 Gas暖读取100 Gas每槽1900 Gas

按EIP给出的定价,命中条目时还要加100 Gas的暖访问费:地址总计约2500 Gas,相比2600 Gas冷访问净省100;存储槽总计约2000 Gas,相比2100 Gas冷读取也净省100。若条目没有被执行路径使用,2400或1900就成为纯额外成本。

为什么自动生成也可能不准

合约调用常有条件分支。模拟时的余额、价格、allowance或调用者不同,实际路径可能变化;代理升级、外部调用和重入路径也会改变访问集合。客户端生成的列表是对某个状态和输入的估计,不是未来执行的证明。

EIP-2930允许重复条目,重复项会重复计入费用,却只会让相同项目进入集合一次。生成后应去重并复查。连接合约前还应先验证目标和方法,见连接智能合约检查清单;访问列表不会降低恶意合约风险。

三个算账场景

**场景一:地址与槽都会访问。**列表中的一个地址和两个存储槽全部命中,协议定价下可比三次冷访问少约300 Gas,但还要考虑交易编码和工具支持。

**场景二:分支没有走到。**模拟以为会读取五个槽,实际提前返回,只访问一个。未命中的四个槽仍预付7600 Gas,整体反而更贵。

**场景三:同一槽反复读取。**无访问列表时只有第一次是冷访问,后面已经是暖访问;不能把每次读取都算成2100 Gas再夸大节省。

Type 1与Type 2不要混淆

Type 1把访问列表加入旧式gasPrice结构;Type 2动态费率交易同样可以携带accessList,但费用字段遵循EIP-1559。钱包或RPC显示“有accessList”不等于交易一定是Type 1。实际类型、Gas Used和费用应从交易与回执一起核对,可参考以太坊交易回执怎么看

普通用户在钱包里很少需要手填访问列表。若只是想降低总费用,优先确认网络、调用复杂度、基础费和Layer2选择,而不是复制陌生列表。Gas费的基础组成可先读Gas费是什么

开发者的验证步骤

  1. 用与实际发送相同的from、to、value、data和区块状态模拟。
  2. 生成accessList后去重地址与存储键。
  3. 对照执行trace,确认每个条目是否真的命中。
  4. 分别估算无列表和有列表的gasUsed,而不是只看条目数量。
  5. 对可能变化的分支设置回退方案与Gas余量。
  6. 发送后从回执记录实际gasUsed,持续校准生成器。

本文用于EVM费用机制与开发调试教育,不构成交易或节费保证。Gas定价可能随协议升级变化,节点模拟也可能与最终区块状态不同。涉及生产系统时,应以当前客户端、目标链规则和真实回执测量为准。