Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-1380: 降低对自身调用的 gas 成本

Authors Alex Beregszaszi (@axic), Jacques Wagener (@jacqueswww)
Created 2018-08-31
Discussion Link https://ethereum-magicians.org/t/eip-1380-reduced-gas-cost-for-call-to-self/1242
Requires EIP-150

摘要

降低调用指令的 gas 成本,当目标是运行当前加载合约的一个新实例时。

动机

当前所有调用类型(CALLDELEGATECALLCALLCODESTATICCALL)的 gas 成本为 700,这没有考虑到调用合约本身 不需要执行额外的 I/O 操作,因为当前的合约代码已经加载到内存中。

降低对自身调用的 gas 成本将极大地有利于智能合约语言,例如 Solidity 和 Vyper,它们将能够利用 CALL 而不是 JUMP 操作码进行内部函数调用。虽然语言已经可以利用 CALL 进行内部函数调用,但不鼓励这样做,因为与它相关的 gas 成本。

使用 JUMP 会给智能合约语言和/或编译器的实现带来相当大的复杂性成本。上下文(包括堆栈和内存)必须在调用函数的上下文中换入和换出。一个理想的特性是拥有 pure 函数,它不修改内存的状态,并且通过 JUMP 实现它们需要编译器付出更大的努力,而不是能够使用 CALL

使用对自身调用可以保证在进行内部调用时,该函数可以依赖于内存或上下文的清晰重置状态,从而使合约编写者和合约使用者受益,避免潜在的未检测到的边缘情况,即内存可能会破坏内部函数的上下文。

由于内部函数使用了 JUMP,如果需要具有许多输入和/或输出的嵌套函数调用,智能合约语言也可能更快地达到堆栈深度限制。

降低 gas 成本,从而激励使用对自身调用而不是 JUMP 进行内部函数实现,也将有利于静态分析器和跟踪器。

规范

如果 block.number >= FORK_BLKNUM,那么将 CALLDELEGATECALLCALLCODESTATICCALL 的成本从 700 降低到 40, 当且仅当,调用的目标地址等于调用者的地址。

原理

EIP150 将这些指令的成本从 40 增加到 700,以便更公平地收取从磁盘加载新合约的费用,例如更紧密地反映 I/O 费用。 通过假设 660 是从磁盘加载合约的成本,可以假设最初的 40 gas 是创建已加载合约代码的新 VM 实例的合理成本。

向后兼容性

这应该不会对向后兼容性构成任何风险。当前现有的合约不应该注意到任何差异,只会看到更便宜的执行。 通过 EIP150,合约(和语言)开发者已经意识到,依赖严格的 gas 成本是不可行的,因为成本可能会发生变化。 这个 EIP 的影响甚至小于 EIP150,因为成本正在下降而不是上升。

测试用例

待定

实现

待定

版权

CC0 下放弃版权和相关权利。

Citation

Please cite this document as:

Alex Beregszaszi (@axic), Jacques Wagener (@jacqueswww), "EIP-1380: 降低对自身调用的 gas 成本 [DRAFT]," Ethereum Improvement Proposals, no. 1380, August 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1380.