Ethereum nasıl çalışır? (Part 1)

3C27...7bz2
4 Feb 2024
32

Kaynak: r/ethereum


Giriş


Muhtemelen, ne olduğunu bilseniz de bilmeseniz de Ethereum blok zincirini duymuşsunuzdur. Bazı büyük dergilerin kapağı da dahil olmak üzere son zamanlarda haberlerde çokça yer aldı, ancak Ethereum’un tam olarak ne olduğuna dair bir temeliniz yoksa bu makaleleri okumak anlamsız gelebilir. Peki nedir? Özünde, dijital işlemlerin kalıcı bir kaydını tutan halka açık bir veri tabanı. Daha da önemlisi, bu veri tabanı, onu korumak ve güvenceye almak için herhangi bir merkezi otorite gerektirmez. Bunun yerine, bireylerin üçüncü bir tarafa VEYA birbirlerine güvenmeye ihtiyaç duymadan eşler arası işlemler yapabileceği bir çerçeve olan “güvenilmez” bir işlem sistemi olarak çalışır.

Hala kafan karışık mı? İşte bu yazı burada devreye giriyor. Amacım, Ethereum’un karmaşık matematik veya korkutucu görünen formüller olmadan teknik düzeyde nasıl çalıştığını açıklamak. Bir programcı olmasanız bile umarım en azından teknolojiyi daha iyi kavrarsınız. Bazı parçalar çok teknikse ve okunması zorsa sorun değil! Her küçük ayrıntıyı anlamaya gerçekten gerek yok. Sadece olayları geniş bir çerçevede anlamaya odaklanmanızı öneririm.

Bu yazıda ele alınan konuların çoğu, sarı kağıtta(yellow paper) tartışılan kavramların bir dökümüdür. Ethereum’u anlamayı kolaylaştırmak için kendi açıklamalarımı ve diyagramlarımı ekledim. Teknik zorluğu üstlenecek kadar cesur olanlar, Ethereum sarı kağıdını(yellow paper) da okuyabilir.

Yellow paper nedir?


White Paper’dan daha detaylı teknik bilgiler içeren dokümantasyona yellow paper denir.
Ethereum yellow paper: https://ethereum.github.io/yellowpaper/paper.pdf


Hadi başlayalım!

Blockchain’in tanımı


Bir blok zinciri, “paylaşımlı durumlu, kriptografik olarak güvenli bir işlemsel tekil makinedir”. [1] Bu çok karışık değil mi? Hadi onu parçalayalım.

  • “Cryptographically secure”, dijital para biriminin yaratılmasının, kırılması son derece zor olan karmaşık matematiksel algoritmalar tarafından güvence altına alınması anlamına gelir. Bir çeşit güvenlik duvarı düşünün. Sistemi aldatmayı neredeyse imkansız hale getirirler (ör. sahte işlemler oluşturma, işlemleri silme vb.)
  • “Transactional singleton machine”, sistemde oluşturulan tüm işlemlerden sorumlu olan tek bir kurallı makine örneğinin olduğu anlamına gelir. Başka bir deyişle, herkesin inandığı tek bir küresel gerçek vardır.
  • “With shared-state”, bu makinede depolanan durumun paylaşıldığı ve herkese açık olduğu anlamına gelir.


Ethereum, bu blockchain paradigmasını uygular.

Ethereum blockchain paradigması açıklandı


Ethereum blok zinciri esasen işlem tabanlı bir durum makinesidir. Bilgisayar biliminde, bir durum makinesi, bir dizi girdiyi okuyacak ve bu girdilere dayanarak yeni bir duruma geçecek bir şeyi ifade eder.


Ethereum’un durum makinesiyle, bir “genesis durumu” ile başlıyoruz. Bu, ağ üzerinde herhangi bir işlem yapılmadan önce boş bir sayfaya benzer. İşlemler yürütüldüğünde, bu oluşum durumu bazı nihai durumlara geçiş yapar. Zamanın herhangi bir noktasında, bu son durum, Ethereum’un mevcut durumunu temsil eder.


Ethereum’un durumunda milyonlarca işlem var. Bu işlemler “bloklar” olarak gruplandırılmıştır. Bir blok bir dizi işlem içerir ve her blok bir önceki blokla birlikte zincirlenir.


Bir durumdan diğerine geçişi sağlamak için bir işlemin geçerli olması gerekir. Bir işlemin geçerli sayılabilmesi için madencilik olarak bilinen bir doğrulama sürecinden geçmesi gerekir. Madencilik, bir grup düğümün (yani bilgisayarların) geçerli bir işlem bloğu oluşturmak için işlem kaynaklarını harcamasıdır.

Ağda kendisini madenci olarak ilan eden herhangi bir düğüm, bir blok oluşturmaya ve doğrulamaya çalışabilir. Dünyanın dört bir yanından birçok madenci aynı anda bloklar oluşturmaya ve doğrulamaya çalışıyor. Her madenci, blok zincirine bir blok gönderirken matematiksel bir “kanıt” sağlar ve bu kanıt bir garanti görevi görür: Kanıt varsa, blok geçerli olmalıdır.

Bir bloğun ana blok zincirine eklenmesi için madencinin bunu diğer tüm rakip madencilerden daha hızlı kanıtlaması gerekir. Bir madencinin matematiksel bir kanıt sağlamasını sağlayarak her bloğu doğrulama süreci, “proof of work” olarak bilinir.

Yeni bir bloğu onaylayan bir madenci, bu işi yaptığı için belirli bir değerle ödüllendirilir. Bu değer nedir? Ethereum blok zinciri, “Ether” adı verilen içsel bir dijital belirteç kullanır. Bir madenci bir bloğu her kanıtladığında, yeni Ether jetonları üretilir ve verilir.
Merak ediyor olabilirsiniz: Herkesin tek bir blok zincirine bağlı kalmasının garantisi nedir? Kendi blok zincirlerini oluşturmaya karar verecek bir madenci alt kümesinin olmadığından nasıl emin olabiliriz?

Daha önce, bir blok zincirini, paylaşımlı duruma sahip işlemsel tekil bir makine olarak tanımlamıştık. Bu tanımı kullanarak, doğru mevcut durumun herkesin kabul etmesi gereken tek bir küresel hakikat olduğunu anlayabiliriz. Birden çok duruma (veya zincire) sahip olmak tüm sistemi mahveder çünkü hangi durumun doğru olduğu konusunda anlaşmak imkansız olurdu. Zincirler birbirinden ayrılırsa, bir zincirde 10, diğerinde 20 ve diğerinde 40 jeton sahibi olabilirsiniz. Bu senaryoda, hangi zincirin en “geçerli” olduğunu belirlemenin bir yolu olmayacaktır.

Birden çok yol oluşturulduğunda, bir “çatal(fork)” oluşur. Genellikle çatallardan kaçınmak isteriz, çünkü bunlar sistemi bozar ve insanları hangi zincire inanacaklarını seçmeye zorlar.


Hangi yolun en geçerli olduğunu belirlemek ve çoklu zincirleri önlemek için Ethereum, “Hayalet protokol(GHOST protocol)” adı verilen bir mekanizma kullanır.

“GHOST” = “Açgözlü En Ağır Gözlemlenen Alt Ağaç”

Basit bir ifadeyle, GHOST protokolü, üzerinde en fazla hesaplamanın yapıldığı yolu seçmemiz gerektiğini söylüyor. Bu yolu belirlemenin bir yolu, mevcut yoldaki toplam blok sayısını temsil eden en son bloğun (yaprak blok(leaf block)) blok numarasını kullanmaktır (genesis bloğunu saymaz). Blok numarası ne kadar yüksek olursa yol o kadar uzun olur ve yaprağa(leaf block) ulaşmak için harcanması gereken madencilik çabası o kadar büyük olur. Bu akıl yürütmeyi kullanmak mevcut durumun standart versiyonu üzerinde anlaşmamıza izin verir.

Artık bir blok zincirinin ne olduğuna dair 10.000 fit’lik genel bir bakış elde ettiğinize göre, Ethereum sisteminin oluşturduğu ana bileşenleri daha derinlemesine inceleyelim:

  • hesaplar
  • durum
  • gaz ve ücretler(gas and fees)
  • işlemler(transactions)
  • bloklar
  • işlem yürütme
  • madencilik(mining)
  • işin kanıtı(proof of work)


Başlamadan önce bir not: Ne zaman X’in “karması” desem, Ethereum’un kullandığı KECCAK-256 karmasından bahsediyorum.

Hesaplar(Accounts)


Ethereum’un küresel “paylaşılan durumu”, bir mesaj iletme çerçevesi aracılığıyla birbirleriyle etkileşime girebilen birçok küçük nesneden (“hesaplar”) oluşur. Her hesabın kendisiyle ilişkili bir durumu ve 20 baytlık bir adresi vardır. Ethereum’daki her bir adres, herhangi bir hesabı tanımlamak için kullanılan 160 bitlik bir tanımlayıcıdır.

İki hesap türü vardır:

  • Özel anahtarlar tarafından kontrol edilen ve kendileriyle ilişkili hiçbir kodu olmayan harici olarak sahip olunan hesaplar.
  • Sözleşme kodları tarafından kontrol edilen ve kendileriyle ilişkili kodu olan sözleşme hesapları.

Harici olarak sahip olunan hesaplar ve sözleşmeli hesaplar

Harici olarak sahip olunan hesaplar ile sözleşmeli hesaplar arasındaki temel farkı anlamak önemlidir. Harici olarak sahip olunan bir hesap, kendi özel anahtarını kullanarak bir işlem oluşturup imzalayarak harici olarak sahip olunan diğer hesaplara VEYA diğer sözleşme hesaplarına mesaj gönderebilir. Harici olarak sahip olunan iki hesap arasındaki bir mesaj, yalnızca bir değer aktarımıdır. Ancak, harici olarak sahip olunan bir hesaptan bir sözleşme hesabına gönderilen bir mesaj, sözleşme hesabının kodunu etkinleştirerek çeşitli eylemleri gerçekleştirmesine izin verir. (örneğin, jetonları transfer etme, dahili depolamaya yazma, yeni jetonlar basma, bazı hesaplamalar yapma, yeni sözleşmeler oluşturma vb.)

Harici olarak sahip olunan hesapların aksine, sözleşme hesapları kendi başlarına yeni işlemler başlatamaz. Bunun yerine, sözleşme hesapları işlemleri yalnızca aldıkları diğer işlemlere yanıt olarak tetikleyebilir (harici olarak sahip olunan bir hesaptan veya başka bir sözleşme hesabından). “İşlemler ve Mesajlar” bölümünde sözleşmeden sözleşmeye aramalar hakkında daha fazla bilgi edineceğiz.


Bu nedenle, Ethereum blok zincirinde meydana gelen herhangi bir eylem, her zaman harici olarak kontrol edilen hesaplardan başlatılan işlemlerle harekete geçirilir.

Hesap durumu(Account state)


Hesap durumu, hesap türünden bağımsız olarak mevcut olan dört bileşenden oluşur:

  • nonce: Hesap harici olarak sahip olunan bir hesapsa, bu numara hesabın adresinden gönderilen işlem sayısını temsil eder. Hesap bir sözleşme hesabıysa ,nonce, hesap tarafından oluşturulan sözleşmelerin sayısıdır.
  • balance: Bu adresin sahip olduğu Wei sayısı. Ether başına 1e+18 Wei vardır.
  • storageRoot: Bir Merkle Patricia ağacının kök düğümünün karma değeri. (Merkle ağaçlarını daha sonra açıklayacağız) Bu ağaç, bu hesabın depolama içeriğinin hash değerini kodlar ve varsayılan olarak boştur.
  • codeHash: Bu hesabın EVM (Ethereum Sanal Makinesi — bundan sonra bahsedeceğiz) kodunun karması. Sözleşme hesapları için bu, hash yapılan ve codeHash olarak depolanan koddur. Harici olarak sahip olunan hesaplar için codeHash alanı, boş dizenin karma değeridir.



Dünya durumu(World state)


Tamam, Ethereum’un küresel durumunun hesap adresleri ve hesap durumları arasındaki bir eşleştirmeden oluştuğunu biliyoruz. Bu eşleme, Merkle Patricia ağacı olarak bilinen bir veri yapısında saklanır .

Bir Merkle ağacı (veya “Merkle trie”), aşağıdakilere sahip bir dizi düğümden oluşan bir ikili ağaç türüdür:

  • ağacın altında temel verileri içeren çok sayıda yaprak düğümü
  • her düğümün iki alt düğümünün karması olduğu bir dizi ara düğüm
  • ağacın tepesini temsil eden, iki alt düğümünün karmasından da oluşan tek bir kök düğüm



Ağacın altındaki veriler, depolamak istediğimiz verileri parçalara bölerek, ardından parçaları kovalara bölerek ve ardından her bir kovanın karma değerini alarak ve kalan toplam karma sayısı olana kadar aynı işlemi tekrarlayarak oluşturulur. Sadece bir tane kök hash(root hash) vardır.


Bu ağacın içinde depolanan her değer için bir anahtara sahip olması gerekir. Ağacın kök düğümünden başlayarak, anahtar, yaprak düğümlerinde depolanan değere ulaşmak için hangi alt düğümü izleyeceğinizi söylemelidir. Ethereum’un durumunda, durum ağacı için anahtar/değer eşlemesi, her hesap için bakiye, nonce, codeHash ve storageRoot dahil olmak üzere adresler ve ilişkili hesaplar arasındadır.


Bu aynı trie yapısı, işlemleri ve makbuzları saklamak için de kullanılır. Daha spesifik olarak, her blok, aşağıdakiler dahil olmak üzere üç farklı Merkle trie yapısının kök düğümünün karmasını depolayan bir “başlığa” sahiptir:

  1. State trie
  2. Transactions trie
  3. Receipts trie



The ability to store all this information efficiently in Merkle tries is incredibly useful in Ethereum for what we call “light clients” or “light nodes.” Remember that a blockchain is maintained by a bunch of nodes. Broadly speaking, there are two types of nodes: full nodes and light nodes. (ÇEVİREMEDİM)

Tam bir arşiv düğümü, genesis bloğundan mevcut ana bloğa kadar tüm zinciri indirerek blok zincirini senkronize eder ve içerdiği tüm işlemleri yürütür. Tipik olarak madenciler, madencilik süreci için bunu yapmaları gerektiğinden, tam arşiv düğümünü depolar. Her işlemi gerçekleştirmeden tam bir düğüm indirmek de mümkündür. Ne olursa olsun, herhangi bir tam düğüm tüm zinciri içerir.

Ancak bir düğümün her işlemi yürütmesi veya geçmiş verileri kolayca sorgulaması gerekmedikçe, tüm zinciri depolamaya gerçekten gerek yoktur. Hafif düğüm kavramı burada devreye girer. Tüm zinciri indirip depolamak ve tüm işlemleri yürütmek yerine, hafif düğümler, herhangi bir işlem veya işlem yürütmeden, genesis bloğundan mevcut başlığa kadar yalnızca başlıklar zincirini indirir. herhangi bir ilişkili durumu alma. Hafif düğümler, üç denemenin karmalarını içeren blok başlıklarına erişime sahip olduklarından, işlemler, olaylar, bakiyeler vb. hakkında kolayca doğrulanabilir cevaplar üretebilir ve alabilirler.

Bunun işe yaramasının nedeni, Merkle ağacındaki karmaların yukarı doğru yayılmasıdır — kötü niyetli bir kullanıcı sahte bir işlemi bir Merkle ağacının altına değiştirmeye çalışırsa, bu değişiklik yukarıdaki düğümün karma değerinde bir değişikliğe neden olur ve bu da bunun üzerindeki düğümün hash’i ve sonunda ağacın kökünü değiştirene kadar böyle devam eder.


Bir veri parçasını doğrulamak isteyen herhangi bir düğüm, bunu yapmak için “Merkle kanıtı” adı verilen bir şey kullanabilir. Bir Merkle kanıtı(Merkle proof) şunlardan oluşur:

  1. Doğrulanacak bir veri yığını ve karma değeri
  2. Ağacın kök karması
  3. “Dal” (tüm ortak, yığından köke giden yol boyunca ilerler)



Kanıtı okuyan herkes, o dal için hash değerinin ağaç boyunca tutarlı olduğunu ve dolayısıyla verilen yığının aslında ağaçta o konumda olduğunu doğrulayabilir.

Özetle, bir Merkle Patricia ağacı kullanmanın yararı, bu yapının kök düğümünün, ağaçta depolanan verilere kriptografik olarak bağımlı olması ve dolayısıyla kök düğümün karma değerinin bu veriler için güvenli bir kimlik olarak kullanılabilmesidir. Blok başlığı durum, işlemler ve makbuz ağaçlarının kök karmasını içerdiğinden, herhangi bir düğüm, potansiyel olarak sınırsız olabilen tüm durumu depolamaya gerek kalmadan Ethereum durumunun küçük bir bölümünü doğrulayabilir.


Gas Ücretleri ve ödeme


Ethereum’daki çok önemli bir kavram, ücret kavramıdır. Ethereum ağındaki bir işlemin sonucu olarak meydana gelen her hesaplama bir ücrete tabidir — bedava öğle yemeği yok! Bu ücret “gaz” adı verilen bir değerde ödenir.

Gaz , belirli bir hesaplama için gereken ücretleri ölçmek için kullanılan birimdir. Gaz fiyatı , her bir gaz birimi için harcamak istediğiniz Ether miktarıdır ve “gwei” ile ölçülür. “Wei”, ¹⁰¹⁸ Wei’nin 1 Eteri temsil ettiği Eter’in en küçük birimidir. Bir gwei 1.000.000.000 Wei’dir.

Gönderici, her işlemde bir gaz limiti ve gaz fiyatı belirler . Gaz fiyatı ve gaz limitinin çarpımı , gönderenin bir işlemi gerçekleştirmek için ödemeye hazır olduğu maksimum Wei miktarını temsil eder.

Örneğin, göndericinin gaz sınırını 50.000 ve gaz fiyatını 20 gwei olarak belirlediğini varsayalım. Bu, gönderenin bu işlemi gerçekleştirmek için en fazla 50.000 x 20 gwei = 1.000.000.000.000.000 Wei = 0.001 Eter harcamaya istekli olduğu anlamına gelir.


Gaz limitinin, gönderenin para harcamak istediği maksimum gazı temsil ettiğini unutmayın. Hesap bakiyelerinde bu maksimumu karşılayacak kadar Ether varsa, gidebilirler. Gönderici, işlemin sonunda kullanılmamış gaz için iade edilir ve orijinal kur üzerinden değiştirilir.

Göndericinin işlemi gerçekleştirmek için gerekli gazı sağlamaması durumunda işlem “gazsız” olur ve geçersiz sayılır. Bu durumda, işlem işleme durdurulur ve meydana gelen herhangi bir durum değişikliği tersine çevrilir, böylece işlemden önceki Ethereum durumuna geri döneriz.

Ek olarak, hangi işlemin denendiğini ve nerede başarısız olduğunu gösteren, başarısız işlemin bir kaydı kaydedilir. Ve makine, gaz bitmeden önce hesaplamaları yapmak için zaten çaba harcadığından, mantıksal olarak, göndericiye gazın hiçbiri iade edilmez.


Bu gaz parası tam olarak nereye gidiyor? Gönderici tarafından gaza harcanan tüm para, genellikle madencinin adresi olan “lehtar” adresine gönderilir. Madenciler hesaplamaları yürütmek ve işlemleri doğrulamak için çaba harcadıklarından, madenciler gaz ücretini ödül olarak alırlar.


Tipik olarak, göndericinin ödemeye razı olduğu gaz fiyatı ne kadar yüksekse, madencinin işlemden elde ettiği değer de o kadar büyük olur. Bu nedenle, madencilerin onu seçme olasılığı daha yüksek olacaktır. Bu şekilde madenciler, hangi işlemleri doğrulamak veya yoksaymak istediklerini seçmekte özgürdür. Göndericilere hangi gaz fiyatını belirleyecekleri konusunda rehberlik etmek için madenciler, işlem yapacakları minimum gaz fiyatını ilan etme seçeneğine sahiptir.


Depolama ücreti de var


Gaz yalnızca hesaplama adımlarını ödemek için değil, aynı zamanda depolama kullanımı için ödeme yapmak için de kullanılır. Toplam depolama ücreti, kullanılan 32 baytın en küçük katıyla orantılıdır.

Depolama ücretlerinin bazı nüanslı yönleri vardır. Örneğin, artan depolama, tüm düğümlerdeki Ethereum durum veritabanının boyutunu artırdığından, depolanan veri miktarını küçük tutmak için bir teşvik vardır. Bu nedenle, bir işlemin depoya girişi temizleyen bir adımı varsa, o işlemin gerçekleştirilme ücretinden feragat edilir ve depolama alanı açılması için para iadesi yapılır.


Ücretlerin amacı nedir?


Ethereum’un çalışma şeklinin önemli bir yönü, ağ tarafından yürütülen her bir işlemin her tam düğüm tarafından aynı anda etkilenmesidir. Ancak, Ethereum Sanal Makinesindeki hesaplama adımları çok pahalıdır. Bu nedenle, Ethereum akıllı sözleşmeleri, ağa yük getirebilecek dosya depolama, e-posta veya makine öğrenimi gibi daha karmaşık kullanımlar yerine, basit iş mantığını çalıştırmak veya imzaları ve diğer kriptografik nesneleri doğrulamak gibi basit görevler için en iyi şekilde kullanılır. Ücretleri dayatmak, kullanıcıların ağa aşırı yük binmesini engeller.

Ethereum tam bir Turing dilidir. (Kısacası, Turing makinesi herhangi bir bilgisayar algoritmasını simüle edebilen bir makinedir (Turing makinelerine aşina olmayanlar için bunu ve bunu kontrol edin ). Bu, döngülere izin verir ve Ethereum’u durma sorununa duyarlı hale getirir . bir programın sonsuz çalışıp çalışmayacağını belirleyemez.Ücretler olmasaydı, kötü niyetli bir aktör, herhangi bir yansıma olmaksızın bir işlem içinde sonsuz bir döngü yürüterek ağı kolayca bozmaya çalışabilir.Böylece ücretler, ağı kasıtlı saldırılardan korur.

“Neden depolama için de para ödememiz gerekiyor?” diye düşünüyor olabilirsiniz. Hesaplama gibi, Ethereum ağında depolama, tüm ağın yükünü üstlenmesi gereken bir maliyettir.


İşlem ve mesajlar


Ethereum’un işlem tabanlı bir durum makinesi olduğunu daha önce belirtmiştik. Başka bir deyişle, farklı hesaplar arasında gerçekleşen işlemler, Ethereum’un küresel durumunu bir durumdan diğerine taşıyan şeydir.

En temel anlamda, işlem, harici olarak sahip olunan bir hesap tarafından oluşturulan, seri hale getirilen ve ardından blok zincirine gönderilen kriptografik olarak imzalanmış bir talimat parçasıdır.

İki tür işlem vardır: mesaj çağrıları ve sözleşme oluşturma (yani yeni Ethereum sözleşmeleri oluşturan işlemler).

Tüm işlemler, türlerinden bağımsız olarak aşağıdaki bileşenleri içerir:

  • nonce : Gönderici tarafından gönderilen işlem sayısı.
  • gasPrice : Göndericinin işlemi gerçekleştirmek için gereken gaz birimi başına ödemeye hazır olduğu Wei sayısı.
  • gasLimit : Göndericinin bu işlemi gerçekleştirmek için ödemeye razı olduğu maksimum gaz miktarı. Bu miktar, herhangi bir hesaplama yapılmadan önce önceden belirlenir ve ödenir.
  • to: alıcının adresi. Sözleşme oluşturan bir işlemde, sözleşme hesabı adresi henüz mevcut değildir ve bu nedenle boş bir değer kullanılır.
  • value(değer) : göndericiden alıcıya aktarılacak Wei miktarı. Sözleşme oluşturan bir işlemde bu değer, yeni oluşturulan sözleşme hesabında başlangıç ​​bakiyesi olarak hizmet eder.
  • v, r, s : işlemin göndericisini tanımlayan imzayı oluşturmak için kullanılır.
  • init (yalnızca sözleşme oluşturan işlemler için mevcuttur): Yeni sözleşme hesabını başlatmak için kullanılan bir EVM kod parçası. init yalnızca bir kez çalıştırılır ve ardından atılır. init ilk çalıştırıldığında , sözleşme hesabıyla kalıcı olarak ilişkilendirilen kod parçası olan hesap kodunun gövdesini döndürür.
  • data (yalnızca mesaj çağrıları için mevcut olan isteğe bağlı alan): mesaj çağrısının giriş verileri (yani parametreler). Örneğin, bir akıllı sözleşme bir etki alanı kayıt hizmeti olarak hizmet veriyorsa, bu sözleşmeye yapılan bir çağrı, etki alanı ve IP adresi gibi girdi alanları bekleyebilir.


Hesaplar ” bölümünde, işlemlerin — hem mesaj çağrıları hem de sözleşme oluşturan işlemlerin — her zaman harici olarak sahip olunan hesaplar tarafından başlatıldığını ve blok zincirine gönderildiğini öğrendik. Bunu düşünmenin başka bir yolu da, dış dünya ile Ethereum’un iç durumu arasında köprü kuran şeyin işlemler olduğudur.


Ancak bu, sözleşmelerin diğer sözleşmelerle konuşamayacağı anlamına gelmez. Ethereum’un durumunun küresel kapsamında var olan sözleşmeler, aynı kapsamdaki diğer sözleşmelerle konuşabilir. Bunu “mesajlar” veya “dahili işlemler” yoluyla diğer sözleşmelere yapıyorlar. Mesajları veya dahili işlemleri, harici olarak sahip olunan hesaplar tarafından oluşturulmamaları arasındaki büyük farkla, işlemlere benzer olarak düşünebiliriz. Bunun yerine, sözleşmeler tarafından üretilirler. İşlemlerin aksine serileştirilmeyen ve yalnızca Ethereum yürütme ortamında bulunan sanal nesnelerdir.

Bir sözleşme, başka bir sözleşmeye dahili bir işlem gönderdiğinde, alıcı sözleşme hesabında bulunan ilişkili kod yürütülür.


Unutulmaması gereken önemli bir nokta, dahili işlemlerin veya mesajların gasLimit içermemesidir. Bunun nedeni, gaz limitinin orijinal işlemin harici yaratıcısı (yani, harici olarak sahip olunan bir hesap) tarafından belirlenmesidir. Harici olarak sahip olunan hesabın belirlediği gaz limiti, sözleşmeden sözleşmeye mesajlar gibi bu işlemin sonucunda ortaya çıkan alt yürütmeler dahil olmak üzere işlemi gerçekleştirmek için yeterince yüksek olmalıdır.

İşlemler ve mesajlar zincirinde, belirli bir mesaj yürütmesinin gazı biterse, o mesajın yürütülmesi, yürütme tarafından tetiklenen sonraki mesajlarla birlikte geri döner. Ancak, üst yürütmenin geri alınması gerekmez.

Bloklar


Tüm işlemler “bloklar” halinde gruplandırılmıştır. Bir blok zinciri, birbirine zincirlenmiş bir dizi bu tür blok içerir.

Ethereum’da bir blok şunlardan oluşur:

  • blok başlığı
  • o bloğa dahil edilen işlem seti hakkında bilgi
  • geçerli bloğun ommers için bir dizi başka blok başlığı.


Ommers açıklaması


“Ommer” nedir? Ommer, ebeveyni mevcut bloğun ebeveyninin ebeveynine eşit olan bir bloktur. Ommer’ların ne için kullanıldığına ve bir bloğun neden ommer’lar için blok başlıklarını içerdiğine hızlı bir dalış yapalım.

Ethereum’un oluşturulma şekli nedeniyle, blok süreleri Bitcoin gibi diğer blok zincirlerinden (~10 dakika) çok daha düşüktür (~15 saniye). Bu, işlemlerin daha hızlı işlenmesini sağlar. Bununla birlikte, daha kısa blok sürelerinin dezavantajlarından biri, madenciler tarafından daha rekabetçi blok çözümlerinin bulunmasıdır. Bu rakip bloklar aynı zamanda “artık bloklar” olarak da adlandırılır (yani, mayınlı bloklar ana zincire girmez).

Ommer’ların amacı, madencileri bu yetim blokları dahil ettikleri için ödüllendirmeye yardımcı olmaktır. Madencilerin içerdiği omerler “geçerli” olmalıdır, yani mevcut bloğun altıncı neslinde veya daha küçüğünde. Altı çocuktan sonra, eski ve öksüz bloklara artık başvuru yapılamaz (çünkü daha eski işlemleri dahil etmek işleri biraz karmaşıklaştırır).

Ommer blokları, tam bloktan daha küçük bir ödül alır. Bununla birlikte, madencilerin bu yetim blokları dahil etmeleri ve bir ödül toplamaları için hala bazı teşvikler var.

Başlık bloğu


Bir an için bloklara geri dönelim. Her bloğun bir “başlığı” olduğundan daha önce bahsetmiştik ama bu tam olarak nedir?

Bir blok başlığı, bloğun aşağıdakilerden oluşan bir kısmıdır:

  • parentHash : ana bloğun başlığının bir karması (blok setini “zincir” yapan şey budur)
  • ommersHash : mevcut bloğun ommers listesinin bir karması
  • beneficiary : bu bloğun madenciliği için ücretleri alan hesap adresi
  • stateRoot : durum denemesinin kök düğümünün karması (durum denemesinin başlıkta saklandığını ve hafif istemcilerin durum hakkında herhangi bir şeyi doğrulamasını kolaylaştırdığını nasıl öğrendiğimizi hatırlayın)
  • TransactionRoot : Bu blokta listelenen tüm işlemleri içeren denemenin kök düğümünün karması
  • ReceivesRoot : bu blokta listelenen tüm işlemlerin makbuzlarını içeren denemenin kök düğümünün karması
  • logsBloom : günlük bilgilerinden oluşan bir Bloom filtresi (veri yapısı)
  • difficulty(zorluk) : bu bloğun zorluk seviyesi
  • number(sayı) : mevcut bloğun sayısı (genesis bloğunun blok numarası sıfırdır; sonraki her blok için blok numarası 1 artar)
  • gasLimit : blok başına mevcut gaz limiti
  • gasUsed : bu bloktaki işlemler tarafından kullanılan toplam gazın toplamı
  • timestamp(zaman damgası) : bu bloğun başlangıcındaki unix zaman damgası
  • extraData : bu blokla ilgili ekstra veriler
  • mixHash : nonce ile birleştirildiğinde bu bloğun yeterli hesaplama yaptığını kanıtlayan bir karma
  • nonce : mixHash ile birleştirildiğinde, bu bloğun yeterli hesaplama yaptığını kanıtlayan bir karma



Her blok başlığının aşağıdakiler için nasıl üç trie yapısı içerdiğine dikkat edin:

  • durum ( stateRoot )
  • işlemler ( transactionsRoot )
  • makbuzlar ( receiptsRoot )

Bu trie yapıları, daha önce tartıştığımız Merkle Patricia denemelerinden başka bir şey değildir.

Ek olarak, yukarıdaki açıklamadan açıklığa kavuşturmaya değer birkaç terim vardır. Hadi bir bakalım.

Logs(Kayıt defteri)


Ethereum, çeşitli işlemleri ve mesajları izlemeyi mümkün kılmak için günlüklere izin verir. Bir sözleşme, günlüğe kaydetmek istediği “olayları” tanımlayarak açıkça bir günlük oluşturabilir.
Bir günlük girişi şunları içerir:

  • kaydedicinin hesap adresi,
  • bu işlem tarafından gerçekleştirilen çeşitli olayları temsil eden bir dizi konu ve
  • bu olaylarla ilişkili herhangi bir veri.

Günlükler , sonsuz günlük verilerini verimli bir şekilde depolayan bir çiçeklenme filtresinde(bloom filter) saklanır.

İşlem makbuzu(Transaction receipt)


Başlıkta depolanan günlükler, işlem makbuzunda yer alan günlük bilgilerinden gelir. Bir mağazadan bir şey satın aldığınızda bir makbuz aldığınız gibi, Ethereum da her işlem için bir makbuz oluşturur. Beklediğiniz gibi, her makbuz, işlemle ilgili belirli bilgileri içerir. Bu makbuz aşağıdaki gibi öğeleri içerir:

  • blok numarası(the block number)
  • blok karma(block hash)
  • işlem karması(transaction hash)
  • cari işlem tarafından kullanılan gaz
  • cari işlem gerçekleştirildikten sonra mevcut blokta kullanılan kümülatif gaz
  • mevcut işlem yürütülürken oluşturulan günlükler
  • ..ve benzeri


Engelleme zorluğu


Bir bloğun “zorluğu”, blokları doğrulamak için gereken sürede tutarlılığı sağlamak için kullanılır. Genesis bloğunun zorluğu 131.072'dir ve bundan sonraki her bloğun zorluğunu hesaplamak için özel bir formül kullanılır. Belirli bir blok önceki bloktan daha hızlı doğrulanırsa, Ethereum protokolü o bloğun zorluğunu arttırır.

Bloğun zorluğu, iş kanıtı algoritması kullanılarak bir blok madenciliği yapılırken hesaplanması gereken bir karma olan nonce’yi etkiler.

Bloğun zorluğu ve nonce arasındaki ilişki matematiksel olarak şu şekilde formüle edilir:


Hd zorluğu nerede?

Zorluk eşiğini karşılayan bir nonce bulmanın tek yolu, tüm olasılıkları sıralamak için iş kanıtı algoritmasını kullanmaktır. Bir çözüm bulmak için beklenen süre, zorlukla orantılıdır — zorluk ne kadar yüksek olursa, nonce’yi bulmak o kadar zorlaşır ve dolayısıyla bloğu doğrulamak o kadar zor olur, bu da yeni bir çözümü doğrulamak için gereken süreyi artırır. engellemek. Böylece, bir bloğun zorluğunu ayarlayarak protokol, bir bloğu doğrulamanın ne kadar süreceğini ayarlayabilir.

Öte yandan, doğrulama süresi yavaşlıyorsa, protokol zorluğu azaltır. Bu şekilde, doğrulama süresi, ortalama olarak her 15 saniyede bir blok olmak üzere sabit bir hızı korumak için kendi kendine ayarlanır.

İşlem Yürütme


Ethereum protokolünün en karmaşık bölümlerinden birine geldik: bir işlemin yürütülmesi. İşlenmek üzere Ethereum ağına bir işlem gönderdiğinizi varsayalım. İşleminizi dahil etmek için Ethereum durumunu değiştirmek için ne olur?


İlk olarak, tüm işlemlerin yürütülebilmesi için bir başlangıç ​​gereksinimleri kümesini karşılaması gerekir. Bunlar şunları içerir:

  • İşlem, uygun şekilde biçimlendirilmiş bir RLP olmalıdır . “RLP”, “Yinelemeli Uzunluk Öneki” anlamına gelir ve iç içe geçmiş ikili veri dizilerini kodlamak için kullanılan bir veri biçimidir. RLP, Ethereum’un nesneleri seri hale getirmek için kullandığı formattır.
  • Geçerli işlem imzası.
  • Geçerli işlem nonce. Bir hesabın nonce’sinin, o hesaptan gönderilen işlemlerin sayısı olduğunu hatırlayın. Geçerli olması için, bir işlemin nonce’si gönderen hesabının nonce’sine eşit olmalıdır.
  • İşlemin gaz limiti , işlem tarafından kullanılan içsel gaza eşit veya ondan büyük olmalıdır . İç gaz şunları içerir:


  1. işlemin gerçekleştirilmesi için önceden tanımlanmış 21.000 gaz maliyeti
  2. işlemle birlikte gönderilen veriler için bir gaz ücreti (sıfıra eşit her veri veya kod baytı için 4 gaz ve sıfır olmayan her veri veya kod baytı için 68 gaz)
  3. İşlem sözleşme yaratan bir işlem ise, ek 32.000 gaz



  • Gönderenin hesap bakiyesinde , gönderenin ödemesi gereken “peşin” gaz maliyetlerini karşılamaya yetecek kadar Ether bulunmalıdır. Peşin alınan gaz maliyetinin hesaplanması basittir: İlk olarak, maksimum gaz maliyetini belirlemek için işlemin gaz limiti işlemin gaz fiyatı ile çarpılır . Daha sonra bu maksimum maliyet, göndericiden alıcıya aktarılan toplam değere eklenir.



İşlem, geçerlilik için yukarıdaki tüm gereksinimleri karşılıyorsa, bir sonraki adıma geçiyoruz.
İlk olarak, gönderenin bakiyesinden peşin yürütme maliyetini düşeriz ve cari işlemi hesaba katmak için gönderenin hesabının nonce’sini 1 artırırız. Bu noktada işlem için toplam gaz limiti eksi kullanılan içsel gaz olarak kalan gazı hesaplayabiliriz .


  • Kendi kendini imha etme seti : işlem tamamlandıktan sonra atılacak bir dizi hesap (varsa).
  • Günlük serisi : sanal makinenin kod yürütmesinin arşivlenmiş ve dizine eklenebilir kontrol noktaları.
  • Geri ödeme bakiyesi : İşlem sonrasında gönderici hesabına iade edilecek tutar. Ethereum’da depolamanın maliyetli olduğundan ve göndericiye depolamayı temizlemesi için geri ödeme yapıldığından bahsettiğimizi hatırlıyor musunuz? Ethereum bunu bir geri ödeme sayacı kullanarak takip eder. Geri ödeme sayacı sıfırdan başlar ve sözleşme depodaki bir şeyi her sildiğinde artar.


Ardından, işlemin gerektirdiği çeşitli hesaplamalar işlenir.

İşlemin gerektirdiği tüm adımlar tamamlandıktan sonra, geçersiz bir durum olmadığı varsayılarak, göndericiye iade edilecek kullanılmamış gaz miktarı belirlenerek durum kesinleşir. Kullanılmayan gaza ek olarak, göndericiye yukarıda açıkladığımız “geri ödeme bakiyesinden” bir miktar ödenek de iade edilir.

Göndericiye para iadesi yapıldığında:

  • gaz için eter madenciye verilir
  • işlem tarafından kullanılan gaz, blok gaz sayacına eklenir (bloktaki tüm işlemler tarafından kullanılan toplam gazın kaydını tutar ve bir bloğu doğrularken kullanışlıdır)
  • kendini imha setindeki (varsa) tüm hesaplar silinir


Son olarak, yeni durum ve işlem tarafından oluşturulan bir dizi günlük kaldı.
Artık işlem yürütmenin temellerini ele aldığımıza göre, sözleşme oluşturan işlemler ile mesaj çağrıları arasındaki bazı farklara bakalım.


Makale yazım sınırı 5000 harf olduğu için yazının devamı 2. part olarak paylaşılmıştır. Profile giderek 2. parta ulaşabilirsiniz.

Kaynak: https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369

Write & Read to Earn with BULB

Learn More

Enjoy this blog? Subscribe to osmankagankurnaz

2 Comments

B
No comments yet.
Most relevant comments are displayed, so some may have been filtered out.