导致以太坊延迟硬分叉的EIP 1283到底是什么?

EIP的全称是Ethereum Improvement Proposals(以太坊改进提案),任何人都可以上去提一些对以太坊的改进提案,不过必须得严谨、正式,以太坊君士坦丁堡这次漏洞就是由一个EIP引起的,这个EIP的编号是1283。EIP 1283使以太坊虚拟机使执行智能合约的引擎更高效,并降低在以太坊上运行智能合约的成本。
该提案是针对SSTORE操作码的,该操作码主要用于合约持久化存储数据,EIP1283为SSTORE操作码设计了更加合理的gas收费方式。
详情地址如下:
https://eips.ethereum.org/EIPS/eip-1283
为什么需要EIP 1283?
EIP-1283提案由Wei Tang(@sorpass)于2018年8月1日创建,作为EIP-1087和EIP-1153的替代方案。EIP-1087由Nick Johnson创建,主要是改变EVM SSTORE运行gas费用收取方式,减少过多的gas费用成本;EIP-1153由Alexey Akhunov创建,相比EIP-1087更加便宜,gas费用计算规则更加简单。EIP-1283提出了在SSTORE上进行gas计量的方案,为数据存储的变化引进更加合理公平的定价方案。
其中定义了三个概念:
存储槽的原始值(original):在当前事务发生回滚(revert)后会存在的值叫原始值。存储槽的当前值(current):在使用SSTORE操作码之前存在的值叫当前值。存储槽的新值(new):在使用SSTORE操作码之后存在的值叫新值。
然后以这三个概念为基础,设计了如下处理逻辑:

导致以太坊延迟硬分叉的EIP 1283到底是什么?


如果当前值等于新值(这是无操作),则扣除200 gas。
如果当前值不等于新值
如果原始值等于当前值(此存储槽未被当前执行上下文更改)
如果原始值为 0,则扣除20000 gas。
否则,扣除5000 gas。如果新值为 0,则在退款计数器中增加15000 gas(退款计数器中记录的gas会退还给用户)。
如果原始值不等于当前值(代表此存储槽”脏”了),则扣除200 gas。
如果原始值不为0
如果当前值为 0(也表示新值不为0),请从退款计数器中减少15000 gas。
如果新值为 0(也表示当前值不为0),请向退款计数器中增加15000 gas。
如果原始值等于新值(此存储槽已重置)
如果原始值为 0,则将退款计数器中增加19800 gas。
否则,则在退款计数器中增加4800 gas。
根据如上的逻辑可以发现,当使用SSTORE操作码的时候如果不改变任何值的时候,只消耗 200 gas。如果改变了值最终又重置为0的话也只消耗20000 + 200 – 19800 = 400 gas。
而在之前EIP 1087的逻辑中如果使用SSTORE操作码改变了值最终又重置为0的话需要消耗20000 + 5000 – 10000 = 15000 gas。
显然EIP 1283的处理逻辑比EIP 1087更加合理,也更加便宜,但是问题就在这里。

导致以太坊延迟硬分叉的EIP 1283到底是什么?

扫一扫手机访问

发表评论