EIP-3298: 移除退款
Authors | Vitalik Buterin (@vbuterin), Martin Swende (@holiman) |
---|---|
Created | 2021-02-26 |
Discussion Link | https://ethereum-magicians.org/t/eip-3298-removal-of-refunds/5430 |
简述
移除 SSTORE 和 SELFDESTRUCT 的 gas 退款。
动机
最初引入 SSTORE 和 SELFDESTRUCT 的 gas 退款是为了激励应用程序开发人员编写能够实践“良好状态卫生”的应用程序,清理不再需要的存储槽和合约。 然而,它们并未被广泛用于此目的,并且糟糕的状态卫生仍然是常态。 现在人们普遍认为,解决状态增长的唯一方法是某种形式的无状态或状态过期,如果实施这样的解决方案,那么未使用的存储槽和合约将开始被自动忽略。
此外,gas 退款还会产生多种有害后果:
- 退款催生了 GasToken。 GasToken 的优势在于将 gas 空间从低费用时期转移到高费用时期,但它也对网络造成了不利影响,尤其是在加剧状态大小方面(因为状态槽实际上被用作“电池”来节省 gas),并且低效地阻塞了区块链 gas 的使用
- 退款增加了区块大小的差异。 区块中实际消耗的 gas 的理论最大量几乎是纸面 gas 限制的两倍(因为退款为区块中的后续交易增加了 gas 空间,尽管退款上限为交易使用的 gas 的 50%)。 这并非致命,但仍然不受欢迎,特别是考虑到退款可用于维持比 EIP 1559 长得多的 2 倍使用高峰。
规范
参数
Constant | Value |
---|---|
FORK_BLOCK |
TBD |
对于 block.number >= FORK_BLOCK
的区块,以下更改适用。
不要应用 refund
。
以上描述足以描述更改,但为了清楚起见,我们枚举了当前使用 gas 退款的所有位置,并且应/可以在节点实现中删除这些位置。
-
删除 SSTORE gas 记账中所有对“退款计数器”的使用,如 EIP 2200 中所定义。 特别是:
- 如果存储槽被更改,并且_当前值_等于_原始值_,但不等于_新值_,则扣除
SSTORE_RESET_GAS
(如果 EIP 2929 规则规定,则加上COLD_SLOAD_COST
),但不修改退款计数器。 - 如果存储槽被更改,并且_当前值_既不等于_新值_也不等于_原始值_(无论后两者是否相等),则扣除
SLOAD_GAS
(如果 EIP 2929 规则规定,则加上COLD_SLOAD_COST
),但不修改退款计数器。
- 如果存储槽被更改,并且_当前值_等于_原始值_,但不等于_新值_,则扣除
-
移除
SELFDESTRUCT
退款。
原理
完全移除退款是解决退款问题的最简单方法; 从部分保留退款机制中获得的任何收益都不值得以太坊协议中剩余的复杂性。
向后兼容性
退款目前仅在交易执行_后_应用,因此它们不会影响执行期间任何特定调用帧可用的 gas 量。 因此,移除它们不会破坏任何代码的执行能力,尽管这会使某些应用程序在经济上不可行。
尤其是 GasToken 将变得毫无价值。 DeFi 套利机器人,今天经常使用已建立的 GasToken 方案或自定义替代方案来降低链上成本,将受益于重写他们的代码以删除对这些不再起作用的 gas 存储机制的调用。
实现
可以在这里找到一个实现:https://gist.github.com/holiman/460f952716a74eeb9ab358bb1836d821#gistcomment-3642048
测试用例更改
- “原始”、“1st”、“2nd”、“3rd”列是指在执行之前和每次 SSTORE 之后存储槽 0 的值。
- “Berlin (冷)”列给出了假设尚未访问存储槽的柏林后(EIP 2929)gas 成本。
- “Berlin (热)”列给出了假设已访问存储槽的柏林后 gas 成本。
- “Berlin (热) + 无退款”列给出了假设已访问存储槽的柏林后 gas 成本,并假设已实施此 EIP。
Gas 成本已扣除退款; 如果数字为负数,则表示退款超过了 gas 成本。 不应用 50% 的退款限制(由于隐含的假设是此代码只是更大执行的一小部分)。
如果要移除退款,这将是比较表
| Code | Original | 1st | 2nd | 3rd | Istanbul | Berlin (cold) | Berlin (hot)| Berlin (hot)+norefund |
| – | – | – | – | – | – | – | – | – |
| 0x60006000556000600055
| 0 | 0 | 0 | | 1612 | 2312 | 212 | 212 |
| 0x60006000556001600055
| 0 | 0 | 1 | | 20812 | 22212 | 20112 | 20112 |
| 0x60016000556000600055
| 0 | 1 | 0 | | 1612 | 2312 | 212 | 20112 |
| 0x60016000556002600055
| 0 | 1 | 2 | | 20812 | 22212 | 20112 | 20112 |
| 0x60016000556001600055
| 0 | 1 | 1 | | 20812 | 22212 | 20112 | 20112 |
| 0x60006000556000600055
| 1 | 0 | 0 | | -9188 | -9888 | -11988 | 3012 |
| 0x60006000556001600055
| 1 | 0 | 1 | | 1612 | 2312 | 212 | 3012 |
| 0x60006000556002600055
| 1 | 0 | 2 | | 5812 | 5112 | 3012 | 3012 |
| 0x60026000556000600055
| 1 | 2 | 0 | | -9188 | -9888 | -11988 | 3012 |
| 0x60026000556003600055
| 1 | 2 | 3 | | 5812 | 5112 | 3012 | 3012 |
| 0x60026000556001600055
| 1 | 2 | 1 | | 1612 | 2312 | 212 | 3012 |
| 0x60026000556002600055
| 1 | 2 | 2 | | 5812 | 5112 | 3012 | 3012 |
| 0x60016000556000600055
| 1 | 1 | 0 | | -9188 | -9888 | -11988 | 3012 |
| 0x60016000556002600055
| 1 | 1 | 2 | | 5812 | 5112 | 3012 | 3012 |
| 0x60016000556001600055
| 1 | 1 | 1 | | 1612 | 2312 | 212 | 212 |
| 0x600160005560006000556001600055
| 0 | 1 | 0 | 1 | 21618 | 22318 | 20218 | 40118 |
| 0x600060005560016000556000600055
| 1 | 0 | 1 | 0 | -8382 | -9782 | -11882 | 5918 |
安全考虑
TBD
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Vitalik Buterin (@vbuterin), Martin Swende (@holiman), "EIP-3298: 移除退款 [DRAFT]," Ethereum Improvement Proposals, no. 3298, February 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3298.