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 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧
erigon++ (silkworm) 👍 👍 👍 👍 👍 👍 👍 👍 🚧 👍 👍
ethereumjs stale stale stale stale stale
evmone 👍 👍 👍 👍 👍 👍 👍 👍 🚧 👍 👍
geth 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧
nethermind 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧 🚧
revm 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍
solidity POC 👍 N/A 👍 👍 N/A 👍 👍 👍 👍 👍
vyper stale N/A stale stale N/A
EELS 🚧 🚧 🚧

Learn More