EVM Opcodes II

EVM Opcodes II

Bu bölümde öncelikle EVM üzerindeki en büyük sayılarla aritmetik işlemler yapacağız. Bu ders, bir ders öncesinden ilerlemektedir. Bu anlamda bir önceki derse göz atmanız yararlı olur. Sonrasında MOD, ADDMOD, EXP, LT,GT, EQ, ISZERO, SHL,SHR ve BYTE opcodelarını inceleyeceğiz.

En büyük maksimum değer ve ADD Opcode

Stack'e gönderebileceğiniz en büyük en değer 32 byte boyutundadır. Gönderelim.

PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Kaynak: evm.codes

Toplama(ADD) işlemini stack'’e gönderirsek sonucu ne olur ? Son sayı + 101 işleminin sonucu ne olur ?

Kaynak: evm.codes

101+ 0xFFFFFFFFFFFFF………..FFFFFFFFFFFFFFFFFFFFFFF = 100

Cevap 100 ’ dür. Kafa karıştırıcı biliyorum. Aşağıdaki grafik anlamanızı kolaylaştıracaktır. 101 sayısına en büyük sayıyı eklediğimizde dairenin etrafında bir tur atıp 100 sayısına ulaşırız.

En büyük maksimum değer ve ADD Opcode

Sıkıldığınızı biliyorum.

En büyük maksimum değer ve SUB Opcode

POP kullanıp stack’i temizleyelim.

POP

Sonrasında aşağıdaki kodları girelim. Sonuç ne olur ?

PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

PUSH1 2

SUB

Kaynak: evm.codes

2 değerinden evm’deki son sayıyı çıkartmaya çalışırsanız ne olur ?

2 - 0xFFFFFFFFFFFFF………..FFFFFFFFFFFFFFFFFFFFFFF = 3

Kaynak: evm.codes

Saat örneğini düşünelim. Aşağıdaki grafik anlamanızı kolaylaştıracaktır. 2 sayısından en büyük sayıyı çıkardığımızda dairenin etrafında TERS bir tur atıp 3 sayısına ulaşırız.

Tüm çalışma koduna şuradan ulaşabilirsiniz.

MOD OPCODE

MOD

Stack üzerinde bulunan iki değişkenin konu olduğu bölme işleminde kalan değeri vermektedir.

Önce 2 değerini sonra 7 değerini giriyoruz. MOD opcode’u yardımıyla 7%2 işleminin sonucunu öğreniyoruz.

Kaynak

ADDMOD: 3 değerle kullanılan bir opcode’dur. İlk iki değer toplanıp, toplam sonucun üçüncü değere göre modu alınır.

(10+12)%7 gibi

MULMOD: 3 değerle kullanılan bir opcode’dur. İlk iki değer çarpılıp, sonucun üçüncü değere göre modu alınır.

(10*12)%7 gibi

EXP OPCODE

EXP

Stack üzerinde bulunan iki değişkeni kullanarak üst alma işlemini gerçekleştirir.

Kaynak

7^2 işlemi gerçekleştirildi ve stack üzerinde sonuç hexadecimal(31) olarak temsil edildi.

SIGNEXTEND OPCODE

SIGNEXTEND

Bu opcode, varolan değeri 1 byte geriye kaydırarak aradaki farkı bulur.

Kaynak

PUSH1’nin alabileceği maksimum değer 255’dir. PUSH2 için 257 değeri verdiğimizde bunun 1 bytenın alabileceği maksimum değerlerle arasındaki fark 1’dir.

Kaynak

PUSH2’nin alabileceği maksimum değer 65535’dir. PUSH3 için 65537 değeri verdiğimizde bunun 2 bytenın alabileceği maksimum değerlerle arasındaki fark 1’dir.

LT OPCODE

LT

Stack üzerinde son değer bir önceki değerden küçükse 1, değilse 0 döndürür.

Diyelim ki;

PUSH1 5
PUSH1 4
LT

GT OPCODE

GT

Stack üzerinde son değer bir önceki değerden büyükse 1, değilse 0 döndürür.

PUSH1 5
PUSH1 4
GT

EQ OPCODE

EQ

Stack üzerinde son değer bir önceki değere eşitse 1, değilse 0 döndürür.

PUSH1 5
PUSH1 4
EQ

ISZERO OPCODE

ISZERO

Stack üzerinde son değer 0’a eşitse 1, değilse 0 döndürür.

Kaynak

Bu örnekte stack üzerindeki son değer 10 olduğu için ISZERO opcode “0” döndürdü.

BYTE OPCODE

BYTE

Stack üzerindeki değerin istediğimiz noktasındaki byte değerini çekiyoruz.

Kaynak

32 bytelik bir veri yazdık

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Bu verinin ilk byte’ı (bunu 0 olarak çağırmalısınız) CC dir.

Bu verinin son byte’ı (bunu 31 olarak çağırmalısınız) EE dir.

Bu örnekte 27. byte’ı çağırdık. AA

Bir örnek daha ve bu faslı kapatalım.

Kaynak

2 bytelik bir değer yazdık

0xCCFF

Bu veri üzerinde 30. byte da ne varsa getirmesini isteyelim.

Cevap CC.

Neden CC, çünkü değerler her 32 bytelık slotun en sağından başlanarak yazılıyor.

Şu şekilde;

0x000000000000000000000000000000000000000000000000000000000000CCFF

SHL OPCODE

SHL

Değeri “BİT” cinsinden sola doğru kaydırmak için kullanıyoruz.

Kaynak

32 bytelik bir veri yazdık

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Bu veriyi 4 BİT sola kaydırdığımızda, ilk 4 bit’i temsil eden ilk “C” harfi ortadan kaybolur ve yerine verinin en sonuna(sağına) “0” eklenir.

Bir örnek daha yapalım.

Kaynak

32 bytelik bir veri yazdık

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Bu veriyi 8 BİT sola kaydırdığımızda, ilk 8 bit’i temsil eden ilk “CC” harfleri ortadan kaybolur ve yerine verinin en sonuna(sağına) “00” eklenir.

SHR OPCODE

SHR

Değeri “BİT” cinsinden sağa doğru kaydırmak için kullanıyoruz.

Kaynak

32 bytelik bir veri yazdık

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Bu veriyi 4 BİT sağa kaydırdığımızda, son 4 bit’i temsil eden sondaki “E” harfi ortadan kaybolur ve yerine verinin en başına “0” eklenir.

Stack ekranındaki sonuç verisini saydığınızda 63 karakter olduğunu göreceksiniz. Başa 0 atılmış.

Bir örnek daha yapalım.

Kaynak

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Bu veriyi 8 BİT sağa kaydırdığımızda, son 8 bit’i temsil eden sondaki “EE” harfleri ortadan kaybolur ve yerine verinin en başına “00” eklenir.

Stack ekranındaki sonuç verisini saydığınızda 62 karakter olduğunu göreceksiniz. Başa 00 atılmış.

Doç. Dr. VeriDelisi

Did you find this article valuable?

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