Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-3322: 账户 gas 存储操作码

Authors William Morriss (@wjmelements)
Created 2020-03-04
Discussion Link https://ethereum-magicians.org/t/eip-3322-efficient-gas-storage/5470

简单概要

允许合约账户存储 gas,这些 gas 可以转移到退款计数器。

摘要

合约可以持久化存储 gas,以便稍后转移到退款计数器。 引入了三个操作码来读取、添加到和使用此 gas 计数器。

动机

目前 gas 代币正在使用退款机制来套利 gas 价格。 这通过将 gas 从需求较少的区块转移到需求较多的区块,从而带来了 gas 供应弹性以及价格稳定性。 不幸的是,这奖励了不必要的状态增长。 通过引入一种更优越的 gas 存储机制,gas 市场将需要更少的存储和计算。

规范

合约账户获得一个无符号 gas 退款计数器,初始值为零。

引入了三个新的操作码来管理此状态。

  • SELFGAS (0x49): 将当前账户的 gas 退款计数器推送到堆栈上。 与 SELFBALANCE 共享 gas 定价。
  • USEGAS (0x4a): 从堆栈中弹出 amount。 将 amount 和当前账户的 gas 退款计数器中的最小值转移到执行上下文的退款计数器。 花费 5000 gas。
  • STOREGAS (0x4b): 从堆栈中弹出 amount。 花费 5000 + amount gas。 将当前账户的 gas 退款计数器增加 amount

理由

通过重用执行上下文的退款计数器,我们可以重用其 50% 的 DoS 保护,这将其区块弹性贡献限制为 2 倍。

gas 成本基于类似的操作码 SELFBALANCESSTORE

大多数账户将不存储 gas,因此在正常情况下,每个账户的存储开销应最小甚至为零。

选择的操作码编号与 SELFBALANCEGASLIMIT 处于相同的 0x4X 范围内。

向后兼容性

由于 gas 被添加到退款计数器,因此预计不会出现兼容性问题。

测试用例

| Code | Used Gas | Refund | Original | Final | |——————|———-|——–|———-|——-| | 0x60004900 | 5003 | 0 | 0 | 0 | | 0x60034900 | 5003 | 2 | 2 | 0 | | 0x60034900 | 5003 | 3 | 3 | 0 | | 0x60034900 | 5003 | 3 | 4 | 1 | | 0x60034960034900 | 10006 | 4 | 4 | 0 | | 0x60034960034900 | 10006 | 6 | 6 | 0 | | 0x484900 | 5010 | 100000 | 100000 | 0 | | 0x61ffff4a00 | 70538 | 0 | 0 | 65535 |

安全注意事项

DoS 已经受到 50% 退款限制的限制。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

William Morriss (@wjmelements), "EIP-3322: 账户 gas 存储操作码 [DRAFT]," Ethereum Improvement Proposals, no. 3322, March 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3322.