EVM bytecode and its relation to Yul
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
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.