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.
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
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
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
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
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
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
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
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
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
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
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ış.