The EVM Object Format (EOF) is an important upgrade for the Ethereum Virtual Machine, comprising a series of EIPs. It introduces an extensible and versioned container format for EVM bytecode with a once-off validation at deploy time, focusing on separating code and data, enhancing code validation, and improving overall efficiency.
Motivation
-
Code validation at deploy time
Instead of having the interpreter validate instructions repeatedly at runtime, EVM bytecode is validated only once during contract creation, providing a faster, cheaper, and more secure execution.
-
Code-data separation
EOF separates EVM bytecode from data, making it easier for static analysis tools, formal verification, and L2s to process executable code.
-
Removal of dynamic JUMPs
EOF bytecode uses only static relative jumps, which is very desirable for tools involving static analysis, formal verification, compilation to native code, zero-knowledge circuits, as well as L2 EVMs.
-
Code and gas non-observability
Lack of code and gas observability is a long-sought trait of the EVM allowing a more maintainable and upgradeable protocol.
-
Removal of JUMPDEST-analysis
By obsoleting JUMPDEST-analysis done at contract runtime, EOF simplifies reasoning about EVM bytecode, as well as other changes, like EVMMAX, Verkle or bytecode size increase.
-
First-class support for EVM functions
Functions in EOF are a subroutine mechanism not relying on dynamic jumps. It improves analysis opportunities by encoding the number of inputs and outputs for each given function, and isolating the stack of each function.
-
Code versioning
Introducing versioning will make backwards-incompatible upgrades much easier. Backwards compatible changes can be done without bumping the EOF version, even if new instructions are introduced.
-
Addressing EVM pain points
EOF proposals address many long-standing issues and quirks of the EVM, streamlining compiler development, providing new compiler optimization opportunities, and ultimately improving developer experience. An example of this are the new improved stack management instructions.
Implementations
EOF has been implemented in the following clients and projects.
3540 | 3670 | 4200 | 4750 | 5450 | 6206 | 7480 | 7069 | 7620 | 7698 | 663 | |
---|---|---|---|---|---|---|---|---|---|---|---|
Megaspec | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
EIP | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
testing | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 🚧 | 🚧 | 🚧 | 👍 | |
besu | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
erigon | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | |||
ethereumjs | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 |
evmone | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
geth | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | 🚧 | |
nethermind | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
revm | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
solidity POC | 👍 | N/A | 👍 | 👍 | N/A | 👍 | 👍 | 👍 | 👍 | 👍 | |
vyper | 🚧 | N/A | 🚧 | 🚧 | N/A | ||||||
EELS | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 | 👍 |
- EOF Tests