EVM, Opcode, Gas, Ethereum Hesapları Hakkında Temel Bilgiler

Eray USTA
5 min readApr 6, 2022

EVM nedir?

EVM, Ethereum blok zinciri için bir yürütme ortamıdır. Akıllı sözleşme kodunu EVM bayt koduna derleyerek çalıştırmanızı sağlar.

Temel Bilgiler: Solidity → Byte Code(Bayt Kodu) → Opcode(İşlem Kodu)

Bildiğiniz gibi, Solidity kodunuz Ethereum ağına dağıtılmadan önce byte koduna derlenmelidir. Bu byte kodu, EVM’nin yorumladığı bir dizi opcode talimatına karşılık gelir.

Kaynak kodu: Java, Solidity gibi bir programlama dilinde yazılmış bir dosya.

Bytecode: Kaynak koddan derlenir ve JVM, EVM gibi bir sanal makinede çalıştırılır.

Makine kodu: Yalnızca işletim sisteminin okuyabileceği kod. Byte kodu makine koduna dönüştürülür ve sonunda çalıştırılır.

Byte code

İşlem kodlarını verimli bir şekilde saklamak için bir byte koduna kodlanırlar. Her işlem koduna bir byte atanır (örneğin, STOP — 0x00). Aşağıdaki bayt koduna bakalım: 0x6001600101

Yürütme sırasında bayt kodu bytelara bölünür (1 byte, 2 onaltılık karaktere eşittir). 0x60–0x7f (PUSH1-PUSH32) aralığındaki bytelar, push verilerini (ayrı bir işlem kodu olarak ele alınmak yerine işlem koduna eklenmesi gerekir) içerdiklerinden farklı şekilde işlenir.

İlk komut, PUSH1'e çeviren 0x60'tır. Dolayısıyla push datanın uzunluğunun 1 byte olduğunu biliyoruz ve bir sonraki byte’ı stack’e ekliyoruz. Şimdi yığında 1 eleman var ve bir sonraki talimata geçebiliriz. 0x01'in PUSH komutunun bir parçası olduğunu bildiğimiz için, yürütmemiz gereken sonraki komut, aynı verilerle birlikte başka bir 0x60 komutudur (PUSH1). Şimdi yığında 2 özdeş öğe var. Son talimat, ADD’ye çeviren 0x01'dir. Bu komut yığından 2 eleman alır ve bu elemanların toplamını yığına koyar. Şimdi yığında bir öğe var: 0x02.

Anlatım kafanızı karıştırmış olabilir her paragrafı okumadan önce görseli dikkatle inceleyiniz.

Operasyon Kodları

Tüm işlem kodlarını aşağıdaki kategorilere ayırabilirsiniz:
1) Yığın yönetimi işlem kodları (POP, PUSH, UP, SWAP);
2) Aritmetik işlemler / karşılaştırma / bitsel işlem kodları (ADD, SUB, GT, LT, AND, OR);
3) Çevresel işlem kodları (CALLER, CALL VALUE, NUMBER);
4) Belleği kontrol eden işlem kodları (LOAD, STORE, MSSTORE 8, M SIZE);
5) Bellek yönetimi işlem kodları (LOAD, STORE);
6) Program sayacı ile ilgili işlem kodları (JUMP, JUMP, PC, JUMPDEST);
7) İşlem kodlarını durdur (STOP, RETURN, REVERT, INVALID, SELF DESTRUCT).

EVM Mimarisi

EVM, yığın tabanlı bir mimari kullanır. Kelime boyutu (yani yığındaki veri öğesinin boyutu) 256 bittir (32 bayt). Bu, Keccak karma ve eliptik eğrilerin 256 bitlik hesaplamalarının yürütülmesini kolaylaştırmak için yapılır.

Maksimum yığın derinliği 1024'tür. EVM’nin ayrıca bağımsız bir depolama modeli vardır; belleğe benzer, ancak bir bayt dizisi değil, sözcük adreslemeye dayalı bir sözcük dizisidir. Depolama, sistem durumunun bir parçası olarak tutulan kalıcı bir anahtar ve değer deposudur (Merkle ağacında kalıcı depolama). EVM, standart bir von Neumann framework değildir. Program kodu, genel bellekte veya depolamada değil, yalnızca belirli talimatlarla etkileşime girebilen bağımsız bir sanal ROM’da saklanır.

Gas (Gaz)

Gaz, Ethereum ağında belirli işlemleri gerçekleştirmek için gereken hesaplama çabasının miktarını ölçen bir ölçü birimidir.

Her Ethereum işleminin tamamlanması için bilgi işlem kaynakları gerektiğinden, her işlem bir komisyon gerektirir. Gas, Ethereum’da başarılı bir işlem için gereken komisyondur.

Gaz ödemesi, Ethereum para birimi eter (ETH) ile yapılır. Gaz fiyatları, kendi içinde ETH’nin nominal değeri olan gwei cinsinden belirtilir — her gwei, 0.000000001 ETH’ye (10–9 ETH) eşittir. Örneğin gazınızın maliyeti 0,000000001 eter demek yerine, gazınızın maliyeti 1 gwei diyebilirsiniz.

“Gwei” kelimesinin kendisi “giga-wei” anlamına gelir ve 1.000.000.000 wei’ye eşittir. Wei (adını b-money yaratıcısı Wei Dai’den almıştır) ETH’nin en küçük birimidir.

Dünyanın ilk kripto para birimi b-money yaratıcısı Wei Dai hakkında:

Neden gaza ihtiyacımız var?

Gaz ücreti, Ethereum ağının güvenliğinin korunmasına yardımcı olur. Ağ üzerinde yapılan her hesaplama için ücret talep ederek, saldırganların ağ üzerinden spam göndermesine izin vermiyoruz. Koddaki rastgele veya düşmanca sonsuz döngülerden veya diğer hesaplama kayıplarından kaçınmak için, her işlem, kullanabileceği kod yürütmenin hesaplama adımlarının sayısı üzerinde bir sınır belirlemelidir. Ana hesaplama birimi “gaz” dır.

İşlem bir limit içerse de, işlemde kullanılmayan herhangi bir gaz kullanıcıya iade edilir (yani maksimum ücret — (taban ücret + bahşiş) iade edilir).

Ethereum Hesap Türleri

Her iki hesap türü de şunları yapabilir:

  • ETH ve jetonları alın, saklayın ve gönderin.
  • Dağıtılan akıllı sözleşmelerle etkileşim kurun.

Temel farklılıklar
Harici olarak sahip olunan hesap (Cüzdan):

  • Bir hesap oluşturmanın hiçbir maliyeti yoktur.
  • İşlemleri başlatabilir.
  • Harici olarak sahip olunan kişiler arasındaki işlemler yalnızca ETH/token transferleri olabilir.

Sözleşme hesabı:

  • Bir sözleşme oluşturmak maliyet gerektirir çünkü depolama kullanılır.
  • Yalnızca alınan işlemlere yanıt olarak işlem gönderebilir.
  • Harici olarak sahip olunan bir hesaptan bir Sözleşme hesabına yapılan işlemler, jetonları aktarmak veya hatta yeni bir sözleşme oluşturmak gibi birçok farklı eylemi gerçekleştirebilen kodu çalıştırabilir.

Hesap oluşturma

  • EVM 160 bitlik adresleri işler.
  • Hesap, bir şifreleme anahtarı çiftinden oluşur: genel(public) ve özel(private). Public key ECDSA algoritması kullanılarak özel anahtardan üretilir.
  • Harici olarak sahip olunan bir hesabın genel adresi şu şekilde oluşturulur Keccak-256'dan (public key) son 20 bayt alınır ve başına 0x eklenir.
  • Sözleşme adresi genellikle Ethereum blok zincirinde bir sözleşme dağıtırken belirtilir. Sözleşme adresi, sözleşmeyi oluşturan harici olarak sahip olunan hesap adresinden ve bu adresten gönderilen işlem sayısından (“nonce”) oluşur. Keccak’tan gelen son 20 bayt 256'dır(RLP(Dışa ait (Externall-owned); nonce)).
Ethereum yellowpaper formüllerin ekran görüntüleri: https://ethereum .github.io/yellowpaper/paper.pdf

Her hesap türüne neler dahildir?

Her hesap, bakiye, nonce, byte kodu ve depolanan verilerden (depolama) oluşur. Ancak, iki hesap türü arasında bazı farklılıklar vardır. Örneğin, Harici sahip olunan cüzdanda byte kodu ve depolama alanları boştur, Sözleşme ise byte kodunu ve tüm Merkle ağacının kök karmasını saklar. Ayrıca, Harici sahip olunan cüzdan ilgili özel anahtara sahipken, sözleşmede bu yoktur. Sözleşme hesaplarının eylemleri kod tarafından kontrol edilir.

Daha fazlası için beni twitter dan takip edebilirsiniz.

Kaynak: https://medium.com/coinsbench/about-evm-opcode-gas-ethereum-accounts-9f0896f09d04

--

--