Ethereum nasıl çalışır? (Part 2)
Sözleşme oluşturma
Ethereum’da iki tür hesap olduğunu hatırlayın: sözleşmeli hesaplar ve harici olarak sahip olunan hesaplar. Bir işlemin “sözleşme yaratan” olduğunu söylediğimizde, işlemin amacının yeni bir sözleşme hesabı oluşturmak olduğunu kastediyoruz.
Yeni bir sözleşme hesabı oluşturmak için öncelikle özel bir formül kullanarak yeni hesabın adresini bildiriyoruz. Ardından yeni hesabı şu şekilde başlatıyoruz:
- nonce’yi sıfıra ayarlama
- Gönderici , işlemle birlikte değer olarak bir miktar Ether gönderdiyse , hesap bakiyesini bu değere ayarlamak
- Bu yeni hesabın bakiyesine eklenen değerin göndericinin bakiyesinden düşülmesi
- Depolamayı boş olarak ayarlama
- Sözleşmenin codeHash değerini boş bir dizenin karması olarak ayarlama
Hesabı başlattığımızda , işlemle birlikte gönderilen başlangıç kodunu kullanarak hesabı gerçekten oluşturabiliriz (başlangıç kodunu tazelemek için “İşlem ve mesajlar” bölümüne bakın). Bu başlatma kodunun yürütülmesi sırasında olanlar çeşitlidir. Sözleşmenin kurucusuna bağlı olarak, hesabın deposunu güncelleyebilir, başka sözleşme hesapları oluşturabilir, başka mesaj aramaları yapabilir, vb.
Bir sözleşmeyi başlatma kodu yürütülürken gaz kullanır. İşlemin kalan gazdan daha fazla gaz kullanmasına izin verilmez. Olursa, yürütme gazın bitmesi (OOG) istisnasına çarpacak ve çıkacaktır. Gaz çıkışı istisnası nedeniyle işlemden çıkılırsa, durum işlemden hemen önceki noktaya döndürülür. Göndericiye, tükenmeden önce harcanan gazın iadesi yapılmaz .
Boo hoo.
Ancak gönderen işlemle birlikte herhangi bir Ether değeri gönderdiyse, sözleşme oluşturma başarısız olsa bile Ether değeri iade edilecektir. Vay!
Başlatma kodu başarıyla yürütülürse, nihai bir sözleşme oluşturma maliyeti ödenir. Bu bir depolama maliyetidir ve oluşturulan sözleşme kodunun boyutuyla orantılıdır (yine bedava öğle yemeği yok!) Bu nihai maliyeti ödemek için yeterli gaz yoksa, işlem tekrar gaz dışı istisna ilan eder ve iptal eder.
Her şey yolunda giderse ve istisnasız bu noktaya kadar gidersek, kalan kullanılmamış gaz işlemin asıl göndericisine iade edilir ve artık değiştirilen durumun devam etmesine izin verilir!
Yaşasın!
Mesaj aramaları
Bir mesaj çağrısının yürütülmesi, birkaç farkla, bir sözleşme oluşturma işlemine benzer.
Yeni hesap oluşturulmadığından bir mesaj çağrısı yürütmesi herhangi bir başlatma kodu içermez. Ancak, bu veriler işlemi gönderen tarafından sağlanmışsa, giriş verilerini içerebilir. Bir kez yürütüldükten sonra, mesaj çağrıları ayrıca, sonraki bir yürütmenin bu verilere ihtiyacı varsa kullanılan, çıktı verilerini içeren ekstra bir bileşene sahiptir.
Sözleşme oluşturmada olduğu gibi, gazın bitmesi veya işlemin geçersiz olması (örneğin yığın taşması, geçersiz atlama hedefi veya geçersiz talimat) nedeniyle bir mesaj çağrısı yürütme çıkarsa, kullanılan gazın hiçbiri orijinal arayan kişiye iade edilmez. . Bunun yerine, kalan kullanılmamış gazın tamamı tüketilir ve durum, bakiye transferinden hemen önceki noktaya sıfırlanır.
Ethereum’un en son güncellemesine kadar, sisteme verdiğiniz tüm gazı tüketmeden bir işlemin yürütülmesini durdurmanın veya geri almanın bir yolu yoktu. Örneğin, arayanın bazı işlemleri gerçekleştirme yetkisi olmadığında hata veren bir sözleşme yazdığınızı varsayalım. Ethereum’un önceki sürümlerinde, kalan gaz hala tüketilecek ve gönderene hiçbir gaz iade edilmeyecekti. Ancak Bizans güncellemesi, bir sözleşmenin yürütmeyi durdurmasına ve durum değişikliklerini geri almasına, kalan gazı tüketmeden ve başarısız işlem için bir neden döndürme yeteneğine sahip yeni bir “geri alma” kodu içerir. Geri dönüş nedeniyle bir işlemden çıkılırsa, kullanılmayan gaz göndericiye iade edilir.
Yürütme modeli
Şimdiye kadar, bir işlemin baştan sona yürütülmesi için gerçekleşmesi gereken bir dizi adım hakkında bilgi edindik. Şimdi, işlemin VM içinde gerçekte nasıl yürütüldüğüne bakacağız.
Protokolün, işlemleri gerçekten işleyen kısmı, Ethereum’un Ethereum Sanal Makinesi (EVM) olarak bilinen kendi sanal makinesidir.
EVM, daha önce tanımlandığı gibi, Turing’in eksiksiz bir sanal makinesidir. EVM’nin tipik bir Turing komple makinesinin sahip olmadığı tek sınırlama, EVM’nin doğal olarak gazla bağlı olmasıdır. Bu nedenle, yapılabilecek toplam hesaplama miktarı, sağlanan gaz miktarı ile doğal olarak sınırlıdır.
Ayrıca, EVM yığın tabanlı bir mimariye sahiptir. Yığın makinesi, geçici değerleri tutmak için son giren ilk çıkar yığınını kullanan bir bilgisayardır.
EVM’deki her yığın öğesinin boyutu 256 bittir ve yığının maksimum boyutu 1024'tür.
EVM, öğelerin sözcük adresli bayt dizileri olarak depolandığı belleğe sahiptir. Bellek uçucudur, yani kalıcı değildir.
EVM ayrıca depolama alanına sahiptir. Belleğin aksine, depolama kalıcıdır ve sistem durumunun bir parçası olarak korunur. EVM, program kodunu yalnızca özel talimatlarla erişilebilen sanal bir ROM’da ayrı olarak depolar . Bu şekilde, EVM , program kodunun bellekte veya depolamada depolandığı tipik von Neumann mimarisinden farklıdır .
EVM’nin ayrıca kendi dili vardır: “EVM bayt kodu.” Sizin veya benim gibi bir programcı Ethereum üzerinde çalışan akıllı sözleşmeler yazdığında, genellikle Solidity gibi daha yüksek seviyeli bir dilde kod yazarız. Daha sonra bunu EVM’nin anlayabileceği EVM bayt koduna kadar derleyebiliriz.
Tamam, şimdi yürütmeye geçelim.
Belirli bir hesaplamayı yürütmeden önce, işlemci aşağıdaki bilgilerin mevcut ve geçerli olduğundan emin olur:
- Sistem durumu
- Hesaplama için kalan gaz
- Yürütülen kodun sahibi olan hesabın adresi
- Bu yürütmeyi başlatan işlemin göndericisinin adresi
- Kodun yürütülmesine neden olan hesabın adresi (orijinal gönderenden farklı olabilir)
- Bu yürütmeyi başlatan işlemin gaz fiyatı
- Bu yürütme için giriş verileri
- Geçerli yürütmenin bir parçası olarak bu hesaba iletilen değer (Wei cinsinden)
- Yürütülecek makine kodu
- Geçerli bloğun blok başlığı
- Mevcut mesaj çağrısının veya sözleşme oluşturma yığınının derinliği
Yürütmenin başlangıcında, bellek ve yığın boştur ve program sayacı sıfırdır.
PC: 0 STACK: [] MEM: [], STORAGE: {}
EVM daha sonra işlemi yinelemeli olarak yürütür ve her döngü için sistem durumunu ve makine durumunu hesaplar. Sistem durumu, basitçe Ethereum’un küresel durumudur. Makine durumu şunlardan oluşur:
- mevcut gaz(gas available)
- program sayıcı(program counter)
- hafıza içeriği(memory contents)
- hafızadaki aktif kelime sayısı(active number of words in memory)
- yığın içeriği(stack contents).
Yığın öğeleri, dizinin en sol kısmından eklenir veya çıkarılır.
Her çevrimde, kalan gazdan uygun gaz miktarı azaltılır ve program sayacı artar.
Her döngünün sonunda üç olasılık vardır:
- Makine istisnai bir duruma ulaşır (örn. yetersiz gaz, geçersiz talimatlar, yetersiz yığın öğeleri, yığın öğeleri 1024'ün üzerine taşar, geçersiz JUMP/JUMPI hedefi vb.) ve bu nedenle, tüm değişiklikler atılarak durdurulmalıdır.
- Sıra bir sonraki döngüde işlemeye devam eder
- Makine kontrollü bir duruşa ulaşır (yürütme sürecinin sonu)
Yürütmenin istisnai bir duruma gelmediğini ve “kontrollü” veya normal bir durma noktasına ulaştığını varsayarsak, makine, sonuç durumunu, bu yürütmeden sonra kalan gazı, tahakkuk eden alt durumu ve ortaya çıkan çıktıyı üretir.
Vay canına. Ethereum’un en karmaşık kısımlarından birinden geçtik. Bu kısmı tam olarak anlamamış olsanız bile, sorun değil. Çok derin bir düzeyde çalışmadığınız sürece, gerçekten cesur yürütme ayrıntılarını anlamanıza gerek yoktur .
Bir blok nasıl sonuçlandırılır?
Son olarak, birçok işlem bloğunun nasıl sonuçlandırıldığına bakalım.
“Kesinleşmiş” dediğimizde, bloğun yeni veya mevcut olmasına bağlı olarak iki farklı anlama gelebilir. Eğer bu yeni bir blok ise, bu bloğun madenciliği için gereken süreçten bahsediyoruz. Mevcut bir bloksa, bloğu doğrulama sürecinden bahsediyoruz. Her iki durumda da, bir bloğun “sonlandırılmış” olması için dört gereklilik vardır:
1) Ommer’leri doğrulayın (veya madencilik yapıyorsanız belirleyin)
Blok başlığındaki her bir ommer bloğu geçerli bir başlık olmalı ve mevcut altıncı nesil içinde olmalıdır. engellemek.
2) İşlemleri doğrulayın (veya madencilik yapıyorsanız belirleyin)
Bloktaki gasUsed numarası, blokta listelenen işlemlerde kullanılan kümülatif gaza eşit olmalıdır. (Bir işlem gerçekleştirirken, bloktaki tüm işlemler tarafından kullanılan toplam gazı takip eden blok gaz sayacını takip ettiğimizi hatırlayın).
3) Ödülleri uygulayın (yalnızca madenciler yapabilir)
Hak sahibi adrese(beneficiary address) blok madenciliği için 5 Ether verilir. (Ethereum teklifi EIP-649 kapsamında , 5 ETH’lik bu ödül yakında 3 ETH’ye düşürülecek). Ek olarak, her ommer için, mevcut bloğun hak sahibine, mevcut blok ödülünün 1/32'si ek olarak verilir. Son olarak, ommer blok(lar)ının hak sahibine de belirli bir miktar verilir (bunun nasıl hesaplandığına dair özel bir formül vardır).
4) Durumu ve nonce’yi doğrulayın (veya madencilik yapıyorsanız geçerli olarak hesaplayın)
Tüm işlemlerin ve sonuçta ortaya çıkan durum değişikliklerinin uygulandığından emin olun ve ardından yeni bloğu, blok ödülü nihai işlemin sonuç durumuna uygulandıktan sonraki durum olarak tanımlayın. Doğrulama, başlıkta depolanan durum denemesine karşı bu son durumu kontrol ederek gerçekleşir.
Madencilik iş kanıtı
“ Bloklar ” bölümü kısaca blok zorluğu kavramına değindi. Engelleme zorluğunu anlamlandıran algoritmaya İş Kanıtı (PoW) denir.
Ethereum’un iş kanıtı algoritmasına “ Ethash ” (önceden Dagger-Hashimoto olarak biliniyordu) denir.
Algoritma resmi olarak şu şekilde tanımlanır:
Burada m , mixHashdir , n noncedur , Hn yeni bloğun başlığıdır ( hesaplanması gereken nonce ve mixHash bileşenleri hariç), Hn(soldaki) , blok başlığının nonce’sidir ve d büyük bir veri setidir.
“ Bloklar ” bölümünde, bir blok başlığında bulunan çeşitli öğelerden bahsettik. Bu bileşenlerden ikisi mixHash ve nonce olarak adlandırıldı . Hatırlayacağınız gibi:
- mixHash , nonce ile birleştirildiğinde bu bloğun yeterli hesaplama yaptığını kanıtlayan bir karmadır.
- nonce , mixHash ile birleştirildiğinde bu bloğun yeterli hesaplama yaptığını kanıtlayan bir karmadır.
PoW işlevi bu iki öğeyi değerlendirmek için kullanılır.
PoW işlevi kullanılarak mixHash ve nonce’nin tam olarak nasıl hesaplandığı biraz karmaşık ve ayrı bir gönderide daha derine inebileceğimiz bir şey. Ancak hatırlayacağınız üzere şöyle çalışır:
Her blok için bir “tohum” hesaplanır. Bu tohum, her çağın 30.000 blok uzunluğunda olduğu her “çağ” için farklıdır. İlk dönem için, tohum, 32 baytlık bir dizi sıfırın karma değeridir. Sonraki her dönem için, önceki tohum karmasının karma değeridir. Bu çekirdeği kullanarak, bir düğüm sözde rastgele bir “önbellek” hesaplayabilir.
Bu önbellek, bu gönderide daha önce tartıştığımız “hafif düğümler” kavramını mümkün kıldığı için inanılmaz derecede kullanışlıdır. Hafif düğümlerin amacı, belirli düğümlere, tüm blok zinciri veri setini depolama yükü olmadan bir işlemi verimli bir şekilde doğrulama yeteneği kazandırmaktır. Bir ışık düğümü, yalnızca bu önbelleğe dayalı bir işlemin geçerliliğini doğrulayabilir, çünkü önbellek, doğrulaması gereken belirli bloğu yeniden oluşturabilir.
Bir düğüm, önbelleği kullanarak, veri kümesindeki her öğenin önbellekten az sayıda sözde rastgele seçilmiş öğeye bağlı olduğu DAG “veri kümesini” oluşturabilir. Madenci olmak için bu tam veri setini oluşturmalısınız; tüm tam istemciler ve madenciler bu veri kümesini depolar ve veri kümesi zamanla doğrusal olarak büyür.
Madenciler daha sonra veri kümesinden rastgele dilimler alabilir ve bunları bir “mixHash” halinde bir araya getirmek için matematiksel bir işlevden geçirebilir. Bir madenci , çıktı istenen hedef nonce’nin altına düşene kadar art arda bir mixHash üretecektir . Çıktı bu gereksinimi karşıladığında, bu nonce geçerli kabul edilir ve blok zincire eklenebilir.
Bir güvenlik mekanizması olarak madencilik
Genel olarak, PoW’nin amacı, kriptografik olarak güvenli bir şekilde, bir miktar çıktı (yani nonce ) üretmek için belirli bir hesaplama miktarının harcandığını kanıtlamaktır. Bunun nedeni, tüm olasılıkları sıralamaktan başka, gerekli eşiğin altında olan bir nonce bulmanın daha iyi bir yolu olmamasıdır. Karma işlevinin tekrar tekrar uygulanmasının çıktıları tek tip bir dağılıma sahiptir ve bu nedenle ortalama olarak böyle bir nonce bulmak için gereken sürenin zorluk eşiğine bağlı olduğundan emin olabiliriz. Zorluk ne kadar yüksekse, nonce için çözmek o kadar uzun sürer. Bu şekilde PoW algoritması, blok zinciri güvenliğini zorlamak için kullanılan zorluk kavramına anlam kazandırmaktadır.
Blockchain güvenliği ile ne demek istiyoruz? Çok basit: HERKESİN güvendiği bir blok zinciri oluşturmak istiyoruz. Bu gönderide daha önce tartıştığımız gibi, birden fazla zincir mevcut olsaydı, kullanıcılar hangi zincirin “geçerli” zincir olduğunu makul bir şekilde belirleyemeyecekleri için güvenini kaybederdi. Bir grup kullanıcının bir blok zincirinde depolanan temel durumu kabul etmesi için, bir grup insanın inandığı tek bir kurallı blok zincirine ihtiyacımız var.
PoW algoritmasının yaptığı tam olarak budur: Belirli bir blok zincirinin gelecekte kabul edilir kalmasını sağlar ve bir saldırganın geçmişin belirli bir bölümünün üzerine yazan yeni bloklar oluşturmasını inanılmaz derecede zorlaştırır (örneğin işlemleri silerek veya sahte işlemler oluşturarak) veya çatallanmaya karşı korur. Önce bloklarının doğrulanması için, bir saldırganın nonce’yi ağdaki herkesten daha hızlı çözmesi gerekir, öyle ki ağ kendi zincirinin en ağır zincir olduğuna inanır (daha önce bahsettiğimiz GHOST protokolünün ilkelerine dayanarak). Saldırganın ağ madenciliği gücünün yarısından fazlasına sahip olmadıkça bu imkansız olurdu, bu senaryo çoğunluk %51 saldırısı olarak bilinir .
Bir servet dağıtım mekanizması olarak madencilik
PoW, güvenli bir blok zinciri sağlamanın ötesinde, bu güvenliği sağlamak için hesaplamalarını harcayanlara servet dağıtmanın bir yoludur. Bir madencinin bir blok madenciliği için aşağıdakileri içeren bir ödül aldığını hatırlayın:
- “kazanan” blok için 5 eter statik blok ödülü
- bloğa dahil olan işlemlerle blok içinde harcanan gazın maliyeti
- Ommer’ları bloğun bir parçası olarak dahil etmek için ekstra bir ödül
PoW konsensüs mekanizmasının güvenlik ve servet dağıtımı için kullanımının uzun vadede sürdürülebilir olmasını sağlamak için Ethereum bu iki özelliği aşılamaya çalışır:
- Mümkün olduğunca çok insan için erişilebilir hale getirin. Başka bir deyişle, insanların algoritmayı çalıştırmak için özel veya yaygın olmayan donanımlara ihtiyacı olmamalıdır. Bunun amacı, servet dağıtım modelini mümkün olduğunca açık hale getirmektir, böylece herkes Ether karşılığında herhangi bir miktarda hesaplama gücü sağlayabilir.
- Herhangi bir tek düğümün (veya küçük kümenin) orantısız miktarda kâr elde etme olasılığını azaltın. Orantısız miktarda kar yapabilen herhangi bir düğüm, düğümün herkes tarafından kabul edilen blok zincirini belirlemede büyük bir etkiye sahip olduğu anlamına gelir. Bu, ağ güvenliğini azalttığı için zahmetlidir.
Bitcoin blok zinciri ağında, yukarıdaki iki özellikle ilgili olarak ortaya çıkan bir sorun, PoW algoritmasının bir SHA256 karma işlevi olmasıdır. Bu tür bir işlevin zayıf yanı, ASIC olarak da bilinen özel donanım kullanılarak çok daha verimli bir şekilde çözülebilmesidir.
Bu sorunu azaltmak için Ethereum, PoW algoritmasını ( Ethhash ) sıralı olarak belleğe dayanıklı hale getirmeyi seçti. Bu, algoritmanın, nonce’yi hesaplamak için çok fazla bellek VE bant genişliği gerektirecek şekilde tasarlandığı anlamına gelir. Büyük bellek gereksinimleri, bir bilgisayarın aynı anda birden çok nonce keşfetmek için belleğini paralel olarak kullanmasını zorlaştırır ve yüksek bant genişliği gereksinimleri süper hızlı bir bilgisayarın bile aynı anda birden çok nonce bulmasını zorlaştırır. Bu, merkezileşme riskini azaltır ve doğrulamayı yapan düğümler için daha eşit bir oyun alanı yaratır.
Unutulmaması gereken bir şey, Ethereum’un bir PoW konsensüs mekanizmasından “hisse kanıtı” adı verilen bir şeye geçiş yapmasıdır. Bu, gelecekteki bir gönderide umarız keşfedebileceğimiz, kendi başına canavarca bir konudur. ☺️
Çözüm
…Vay canına! Sen sonuna kadar yaptın. Umarım?
Bu yazıda sindirilecek çok şey var, biliyorum. Neler olup bittiğini tam olarak anlamak için birden fazla okuma yapmanız gerekiyorsa, bu tamamen sorun değil. Neler olup bittiğine bakmadan önce Ethereum sarı kağıdını, beyaz kağıdı ve kod tabanının çeşitli kısımlarını kişisel olarak birçok kez okudum.
Yine de, umarım bu genel bakışı yararlı bulmuşsunuzdur. Herhangi bir hata veya hata bulursanız, özel bir not yazmanızı veya doğrudan yorumlara göndermenizi isterim. Hepsine bakıyorum söz veriyorum ;)
Ve unutmayın, ben insanım (evet, bu doğru) ve hatalar yaparım. Bu yazıyı topluluğun yararına ücretsiz olarak yazmak için zaman ayırdım. Bu yüzden lütfen gereksiz yere kırmadan geri bildiriminizde yapıcı olun. ☺️
Makaleyi sonuna kadar okuduğunuz için sizi teşekkür ederim. Yer yer kafa karıştıran bilgi dolu bir makale olsa da sonuna ulaşabildiniz. Aynı makaleyi bir de İngilizce olarak göz atmanız için aşağıya bırakıyorum.
Kaynak: https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369