EVM Opcodes III

EVM Opcodes III

·

2 min read

SHA3, CALLDATA, CALLDATALOAD, CALLVALUE, CODESIZE ve GASLIMIT yeni opcode'larımız. Opcodelarınız mübarek olsun !

SHA3 OPCODE

SHA3

Memory üzerinde yer alan verinin istediğimiz bölümünün keccak256 şifrelemesini yapmaktadır. Bu nedenle elimizdeki veriyi önce memory’e kaydetmeliyiz. Bu işlemi MSTORE opcode’u ile yaparız. İleride ayrıntılı anlatacağım.

Memory’e kayıt tamamlandıktan sonra

offset: byte offset in the memory.(Memory üzerinde verinin alınmaya başlanacağı nokta)

size: byte size to read in the memory. (Verinin kaç byte boyutunda alınacağı)

Kaynak

MSTORE yordamıyla 32 bytelık aslan parçasını memory’e kaydettik.

0xFFFFFFFF00000000000000000000000000000000000000000000000000000000

Şimdi SHA3 leyelim.

PUSH1 4 (size)

PUSH1 0 (offset)

SHA3

Sonrasında 0. byte’dan başlayarak 4 byte boyutundaki veriyi (FFFFFFFF) Keccak256 ile şifreledik.

Sonucu internetteki keccak256 aracı ile de onayladım. Dikkat bu aracı kullanırken input type olarak “hex” seçili olmalı.

Kaynak

Calldata OPCODE

Calldata

Calldata da aslında memory gibi bir alandır. Memory ile aralarındaki farkları okumak için şu kaynağa bakınız. Şimdi calldata durumunda kullanacağımız 3 opcode’u görelim.

Calldataload OPCODE

Calldata kullanılan fonksiyonda verinin stack’e hangi byte’ dan itibaren aktarılacağı belirlenir.

Değerimiz aşağıdaki gibi olsun.

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Kaynak

PUSH1 30 yazarak, son iki byte’nın çekilmesini talep ettik. Aslında 30 dahil sonra ne varsa getir dedik.

Sonuç DDEE

Calldatasize OPCODE

Calldata’nın byte cinsinden büyüklüğünü döndürür. Sonuç stack üzerinde görünür.

0xFFEECC değerini 3 olarak döndürecektir.

Kaynak

Calldatacopy OPCODE

İşte memory ile etkileşime geçen yegane calldata koduna geldik.

  1. destOffset: Calldata’dan çekilecek veriler memory'de hangi byte dan başlayarak kaydedilecek

  2. offset: Calldata da hangi byte dan başlayarak veriler alınacak

  3. size: Kopyalanacak byte uzunluğu

32 bytelık aslanımızı piste alalım.

0xCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAABBCCDDEE

Aşağıdaki opcodeları uygulamadan sırasıyla açıklayalım.

PUSH1 2 (Kopyalanacak byte uzunluğu)

PUSH1 30 (Calldata da hangi byte dan başlayarak veriler alınacak)

PUSH1 0 (Calldata’dan çekilecek veriler memoryde hangi byte dan başlayarak kaydedilecek)

CALLDATACOPY

Kaynak

Cevap DDEE olacaktır.

Callvalue OPCODE

Tam olarak solidity’de call fonksiyonunu kullandığımızda karşımıza çıkan msg.value değerine eşittir. Bizim için opcode üzerindeki önemi ise, stack’e bu opcode yardımıyla istediğimiz değeri gönderebilmemizdir.

Kaynak

CODESIZE OPCODE

Kodumuzun byte cinsinden büyüklüğünü ölçer.

Kaynak

Burada cevap neden 5 ?

PUSH2 (1 byte)

2227(2 byte)

POP (1 byte)

CODESIZE (1 byte)

Bir örnek daha yapalım mı ?

PUSH3 (1 byte)

22111 (3 byte)

POP (1 byte)

CODESIZE (1 byte)

GASLIMIT OPCODE

Bu block gas limitidir. 0xffffffffffff

CHAINID OPCODE

CHAINID

Hangi chain üzerinde olduğunuzu döndürür.

Doç. Dr. VeriDelisi

Did you find this article valuable?

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