EIP 2327: BEGINDATA opcode
Author | Martin Lundfall |
---|---|
Discussions-To | https://ethereum-magicians.org/t/new-opcode-begindata/3727 |
Status | Draft |
Type | Standards Track |
Category | Core |
Created | 2019-10-28 |
Simple Summary
Introduces a new opcode BEGINDATA
, which indicates that the remaining bytes of the contract should be regarded as data rather than contract code.
Abstract
It is common for smart contracts to efficiently store data directly in the contract bytecode. Examples include constant variables, compiler metadata and the contract runtime during the init phase. Currently, such data is not distinguished from normal bytecode and is still being analysed for JUMPDEST
s by EVM interpreters. This EIP introduces a new opcode BEGINDATA
at byte 0xb6
, which marks the remainding bytecode as data, indicating to EVM interpreters, static analysis tools and chain explorers that the remaining bytes do not represent opcodes.
Motivation
The BEGINDATA
opcode has been suggested before as part of the EIP Subroutines and Static Jumps for the EVM
EIP-615 as a way to determine the position of jumptables in contract bytecode. It is here introduced in its own right in order to exclude data from the JUMPDEST
analysis of contracts, making it impossible to jump to data. This makes it easier for static analysis tools to analyse contracts, allows disassemblers, chain explorers and debuggers to not display data as a mess of INVALID opcodes and may even provide a marginal improvement in performance. Additionally, it paves the way for suggestions such as EIP 1712 to disallow unused opcodes, jumptables EIP-615 and speculative proposals to disallow for deployment of contracts with stack usage violations.
Specification
While computing the valid JUMPDEST
s of a contract, halt analysis if BEGINDATA
is encountered. A JUMP
to a value higher than the PC
value of BEGINDATA
should throw with a BAD_JUMP_DESTINATION
error. Bytes past BEGINDATA
remain accessible via CODECOPY
and EXTCODECOPY
.
If BEGINDATA
is encountered during contract execution, it has the same semantics as STOP
. It uses 0 gas.
Rationale
The byte 0xb6
was chosen to align with EIP-615.
The choice to STOP
if BEGINDATA
is encountered is somewhat arbitrary. An alternative would be to be to abort the execution with an out-of-gas error.
Backwards Compatibility
The proposal will not change any existing contracts unless their current behaviour relies upon the usage of unused opcodes.
Test Cases
Test cases should include:
1) A contract which jumps to a destination X
, where X
has a pc value higher than the BEGINDATA
opcode, and the byte at X
is 0x5b
. This should fail with a BAD_JUMP_DESTINATION
error.
2) A contract which encounters the BEGINDATA
opcode (should stop executing the current call frame)
Implementation
Not yet.
Copyright
Copyright and related rights waived via CC0.