Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-2542: 新的操作码 TXGASLIMIT 和 CALLGASLIMIT

Authors Alex Forshtat <forshtat1@gmail.com>
Created 2020-02-29
Discussion Link https://ethereum-magicians.org/t/eip-2542-add-txgaslimit-callgaslimit-txgasrefund-opcodes

简单总结

一种机制,允许智能合约访问当前交易和执行帧的 gas 限制信息。

摘要

目前,存在一个操作码 0x45 GASLIMIT,它提供对区块 gas 限制的访问。虽然此信息在某些情况下可能很有用,但它可能不是智能合约开发者可能关心的值。操作码 0x5a GAS 提供剩余的 gas,而不是初始的 gas。此外,值得注意的是现有的 0x32 ORIGIN0x33 CALLER0x34 CALLVALUE0x3a GASPRICE 操作码如何设置一种模式,即可以访问交易和当前执行帧状态。 待定:由于 0x30 操作码范围已耗尽,建议的操作码可以添加到 0x50 范围,或者可以添加一个新范围。

动机

随着中继、元交易、gas 费用和账户抽象等概念的普及,对于某些合约来说,能够以绝对的精度跟踪 gas 支出变得至关重要。如果没有在 EVM 级别访问这些数据,此类合约将求助于近似、在链上模拟 EVM 逻辑,甚至有些用例变得不可行。

规范

如果 block.number >= TBD,则添加三个新的操作码:

TXGASLIMIT: 0x5c

将整个交易的 gas 限制推送到堆栈上。这是由外部拥有的账户签名的“startgas”参数的值。 Gas 成本:2(与 GASLIMIT 相同)

CALLGASLIMIT: 0x5d

将当前执行帧的 gas 限制推送到堆栈上。这是应用 EIP-150 “除 1/64 外的所有” 规则后获得的“callGas”值。 Gas 成本:2(与 GASLIMIT 相同)

此外,考虑将 0x45 GASLIMIT 重命名为 BLOCKGASLIMIT 以避免混淆。

理由

假设一个 solidity 智能合约想要知道整个交易或其中的一部分消耗了多少 gas。使用当前的 EVM 完全不可能做到这一点。通过提议的更改,使用伪 Solidity 语法,此信息将很容易获得:

function keepTrackOfGas(string memory message, uint256 number) public {
    ...
    uint gasUsed = msg.gasLimit - gasleft();
}

这是一个非常常见的用例,并且多个实现都受到未考虑不可访问费用的影响。 gasUsed 问题的最先进解决方案是在您的智能合约的第一行访问 ‘gasleft()’。 请注意,可变交易输入大小意味着交易使用的 gas 取决于输入的零和非零字节数,以及 GTXDATANONZERO。另一个问题是 Solidity 通过将整个输入从 calldata 加载到 memory 来处理 public 方法,从而花费不可预测数量的 gas。

另一个应用是让一个方法对给定的 gas 限制有要求。这种情况在元交易的上下文中非常常见,其中 msg.sender 的帐户持有人可能对内部交易的成功不太感兴趣。夸张的伪代码:

function verifyGasLimit(uint256 desiredGasLimit, bytes memory signature, address signer, bytes memory someOtherData) public {
    require(ecrecover(abi.encodePacked(desiredGasLimit, someOtherData), signature) == signer, "Signature does not match");
    require(tx.gasLimit == desiredGasLimit, "Transaction limit does not match the signed value. The signer did not authorize that.");
    ...
}

在这种情况下,不可能依赖 ‘gasleft()’ 值,因为它是动态的,取决于操作码和 calldata 定价,并且无法签名。

向后兼容性

此提案引入了两个新的操作码并重命名了一个现有的操作码,但除此之外,它完全向后兼容。

向前兼容性

此提案的一个主要考虑因素是其与 EVM 的一项或多项未来可能修改的对齐:

  1. EIP-2489 弃用 GAS 操作码(又名 39-UNGAS 提案) 有一种观点认为,智能合约执行“gas 自省”的能力导致合约依赖于当前的操作码定价。 虽然批评这种误解超出了本 EIP 的范围,但如果需要对现有 0x5a GAS 操作码的行为进行重大更改,则相同的考虑因素将适用于建议的操作码。这意味着此 EIP 不会对 EMV 演进增加任何新的限制。

  2. 无状态以太坊 据说 UNGAS 提案与正在进行的无状态以太坊项目有关。它对于无状态以太坊来说不是绝对必要的,但它是一种使未来更容易对 gas 计划进行重大更改的想法。 只要“gas 限制”的概念是 EVM 的一部分,作者就认为提议的操作码不会与无状态以太坊冲突。本提案不公开 gas 计划。

  3. 与其他有争议的操作码的比较 有些操作码没有被提议弃用,但面临批评。例如 0x32 ORIGIN 被智能合约开发者滥用,或者 0x46 CHAINID 使一些智能合约“不可分叉”。 此 EIP 既不鼓励也不启用任何不良安全实践,也不会引入任何对 EVM 来说是新的概念。

安全考虑

现有的智能合约不受此更改的影响。 将使用提议的操作码的智能合约不得将它们用于任何安全功能的核心,而只能用作有关其执行环境的信息来源。

实现

必须在任何 EIP 被赋予“最终”状态之前完成实现,但不必在 EIP 被接受之前完成。虽然在编写代码之前就规范和理由达成共识的方法有其优点,但在解决 API 细节的许多讨论时,“粗略共识和运行代码”的原则仍然有用。

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Alex Forshtat <forshtat1@gmail.com>, "EIP-2542: 新的操作码 TXGASLIMIT 和 CALLGASLIMIT [DRAFT]," Ethereum Improvement Proposals, no. 2542, February 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2542.