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 成本基于类似的操作码 SELFBALANCE
和 SSTORE
。
大多数账户将不存储 gas,因此在正常情况下,每个账户的存储开销应最小甚至为零。
选择的操作码编号与 SELFBALANCE
和 GASLIMIT
处于相同的 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.