EVM Opcodes I

EVM Opcodes I

·

2 min read

Bu derste LIFO yönteminin stack üzerinde nasıl uygulandığını inceleyip PUSH1, PUSH2, ADD, MUL,SUB,DIV ve POP opcode'larını öğreneceğiz.

evm.codes sitesinde pratik yapmak sizi opcode konusunda bir adım daha öteye taşıyacaktır.

Kaynak: evm.codes

Opcode’ların giriş yaptığı stack üzerinde çalışma biçimi LIFO(Son giren ilk çıkar) şeklindedir.

Diyelim ki; sırasıyla

2

3

4

değerlerini stack'e göndermek istiyoruz.

Hangi opcode ile göndereceğiz ?

PUSH1 opcode'u yardımıyla bu değerleri stack'e gönderebiliriz. Burada göndereceğimiz değerin büyüklüğüne göre Push opcode'nun önündeki sayısı değiştirebiliriz. Tahmin edeceğiniz üzere en büyük PUSH, PUSH32'dir.

https://www.evm.codes/?fork=merge

Opcode’lar yardımıyla ilerleyelim.

PUSH1 opcode’u yardımıyla 1 byte’lık değerleri stack’e gönderebilirsiniz.

PUSH1 2

PUSH1 3

PUSH1 4

Şimdi gönderdiğimiz değerlerin stack üzerindeki yansımasına bakalım.

Kaynak: evm.codes

Grafik üzerinde ayrıca gösterelim.

Son girilen değer, stack'in en üstünde(LIFO) yer alıyor. Bir işlem olduğunda ilk bu değer işleme konu olacaktır.

Bu değerlerden sonra bir toplama işlemi (ADD) gönderirsek, stack son yolladığımız iki değişkeni toplar.

4+3\=7

ve stack görüntüsü şu şekilde olur.

Kaynak:

Bir de grafik üzerinde görelim.

Geldiğimiz noktada stack üzerinde 7 ve 2 değerlerini görmekteyiz.

POP opcode’u yardımıyla bir adet değeri stack üzerinden kaldıralım. Tahmin edin hangi değer ortadan kaybolacaktır?

Son giren ilk çıkar (LIFO) !

Kaynak: evm.codes

Görüldüğü üzere stack üzerindeki son değer olan 7 ortadan kaldırılmıştır.

Stack’e 2 değer daha yollayalım. İlk değerimiz 1 byte ve ikinci değerimiz 2 byte büyüklüğünde olsun. PUSH1 1 bytelık değerler için PUSH2 ise 2 bytelık değerler için kullanılır.

PUSH1 255

PUSH2 65535

Kaynak: evm.codes

Gönderdiğimiz decimal değerler stack üzerinde hexadecimal olarak işlenmektedir.

Şu kaynak üzerinden decimal-hexadecimal değişimlerini kolayca görebilirsiniz.

Oturmaya mı geldiniz ?

Hadi sırasıyla bir çarpma(MUL) ve bir çıkarma(SUB) işlemi yapalım.

MUL

SUB

Çarpma(MUL) işleminde stack üzerinde var olan son iki değeri (ffff ve ff) kullanarak çarpma(MUL) işlemini gerçekleştirdik.

ffff * ff= feff01 dir.

Şu kaynak üzerinden çarpma işlemini teyit edebilirsiniz.

Kaynak: evm.codes

Çıkartma(SUB) işleminde stack üzerinde var olan son iki değeri (feff01 ve 2) kullanarak çıkartma(SUB) işlemini gerçekleştirdik.

feff01 - 2= fefeff dir.

Şu kaynak üzerinden çıkartma işlemini teyit edebilirsiniz.

Kaynak: evm.codes

Sıkılan varsa çıkabilir :)

Kod üzerinde gördüğünüz üzere bir bölme(DIV) işlemi var fakat ortada bölme işlemine koyacak 2 değer yok. Bu durumda kod hata verecektir.

Kaynak: evm.codes

Buradaki DIV’ i çıkartıp, 4 bytelık bir değer ekleyerek çalışmamıza devam edelim.

PUSH4 4294967295

Şimdi DIV(bölme) ekleyelim.

4294967295 / fefeffe= 101 dir.

Kaynak: evm.codes

Bu dersteki tüm görselleri birleştirelim.

Umarım bu ders yararlı olmuştur.

Doç.Dr. Engin YILMAZ

Did you find this article valuable?

Support Buildchain by becoming a sponsor. Any amount is appreciated!