PHP ile Blockchain (Blokzinciri) yazıyoruz. Bölüm 3: Saklama ve Komut Satırı

Ulugbek Miniyarov
3 min readJun 3, 2018

--

Bu yazı ingilizceden çevrilmiştir. Kod kaynağı:

PHP ile Blockchain:

Bölüm 1: Basit Prototip

Bölüm 2: Proof-of-Work (İş Kanıtı)

Giriş

Şimdiye kadar madenciliği mümkün kılan Proof-of-Work sistemli blockchain’i yazdık. Uygulamamız tam fonksiyonlu bir blockchain’e yaklaştı ama hala önemli eksikleri var. Bugünkü yazımızda bloklarımızı veritabanına saklamayı ve onu yönetmek için ufak bir komut satırı arayüzü yazacağız. Esasında blockchain dağıtık bir veritabanıdır. Şimdilik biz “dağıtık” kısmını es geçelim ve veritabanı kısmına odaklanalım.

Veritabanı Seçimi

Şu anki uygulamamızda veritabanı yok, aksine her çalıştırdığımızda bloklar oluşuyor ve hafızada tutuyor. Blockchain’i tekrar kullanamıyoruz, başkaları ile paylaşamıyoruz. Bunu yapabilmek için diskte saklamamız gerekiyor.

Hangi veritabanına ihtiyacımız var? Aslında herhangi biri. Orijinal Bitcoin makalesinde veritabanı hakkında herhangi bir bilgi verilmemiş, haliyle tamamen geliştiriciye bırakılmıştır. İlk Satoshi Nakamoto tarafından yayınlanan ve bitcoin’e referans olan Bitcoin Core LevelDB (gerçi istemciye 2012 yılında sunulmuştu) veritabanını kullanıyor. Bizim kullanacağımız ise…

PDO ve SQLite

Nedeni;

  1. PDO (PHP Veri Nesnesi) farklı veritabanlarına ulaşmak için basit ve tutarlı arayüz sağlaması
  2. SQLite herhangi bir sunucu gereksinimi olmadan SQL veritabanı oluşturulabilmesi

Bizim ihtiyacımızı karşılayacağını düşünüyorum. SQLite güncel SQL dilinin birçok özelliğini barındırıyor.

Veritabanı Yapısı

Uygulamaya başalamadan önce veritabanı yapısına ve nasıl saklayacağımıza karar verelim. Bunun için de Bitcoin Core’u ele alalım.

SQL benzeri düşündüğümüzde Bitcoin 2 tablo kullanıyor:

  1. blocks tablosu zincirdeki blokların bilgilerini tutar.
  2. chainstate tablosu da zincirin durumunu tutar; harcanmayan işlem çıktıları ve bazı başlık bilgileri.

Ayrıca bloklar diskte farklı dosyada tutulur. Sebebi de performans amaçlı; bir bloğu okumak için tümünü hafızaya yüklememek için. Biz bunu uygulamayacağız.

Daha fazla detay ve açıklama için Bitcoin Core Data Storage sayfasına bakın.

Blok veri yapımızda henüz işlemler (transaction) olmadığı için sadece block tablosu yaratacağız. Bitcoin’de olduğu gibi her bloğu ayrı dosyada tutmak yerine tüm veritabanını tek dosyada tutacağız. Dosya numaraları ile işimiz olmayacak. Blok tablomuzda 3 sütün olacak:

  1. id — her blok eklendiğinde autoincrement id’si
  2. hash — blok hash’i
  3. blok içeriği — serialize edilmiş blok

Veritabanını oluşturmamız için bunlar yeterli.

Serialize

Blok veri yapısını SQL sütünlerine uygulamak yerine tek sütünde tutalım. Bunun için de JsonSerializable arayüzünü kullanalım.

Blok nesnesi için Serialize metodu

Şimdi de veritabanından aldığımızda Blok nesnesine geri dönüştürmek için Deserialize metoduna ihtiyacımız var:

De/Serialize kısımlarını bu şekilde halletmiş olduk.

Saklama

Hadi NewBlockchain fonksiyonu ile başlayalım. Daha önce yazdığımız bu fonksiyon yeni bir Blockchain nesnesi oluşturuyor ve Genesis bloğu ekliyordu. Yapmak istediğimiz ise:

  1. Veritabanına bağlantı kurması
  2. Daha önce veritabanı oluşturulmuş mu
  3. Eğer blockchain varsa
  • Blockchain nesnesindeki son blok hash’ini güncelle

4. Daha önce veritabanı oluşmamış ise

  • Genesis bloğunu oluştur
  • Veritabanına kaydet
  • Blockchain nesnesindeki son blok hash’ini Genesis hash’i ile güncelle

Koda dökülmüş hali:

Bir sonraki güncellememiz gereken ise Blockchain nesnesindeki AddBlock fonksiyonudur. Daha önce sadece diziye ekleme yapan fonksiyonu veritabanına yazacak şekilde güncelleyelim.

Son olarak da tüm blokları veren fonksiyonu yazalım:

Bu kadar! Hiç de zor değil, değil mi?

Komut Satırı

Şu ana kadar uygulamamıza blockchaini güncellememiz için arayüz eklemedik. Şimdi de bunu geliştirelim. İstediğimiz komutlar:

~$ php blockchain.php addblock "Ulugbek'e 10 BTC gönder"
~$ php blockchain.php printchain

Tüm komut satırı fonksiyonlarımız CLI sınıfımız içinde olacak:

class CLI {
/** @var Blockchain */
public $blockchain;
}

Komut satırı çalıştırıldığında çağırılan fonksiyon:

Ve tabiki blockchain.php dosyasını da güncelleyelim:

Gördüğünüz gibi komut satırına verilen komuta bakmadan önce Blockchain nesnesini oluşturuyoruz.

Son olarak da yaptıklarımızı çalıştırarak kontrol edelim:

Böylece Blockchain uygulamamızı saklamış olduk!

Sonuç

Sonraki bölümlerde adres, cüzdan ve işlemleri ele alacağız. Takipte kalın!

--

--

Ulugbek Miniyarov
Ulugbek Miniyarov

Written by Ulugbek Miniyarov

Engineering, Staff @acquia, former Chief Software Architect @enuygun, Creator @lugattj and @zudvpn

No responses yet