Ethereum ve Akıllı Sözleşmeler

Emre Güçlü
ODTÜ Blockchain Topluluğu
8 min readMay 21, 2022

Bu yazı Ethereum’a ve akıllı sözleşmelere genel bir bakış niteliğinde olacaktır. Keyifli okumalar :)

Ethereum’un ortaya çıkış sebebi neydi?

Takvimler 2013 yılını gösterirken Bitcoin üzerinde büyük bir ilgi söz konusuydu, aynı zamanda blokzincirlerinin para transferi dışında da kullanılabileceğinin örnekleri günden güne artıyordu.

Domain servisi, dünya varlıklarının dijital hale getirilmesi, kitle fonlaması, oylamalar hatta kumar oynama gibi çeşitli hizmetler blokzincirler üzerinden verilebiliyordu. Fakat her hizmetin blokzinciri ayrıydı, kendine has yapıları ve “sınırları” vardı. Sınırları itibariyle klasik hesap makinelerine benzetilebilirler, sebebinden yazının ilerleyen kısımlarında bahsedeceğim.

Her gün yeni hizmetlerin ortaya çıkışından dolayı yeni blokzincirleri üretilmekteydi, haliyle ortalık blokzincirinden geçilmez olmuştu. Günümüzde ufacık denebilecek hizmetler için bile ayrı blokzincirlere ihtiyaç duyulması uzun vadede sürdürülebilir değildi ve teknolojinin benimsenmesini zorlaştırıyordu.

Bu durum o zamanlar 19 yaşında olan Vitalik Buterin’in de kafasını kurcalamaktaydı. “Bu huzursuzluk meyvesini vermeli artık!” dercesine 2014 yılında Ethereum whitepaper’ını yayınladı.

Vitalik Buterin

Ethereum neden devrimseldir?

“Turing Complete bir makine yeterli zaman ve doğru talimatlar verildiğinde işlem gücünün yettiği ölçüde, ne kadar karmaşık olursa olsun, akla gelebilecek tüm hesaplamaları gerçekleştirebilir.”

Ethereum’dan önceki blokzincirlerini klasik hesap makinelerine benzetmiştik. Bu, güzel bir benzetmedir çünkü hesap makineleri Turing Complete değildirler. Sınırları çerçevesinde toplama, çıkartma vb. gibi talimatları yerine getirebilirler ama her talimatı yerine getiremezler. Programlanabilir değillerdir, yani üzerinde olmayan talimatları anlamlandırabilme kapasiteleri yoktur.

Ethereum’u bir dünya olarak düşünürsek merkezinde adı Ethereum Virtual Machine(EVM) olan, bu dünyanın “state” yani durum kaydı bulunan, hakkında ağ katılımcıları olan düğümlerin(node’lar) hemfikir olduğu, standart kabul edilen bir sanal makine vardır. Global sanal bilgisayar olarak düşünülebilir, yazının ilerleyen kısımlarında daha detaylı inceleyeceğiz merak etmeyin.

Ethereum devrimseldir çünkü Vitalik blokzincirinin temeline koyduğu EVM’i “Turing Complete” bir makine olacak şekilde tasarlamıştır. Bu çok önemlidir çünkü EVM’in kod parçalarını anlamlandırabilme yeteneği “akıllı sözleşme” kavramının önünü açar. Sunulacak hizmetler artık çalışabilmelerini mümkün kılacak şartlara sahip, kendilerine ait blokzincirlerde sağlanmak zorunda olmaktan çıkmıştı. Geliştiriciler sağlayacakları hizmetleri EVM’in anlayabileceği bir kod haline getirip akıllı sözleşmeler yoluyla Ethereum blokzinciri üzerinde yayınlayabileceklerdi.

Ethereum’a giriş

Ethereum blokzinciri şu anda “İş ispatı(Proof of Work)” temellidir ve “Nakamoto konsensus protokolünü kullanmaktadır. İş gücü ispatı temelli blokzincirlerinde(bkz. Bitcoin) yeni blokları blokzincire ekleme görevi madencilerdedir(miner). Madenciler işlem güçlerini kullanarak yeni bloğu ekleyebilme hakkı için birbirleriyle yarışırlar. Hak kazanan madenci eklediği her blok karşılığında ağ tarafından hatrı sayılır miktarda ağın yerel kriptoparası ile ödüllendirilir. Ethereum’un yerel kriptoparası “Ether(ETH)”dir.

1. Ethereum Blokzinciri

Ethereum’da “world state” olarak tanımlanan kavram ağın herhangi bir t zamanındaki durumunu tanımlar. World state, Ethereum üzerindeki tüm adreslerin ve adreslerin bağlı olduğu “account state” yani hesap durumlarının kaydından oluşur.

Ethereum üzerinde yapılan “transaction”lar yani işlemler ağın world state’inde değişikliğe sebep olurlar. İşlemler blok adı verilen veri yığınlarında toplanır. Her eklenen blok ile world state değişikliğe uğrar.

World state’lerin değişimi açısından değerlendirecek olursak Ethereum bir “state chain” yani durum zinciri olarak değerlendirebilir.
Ama bloklar açısından değerlendirilirse Ethereum’un bir BLOKZİNCİRİ olduğu açıkça görülmektedir.

2.Hesaplar

“Account” yani hesap dediğimiz kavram world state’deki nesnelerdir. Her hesap bir adres ve adresin eşi olan bir account state’ten oluşur.

Ethereum üzerinde iki adet hesap türü vardır. Bunlar “externally owned account” ve “contract account” olarak isimlendirilmişlerdir.

Externally owned account’lar yani kısaca “EOA”lar, Ethereum üzerindeki kullanıcıların private key’leri ile kontrol ettikleri hesaplardır. EVM kodu bulundurmazlar. Cüzdanlar ile erişilebilen hesaplar bu kategoridendir.

Contract account yani kontrat hesapları ise Ethereum üzerindeki akıllı sözleşmelerin hesaplarıdır. EVM’in anlayacağı dilde olan “EVM bytecode” bulundururlar ve hesap bu kod tarafından kontrol edilir. Akıllı kontratların yapılarını daha sonra inceleyeceğiz.

Account state’lerde nonce ve balance verisi tutmak her iki hesap türü için de ortaktır. “Nonce” bir sayaç gibi düşünülebilir, hesabın gönderdiği işlem sayısını tutar. “Balance” ise hesabın sahip olduğu “Ether” bakiyesinin bilgisini tutar.

Yalnızca kontrat hesaplarının account state’inde bulunabilen “code hash”, akıllı sözleşmenin gelecek isteklere karşı nasıl davranacağının belirtildiği EVM kodunun hashlenmiş versiyonunu tutar.

Yine sadece kontrat hesaplarında olan “storage hash” en basit şekliyle hesabın balance ve nonce dışında tuttuğu verilerin hashlenmiş versiyonunu tutar, Merkle patricia tree kullanılarak bu veri EVM tarafından anlamlandırılır fakat detayına bu yazıda girmeyeceğim.

Adresler

EOA’ların adresleri güvenli ortamda oluşturulacak bir private key’den eliptik eğri kriptografisi kullanılarak public key üretilmesi, daha sonra bu public key’in hash fonksiyonundan geçirilmesi ile belirlenir.

Ethereum’daki hesap adresleri 160 bitlik(40 karakter uzunluğunda) hexadecimal sayılarla belirtilirler. Hexadecimal oldukları “0x” ile başlamalarından anlaşılabilir.

Öte yandan kontrat hesaplarının adreslerinin oluşturulma şekli daha farklıdır. Bir kontrat hesabının adresi akıllı sözleşmenin kodunu yükleyerek kontrat oluşturma işlemini gönderen hesabın adres ve nonce ikilisinin hashlenmesi ile belirlenir. İşlem gönderen hesabın nonce’u artacağından dolayı bu yöntemle aynı hesaptan gönderilecek her kontrat oluşturma işlemi ile oluşacak kontrat hesabı kesin olarak öncekilerden farklı ve özgün bir adrese sahip olur.

3.İşlemler

“Transaction” yani işlem olarak geçen kavram, kriptografik olarak imzalanmış ve EVM’e gönderilecek talimat anlamına gelmektedir.

Hem EOA’lar yani kullanıcı hesapları, hem de kontrat hesapları işlem oluşturabilirler. Bu sebepten işlem gönderen hesaba “dış aktör” dememiz daha iyi olacaktır.

İki adet işlem türü vardır, bunlar “contract creation(kontrat oluşturma)” ve “message call(mesaj çağrısı)”dır.

Kontrat oluşturma(deploy etme) türü işlemlerde oluşturulacak akıllı sözleşmenin kodu EVM’in anlayacağı bir şekle çevrilerek işlemin içine talimat olarak eklenir ve işlem “0x0” yani 0 adresine gönderilir.

Bu işlem sonucunda world state’te nasıl davranacağı kodlarla belli olan yeni bir kontrat hesabı oluşturulur.

Message call türü işlemlerde gerçekleştirilecek eylemin data’sı(bir dizi byte) ve value’su(ether cinsinden yollanacak değer) gönderilen “mesaj”ı oluşturur.

Yapılan işlem sonucu world state’teki diğer hesapların account state’lerinde değişiklikler oluşabilir.

İşlemler yapı olarak aşağıdaki gibidir:

Burada dikkat çeken, bahsetmediğimiz 2 unsur var: “gasPrice” ve “gasLimit”. Bunlara ilerleyen kısımlarda değineceğim.

Hem EOA’lar, hem de bir EOA tarafından tetiklenmiş kontrat hesapları(CA) işlem oluşturup ağa yollayabilirler.

Tetiklenen kontrat hesapları işlem gönderip başka kontrat hesaplarını da tetikleyebilirler. Bu sayede kontratlar birbirlerine çağrı gönderebilir.
İşlemler atomik operasyonlardır. Bölünemez, parçalanamaz veya yarıda kesilemezler.
Yani; bir işlem ya tamamen gerçekleşir, ya da hiç gerçekleşmez.

4. Gas ve İşlem Ücretleri

Ethereum blokları ortalama 15 milyon adet “gas” kapasiteye sahiptirler. “Gas” denen birimler, işlemlerin karmaşıklığına yani world state’te yapılacak değişikliğin büyüklüğüne bağlı olarak ağda harcanması gereken “yakıt parçaları” olarak düşünülebilir.

Kullanıcılar işlemlerinde kullanacakları gas miktarını ve “gas başına ödenecek ücret”i işlemlerinde belirtirler. Daha önce bahsettiğimiz gasLimit ve gasPrice kavramları bunlara işaret eder. Gas başına ödenecek ücret 1 ether’in milyarda biri olan “gwei” birimi üzerinden hesaplanır. Eğer bir işlemin kaç gas kullanacağını ve gas başına kaç gwei ödeneceğini biliyorsak, bu işlemin ödeyeceği “işlem ücretini” hesaplayabiliriz.

Örneğin Ethereum ağında ether transferi işlemi için 21000 gas kullanılır. Benim yazıyı yazdığım esnada gas başına ödenmesi gereken “ortalama” ücret anlık 40.4 gwei olarak gözüküyor. Bu fiyat ağın yoğunluğuna bağlı olarak her an değişmektedir. Transfer işlemini yapmak için 21000 * 40.4 = 848.400 gwei ödemem gerekiyormuş, bu da 0.0008484 ether’e karşılık geliyor. Ether fiyatı anlık yaklaşık 2000 dolar olduğundan 1.7 dolar gibi bir ücret karşılığında anlık ether transferi yapabiliyorum.

İşlemlerin Bloklara Eklenme Süreci

Dış aktörler Ethereum blokzincirine eklenmeleri için işlemler gönderirler. Fakat bu işlemlerin blokzincirine işlenme sırası gönderildikleri zamanla doğrudan bağlantılı olmak zorunda değildir.

Gerçekleştirilmek üzere gönderilen işlemler ilk olarak bir işlem havuzuna(mempool) alınırlar ve burada beklerler. Bu işlem havuzu madenciler ve diğer düğümler(node’lar) tarafından anlık olarak görüntülebilir.

İş ispatı(Proof of Work-PoW) yöntemi sonucu verilen görevi en hızlı şekilde yerine getirip kendini kanıtlamış ve sıradaki bloğu eklemeye hak kazanmış madenci, bloğuna yerleştireceği işlemleri havuzdan belli parametreleri gözeterek seçer.

Bu işlem havuzunun içinde A, B, C, D, E şeklinde 5 tane işlemin blokzincire eklenmek için beklediğini varsayalım.

Blok eklemeye hak kazanan madenci, havuzdaki işlemleri inceler ve gas başına gwei cinsinden en fazla ücret ödemeyi kabul eden işlemlere öncelik verir. Çünkü işlem ücretleri doğrudan kendine gider ve blokların kapasiteleri 15 milyon gas ile sınırlı olduğundan her bir gas’lık hacimden maksimum getiriyi elde etmek isterler.

Bugün sen işlemini bloğa yerleştirebil diye çok büyük bedeller ödendi, anlıyorsun değil mi? Bunu sakın unutma, olur mu?

Ethereum Sanal Makinesi(EVM)

Ethereum hesapların sahip olduğu kriptoparaların kaydını tutan bir dağıtık defter olmaktan ötedir. Ethereum üzerinde machine state yani makine durumu saklanır.

EVM’i akıllı kontratlar oluşturma aracılığıyla üzerine uygulama yüklenebilen, yüklenmiş uygulamalar üzerinde değişiklik yapabilen, herkesçe erişilebilen bir makine olarak düşünebiliriz. EVM denen bu makinenin durumu her yeni eklenen blokla değişir ve durumun kaydı Ethereum blokzincirinde saklanır.

EVM’in gerçekleştirebildiği 141 adet OPCODE(operation code) vardır. Bunlar alt seviye, makine düzeyinde operasyonlardır. EVM’i Turing Complete yapan şey işte tam olarak bu operasyonlarla yaptırılabilecek işlemlerin sağladığı sınırsızlıktır.

EVM kodları Ethereum Sanal Makinesi üzerinde yürütülür.

Akıllı Sözleşmeler/Akıllı Kontratlar

Akıllı sözleşme ifadesi Ethereum blokzinciri üzerinde çalışabilen programları ifade etmek için kullanılır. Akıllı kontratlardaki kod tarafından yönetilen, kontrat hesabı olarak geçen hesap türlerinden bahsetmiştik. Akıllı kontrat hesaplarının kendi bakiyeleri vardır ve ağa işlem gönderebilirler. Akıllı kontratlar bir kullanıcı tarafından kontrat oluşturma işlemi gönderilmek suretiyle ağa “deploy” edilirler ve programlandıkları şekilde çalışırlar. İşlem göndererek bu akıllı kontratlarla etkileşime geçmek ve akıllı kontratta tanımlanmış olan fonksiyonları çalıştırmak mümkündür.

Akıllı kontratları işlev itibariyle otomatlara benzetmek mümkündür. Otomata yeterli kaynağı sağlayıp almak istediğiniz ürünü seçerseniz, otomat tabiatı gereği isteğinizi gerçekleştirecektir. Sadece otomatın sahibi aletin içini açıp ürün ekleyebilir. Bu sistemi akıllı kontrat şeklinde ifade etmek mümkündür.

Sadece çikolata satan bir otomat, yukarıdaki şekilde akıllı kontrat olarak ifade edilebilirdi.

İsteyen herkes akıllı kontrat yazıp ağa yükleyebilir. Tek yapmanız gereken nasıl akıllı kontrat dilinde kodlama yapabileceğinizi öğrenmek ve kontratı deploy etmeye yetecek ETH bakiyesi bulundurmak. Deploy etmek de bir işlem olduğundan dolayı(nasıl ki ether transferi için işlem ücreti ödememiz gerekiyorsa) işlem ücreti ödememiz gerekiyor. Hemen canınızı sıkmayın, kendinizi geliştirip bol bol kontrat deploy edebilmeniz için Ethereum test ağları var :)

Ethereum akıllı kontrat yazmak için geliştirici dostu yazılım dillerine sahiptir, bunlar “Solidity” ve “Vyper”dır. Fakat bu dillerle yazılan akıllı kontratların EVM’in anlayabileceği hale gelmeleri için daha ilkel bir hale(EVM bytecode’una) çevrilmeleri gerekir. Bu çevirme işlemine “compile” etmek denir. Compile işlemi sonunda ortaya çıkan bytecode, EVM’deki alt seviye talimatlar olan OPCODE’lar aracılığıyla çeşitli işlemler yaptırır.

Merkeziyetsiz uygulama(decentralized application/dApp) kavramı, kodları Ethereum gibi merkeziyetsiz bir ağda çalışan uygulamalar nitelendirilirken kullanılır. Merkezi sunucularda çalışan uygulamalar(Facebook, Twitter, Instagram vb.) buna yapı olarak zıttır.

Akıllı kontratlar kendi başlarına “Ethereum ağı dışında kalan” verilere erişemezler çünkü HTTP istekleri gönderemezler. Tasarımları bu şekildedir. Yine de oracle adı verilen, çeşitli dış dünya verilerine duyulan ihtiyaçlar için(kriptopara fiyatlarının USD cinsinden değerini öğrenme vb.) hizmet sunan merkeziyetsiz uygulamalar vardır.

Akıllı kontrat ve Web3 geliştiriciliği konusuna ilgi duyan okuyuculara Chainshot, Buildspace ve LearnWeb3 sitelerindeki eğitimleri incelemelerini, ayrıca İTÜ Blockchain Topluluğunun oluşturduğu Solidity Eğitim Serisini izlemelerini tavsiye ederim.

Buraya kadar okuduğunuz için teşekkür ederim. Umarım keyif almışsınızdır. İsterseniz hesaplarımızı takip edebilirsiniz.

Twitter: /0xemremre & /odtublockchain

Kaynaklar:

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

https://github.com/takenobu-hs/ethereum-evm-illustrated/blob/master/ethereum_evm_illustrated.pdf

https://www.preethikasireddy.com/post/how-does-ethereum-work-anyway

--

--