EVM bytecode and its relation to Yul

Shlok KumarShlok Kumar
4 min read

The Ethereum Virtual Machine (EVM) is a critical component of the Ethereum network, responsible for executing smart contract bytecode. EVM bytecode is a low-level programming language used to write smart contracts on the Ethereum blockchain.

EVM bytecode is a low-level representation of smart contract code that is executed by the EVM. It is a stack-based bytecode language that is similar to assembly language. EVM bytecode is generated by compiling high-level programming languages like Yul into machine-readable instructions that the EVM can execute.

Yul is a low-level programming language that is designed to be easy to read and write while still being efficient and expressive. Yul code is compiled into EVM bytecode, which is then executed by the EVM. Yul is similar to other low-level programming languages like LLVM and WebAssembly, but it is specifically designed for smart contract development on the Ethereum blockchain.

Yul code is compiled into EVM bytecode using a compiler like solc, which is the Solidity compiler. The solc compiler takes Yul code as input and generates EVM bytecode that can be executed by the EVM. Yul code can also be compiled into other formats like LLVM and WebAssembly, which can be useful for testing and debugging.

EVM bytecode operates as a stack machine with a depth of 1024 items, where each item is a 256-bit word. It can execute arithmetic and logical operations, control flow structures like branching and looping, and interact with the Ethereum network through opcodes.

Yul is a higher-level programming language that compiles down to EVM bytecode. It supports advanced features like function overloading, contract inheritance, and inline assembly. Yul allows developers to write smart contracts in a more human-readable and expressive way while still leveraging the power of the EVM.

Yul can be used to write smart contracts from scratch, or to optimize existing Solidity code by using inline assembly blocks. Yul can also be used to write libraries or modules that can be reused across different smart contracts. Yul code can be compiled to EVM bytecode using the solc compiler or the yulc compiler.

Here is an example of a simple Yul contract that implements a counter:

// A contract that keeps track of a counter
object "Counter" {
    code {
        // Deploy the contract
        datacopy(0, dataoffset("Runtime"), datasize("Runtime"))
        return(0, datasize("Runtime"))
    }
    object "Runtime" {
        code {
            // The storage slot where the counter is stored
            let slot := 0
            // The function selector
            let selector := calldataload(0)
            // Check if the call data matches the increment function
            if eq(selector, 0x8ada066e) {
                // Increment the counter by 1
                sstore(slot, add(sload(slot), 1))
                // Return the new value
                let value := sload(slot)
                mstore(0, value)
                return(0, 32)
            }
            // Check if the call data matches the get function
            if eq(selector, 0x6d4ce63c) {
                // Return the current value
                let value := sload(slot)
                mstore(0, value)
                return(0, 32)
            }
            // Invalid function selector
            revert(0, 0)
        }
    }
}

To better understand how Yul relates to EVM bytecode, consider the following example in Yul:

function add(a: uint256, b: uint256) -> uint256:
    let c := a + b
    return c

This Yul code defines a function that takes two uint256 values as input and returns their sum. When this Yul code is compiled, it generates the corresponding EVM bytecode, which can be executed on the Ethereum blockchain.

Here's an example of what the compiled bytecode might look like:

60 00 80 80 52

Each byte in this bytecode represents an opcode that the EVM will execute when it runs the smart contract. The 60 opcode pushes the value 00 onto the stack, 80 duplicates the top of the stack, 52 adds the top two values on the stack and replaces them with their sum.

In conclusion, EVM bytecode is the low-level programming language used to write smart contracts on the Ethereum blockchain, and Yul is a higher-level language that compiles down to EVM bytecode. These two languages work together to allow developers to write expressive, powerful smart contracts that can interact with the Ethereum network.

EVM bytecode is a low-level machine code that is executed by the Ethereum Virtual Machine (EVM). Yul is a low-level programming language that is compiled into EVM bytecode and is designed for smart contract development on the Ethereum blockchain. Understanding EVM bytecode and how it relates to Yul is crucial for developing efficient and secure smart contracts on the Ethereum blockchain.

For more content, follow me at - https://linktr.ee/shlokkumar2303

0
Subscribe to my newsletter

Read articles from Shlok Kumar directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Shlok Kumar
Shlok Kumar

Ethereum developer Solidity smart contract expert Bitcoin and cryptocurrency enthusiast Experience in Solana and other blockchain platform Blockchain enthusiast and developer. Building decentralized solutions that shape the future. Passionate about smart contracts, dApps, and all things crypto. Follow me for updates on my projects and the latest in blockchain technology.