HomeEIPs
EIPsEIP-2970
EIP-2970

IS_STATIC opcode

StagnantStandards Track: Core
Created: 2020-09-13
Vitalik Buterin (@vbuterin)
DiscussionsOriginal linkEdit
1 min read

The EIP-2970 proposal is related to the Ethereum blockchain and suggests the addition of a new opcode called IS_STATIC. This opcode would allow smart contract developers to check whether their contract is being called in a static or non-static context. In a static context, the contract is being called for view or pure functions, which do not modify the state of the blockchain. In a non-static context, the contract is being called for functions that modify the state of the blockchain. The IS_STATIC opcode would help developers optimize their code by allowing them to skip unnecessary checks and operations when their contract is being called in a static context. This proposal is still in draft form and has not yet been implemented.

Video
Anyone may contribute to propose contents.
Go propose
Original

Simple Summary

Add a IS_STATIC (0x4A) opcode that pushes 1 if the current context is static (ie. the execution is in a STATICCALL or a descendant thereof, so state-changing operations are not possible), and 0 if it is not.

Abstract

Motivation

The main intended use case is to allow account abstraction (EIP 2938) to be extended so that accounts can allow static calls from the outside (which are harmless to AA's security model) but not state-changing calls.

Specification

Add a IS_STATIC (0x4A) opcode that pushes 1 if the current context is static (ie. the execution is in a STATICCALL or a descendant thereof, so state-changing operations are not possible), and 0 if it is not.

Rationale

Determining staticness is already possibly using the following hacky technique: make a CALL with limited gas, and inside that CALL issue one LOG and exit. If the context is static, the CALL would fail and leave a 0 on the stack; if the context is non-static, the CALL would succeed. However, this technique is fragile against changes to gas costs, and is needlessly wasteful. Hence, the status quo neither allows a reasonably effective way of determining whether or not the context is static, nor provides any kind of invariant that executions that do not fail outright will execute the same way in a static and non-static context. This EIP provides a cleaner way of determining staticness.

Backwards Compatibility

TBD

Security Considerations

TBD

Copyright and related rights waived via CC0.

Further reading
Anyone may contribute to propose contents.
Go propose
Adopted by projects
Anyone may contribute to propose contents.
Go propose

Not miss a beat of EIPs' update?

Subscribe EIPs Fun to receive the latest updates of EIPs Good for Buidlers to follow up.

View all
Serve Ethereum Builders, Scale the Community.
Resources
GitHub
Supported by