Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-1285: 增加 CALL 操作码中的 Gcallstipend gas

Authors Ben Kaufman <ben@daostack.io>, Adam Levi <adam@daostack.io>
Created 2018-08-01
Discussion Link https://ethereum-magicians.org/t/eip-1285-increase-gcallstipend-gas-in-the-call-opcode/941

简单概要

CALL 操作码中的 Gcallstipend 费用参数从 2,300 增加到 3,500 gas 单位。

摘要

目前,当调用合约时,CALL 操作码会为非零值 CALL 操作转发 2,300 gas 单位的津贴。此津贴提供给合约,以允许执行其 fallback 函数。提供的津贴有意地很小,以防止被调用的合约花费 call gas 或执行攻击(如重入)。 虽然津贴很小,但它仍然应该为一些廉价的操作码(如 LOG)提供足够的 gas,但对于一些更复杂和现代的逻辑实现来说,这还不够。 此 EIP 建议将给定的津贴从 2,300 增加到 3,500,以提高 fallback 函数的可用性。

动机

此 EIP 背后的主要动机是允许为遵循 "Proxy" 模式的合约实现简单的 fallback 函数。简单来说,"Proxy Contract" 是一个合约,它在其 fallback 函数中使用 DELEGATECALL,以便根据另一个合约的逻辑运行,并作为它指向的合约逻辑的独立实例。 这种模式对于节省每次部署的 gas 非常有用(因为 Proxy 合约非常精简),并且它开启了试验合约可升级性的能力。 平均而言,proxy 合约的 DELEGATECALL 功能花费约 1,000 gas 单位。 当合约将 ETH 转移到 proxy 合约时,在逻辑合约的 fallback 函数执行之前,proxy 逻辑将消耗约 1,000 gas 单位。这仅为逻辑的执行留下了大约 1,300 gas 单位。这是一个严重的限制,因为它不足以进行平均的 LOG 操作(可能足以进行带有单个参数的 LOG)。 通过稍微增加津贴中给出的 gas 单位,我们允许 proxy 合约具有适当的 fallback 逻辑,而不会增加调用合约的攻击面。

规范

CALL 操作码中的 Gcallstipend 费用参数从 2,300 增加到 3,500 gas 单位。 对以太坊客户端的实际更改是更改它们存储为常量的 CallStipend。 对于实现示例,你可以找到 此处 链接的 Geth 客户端实现。可以在 此处 找到对代码的实际更改。

原理

Gcallstipend gas 参数增加 1,200 gas 单位的基本原理来自执行 DELEGATECALLSLOAD 的成本,以及一些小的额外操作的少量余量。所有这些都同时保持了津贴相对较小,并且不足以访问存储或更改状态。

向后兼容性

此 EIP 需要对 CALL 操作码中的 Gcallstipend gas 参数进行向后不兼容的更改。

版权

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

Citation

Please cite this document as:

Ben Kaufman <ben@daostack.io>, Adam Levi <adam@daostack.io>, "EIP-1285: 增加 CALL 操作码中的 Gcallstipend gas [DRAFT]," Ethereum Improvement Proposals, no. 1285, August 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1285.