EVM Opcodes IV

EVM Opcodes IV

Bu çalışmaları yaparken sürekli paslaştığım değerli kardeşim Natzuu’yu selamlıyorum. Emeği büyük !

MSTORE

Öncelikle memory layout sayfasını okumalısınız.

offset: offset in the memory in bytes. (Memory üzerinde değeri yerleştirmeye başlayacağınız byte konumu)

value: 32-byte value to write in the memory. ( Yerleştirmek istediğiniz 32 bytelık değer, burada isterseniz 1 byte yazın sıfırları basıp 32 byte uzunluğunda yazıyor )

Kaynak: Yazar

Memory dizisinin t0 zamanındaki durumu yukarıda gösterilmiştir. 32 byte alana sahip boş bir dizi görülmektedir. Grafik üzerinde byteların içinde gördüğünüz sayılar indeksleri temsil etmektedir. Bom boş bir byte dizisi.

Şimdi aşağıdaki kodları uygulamaya geçelim

PUSH1 0xCC

PUSH1 0

MSTORE

Kaynak: Yazar

Sonuç: 00000000000000000000000000000000000000000000000000000000000000CC

Analiz: 1 bytelık CC değerini 32 byte'lık veri üzerinde en sağa atadı. CC şuan 63-64 karakterlerde yani 31. byte üzerinde duruyor. (Unutmayın byte dizisini 0’dan saymaya başlıyoruz)

Buraya kadar sorun olmamalı. Gözlüklü sen dışarı çıkıp biraz hava al !

Şimdi

PUSH1 0xCC

PUSH1 1

MSTORE

Yada daha basitçe!

Sonuç:

0000000000000000000000000000000000000000000000000000000000000000CC00000000000000000000000000000000000000000000000000000000000000

Analiz: Memory üzerinde 1. byte’dan başlayarak 32 bytelık değerimizi yerleştirdik. CC değeri bu durumda yeni 32 byte’lık alanın ilk byte’ı üzerine düştü.

Büyük resmi görelim.

Yeni bir örnek daha yapalım.

PUSH1 0xCC

PUSH1 32

MSTORE

Yada basitçe

Sonuç:

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc

Analiz: Memory üzerinde 32. byte’dan başlayarak 32 bytelık değerimizi yerleştirdik. CC değeri bu durumda yeni 32 byte’lık alanın son byte’ı üzerine düştü.

Memory üzerine 32 byte ve 1 byte veri yazabiliriz fakat okuma sadece 32 byte için geçerli oluyor. Burada noxx’un yazısından çokca faydalandım. Aynı zamanda beynim yandı. Zalimsin noxx!

Öncelikle 1 byte’lık veri kaydetmek için MSTORE8 opcode’nu kullanıyoruz.

// 0'ıncı byte'dan başlayarak 32 bytelık veriyi memory'e yüklüyoruz.

PUSH32 0x1111111111111111111111111111111111111111111111111111111111111111

PUSH1 0x00

MSTORE

Kaynak

// MSTORE8 yoluyla 1 byte değerindeki 0x22 değerini memory'de 32. byte'a kaydediyoruz.

PUSH1 0x22

PUSH1 0x20

MSTORE8

Kaynak

// MSTORE8 yoluyla 1 byte değerindeki 0x55 değerini memory'de 33. byte'a kaydediyoruz.

PUSH1 0x55

PUSH1 0x21

MSTORE8

Kaynak

MLOAD

MLOAD yoluyla memorydeki verileri stack’e çekiyoruz. Unutmayın 32 bytelık setler halinde çekebiliyoruz.

// MLOAD, memory üzerindeki 0-32 byte'ları stack'e yüklüyor

PUSH1 0x00

MLOAD

Kaynak

// MLOAD, memory üzerindeki 32-64 byte'ları stack'e yüklüyor

PUSH1 0x20

MLOAD

Kaynak

// MLOAD, memory üzerindeki 33-65 byte'ları stack'e yüklüyor

PUSH1 0x21

MLOAD

Kaynak

RETURN

Bu opcode aşağıdaki şekilde kullanılır.

  1. offset: Memoryden alınacak verinin hangi bytedan başlayarak kopyalanacağı

  2. size: Kaç bytelık veri kopyalanacağı

Burada return opcode’u veriyi stack’e atmaz doğrudan döndürür.

Örnek yapalım.

PUSH3 0xAABBCC

PUSH1 0

MSTORE

3 bytelık AABBCC verimizi memorye yükledik. Dikkat, evm 32 byte olarak yüklediği için bu verilerimiz en sağda.

Şimdi aşağıdaki kodlar yardımıyla memoryden bu verileri döndürelim.

PUSH1 3

PUSH1 29

RETURN

Kısaca şunu söylüyoruz: 29. byte’dan itibaren 3 byte büyüklüğünde veri döndür

Kaynak

Bingo! Ekran alıntısı üzerinde en sağ alta bakın “return value : aabbcc”

Örnek yapalım.

PUSH3 0xAABBCC

PUSH1 0

MSTORE

3 bytelık AABBCC verimizi memorye yükledik. Dikkat, evm 32 byte olarak yüklediği için bu verilerimiz en sağda.

Şimdi aşağıdaki kodlar yardımıyla memoryden bu verileri stack’e alalım.

PUSH1 29

MLOAD

Kısaca şunu söylüyoruz: 29. byte’dan itibaren 32 byte büyüklüğünde veri döndür. Zalım kader. MLOAD böyle arkadaşlar 32 byte yüklüyor.

Kaynak

Stack görüntüsünü buraya aktaralım

aabbcc0000000000000000000000000000000000000000000000000000000000

Doç. Dr. VeriDelisi

Did you find this article valuable?

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