Ethereum Sanal Makinesi’ni (EVM) Anlamak

Eray USTA
5 min readJul 13, 2022

Muhtemelen Ethereum Sanal Makinesini (EVM) duymuşsunuzdur, fakat bu bazen korkutucu bulmaktan daha fazlasını içerebilir. Bu yazıda EVM ‘nin ne olduğuna ve nasıl çalıştığına dair temel bir rehberim var:

Başlamak için sanal makinenin ne olduğunu anlamak önemlidir. Ethereum bağlamında, bir sanal makine, bir bilgisayarın işlevselliğini yeniden yaratan yazılıma (Ethereum istemcileri) yerleşik bir programdır.

Nasıl çalıştığını anlamak için, bazı temel kategorileri parçalayarak bir Ethereum doğrulayıcı merceğinden kullanımına bir göz atalım: İstemciler (clients), Depolama (Storage), İşlemler (Transaction) ve Yürütme (Execution).

İstemciler (Clients): Doğrulayıcı olmak ve bloklar üretmek için, durum geçişlerini hesaplamak için bir araç olarak EVM’yi çalıştırmak gereklidir. Hangi durum ve durum geçişlerini en iyi şekilde anlamak için, Ether gönderirken bunun blok zinciri durumunda bir geçiş gerektirdiğini düşünün: Tokenlar artık eskisinden daha yeni bir hesaba ait ve bunun Ethereum’un kimin neye sahip olduğu haritasına yansıtılması gerekiyor.

Bunu yapmak için, doğrulayıcıların(valitador) girdileri (input) /işlemleri (transactions )alması, ilgili talimatlarını EVM’de çalıştırması ve çıktıyı bir blok başlığında yazdırması gerekir. Bu, diğer düğümlerin durumun nasıl değiştiğinin farkında olması içindir. Doğrulayıcı (validator), EVM programını içeren bir Ethereum istemcisi yazılımı indirerek EVM’yi çalıştırır.

Bir Ethereum istemcisi, Ethereum Sanal Makinesini (EVM) ve diğer gerekli özellikleri içerir:

a) Hafıza havuzu (memory pool): Bir bloğa dahil edilmeye hazır imzalı işlemlerin yeri saklanır
b) Ethereum’a veri okuma/yazma isteklerini işlemek için bir veri yapısı sağlayan JSON-RPC API
c) Mempool’dan EVM’ye işlemler gönderen bir istemci süreci

Farklı dillerde çalışan birçok farklı istemci türü vardır, ancak Ethereum yellow paper da aynı özellikleri izledikleri için birbirleriyle birlikte çalışabilirler.

Depolama (Storage): EVM, yeni bir işlemden önceki durumu nasıl depolar? Bir bilgisayar gibi, sanal bir bilgisayar da veri depolayabilir. EVM bağlamında, kritik işlevlerinden biri, tüm hesapların “durumunu (state)” ve bu hesapların hangi bilgileri sakladığını depolamaktır. EVM, durumu, Ethereum’daki tüm adreslerin tüm anahtar(key):değer(value) çiftlerini içerebilen “Merkle Patricia trie” adlı bir veri yapısına göre saklar.

Anahtarlar hem genel hem de akıllı sözleşme (smart contract) adreslerine karşılık gelir ve ilgili değerleri bu adreslerin mevcut durumunu temsil eder.

Her adresin değeri(value)/durumu(state), adresin ilgili kodunun hash değerinin, hesapta saklanan verilerin hash değerinin, bakiyesinin ve gerçekleştirdiği işlem sayısının (nonce olarak gösterilir) bir kodlamasıdır.

Bu verileri depolamak için bir Merkle Patricia Trie kullanılır, çünkü sonunda kimin neye sahip olduğunun tekil bir “Merkle Kök Karması (root hash)”na ulaşmak için tüm anahtar(key)/değer(value) çiftlerinin hashlerini gerçekleştirmeyi kolaylaştırır — bir doğrulayıcının önerilen bloğunun blok başlığında gerekli bir alan.

Hashlerin çalışma mantığından dolayı, blockchain durumundaki bir dakikalık değişiklik bile tamamen farklı bir kök karması(root hash) ile sonuçlanacaktır. Doğrulayıcıların bu kök karmasını (root hash) bir blok başlığına dahil etmelerini zorunlu tutmanın nedeni, ağın güvenliğini önemli ölçüde artırmasıdır.

Bunun nedeni, bir doğrulayıcının(validator) çoğaltmaya çalıştığı bloğun meşruiyetini doğrulamak için bu Merkle Patricia trie nin depolamak için alana sahip olmayan light node ların etkinleştirilmesidir.

Bir light node, önerilen tam düğümün (Merkle Proof) kök karması(root hash) , hesap anahtarı (account ket) ve bakiye değeriyle bir “Merkle Kanıtı” hesaplayabilir ve bunu kendi adresi ve bakiyesinin bir Merkle kanıtıyla karşılaştırabilir. Herhangi bir yanlış veri olsaydı, Merkle kanıtlarında eşleşme olmazdı.

Merkle Ağacı nı ve yapısını anlamak için şu yazımdan faydalanabilirsiniz:

İşlemler (Transaction) : Bir kullanıcı bir cüzdan aracılığıyla imzalı bir işlem gönderdiğinde, işlem verileri Bytecode’da derlenir ve yukarıda bahsedilen JSON-RPC API’si kullanılarak bir düğüme gönderilir. Bayt kodu, durum geçişlerini hesaplamak için EVM’nin okuduğu düşük seviyeli dildir. Bytecode, bir ikili dizenin HEX kodlaması olarak görünür. Bu baytların koleksiyonları, EVM’nin gerçekleştireceği işlem kodları olarak bilinen belirli işlemleri temsil eder. Opkodlar, durumu değiştirmek için bir araç olarak yığındaki giriş verilerini (data)/işlemi (transaction) işlemek için EVM’nin izlediği talimatlardır. HEX formatı, ikiliyi okunabilir bir şekilde iletmek için kullanılan yalnızca sayısal bir sistemdir (ikili ve ondalık sistem gibi).

İşlem kodlarının önemli olmasının nedeni, hesaplandığında EVM’nin işlem tarafından talep edilen durum geçişinin çıktısını bulmasını sağlamalarıdır.

Mempool’a gönderildiğinde, bayt kodu, JSON-RPC API kullanılarak bir düğümün mempool’una yapılan bir işlem yayınında argüman olarak iletilir. Bundan sonra, işlem, bir doğrulayıcı tarafından bir bloğa dahil edilmeye hazır diğer onaylanmamış işlemlerle birlikte mempool’da oturur.

Doğrulayıcı bir bloğa dahil etmek istediği işlemleri seçtiğinde, durum geçişlerini, her işlemin ilgili bayt kodu tarafından belirtilen işlemler (operations) / işlem kodları (opcodes) tarafından tanımlandığı şekilde hesaplamak zorundadır. EVM’nin temel işlevi olan yürütmenin devreye girdiği yer burasıdır.

Yürütme (Execution): Tüm hesapların durumunu saklamak, EVM’nin kalıcı olarak sakladığı verilerdir, ancak EVM, işlem kodlarını yürütmek için geçici bellek kullanır. Bunu anlamak için, işlem kodunun yürütülmesi sırasında kullanılan “yığın (stack)” ve “bellek (memory)” olmak üzere iki tür geçici belleği anlamak gerekir.

a) Yığın (stack) , işlem kodları tarafından tanımlanan hesaplamaların yapıldığı veri alanıdır.
b) Bellek (memory), yığının üstündeki talimatları hesaplamak için gerekli olan verilerden geçmek üzere bilgileri geçici olarak depolamak için kullanılabilecek bir veri dizisidir.

Söz konusu istemci işlemi kullanılarak mempool üzerinden EVM tarafından işlemlere erişildiğinde, EVM talimatları bytecode tarafından belirtilen sırayla alır ve bytecode ilgili opcode’larına ayrılır.

İşlem kodları (opcode) , bayt kodu tarafından belirtilen sırayla her bir işlem kodunun bir diğerinin üzerine düştüğü bir seri dizi halinde veri alanına sırayla yüklenir.

Yığın, yığının en üstündeki talimatları takip eder ve yığının üstündeki talimatları hesaplamak için işlem sırasında belleğe taşınan verileri (data) / değişkenleri (variable) kullanır. EVM ayrıca bu işlem kodlarını çalıştırmak için depolamadan aldığı durum hakkında bilgi gerektirir.

Tüm işlem kodları (opcode) çalıştırıldığında, durum değişikliği ile ilgili herhangi bir çıktının yığın tarafından kalıcı depolamaya (permanent storage) yükleneceği anlamına gelir. Her işlem kodunun (opcode), Ethereum durumunun ne olduğuna dair yeni bir hesaplama ile sonuçlandığını ve her işlem kodunun belirli bir maliyeti olduğunu unutmamak önemlidir.

Her işlem kodu çalıştırıldığında, yürütülmesi için harcanan gaz miktarı, kullanıcı işlemi ilk gönderdiğinde belirtilen mevcut gazdan çıkarılır. İşlem kodlarını(opcode) çalıştırma maliyetini karşılamak için yetersiz gaz gönderildiyse, doğrulayıcı işlemi blokta içermez, ancak doğrulayıcı zaten hesaplamayı çalıştırma maliyetini üstlendiğinden kullanıcıya geri ödeme yapılmaz.

Doğrulayıcının bloğa dahil etmek istediği mempool’daki tüm işlemler için bu işlem tamamlandıktan sonra, doğrulayıcı yeni durumun yukarıda belirtilen kök karmasını hesaplayabilir ve blok başlığına dahil edebilir.

Daha sonra bloğu diğer düğümlere yaymak için gereken birçok başka alan olmasına rağmen, bu, EVM’nin bir doğrulayıcının merceğinden nasıl çalıştığına dair genel açıklamayı tamamlar.

Ethereum Sanal Makinesi (EVM)

Ethereum sanal makinesine ve bunun durum, işlemler ve akıllı sözleşmelerle ilişkisine giriş;

https://ethereum.org/en/developers/docs/evm/

Düğümler (node) ve istemciler (clients)

Ethereum düğümlerine ve istemci yazılımına genel bakış, ayrıca bir düğümün nasıl kurulacağı ve bunu neden yapmanız gerektiği;

https://ethereum.org/en/developers/docs/nodes-and-clients/

EVM’nin Derinliğine İnmek: Ethereum Sahne Arkasında Nasıl Çalışır

Ethereum EVM illustrated;

Merkle Patricia Trie’nin Açıklaması:

https://medium.com/@chiqing/merkle-patricia-trie-explained-ae3ac6a7e123

EVM Deep Dives: The Path to Shadowy Super Coder 🥷 💻 — Part 1:

Önemli açıklama: EVM, yalnızca akıllı sözleşme içeren bir işlemse, örneğin Yearn’e bazı tokenler yatırırken veya Uniswap’ta likidite sağlarken çalıştırılacaktır. İki EOA arasındaki bir işlem, herhangi bir kod yürütmeye gerek kalmadan değeri aktarır!

Beni twitter hesabımdan ve youtube hesabımdan takip edebilirsiniz.

Kaynak:

--

--