EVM Opcodes 0
Bu yazı dizisinde, baştan sona EVM opcode'ları inceleyeceğiz. İlk yazıda bytecode ve opcode kavramlarını uygulama yoluyla somutlaştıracağız.
1- Bytecode Nedir?
Diğer birçok popüler programlama dili gibi Solidity de yüksek seviyeli bir programlama dilidir. Solidity kodunu solc derleyicisini kullanarak derlediğimizde, kodumuzu yalnızca EVM'nin anlayabileceği bir şey olan bytecode'a çevirecektir.
Kısaca bytecode, Solidity dilinde yazılmış bir kodun ve solc derleyicisi tarafından EVM'nin anlayacağı bir koda dönüştürülmesi sonucunda ortaya çıkan makine dilindeki kod yapısıdır. (Derleme sırasında ABI'de oluşturulur. Başka bir zaman anlatırım.)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract StorageContract {
uint public x=2;
Bu kodu remix üzerinde compile ettiğinizde aşağıdaki görüntü karşınıza çıkacaktır. Ekran görüntüsü üzerinde kare içine aldığım alanda Bytecode bulunmaktadır. İlgili kutucuğa tıkladığınızda Bytecode'u kopyalamış olursunuz.
Gidip bu kodu bir boş sayafaya yapıştırdığınızda şu sonucu alacaksınız. Bu bytecode'dur. Baştaki 0x ifadesi bytecode'un hexadecimal olarak yazıldığını ifade etmektedir.
**0x**6080604052600260005534801561001557600080fd5b5060b3806100246000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80630c55699c14602d575b600080fd5b60336047565b604051603e91906064565b60405180910390f35b60005481565b6000819050919050565b605e81604d565b82525050565b6000602082019050607760008301846057565b9291505056fea264697066735822122040d72790712387380cc9d75024fcfa2d40ba3ec182cd49afa48224043d7f3d6f64736f6c63430008130033
2- Bytecode Nasıl Analiz Edilir?
a-Remix
Sanırım yukarıdaki remix görüntüsüyle bir nebze daha konuyu anladınız. Debug sekmesi altında görülen input satırının ayrıntısını sol tarafta yer alan Debugger(Bunu remix'e yüklemeniz lazım) aracıyla daha ayrıntılı görebilirsiniz. Yukarıdaki görüntüde daire içine aldığım butona tıklayarak kodumuzun byte görünümünün her adımda nasıl değiştiğini izleyebilirsiniz.
b-evm.codes
Bir başka yolda, remix üzerinden aldığımız bytecode'u evm.playground üzerinde çalıştırmaktır. Dikkat edin aldığımız bytecode'un başındaki "0x" i burada çıkartıp ekrana yapıştıracağız.
Bu işlemi yaptıktan sonra daire içine aldığım "Run" butonuna basarak sağ üstte kare içine aldığım hareket butonuna basarak kodun nasıl ilerlediğini aşağıdaki veritabanlarından(storage, memory,stack) ve çıktı(return) ekranlarından izleyeceğiz. Şuna tıklayarak uygulamada kodun nasıl çalıştığını görebilirsiniz.
c-bytegraph.xyz
Bir başka yolda, remix üzerinden aldığımız bytecode'u bytegraph.xyz üzerinde çalıştırmaktır. Dikkat edin aldığımız bytecode'un başındaki "0x" i burada çıkartıp ekrana yapıştıracağız.
Sonrasında ekranda daire içine aldığım "Bytecode" butonu seçilerek analize aşağıdaki şekilde devam edilecektir.
Öncelikle(1) sol menüde bulunan uçak işaretine(execute butonu) tıklayınız. Buna tıkladığınızda sağ tarafta menü açılacaktır. Buradan step butonuna basarak sırayla işlemin nasıl geliştiğini izleyebilirsiniz. Bu işlemlerin gelişimini daha ayrıntılı görmek için sol menüde bulunan(2) dosya butonuna(Instruction Info) tıklayın.
3-Opcode Nedir?
Opcode, bytecodeların içinde yer alan talimatlardır.
Bytecode, opcode ve değerlerden oluşur.
Bytecode'un ilk bölümünü hatırlayalım.
6080604052
Burada 60 aslında PUSH1 opcode'una işaret etmektedir. 52 ise MSTORE opcode'una işaret etmektedir.
İlk işlemde 60 yani PUSH1 kodu ile 80 değerini Stack'e yüklüyoruz.
İkinci işlemde 60 yani PUSH1 kodu ile 40 değerini Stack'e yüklüyoruz.
Üçüncü işlemde 52 yani MSTORE kodu ile daha önce Stack'e eklenen değerleri storage'e ekliyoruz.
Şu ayrınıtıyı öğrenmenizde de fayda görmekteyim. Her opcode 1 byte büyüklüğündedir.
PUSH1, 1 byte büyüklüğündedir. Aynı şekilde MSTORE da 1 byte büyüklüğündedir.
Bu yazıda; bytecode ve opcode kavramlarını öğrenip uygulamada nasıl karşımıza çıktığını çeşitli platformları kullanarak gösterdik.
Saygılarımla