导致以太坊延迟硬分叉的EIP 1283到底是什么?
EIP的全称是Ethereum Improvement Proposals(以太坊改进提案),任何人都可以上去提一些对以太坊的改进提案,不过必须得严谨、正式,以太坊君士坦丁堡这次漏洞就是由一个EIP引
EIP的全称是Ethereum Improvement Proposals(以太坊改进提案),任何人都可以上去提一些对以太坊的改进提案,不过必须得严谨、正式,以太坊君士坦丁堡这次漏洞就是由一个EIP引起的,这个EIP的编号是1283。EIP 1283使以太坊虚拟机使执行智能合约的引擎更高效,并降低在以太坊上运行智能合约的成本。
这个提议是针对SSTORE opcode的,它主要用于在契约中持久地存储数据。EIP1283为SSTORE操作码设计了更合理的充气方式。
详细地址如下:
https://eips.ethereum.org/eips/EIP-1283
为什么需要EIP 1283?
提案EIP-1283由汤唯(@sorpass)于2018年8月1日创建,作为EIP-1087和EIP-1153的替代方案。EIP-1087是Nick Johnson创造的,主要是为了改变EVM商场运营的气费收取方式,降低过高的气费;EIP-1153是由阿列克谢·阿克胡诺夫创造的。与EIP-1087相比,EIP-1153更便宜,并且燃气费计算规则更简单。EIP-1283提出了一个在SSTORE上进行气体计量的方案,为数据存储的变化引入了一个更加合理和公平的定价方案。
定义了三个概念:
存储槽的原始值:当前事务回滚后将存在的值称为原始值。存储槽的当前值:使用SSTORE操作码之前存在的值称为当前值。存储槽的新值:使用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更加合理,也更加便宜,但是问题就在这里。
这个提议是针对SSTORE opcode的,它主要用于在契约中持久地存储数据。EIP1283为SSTORE操作码设计了更合理的充气方式。
详细地址如下:
https://eips.ethereum.org/eips/EIP-1283
为什么需要EIP 1283?
提案EIP-1283由汤唯(@sorpass)于2018年8月1日创建,作为EIP-1087和EIP-1153的替代方案。EIP-1087是Nick Johnson创造的,主要是为了改变EVM商场运营的气费收取方式,降低过高的气费;EIP-1153是由阿列克谢·阿克胡诺夫创造的。与EIP-1087相比,EIP-1153更便宜,并且燃气费计算规则更简单。EIP-1283提出了一个在SSTORE上进行气体计量的方案,为数据存储的变化引入了一个更加合理和公平的定价方案。
定义了三个概念:
存储槽的原始值:当前事务回滚后将存在的值称为原始值。存储槽的当前值:使用SSTORE操作码之前存在的值称为当前值。存储槽的新值:使用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更加合理,也更加便宜,但是问题就在这里。