PHP ile Blockchain (Blokzinciri) yazıyoruz. Bölüm 1: Basit Prototip
Bu yazı ingilizceden çevrilmiştir. Kod kaynağını buradan inceleyebilirsiniz.
Giriş
Blockchain hala olgunlaşan ve potansiyeli henüz tam olarak gerçekleştirilmeyen 21. yüzyılın en devrimci teknolojilerinden biridir. Özünde, blockchain sadece dağıtılmış bir kayıt veritabanıdır. Ancak onu benzersiz kılan, dışarıya kapalı bir veritabanı değil, herkese açık, kullanan herkesin tam veya kısmi bir kopyasına sahip olmasıdır. Yeni bir kaydın eklenmesi ise diğer sahiplerin de uygun bulmasıyla eklenebilir. Böylece blockchain kripto paraları ve akıllı sözleşmeleri mümkün kılıyor.
Bu makale serisinde, bir blockchain uygulamasına dayanan basitleştirilmiş bir kripto para birimi oluşturacağız.
Blok
“Blockchain” parçasının “blok” kısmı ile başlayalım. Blockchain’de değerli bilgileri saklayan bloklardır. Örneğin, Bitcoin blokları, işlemleri (transaction) saklar. İşlemler herhangi bir kripto paranın özüdür. Bunun yanı sıra, blok içinde bazı teknik bilgileri barındırır, örneğin, sürümü (version), zaman damgası (timestamp) ve önceki bloğun karması (hash) gibi.
Bitcoin’de tanımlanan blok spesifikasyonları yerine önemli verileri tutan basitleştirilmiş bir blok yapısı yazalım. Şöyleki:
$timestamp mevcut zaman damgasıdır (blok oluşturulduğu zaman), $data asıl değerli bilgilerdir, $prevBlockHash önceki bloğun hash değerini saklar ve $hash ise bloğun karma değeridir. Bitcoin spesifikasyonunda timestamp, prevBlockHash ve hash blok başlığını oluşturan veri yapısına sahiptir. İşlemler (bizim kurgumuzda data) ise ayrı bir veri yapısına sahiptir. Ama basit olması amacıyla bizim yapıda tek bir veri yapısında tutacağız.
Peki, hashi nasıl hesaplarız? Hash hesaplanma şekli Blockchain’in en önemli özelliklerinden biridir ve blockchain güvenliğini sağlayan da bu özelliktir. Şöyleki, hash hesaplanma açısından zor bir işlemdir, en hızlı bilgisayarlarda bile biraz zaman alır (Bu sebeptendirki insanlar Bitcoin’e güçlü GPU veya ASIC satın alırlar). Bu, yeni blokların eklenmesini zorlaştıran, eklendikten sonra değişikliklerini engelleyen yapı kasıtlı bir mimari tasarımdır. Bu mekanizmaya sonraki makalede değineceğiz ve uygulayacağız.
Şimdilik, yalnızca blok yapısını alıp birleştirelim ve SHA-256 hash değerini hesaplayalım. Bunu setHash metodunda yapalım:
Akabinde blok oluşturmayı kolaylaştırmak için yardımcı fonksiyon yazıyoruz:
Ve böylece blok oluşturmuş olduk!
Blockchain
Şimdi de bir blockchain yazalım. Özünde blockchain sadece belirli bir yapıya sahip bir veri tabanıdır: sıralı, arkaya bağlı bir liste. Bu, blokların ekleme sırasına göre saklandığı ve her bloğun bir öncekine bağlı olduğu anlamına gelir. Bu yapı, bir zincirdeki en son bloğu hızlı bir şekilde almayı (verimli bir şekilde) ve herhangi bir bloğu hashine göre getirmesini sağlar.
PHP dilindeki array veri yapısını kullanarak ardışık liste olarak blockchaini uygulayabiliriz.
Yeni bir blok eklemek için önceki bir bloğa ihtiyacımız var, ancak blok zincirimizde blok yok! Yani herhangi bir blok zincirinde en az bir blok olmalı. Zincirdeki ilk blok genesis bloğu olarak adlandırılır.
Hadi blockchain yapımızı ve ilk bloğu ekleyecek kodu yazalım:
İşte bu kadar, değil mi?
Şimdi de yazdığımız blockchain uygulamamızın çalıştığını kontrol edelim.
Çıktı:

Bu kadar!
Sonuç
Çok basit bir blockchain prototipi oluşturduk: her bloğu bir öncekine bağlı olan bir dizi. Bitcoin blockchain’i aslında çok daha karmaşıktır. Bizim blockchain’de yeni bloğun eklenmesi kolay ve hızlı oldu, ancak Bitcoin blockchain’inde yeni blok eklemek için uzun süren hesaplama yapılması gerek (bu mekanizmaya Proof-of-Work denir). Blockchain dağıtık bir yapı olduğu için her yeni blok, her katılımcı tarafından onaylanması gerek (bu mekanizmaya konsensüs denir). Ayrıca bizim blockchain’de henüz transaction’lar yok.
Gelecek makalelerde, bu özelliklerin her birini ele alacağız.