EIP的全称是Ethereum Improvement
Proposals(以太坊改进提案),任何人都可以上去提一些对以太坊的改进提案,不过必须得严谨、正式,以太坊君士坦丁堡这次漏洞就是由一个EIP引起的,这个EIP的编号是1283。EIP
1283使以太坊虚拟机使执行智能合约的引擎更高效,并降低在以太坊上运行智能合约的成本。该提案是针对SSTORE操作码的,该操作码主要用于合约持久化存储数据,EIP1283为SSTORE操作码设计了更加合理的gas收费方式。详情地址如下:
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操作码之后存在的值叫新值。然后以这三个概念为基础,设计了如下处理逻辑:如果当前值等于新值(这是无操作),则扣除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更加合理,也更加便宜,但是问题就在这里。

发表评论

电子邮件地址不会被公开。 必填项已用*标注