EVM Opcodes V

EVM Opcodes V

·

2 min read

Bir kontrat incelemeye başladığınızda açılışın aşağıdaki gibi olduğunu görürsünüz.

PUSH1 0x80

PUSH1 0x40

MSTORE

Bu kodu geçen derste öğrendiğimiz çerçevede yorumlayalım.

64’üncü byte’dan(0x40) itibaren memory’e kaydetmeye başla ve ilk kaydedilecek değer 128(0x80) olsun.

Peki 0x80 (128 değeri ne işe yarıyor) bize memory’e kayıt işleminin 64’üncü byte’dan başladığını söylüyor. Dolayısıyla toplamda memory’in boyutunun ne olduğunu öğreniyoruz.

{ Her slot 32 byte olduğu için; 128/32= 4 slot büyüklüğünde memory’e sahibiz başlangıçta }

[4. slotun en başındayız]

Anlamadınız değil mi ? Biraz daha sabır lütfen !

Şimdi noxx’un örneğinden gidelim.

Kaynak

İlk işlem, free memory pointer lokasyonuna (0x40), 0x80 değerini kaydetmek oluyor.

Kaynak

İkinci işlemde, 5 elemanlı bir dizi için ne kadar alanın gerekli olduğunu hesaplamak oluyor. Her dizi elemanı için 32 byte ayrılıyorsa, 5 eleman için 160 byte (0xa0) ayırmamız gerekiyor.

free memory pointer (0x80) + space for array (0xa0) = new free memory pointer

Kaynak

Yeni değerimiz hexa cinsinden 120, decimal cinsinden 288 olacaktır.

Şu anda sadece free pointerımız 80’den 120’ye dönüştü. Bu bize memory’in yeni alanını veriyor.

Teyit etmek için memory’deki uzunca sayısı karakter sayacına atın, yukarıdaki sonucu alacaksınız. Şu an sadece memory’in ne kadar büyüdüğünü gösteren sayı memory’e yüklendi. Memory daha genişlemedi

Hexa 120, 288 decimal’e eşit oluyor. Bu sayısı da 2 ile çarptığımızda 576 sayısını buluyoruz. Kısaca karakter cinsinden mevcut memory’in kapladığı alanı buluyoruz.

Kaynak

İsteyenler karakter sayacına yukarıdaki sayıyı kopyalayarak teyit edebilirler.

Tamam. Son olarak şu görselleştirmeyi yapalım.

Sözleşmemize 5 elemandan oluşan bir dizi ekledik. Her dizi değeri 32 byte olduğu için mevcut memory 160 byte daha genişledi. Bu genişlemeyi ise 80(hex) + 160(hex) toplamı olan 120 (hex) değeriyle 0x40 lokasyonunda belirttik.

Kısaca, bu sözleşmeye yabancı olsaydınız ve ilk memory’e yükleme işlemi sonrası 120’nin oluştuğunu bilseydiniz. Şunu düşünürdünüz:

120(hex)=288 byte

288 byte / 32= 9 slot

4 eski slot + 5 eski slot =9 slot

Not:

0x80(hex)= 128 byte

128 byte/32= 4 slot

Bonus:

Veridelisi olarak bizden de bir örnek olsun dedim.

Bu örnekte 5 elemanlı bir dizi tanımladık her elemana bir değer atadık.

Remix üzerinde bu kodu çalıştırıp debug yaptığınızda, memory’in görünümü şöyle olacaktır.

5 yeni slot açmıştık, şimdi her slota atamamızı yaptık.

Karakter sayacında da görelim.

Arkadaşlar kafanızı ütüledim. Kusura kalmayın.

Doç.Dr.VeriDelisi

Did you find this article valuable?

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