Ethereum durum(state)mimarisi ve merkle/patricia ağaç yapısı üzerine

doğa özcan
6 min readMay 24, 2019

--

Merhabalar, bugun medium üzerindeki ilk yazım. Bu yazımda Ethereum mimarisinden bahsedeceğim, ayrıca Ethereum üzerindeki ağaç yapılarına değineceğim, sonrasında Merkle ağacı üzerine biraz yoğunlaşıp bu konudaki yorumlarımı aktarmaya çalışacağım. Yazımdaki kaynaklar yeni basılan kitabım olan “blokzincir mimarisi ve merkezi olmayan uygulamalar” ‘dandır. Kitabım Pusula yayıncılıktan çıktı, içerisinde teorik ve pratik bir çok bölüm mevcuttur, detaylı türkçe kaynak olarak başvurabilirsiniz. Dönem dönem blokzincir, Aws mimarisi ve web servisleri hakkında yazıları paylaşmayı planlıyorum. Bugun bu paylaşımların ilkine Ethereum mimarisi ile başlıyorum. Bir sonraki bölümde ise Stellar ve akıllı sözleşmeler üzerine konuşmayı düşünüyorum, sözü fazla uzatmayayım.

Ethereum tasarım prensipleri

Ethereum platformu basitlik, evrensellik, modüler olma, ayrım gözetmeme, çeviklik gibi prensipler üzerine inşa edilmiştir. Bu maddelerin detayları aşağıdaki linkte yer almaktadır.

https://ethereumbuilders.gitbooks.io/guide/content/en/design_rationale.html

Ethereum platformunda durum (state) kavramı

Bitcoin blokzincirindeki tasarım tamamen durumsuzluk (stateless) üzerine kurulmuştur, verilerin saklama alanları tek tiptir ve bloklar üzerindedir, depolama için levelDb kullanılır, depolama için farklı hiçbir özel yapı kullanılmaz ancak Ethereum tasarlanırken mimari değişmiştir ve durum tutan (stateful) yapı tasarlanmıştır. Bitcoin blokzincirinde harcanmamış işlem çıktısı (Unspent Transaction Output) üzerinden bitcoin bakiyesi hesaplanır, herhangi bir bakiye değeri tutulmamaktadır ancak Ethereum üzerinde hesap bakiyeleri bir ağaç yapısı üzerinde tutulur ve her blok güncellemesi yapıldığında eğer hesap ile ilgili bakiye değişimi olmuş ise blok içerisindeki kök (root) hash değerinden ağacın ilgili dalı bulunur ve ilgili hesap bakiyesi güncellenir, Ethereum platformunun bu durum tutan yapısı, akıllı sözleşme verilerinin ve bakiyelerinin bloklar içerisinde tutulmamasına ve Merkle/Patricia diye adlandırılan özel bir ağaç yapısı içerisinde tutulmasını sağlamıştır.

Ethereum üzerinde verilerin tutulması ve genel bir Merkle ağaç yapısı değerlendirmesi

Ethereum platformunun durum (state) tutan yapısından bahsettik, tasarım itibariyle bloklar ve işlemler yine mevcuttur. Ethereum sanal makinesi, madencilerin akıllı sözleşmeleri blokzincir ağında yaygınlaştırmasına olanak verir, paydaşların kendi aralarında ethereum gönderebilmesi hem gerçek ethereum hesapları hem de akıllı sözleşme hesaplarıyla yapılabilmektedir. Kitabımın önceki bölümlerinde, bitcoin blokzincirindeki hesapların bakiye değerlerinin bloklar içerisinde tutulduğuna değindik, Ethereum üzerinde farklı bir tasarım mevcuttur. Bu tasarım 3 ayrı Merkle/Patricia ağacına dönüştürülmüştür.

1) Durum (state) ağacı

2) Receipt log (receipts) ağacı

3) İşlem (transaction) ağacı

Aşağıda görünmeyen ve doğrudan blok içerisinde refaransı bulunmayan, her blok içerisinde değeri güncellenen bir ağaç yapısı daha mevcuttur, bu ağaç depo (storage) ağacıdır ve referansı durum(state) ağacının içerisinde mevcuttur. Bu konuya bir sonraki adımda değiniyor olacağız.

Ethereum blok ve ağaç referansları

Merkle ağacı

Merkle ağacındaki mantık şudur: İşlemlerin hash değerleri alınır ve bu değerler ağacın yapraklarına eklenir ve her yaprağın eşlenik yaprak ile hash değeri alınıp üst dallara iletilmesi ile sonunda kök değeri elde edilir bu eşsiz bir hash değeridir. Merkle ağacında işlem (transaction) değerleri yer almaz sadece hash değerleri bulunur.

Aşağıdaki şekilde en aşağıdaki sıra orjinal işlemleri, bir üstteki sıra ise işlemlerin hash değerlerini belirtir ve işlemlerin orijinal değerleri blok içerisinde saklanmaktadır ve bu şekilde düşük boyutlu bir arama simülasyonu elde edilmektedir.

Merkle ağacı simülasyonu

işlemlerin teker teker hash değerleri alınır ve ağacın en alt sırası oluşturulur. Sonrasında ise eşlenik olarak kendi kardeşi olan hash değeri ile birleştirilip yine bir hash değeri elde edilir, bu hash değeri bir üst düğüme eklenir, sonraki mekanizma da aynı şekilde devam eder ve sonucunda en üst düğümde bir hash değerine ulaşılır ve bu değer Merkle hash root olarak blok header yapısı içerisinde saklanır. Bu şekilde, blok içerisindeki işlemlerin bütünlüğünün sağlanabilmesi ve hızlı doğrulanabilmesi için bir algoritma kurulmuş olunur.

Yukarıdaki şekilde işlemlerin hash değerleri alınıp ağaca eklenmiştir ve en alt soldaki işlemin(yeşil blok) blok içerisinde olup olmadığına bakmak istiyoruz, biliyoruz ki blok boyutu 2 mb büyüklüğe kadar çıkabiliyor ve bu verinin hepsini indirmek mantıksız, halbuki aşağıdaki ağaç ile ihtiyacımız olan veriler sadece bordo renkli olanlar;

· Alttan ikinci işlemin hash değeri; hash-2

· 3. ve 4. işlemlerin hash değerleri olan hash-34’ dür

Bu verileri kendi aradığımız işlemin hash değeri ile işleme soktuğumuz zaman elde edeceğimiz hash değeri Merkle root hash değeri olan hash-1234 değerine eşit ise işlemimizin bu blok içerisinde olduğunu anlayabiliyoruz.

Peki neden tüm işlemlerin hash değerlerini teker teker alıp elde ettiğimiz string değerin tekrar hash değerini alıp kök hash değerini elde etmiyoruz da bunu bir ağaç yapısı ile yapıyoruz? Sebebini aşağıdaki şekil ile açıklayalım. Aşağıdaki yapıda tüm işlemlerin hash değerini aldık ve ilk işlemin doğrulamasını istiyoruz, ancak kök değerine erişmek için diğer tüm işlemlerin hash değerine ihtiyacımız var. Aşağıdaki şekilde kök hash değeri için; hash2, hash3, hash4 değerlerine ihtiyacımız var ve bir blok içerisinde işlem sayısının fazlalığı düşünüldüğü zaman bize neredeyse işlem doğrulama için işlem sayısı kadar hash değeri gerekecektir. Halbuki dengeli bir Merkle ağacı ile bu sorun çok az sayıda hash değeri ile çözülebilmektedir.

Merkle kaynakça 6

Merkle ağacına değindikten sonra şimdi Ethereum platformunda bu ağaç yapılarıyla nasıl veri tutulabildiğine değinelim, Ethereum durum (stateful) yapısı için Merkle-Patricia ağaçlarını kullanır. Hesapların ethereum bakiyeleri için farklı ağaç, akıllı sözleşmelerdeki global veri tiplerinin tuttuğu değerler için farklı ağaç mevcuttur.

Aşağıdaki şekilde ethereum hesap bakiyelerini nasıl tuttuğunu görebiliriz. Aşağıdaki şekil Vitalik Buterin’in kendi blok yazısından alıntıdır ve linki kitabımda referans olarak paylaşılmıştır. Bloklar sadece Merkel-Patricia ağacı için kök hash değerini tutar, verilerin kendisi için ayrı bir veritabanı ağaç yapısı vardır. Şimdi simülasyonu yapalım; ilk blok içerisinde Doğa’ nın 3 ethereum bakiyesi olsun daha sonra blokzincire bir blok daha eklensin ve burada Doğa’ya 2 ethereum gönderimi daha olsun, işlemin hash değeri blok üzerinde ve artık kesinlikle değiştirilemez ancak o blok içerisindeki kök hash değeri ile ağaca ulaşırız ve Doğa’ nın ethereum bakiyesini işarete eden dal (branch) değerini veritabanından güncelleriz ve artık Doğa’nın bakiyesi 5 ethereum olarak güncellenir.

Ethereum bakiye ağacı — Vitalik Buterin ‘ e ait şekil, kaynakça 5

Ethereum üzerindeki blokların header değerlerine bir göz atalım. Bu değerlere github kodlarından erişebiliriz. Linkimiz şu şekildedir:

https://github.com/ethereum/go-ethereum/blob/master/core/types/block.go

Blok başlık, kaynakça 6

Blok içerisinde Difficulty; blok zorluk derecesidir. GasUsed; blok içerisindeki işlemlerin harcadığı toplam gas miktarıdır. GasLimit; bloğun alabileceği maksimum işlem gas miktarına eşittir. Nonce; çifte harcamayı önleyen kontrol sayacıdır.

Aynı şekilde akıllı sözleşmelerin verileri de bu Merkle/Patricia ağaç yapısında tutulur. Öncelikle bu durum(state) ağacıdır (bu key-value yapıdadır) ve bu ağaç içerisinde başka bir depo (storage) ağacına işaret eden bir referans değeri bulunur, çünkü akıllı sözleşmelerde, gerçek kişiler gibi ethereum adresi tutarlar ve bu referans yapısı sayesinde kendi içlerinde tuttukları verileri güncelleyip erişebilirler.

Aşağıdaki yapıda blok üzerindeki stateRoot hash değeri bir başka Merkle/Patrica ağacına işaret ettiği görülmektedir, buradaki key-value yapıda adrese ait bazı bilgileri tutarız. Ethereum platformu üzerinde her address tipine karşılık, depolama alanları mevcuttur ve her address tipine ait bakiye tutan kalıcı bir alan mevcuttur.

Aşağıdaki yapıda her ethereum adresine karşılık gelen verileri state (durum)ağacı altında gösterdik, key değeri bir adrestir, value alanı da nonce, balance, storageRoot ve codeHash alanlarını tutar, burada en önemlisi bir başka ağaca işaret eden değeri tutan storageRoot değeridir. Burada storage (depo) Merkle/Patricia ağacının referansını tutarız ve oradan ilgili uzaydaki verilerimize erişiriz. Tasarım mantığı Amazon web servislerdeki sanal makineler gibidir, her makine belli kaynakları ortak, eşit ve demokratik şekilde kullanır ama her sanal makinenin verisi özeldir ve asla diğer sanal makinelerin verileriyle karıştırılamaz.

Durum ağacı ve depo ağacına referans

Durum ağacı ise aşağıdaki gibi storage (depo) ağacına işaret eder, bu ağaç finansal işlemler dışındaki akıllı sözleşme işlemlerine ait veri tutma fonksiyonuna da yön vermektedir, örneğin akıllı sözleşmeler ile çalışan bir biletleme uygulaması yaptınız ve müşteri bilgilerini tutmanız gerekiyor işte bu veriler bu ağaç yapısı üzerinde bulunur.

Depo ağacı ve veriler

Ethereum üzerindeki blokların boyutunun bitcoin blokzincirindeki gibi sabit olmadığını belirtmiştik, blok içerisine ne kadar işlem sığdırılacağı bilgisi gasLimit değeri ile belirlenmiştir. Bitcoin bloklarından farklı olarak ve yukarıdaki mimariye ek olarak, gasLimit ve blok içerisindeki kullanılan gas değerini tutan gasUsed alanları bulunmaktadır.

--

--