DEV Community

Cover image for EVM bytecode and its relation to Yul
Shlok Kumar
Shlok Kumar

Posted on

EVM bytecode and its relation to Yul

EVM bytecode is stored on the blockchain as a sequence of bytes, and it can be executed by any node in the network that has access to it

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)
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)