Blokzincirin Temelleri — 2

Blokzincirin çalışma mekanizmasını anlattığım yazı dizisinin ikincisi, transfer işlemlerinin bloklar içerisinde kayıt edilmesidir.

Faruk Terzioğlu
Blokzincir
6 min readApr 13, 2018

--

Yazılar genel olarak aşağıdaki konuları kapsamaktadır.

Blokların Oluşturulması

Bir önceki yazıda transfer işlemlerinin nasıl dağıtık şekilde tutulduğundan bahsettik. Dağıtık cüzdanı tutan düğümler, bir işlem mesajı aldığında bazı kontroller yapıyor ve uygun olan işlem kaydını defterine yazarak, mesajı diğer düğümlere dağıtmaya devam ediyordu.

Burada çözülmesi gereken diğer bir konu da çift harcama problemidir.

İki kişi arasında transfer yapılırken, gönderici sahip olduğu bir veya daha fazla işlemi, yeni işleme girdi olarak ekliyordu. İşlem mesajını alan düğümler de girdi olarak kullanılan eski işlemin harcanıp harcanmadığına bakıyor.

Burada göz önünde bulundurulması gereken konu, yeni oluşturulan transfer mesajı ağ üzerinde dağıtılırken, farklı düğümlere farklı zamanlarda ulaşıyor olması. “İzin gerektirmeyen açık paylaşımlı” ağlarda düğümler dünyanın farklı farklı yerlerinde bulunmaktadır. Burada meydana gelebilecek olan durum, gönderenin kullandığı bir işlem girdisini diğer bir işlemde de kullanarak ağda yayınlamasıdır. Bu durumda, ağda dolaşan iki farklı işlem mesajı olacaktır ve ikisinde de aynı işlem girdi olarak kullanılmış olacaktır. Mesajlardan birini alan düğüm bunu defterine yazacak ve dağıtmaya devam edecek. Fakat çift harcama yapılmış mesaj da başka düğümler tarafından defterine yazılmış olacak ve ağda dağıtılmaya devam edecektir.

Herbir düğüm işlem mesajını alır, kendi defterini günceller ve mesajı yanındaki düğümlere gönderir.

Eğer bu transfer karşılığında alıcı (Mehmet) bir ürün veya hizmet sunuyorsa, çift harcanan transferlerden kendi adına olanı görüp karşılığında geri alınamaz bir hizmeti(lisans key satışı gibi) karşı tarafa gönderebilir. Fakat diğer harcama ağda daha hızlı dağıtılarak düğümler arasında kabul edilen şeçilebilir. Karşılığında hizmet satılan transfer işlemi ise düğümlere daha sonra ulaşacağı için, çift harcama olarak kabul edilecek ve deftere yazılmayacaktır. Bu durumda satıcı hem ürününden hem de parasından olabilir.

Düğümler bir işlem mesajı aldıklarında bunu defterlerine yazarlar. Fakat bazı düğümlere ilk olarak çift harcama olan ulaşabileceği için onlar da defterlerine bu kaydı yazacak ve ağda iki farklı defter kaydı olacaktır. Bunu engellemek için ağdaki düğümler, işlemleri sırası konusunda mutabakata varmalılar. Bunu sağlamanın yolu da bitcoin blokzincirinde matematiksel bir yarış olarak oyunlaştırılmıştır.

Yapılan transfer işlemlerin sıralı şekilde yapılabilmesi için işlemler kayıt altına alınmalı ve oluşacak defter üzerine tüm ağ mutabık kalmalıdır. Bunun için de transfer işlemlerinden kalıcı olarak kayıt edilmemişleri bir araya toplayarak bunlardan bir blok oluşturmak adına düğümler çalışmaya başlar. Düğümler seçtikleri işlem bilgilerini değiştirilemez bir şekilde bir araya getirilerek (hash ve merkel ağacı) blok içerisine ekler ve yeni oluşturduğu bloğu mevcut blok zincirine ekler. Eklediği bu bloğu diğer düğümlerin kendi blokzincirlerini güncelleyebilmesi için ağ üzerinde yayar.

Fakat yeni bloğun oluşturulması için birden çok düğüm blok oluşturmuş ve ağa yaymış olabilir. Bu durumda ağdaki düğümler, bir sonraki bloğun hangi blok olacağına nasıl karar verecek? Yeni bloğu hangi düğümün oluşturup blokzincire ekleyeceğini belirlemek için düğümler kendi arasında mutabakata varmalılar.

Bitcoin blokzincirinde mutabakat algoritması Emeğin İspatı (Proof of Work — PoW) olarak belirlenmiştir. Düğümler blokzincirine yeni bir blok ekleyebilmek için ortaya koydukları emeği ispat etmelidirler. Bunun yolu da belli bir kriterde hash değeri üretmektir.

Kriptografik hash fonksiyonunda (SHA256) fonksiyon içerisine konulan metne göre birbirinden farklı ama aynı uzunlukta değerler üretilmektedir. Hash i hesaplanacak olan metinde bir karakterin bile değişmesi tamamen farklı bir hash değeri üretilmesine sebep olacaktır.

Hash fonksiyonu sonucunda üretilen değer belli bir kriterde olması gerektiğini belirttik. Hash i alınacak metin(işlemler) aynı olduğu için, farklı hash değerleri üretebilmek adına fonksiyona rastgele oluşturulan bir sayı eklenir (nonce). Bu sayı her seferinde rastgele üretilerek tekrar tekrar hash fonkiyonuna sokulur ve oluşan hash değerinin ilk birkaç karakterinin (değişken sayıda) sıfır olup olmadığı kontrol edilir. Eğer düğümlerden biri bu denemeler sonucunda beklenen kriterlere uygun bir hash değeri bulursa yeni bloğu eklemeye hak kazanır ve yeni yarattığı bloğu, bulduğu nonce değeri ile beraber ağda yayınlar.

Bu beklenen zorluktaki hash değerinin üretilebilmesi için gereken denemeler, standart bir bilgisayar ile bir yılı bulabilir. Fakat ağdaki tüm bilgisayarların denemesi ile yaklaşık olarak 10dk bir blok üretilmektedir. Nonce değerinin üretilmesindeki rastgelelik ile, bir sonraki bloğu kimin üreteceği dengeli bir şekilde dağıtılmıştır ve aynı anda iki kişinin blok ekleme ihtimali de oldukça düşüktür.

Bulunan yeni bloğun, mevcuk blok zincirine eklendiği söylemiştik. Bu zincir ilişkisini sağlamak için, hash fonksiyonuna bir önceki bloğun hash i girdi olarak verilir. Bu sayede oluşan bir bloğun değişmesi de engellenir. Herhangi bir blok içerisinde yapılacak ufak bir değişiklik bloğun hash değerinin değişmesine sebep olacak ve dolayısıyla o bloktan sonra gelen blokların da hash değeri değişecektir.

Herhangi bir bloğa yazılan bir işlem değiştirilmek istediğinde, o bloğun hash değeri baştan hesaplanmalıdır. Blokların içeriklerini hash’lerken bir önceki bloğun hash’i de kullanıldığı için sonraki blokların da hash’i baştan hesaplanması gerekmektedir. Onun için herhangi bir bloğa müdahale etmek isteyen bir kişi en az bir bloğun veya daha fazlasınının hash’ini baştan hesaplamalıdır. Bir bloğu bir pc nin tek başına hesaplaması bir yılı bulabileceği için ve dağıtık olarak hesaplandığında da nonce değerinin rastgeleliğinden dolayı aynı kişinin ard arda iki blok hesaplaması oldukca düşük olduğu için, blokların değiştirilemezliği güven altına alınmıştır.

Blokların bu değiştirilmeye karşı dayanaklığını sayesinde, bir bloğa yazılmış işlem, varlığını kalıcı olarak ispat etmiş demektir. Ağdaki işlem gücünün çoğunu elinde bulunduran biri daha kolay bir şekilde blok içeriğini değiştirip yeni bir blok ekleyebilir olsa da, blokzincirinde geriye gittikçe, yapılan bir değişiklik sonucunda blokların zincirleme olarak değişmesi gerekeceği için, bir transfer işlemi tamamlandığından emin olmak için birkaç blok beklenebilir.

Blokzincirin sürekli bir şekilde çalışabilmesi için düğümler, işlemlerin doğrulanması ve yeni blokların üretilmesi için çalışmalıdırlar. Bir düğümün tek başına yeni bir blok eklemesi oldukça zordur, onun için birçok düğüm eş zamanlı olarak yeni blok eklemek için çalışması gerekmektedir.
Sistemin devamlılığı sağlamak adına düğümleri çalışmaya ikna etmek için bir ödül sistemi getirilmiştir. Yeni bir blok eklemek için gerekli olan hash’i çözen düğüme ödül olarak 12.5 Bitcoin verilmektedir. (~424.000 TL — 25.03.2018). Ödülü elde edebilmek için blok eklemek üzerine çalışan düğüm, bloğun içine ekleyeceği transfer işlemlerinden ilkini kendi adına tanımlar. Eğer gerekli olan nonce değerini bulup ta blok eklemeyi başarırsa kendi hesabına tanımlanmış 12.5 BTC yi ödül olarak alacaktır. Blok ödülüne ek olarak, blok içerisine ekleyeceği işlemlerin ücretini de alır. Bunun için düğümler bloklara ekleyeceği işlemleri seçerken, ücreti yüksek tanımlanmış işlemleri öncelikli olarak seçer. Bir transfer işlemi tanımlarken işlem ücretini ne karar yüksek tanımlarsanız işleminizin blok içerisine dahil olma ihtimali o kadar artar.

Yeni üretilen blok için dağıtılan ödül sayesinde sisteme yeni bitcoinleri girişi sağlanır. Bitcoin blokzincirinde blok ödülleri her 4 yılda bir yarılanacak şekilde ayarlanmıştır. Yarılanmalar sonucunda daha fazla BT üretilmeyecek ve toplamda 21 milyon BTC üretilmiş olacaktır. Blok ödülleri sıfırlandığında blok ekleyen düğümler sadece işlem ücretlerini ödül olarak alacaktır. Blok eklemeye çalışan düğümler, emeklerin ispatı karışılığında (Proof of Work) ödül olarak yeni bitcoinler ürettiği için bu işleme madencilik de denilmekte(Mining).

Blokzincirinin sürekliliği için ağdaki düğümlerin aktif olarak blok eklemesi gerekmektedir. Herhangi bir kişi işlem gücünü çok artırarak veya sisteme daha fazla düğümün dahil olması ile blokların üretilme süresi çok düşebilir. Bunu engellemek için dinamik olarak değişen bir zorluk sistemi getirilmiştir. Üretilen blok hash inin ilk birkaç hanesinin 0 olması gerektiğini söylemiştik. Bu değeri bulabilmek içinde blok içeriğine eklenecek olan nonce değerini bulmak için defalarca rastgele değer üretilmesi gerekmektedir. Yüksek işlem gücüne sahip olan biri hızlı bir şekilde nonce değerini bulup blokları seri bir şekilde eklemesini engellemek için, zorluk seviye değişir ve hash değerinin başında olması gereken sıfırların adeti değişir. Eğer ağdaki işlem gücü artar ve blokların eklenmesi 10dk nın altına inerse sistem otomatik olarak zorluk seviyesi artırır ve blok eklenme süresini 10dk civarına ayarlar. Eğer madencilik yapan düğümler azalır yani ağdaki işlem gücü azalırsa ve dolayısıyla blok eklenme süresi 10dk nın üzerine çıkarsa sistem zorluk seviyesini azaltacaktır. Her iki haftada bir Bitcoin yazılımı tekrar kalibre olarak zorluk seviyesini ayarlar.

Kaynaklar

Bitcoin: A Peer-to-Peer Electronic Cash System
https://bitcoin.org/bitcoin.pdf
How Bitcoin Works Under the Hood?
http://www.imponderablethings.com/
How Does the Blockchain Work?
https://medium.com/@micheledaliessi/how-does-the-blockchain-work-98c8cd01d2ae

--

--