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 成本,当目标是运行当前加载合约的一个新实例时。
动机
当前所有调用类型(CALL
、DELEGATECALL
、CALLCODE
和 STATICCALL
)的 gas 成本为 700,这没有考虑到调用合约本身
不需要执行额外的 I/O 操作,因为当前的合约代码已经加载到内存中。
降低对自身调用的 gas 成本将极大地有利于智能合约语言,例如 Solidity 和 Vyper,它们将能够利用 CALL
而不是 JUMP
操作码进行内部函数调用。虽然语言已经可以利用 CALL
进行内部函数调用,但不鼓励这样做,因为与它相关的 gas 成本。
使用 JUMP
会给智能合约语言和/或编译器的实现带来相当大的复杂性成本。上下文(包括堆栈和内存)必须在调用函数的上下文中换入和换出。一个理想的特性是拥有 pure 函数,它不修改内存的状态,并且通过 JUMP
实现它们需要编译器付出更大的努力,而不是能够使用 CALL
。
使用对自身调用可以保证在进行内部调用时,该函数可以依赖于内存或上下文的清晰重置状态,从而使合约编写者和合约使用者受益,避免潜在的未检测到的边缘情况,即内存可能会破坏内部函数的上下文。
由于内部函数使用了 JUMP
,如果需要具有许多输入和/或输出的嵌套函数调用,智能合约语言也可能更快地达到堆栈深度限制。
降低 gas 成本,从而激励使用对自身调用而不是 JUMP
进行内部函数实现,也将有利于静态分析器和跟踪器。
规范
如果 block.number >= FORK_BLKNUM
,那么将 CALL
、DELEGATECALL
、CALLCODE
和 STATICCALL
的成本从 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.