移除 SELFDESTRUCT 的 gas 退款,并将 SSTORE 的 gas 退款限制在一种特定情况下。
动机
最初引入 SSTORE 和 SELFDESTRUCT 的 gas 退款是为了激励应用程序开发者编写实践“良好状态卫生”的应用程序,清除不再需要的存储槽和合约。然而,它们并没有被广泛用于此,并且不良的状态卫生仍然是常态。现在人们普遍认为,解决状态增长的唯一方法是某种形式的无状态化或状态过期,如果实现了这样的解决方案,那么废弃的存储槽和合约将开始被自动忽略。
此外,gas 退款还有多个有害后果:
退款催生了 GasToken。GasToken 在将 gas 空间从低费用时期转移到高费用时期方面具有优势,但它也对网络具有不利影响,尤其是在加剧状态大小(因为状态槽实际上被用作“电池”来节省 gas)和低效地阻塞区块链 gas 使用方面。
退款增加了区块大小的差异。区块中实际消耗的 gas 的理论最大量几乎是纸面 gas 限制的两倍(因为退款为区块中的后续交易增加了 gas 空间,尽管退款上限为交易已用 gas 的 50%)。这并不是致命的,但仍然是不受欢迎的,特别是考虑到退款可以用于维持 2 倍的使用峰值,比 EIP 1559 持续的时间更长。
互斥锁用例
实现互斥锁有两种典型方法:“0-1-0”和“1-2-1”。让我们看看它们有何不同
‘0-1-0’:
Istanbul: 1612
Berlin: 212
NoRefund: 20112
EIP-3403: 1112
‘1-2-1’:
Istanbul: 1612
Berlin: 212
NoRefund: 3012
EIP-3403: 3012
注意:实际上,永远不会有负的 gas 成本,因为退款上限为 0.5 * gasUsed。
但是,这些表显示了负值,因为更实际的情况可能会将额外的 gas 花费在其他操作上。’
Gas token 继续不可行,因为每次 19000 的退款只有在同一交易中早些时候因将该存储槽从零翻转为非零而支付了 19000 额外 gas 的情况下才有可能,因此您无法清除某些存储槽并使用节省的 gas 来填充其他存储槽。
_执行花费_的 gas 总量上限为 gas 限制。每次将存储槽从非零 -> 零翻转的 19000 退款只有在同一交易中早先为将该槽从零 -> 非零翻转而支付的 19000 额外 gas 的情况下才有可能;为存储写入和扩展支付的 gas 都被恢复了,因此实际上不需要将其应用于 Merkle 树。因此,这种额外的 gas 不会增加风险。
向后兼容性
退款目前仅在交易执行_之后_应用,因此它们不会影响执行期间任何特定调用帧可用的 gas 量。因此,移除它们不会破坏任何代码的执行能力,但会使一些应用程序在经济上不可行。
特别是 Gas token 将变得毫无价值。DeFi 套利机器人今天经常使用已建立的 gas token 方案或自定义替代方案来降低链上成本,它们将受益于重写其代码以删除对这些不再起作用的 gas 存储机制的调用。