Alert Source Discuss
Standards Track: Core

EIP-214: 新操作码 STATICCALL

Authors Vitalik Buterin <vitalik@ethereum.org>, Christian Reitwiessner <chris@ethereum.org>
Created 2017-02-13

简述

为了提高智能合约的安全性,本提案添加了一个新的操作码,可用于调用另一个合约(或自身),同时禁止在调用期间(以及其子调用,如果存在)对状态进行任何修改。

摘要

本提案添加了一个新的操作码,可用于调用另一个合约(或自身),同时禁止在调用期间(以及其子调用,如果存在)对状态进行任何修改。任何尝试执行此类修改的操作码(详见下文)都将导致异常,而不是执行修改。

动机

目前,只要计算可以在提供的 gas 量内执行,对被调用合约可以执行的操作没有任何限制。这给智能合约工程师带来了一些困难;在常规调用之后,除非您了解被调用的合约,否则您无法对合约的状态做出任何假设。此外,由于您无法在交易被矿工确认之前知道交易的顺序,因此即使是外部观察者也无法在所有情况下都确定这一点。

此 EIP 增加了一种调用其他合约并以最简单的方式限制它们可以执行的操作的方法。可以安全地假设所有帐户的状态在静态调用前后是相同的。

规范

向虚拟机引入一个新的 STATIC 标志。该标志最初设置为 false。它的值总是被复制到子调用中,但下面的新操作码除外。

操作码: 0xfa

STATICCALL 的功能与 CALL 等效,只是它只接受 6 个参数(不包括“value”参数,并将其视为零),并在执行子程序时将 STATIC 标志设置为 true 调用子程序。一旦此调用返回,该标志将重置为其调用之前的值。

任何尝试在 STATIC 设置为 true 的执行实例中进行状态更改操作都将抛出异常。这些操作包括 CREATECREATE2LOG0LOG1LOG2LOG3LOG4SSTORESELFDESTRUCT。 它们还包括具有非零值的 CALL。 作为例外,即使具有非零值,CALLCODE 也不被视为状态更改。

理由

这允许合约进行明确的非状态更改调用,让开发人员和审查人员放心,重入错误或其他问题不可能由该特定调用引起;它是一个纯函数,返回一个输出,不执行任何其他操作。 这也可能使纯函数式 HLL 更容易实现。

向后兼容性

该提案增加了一个新的操作码,但不会修改其他操作码的行为,因此对于不使用新操作码且未通过新操作码调用的旧合约,该提案是向后兼容的。

测试用例

待编写。

实现

版权

根据 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Vitalik Buterin <vitalik@ethereum.org>, Christian Reitwiessner <chris@ethereum.org>, "EIP-214: 新操作码 STATICCALL," Ethereum Improvement Proposals, no. 214, February 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-214.