将 CALL, DELEGATECALL, CALLCODE 的 gas 成本增加到 700(从 40 增加)。
将 SELFDESTRUCT 的 gas 成本增加到 5000(从 0 增加)。
如果 SELFDESTRUCT 命中新创建的帐户,它将触发额外的 gas 成本 25000(类似于 CALL)。
将建议的 gas 限制目标增加到 550 万。
将 “除了 1/64 之外的所有” N 定义为 N - floor(N / 64)。
如果一个调用请求的 gas 超过了最大允许量(即,在减去调用和内存扩展的 gas 成本后,父级中剩余 gas 的总量),则不要返回 OOG 错误;相反,如果一个调用请求的 gas 超过了最大允许量的 “除了 1/64 之外的所有”,则使用最大允许量的 “除了 1/64 之外的所有” 的 gas 进行调用(这相当于 EIP-901 加上 EIP-1142 的一个版本)。CREATE 仅向子调用提供父 gas 的 “除了 1/64 之外的所有”。
也就是说,替换:
extra_gas = (not ext.account_exists(to)) * opcodes.GCALLNEWACCOUNT + \
(value > 0) * opcodes.GCALLVALUETRANSFER
if compustate.gas < gas + extra_gas:
return vm_exception('OUT OF GAS', needed=gas+extra_gas)
submsg_gas = gas + opcodes.GSTIPEND * (value > 0)
用:
def max_call_gas(gas):
return gas - (gas // 64)
extra_gas = (not ext.account_exists(to)) * opcodes.GCALLNEWACCOUNT + \
(value > 0) * opcodes.GCALLVALUETRANSFER
if compustate.gas < extra_gas:
return vm_exception('OUT OF GAS', needed=extra_gas)
if compustate.gas < gas + extra_gas:
gas = min(gas, max_call_gas(compustate.gas - extra_gas))
submsg_gas = gas + opcodes.GSTIPEND * (value > 0)
此 EIP 旨在简单,并在该表中计算出的成本之上添加 300 gas 的固定惩罚,以解释加载代码的成本(最坏情况下约为 17–21 kb)。
引入 EIP 90 gas 机制是因为如果没有它,所有当前进行调用的合约都将停止工作,因为它们使用诸如 msg.gas - 40 之类的表达式来确定使用多少 gas 进行调用,这是依赖于调用的 gas 成本为 40。此外,引入 EIP 114 是因为,鉴于我们正在使调用的成本更高且更不可预测,因此我们有机会在不增加当前可用保证的额外成本的情况下进行此操作,因此我们还实现了以下好处:用“更软”的基于 gas 的限制取代调用堆栈深度限制,从而消除了调用堆栈深度攻击,使其成为合约开发者必须担心的攻击类型,从而提高了合约编程的安全性。请注意,使用给定的参数,实际的最大调用堆栈深度限制为约 340(从约 1024 降低),从而减轻了任何进一步潜在的二次复杂度 DoS 攻击(依赖于调用)造成的损害。