Blok zincirlerinde verilerin kriptografik hash fonksiyonlarından geçirilerek saklandığını biliyoruz. Peki sistem bu hash fonksiyonlarını kullanırken aynı zamanda nasıl hızlı olabiliyor? Bu yazımızda hızı ve güvenliği sağlayan Merkle ağacı (Merkle tree) yapısını detaylı bir şekilde inceleyeceğiz.
Merkle Ağacı (Merkle Tree) Nedir ?
Merkle ağacı kavramı, Ralph Merkle isimli bir bilgisayar bilimcisi tarafından 1987 yılında yayımlanan “ Geleneksel Şifreleme Fonksiyonuna Dayalı Dijital İmza” adlı makalesinde ilk defa bahsedilmiştir. Kriptografik hash sistemini icat eden kişi olan Ralph Merkle’nin soyadı bu yapının adı olarak kabul edilerek günümüze kadar gelmiştir.
Merkle ağacı, hash özetlerini bulunduran şema şeklinde bir veri yapısıdır. Bu veri yapısı sayesinde bir set içindeki verilerin doğruluğu hızlı bir şekilde doğrulanır. Günümüzde blok zincirine blokların eklenmesi durumunda yaşanabilecek sahtecilik olaylarını engellemek amacıyla kullanılmaktadır.
Merkle Ağacı (Merkle Tree) Nasıl Çalışır ?
Çalışma mantığını anlatmadan önce sistemin üzerine kurulduğu kriptografik hash yapısından kısaca bahsedelim.
Kriptografik Hash
Kriptografik hash fonksiyonu, herhangi bir boyuttaki girdiyi (input) alıp sabit boyutlu bir çıktıya (output) dönüştüren fonksiyondur. Elde edilen bu çıktıya hash değeri ismi verilir. Hashlerin boyutu hashleme fonksiyonunun çıktı özelliğine bağlı değişir. Örneğin SHA-256 hash fonksiyonu daima 32 bayt büyüklüğünde çıktılar üretir.
Kriptografik hashleri kısaca tanıdığımıza göre Merkle ağacı sistemini günlük hayattan bir örnekle anlamaya devam edebiliriz. Bu sistemi anlatmak için günlük hayatta genellikle büyük boyutlu dosyaları indirmek için kullandığımız torrent sistemi üzerinden örnek vermek doğru olacaktır. Torrent sisteminde kullanıcılar sistem üzerinde depolanan büyük boyutlu dosyaları küçük boyutlu parçalar şeklinde indirerek sonunda asıl dosyayı indirmiş olur.
Kullanıcıların asıl dosyayı indirdiğini doğrulayabilmesi için de kaynak tarafından “Merkle kökü” adı verilen bir hash kullanıcıya verilir. Bu hash indirilen dosyayı oluşturan tüm parçaların bir temsilidir. Merkle kökü sayesinde indirilen verinin içeriğine bakmadan çok kolay bir şekilde doğrulanabilmesinden dolayı hız için oldukça yararlı bir çözümdür.
Merkle ağacının nasıl çalıştığını daha iyi anlamak için 16 parçaya bölünmüş 16 GB’lık bir dosya örneğini ele alalım. Bu bölünen parçalara A’dan P’ye kadar isim verelim. Sonra parçalı dosyaların her birini bir hash fonksiyonundan geçirelim ve sonuçta 16 farklı hash elde edelim
Bu aldığımız hashler sayesinde dosyaların içerisine bakmadan doğru bilgileri içerip içermediklerini anlayabiliriz. Fakat her bir hash’i tek tek kontrol etmemiz oldukça fazla zaman alacaktır. Bu durumu bir de çok yüksek boyutlu dosyalarda olduğunu düşünün. Kontrol etmenin oldukça zaman alacağı aşikârdır.
Bu verimsiz durum yerine elimizde olan 16 hash’i ikişerli gruplandırarak bu gruplarının hash’ini alalım. Yani hA +hB, hC +hD, hE + hF, hG + hH, hI + hJ, hK + hL, hM +hN ve hO + hP olacak şekilde grupların hashlerini alalım. Bu durumda elimizde 8 adet hash olur fakat hâlâ 8 hash hız için ideal olmadığından elimizde 2 hash kalana kadar çıkan hashleri ikili gruplandırarak hashlerini almaya devam edelim. En sonunda, elimizde kalan iki hash’i de hash’leyerek ana hash’imiz olan Merkle köküne ( ya da kök hash’e) ulaşırız.
En sonda elde ettiğimiz hash indirdiğimiz dosyayı temsil eden Merkle Kökü’dür . Bu hash’i kolay bir şekilde kaynak tarafından verilen hash ile karşılaştırabiliriz. Bu karşılaştırmada iki hash birbiri ile aynı çıkarsa indirdiğimiz dosyanın orjinal dosya olduğunu çok kolay bir şekilde anlamış oluruz. Farklı olması durumunda ise ya indirdiğimiz dosyalarda bir sorun vardır ya da dosyaları indirirken hatalı bir dosya indirilmiştir. Hatalı dosyalarda hatalı hashler oluşturarak en sonda elde ettiğimiz Merkle kökümüzü değiştirmiştir.
Bu merkle ağacı örneğinden de anlayacağınız üzere Merkle kökünü elde etmek için kullandığımız alt hash’lerde herhangi bir sorun olması durumunda direkt Merkle kökümüz değişmektedir. Bu değişim sayesinde de veride yapılabilecek herhangi bir sahtecilik veya eksik dosya indirme gibi durumlarının kolayca farkına varılarak önüne geçilebilir.
Peki Hatalı Olan Hash’i Yani Dosyayı Bulabilir Miyiz ?
Evet hatalı olan hash’i kolay bir şekilde bulabiliriz. Örneğimizde hatalı olan veya değiştirilen hash’i hA olduğunu varsayalım. İlk olarak ana sağlayıcıdan Merkle kökünü oluşturan iki hash’i (hABCDEFGH VE hIJKLMNOP) istememiz gerekiyor. Bizim elimizde olan hIJKLMNOP hash’imiz ile sistemden gelen değerimiz eşleşmesi gerekir çünkü bu alt ağaçta hata yoktur. Fakat hABCDEFGH değerimiz ile sistemin biz verdiği değer eşleşmeyecektir. Bu sayede bu alt ağacı kontrol etmemiz gerektiğini anlamış oluruz. Daha sonrasında hABCDEFGH hash’inin alt merkle grubu olan hABCD ve hEFGH hashlerini sistemden isteriz. Burada ise hEFGH tarafında bir sorun olmadığı için karşılaştırmada doğru çıkarken hABCD farklı çıkacaktır. Farklı olan hABCD hash’i olduğundan dolayı farklı olan dosyanın burada olduğunu düşünerek bu sefer sistemden hAB ve hCD hash’lerini sistemden isteriz. Sistem tarafında verilen hashler ile elimizde olan hash’leri karşılaştırdığımızda sorunun hAB hashinde olduğunu anlarız. Son olark hAB alt hash grubunun hA ve hB hashlerini sistemden isteriz. Sistemden gelen bilgiler ile elimizdeki bilgileri karşılaştırdığımızda hA hash’inin hatalı olduğu buluruz. Hatalı olan dosyayı bulduktan bu dosyayı tekrar indirerek sorunu çözebilirsiniz.
Özetle, bir Merkle ağacı verinin birçok parçaya bölünmesi ve daha sonra bir Merkle kökü oluşturmak için bu parçaların tekrar tekrar hash edilmesiyle oluşturulur. Bu sayede veri parçalarında bir hata olup olmadığı kolay bir şekilde kontrol edilebilir.
Merkle Ağacı ( Merkle Tree) Bitcoin’de Neden Kullanılır?
Merkle Ağacı, Bitcoin teknolojisinde;
- Madencilik
- İşlem Doğrulama
olmak üzere iki farklı şekilde uygulanır.
Madencilik
Bir bitcoin bloğu iki ana parçadan oluşur. Bunlar blok başlığı ve işlem listesidir. Blok başlığında ilgili bloğun meta verisi bulunur. Burada sadece nonce değeri şu an bizim için önemlidir. İşlem listesinde ise o blokta blok zincire eklenecek işlemler yer alır.
Bu ilgili bloğu blok zincirine eklemek isteyen madenci geçerli bir hash değerini bulabilmek amacıyla sürekli bloğu hash eder. Her bloğu hashlemesinde geçerli hash değerini bulabilmek için blok başlığındaki nonce değerini değiştirir fakat bloğun büyük kısmı aynı kalır. Sistem bu hash değerini bulabilmek için binlerce kez bloğu hash etmesi gerekirken sadece değişen veri nonce değeridir.
İşte bütün verileri tekrar tekrar hash etmek yerine bir adet Merkle kökü kullanmak süreci büyük ölçüde kolaylaştırır. Burada madenci işlem listesine dahil etmek istediği işlemlerden bir Merkle ağacı oluşturur. Bu Merkle ağacının kök hash’ini ise blok başlığına koyar. Daha sonrasında madencilik yaparken tüm blok yerine sadece blok başlığı bölümünü hash etmesi yeterli olacağından oldukça hızlı bir şekilde uygun hash değerine ulaşabilir.
Daha sonradan ağ tarafından istenilen hash bulunduğunda ağı bağlı tüm node’lara duyurulur. Node’larda kontrol ettiğinde eğer herhangi bir sorun yoksa blok zincirine eklenir.
Doğrulama
Merkle ağacının ilginç bir özelliği de hafif node’lar (blok zincirin tam bir kopyasını tutmayan nodelar) için oldukça faydalıdır. Bu node’lar sınırlı bir kaynağa sahip üzerinde çalıştığı için tüm blok işlemlerini indirip hash etmez. Bunun yerine ilgili node’ın Merkle İspatı (bir full node tarafından gönderilen ve işleminizin belirli bir blokta bulunduğunu ispat eden kanıt) istemesi yeterli olur. Bu duruma genellikle Basitleştirilmiş Ödeme Doğrulması adı verilir.
ÖZET
1980’lerde ortaya atılan Merkle ağaçları, kullanıldıkları alanda hız, verim ve güvenlik açısında yüksek avantaj sağlar. Merkle ağaçları sayesinde verilerin kolay bir şekilde doğrulanabilmektedir. Bu kolay doğrulanabilme özelliğinden dolayı günümüzde blok zincirleri hızlı ve güvenli şekilde çalışabilmektedir. Bu da bizlere hız ve transfer ücretlerinde oldukça fayda sağlamaktadır. Ayrıca hafif node’lara sağladığı Merkle ispatı sayesinde kullanıcılar işlemlerinin bir bloğa dahil edilip edilmediğini kolay bir şekilde kontrol edebilmektedir.
En son gelişmelerden haberdar olmak için Digicentralized Twitter ve Instagram hesaplarını takip edebilirsiniz.