BTC : 81910 ₺ ETH : 1.84 ₺ XRP : 45.5 ₺ LTC : 7.7 ₺ USDT : 350.2 ₺ XLM : 0.2388 ₺
  1. Anasayfa
  2. Kripto Para HaberleriBlockchain Haberleri
  3. Blockchain rehberi: Blockchain nedir, nasıl oluşturulur?

Blockchain rehberi: Blockchain nedir, nasıl oluşturulur?

Blockchain rehberi: Blockchain nedir, nasıl oluşturulur?
0

Blockchain nedir?

Blockchain ağında yapılan işlemlerin bloğa kayıt altına alınır ve bloğun kapasitesini doldurunca bir önceki bloka eklenereke herkesin tabini yapabileceği merkezsiz ve şeffaf bir veritabanı sitemi oluşturur. Bu veri sistemine Blockchain (blok zincir) adı verilir.
Blockchain oluşturma zannedildiği kadar zor değildir. Blockchain ya da Türkçe ifadeyle Blok Zincir’in ne olduğunu öğrenmek için öncelikle aşağıdaki yazıya bir göz atınız.

Blockchain nasıl oluşturulur?

Yukarıdaki yazıyı okuduysanız devam edebiliriz. Bu yazıda blockchain’in ne olduğunu çok farklı bir yöntemle öğreneceğiz: kendi blockchain’imizi oluşturacağız! Blockchain oluşturma tabii çok kolay bir işlem değildir. Bunun için en azından bir takım temel teknik bilgi ve altyapıya sahip olmanız gerekiyor.

Şu an burada bu yazıyı okuyorsun, çünkü benim gibi, kripto paraların yükselişi konusunda kafayı yemişsin. Ve blockchain’in nasıl çalıştığını ve arkasındaki temel teknolojiyi bilmeyi arzuluyorsun. Bunun ötesinde Blockchain oluşturma yöntemlerini merak ediyorsun.

Ancak blockchain’i anlamak kolay değildir – ya da en azından benim için değildi. Bol bol videolar izledim, dersler aldım ve genelde hayal kırıklığı yaşadım.

koinmedya_brave

Yaparak öğrenmeyi severim. Bazıları böyledir. Günlerce okur, çalışır fakat hiç birşey anlamaz. Bir kez yapar ve her şeyi kavrar. Ben öyleyim. Konuyu, kod düzeyinde ele almam lazım. Aynı şeyi siz de yaparsanız, bu rehberin sonunda, blokchain’in nasıl çalıştığına dair sağlam bir kavrayışa sahip olacaksınız artı işleyen bir Blockchain’iniz olacak. Blockchain oluşturma noktasında uzmanlık kazanmış olacaksınız.

  • 1 Başlamadan önce…
  • 2 Adım 1: Bir Blockchain Oluşturma
    • 2.1 Temsili Blockchain Oluşturma
    • 2.2 Bir blok neye benzer?
    • 2.3 Bir Bloğa İşlem Ekleme
    • 2.4 Yeni Bloklar Oluşturma
    • 2.5 İş İspatını Anlamak
    • 2.6 Temel İş İspatı Uygulaması
  • 3 Adım 2: Bir API olarak Blockchain’imiz
    • 3.1 Flask Kurulumu
    • 3.2 İşlem Endpoint’i
    • 3.3 Madencilik Endpoint’i
  • 4 Adım 3: Blok zincirimizle etkileşim
  • 5 Adım 4: Fikir birliği (Konsensüs)
    • 5.1 Yeni Düğümlerin Kaydedilmesi
    • 5.2 Konsensüs Algoritmasının Uygulanması

Başlamadan önce…

Bir blockchain ya da blok zincirin, bloklar olarak adlandırılan değişmezsıralı bir kayıt zinciri olduğunu unutmayın. İşlem (transaction), dosya veya istediğiniz herhangi bir veriyi içerebilirler. Ancak önemli olan, hash yöntemleriyle birbirine zincirlenmiş olmalarıdır.

Hash’in ne olduğundan emin değilseniz, buradaki kısa açıklamayı okuyabilirsiniz.

Bu rehber kimleri hedefliyor? HTTP üzerinden Blockchain ile konuşacağımız için temel Python bilgisine sahip olmanız gerek. Ayrıca HTTP isteklerinin (request) işleyişi hakkında biraz bilgi sahibi olmanız gerekir.

Neye ihtiyacınız olacak? Sisteminizde Python 3.6+ (pip ile birlikte) kurulu olduğundan emin olun. Ayrıca, Flask’ı ve Requests kitaplığını yüklemelisiniz:

pip install Flask==0.12.2 requests==2.18.4

Ayrıca Postman veya cURL gibi bir HTTP istemcisine de ihtiyacınız olacak.

Nihai kod nerede? Kaynak kodu burada mevcut.

Blockchain ve HASH

Blok zinciri nedir sorusunu teknik olarak anlamlandırmak için bazı kavramları zihnimizde oturtmamız gerekiyor. Her bir blok -klasik bir zincir gibi- bir öncekine karışmış (hash) olarak devam eder.  Blok zinciri, kullanıcı adresleri ve ilk kullanıcıdan son kullanıcıya kadar  tüm blok hakkında eksiksiz bilgiye sahiptir. Buradaki önemli nokta ise, kaydedilen tüm veriler, şifrelenerek  kopyalamaya ve manipülasyonlara karşı koruma altındadır.

blokzincir-nedirYukarıda bahsettiğimiz sadece bir tablo içindi. Bunun sayıca çok olduğunu ve içerdiği verinin de çok daha komplex olduğunu düşünelim. Bunları kontrol etmek ve güncellemek çok zor. Özellikle de yeni giriş yapmak isteyen çok fazla insan olduğunda.

Buradan yeni bir fikir ortaya çıkıyor. Artık Blok zinciri formlarında yapılan değişiklikler, katılımcıların bilgisayarları tarafından oluşturulmakta. Pc’den elde edilen işlem gücü, hesaplamaları yapmak ve işlemleri doğrulayarak “tablo” nun düzenlenmesine yardımcı oluyor.

Bu işleri hızlandırmak ve benzersizliği korumaya devam etmek için en kolay yol ise, her belgede matematiksel olarak benzersiz bir değer olup olmadığını kontrol etmek olacaktır. Bu da bizi “hash”lara ve hash değerlerine getiriyor.

hash ve blok 2Her bir tabloda sahibinin benzersiz bir sayısal kimliği bulunmaktadır. Parmak izi gibi düşünebilirsiniz bunu.  Tüm gerekli verileri girdiğimiz takdirde, bu, ilk işlem girişi için hash değeri olarak saklanır. Bu değer, tablonun sütunlarından elde edilen bir formülle sürdürülür. Devam eden veri girişleri için aynı formül kullanılır. Sonuç olarak, oluşan bloklar, üretilen gerçek hash değerlerinden oluşan bir zincir meydana getirir.

Ve bir kez daha hatırlatalım, eğer birileri tablolarda önceki girişleri değiştirmeye çalışırsa, başarısız olacaktır. Çünkü bunun için mevcut zincirdeki tüm kayıtların değiştirilmesi gerekir ki bu da imkansızdır.

NOD nedir?

Blockchain ve nodeTürkçe’ye direk çevirdiğimizde düğüm, boğum gibi bir şey çıkıyor. İşlem olarak ise “nod”lar bir blokzinciri ‘nin ayrılmaz parçasıdır. Nodlar, işlemleri doğrulama ve yürütme görevini gerçekleştiren bir istemci kullanır. Bunlar, Blok zinciri ağına bağlandıkları anda o blok zincirinin bir kopyasını otomatik olarak kendilerine alırlar. Nitecede, ağa bağlanan her bilgisayar, ağda yürütülen gerçekleştirilen tüm işlemlerin kayıtlarına ait onaylı bilgileri almış olur.

Tüm nodlar, bildiğimiz internet ağından çok daha başka bir ağ yapısıyla işlem görür. İşleyiş olarak her nod ağa gönüllü katılır ve katıldığı o Blok zinciri ağının bir yöneticisi konumunu alır.

Ağa katılan nodların Bitcoin kazanma veya madencilik yapma şansı olduğunu ekleyelim. Tüm nodlar, sayısal bulmacaları çözmeye ve karşılığını almaya çalışır. Sonuç olarak, yeni blok 5-10 dakika içinde oluşmaya başlar.

Ağdaki her nod, blockchain’in tam bir kopyasına sahiptir. Peki bu nasıl oluyor?

Blok zinciri ve Decentralization (Merkeziyetsizlik)

blokzincirYenilikçi bir teknoloji olan blokzincir, merkeziyetsiz ve hükümetlerden bağımsız olmayı planlanıyordu. Bu durumda, merkeziyetsiz şebekenin, kullanıcıdan-kullanıcıya doğrudan bir yapıda çalışması anlamına geliyor.

Merkezi sistem tek bir otoriteye sahiptir: tüm nodlar tek bir kişinin komutlarını takip etmeli. Ancak merkeziyetsiz sistemde tek bir yetkili yoktur. Birkaç uç nod (mavi) bulunur. Bunlar kendi aralarında bağlantılı olan ikincil nodlara (sarı) bağlıdır.

Blokzincir en yaygın kullanımı kripto para birimini temsil etmektir. Bugüne kadar, hiçbir token ve kripto para merkezi bir otorite tarafından oluşturulmamış veya kontrol edilmemiştir. Bu, kripto para birimlerinin fiyat bazlı finansal modelden birkaç adım öne geçmesine ve merkeziyetsiz kalmasına yardımcı olmaktadır.

Blok zinciri nedir soruna tarihsel cevap: Bizanslı Generaller Çıkmazı

Yukarıda Blok zinciri teknolojisini teknik kavramlarla açıklamaya çalıştık. Blokzincir kavramı, tarihsel bir sorun üzerinden de açıklanabilir: Bizanslı Generaller Çıkmazı.

Birbiri ile rekabet halinde olan 4 General, Bizans İmparatorluğu döneminde güçlü surlarla çevrili bir şehri fethetmek için yola çıkarlar. Her 4 general, birbirinden farklı 4 orduya kumandanlık etmektedir. Her bir ordu şehre yaklaştığında 4 farklı noktada mola verir ve saldırı hazırlığına başlar. Şehrin sakinleri kendilerine yaklaşan tehlikenin henüz farkında değildir. Bizanslıların kuşatmadan galip taraf olarak ayrılmaları için şehre aynı anda saldırmaları gerekiyor. Ancak savaşın kaderini belirleyecek önemli bir sorun vardır. Bu sorun iletişim sorunu.

Generaller birbirleri ile rekabet halinde oldukları için diğerlerinin başarısını istememektedir. Bu nedenle 1’inci ordunun kumandanı “ben saldırıya geçtiğimde diğer taraf saldırmazsa mağlup olurum” düşüncesine sahip. Diğer ordu komutanları da benzer düşüncededir.

1’inci ordu komutanı diğer ordulara bir ulak göndererek iletilişim sorununu çözebilirler ancak ulak diğer ordu generalleri tarafından ikna edilerek ihanete zorlanabilir. Ya da kuşatma altındaki şehir sakinleri ulağı yakalayarak planlarını deşifre edebilir. Bu nedenle Bizanslı Generallerin aynı anda karar verebilecekleri ve diğerlerinin de kararlarını kontrol edebilecekleri bir mekanizmaya ihtiyaçları var. Ayrıca bu mekanizmaya dışarıdan da müdahale edilmemeli. Bu durum ancak Blokzincir teknolojisi ile mümkün.

Blok zinciri teknolojisi ile oluşturulan bir iletişim ağında veri transferi, ancak her düğümden alınan onayla mümkün. Ayrıca blokzincir ağları kırılması imkansıza yakın kriptografi ile korunmaktadır. Ağın manipüle edilmesi için düğümlerin en az yüzde 51’inin kontrol edilmesi gerekiyor.

Adım 1: Blockchain nasıl oluşturulur?

En sevdiğiniz metin editörünü veya IDE’yi açın, kişisel olarak ben PyCharm‘i seviyorum. Blockchain.py adlı yeni bir dosya oluşturun. Yalnızca tek bir dosya kullanacağız, ancak kaybolursanız, kaynak koda her zaman başvurabilirsiniz.

Temsili Blockchain Oluşturma

Constructor‘ı boş bir liste oluşturan (blok zincirimizi depolamak için) bir blok zinciri sınıfı oluşturuyoruz ve bir diğerini ise işlemleri depolamak için kullanacağız. Sınıfımız için hazırlanan tasarı aşağıda belirtilmiştir:

class Blockchain(object):
    def __init__(self):
        self.chain = []
        self.current_transactions = []
        
    def new_block(self):
        # Yeni bir blok oluşturur ve zincire ekler
        pass
    
    def new_transaction(self):
        # İşlem listesine yeni bir işlem ekler
        pass
    
    @staticmethod
    def hash(block):
        # Bloku hash'ler
        pass

    @property
    def last_block(self):
        # Zincirdeki son bloku döner
        pass

Blockchain sınıfımız zinciri yönetmekten sorumludur. İşlemleri depolar ve zincire yeni bloklar eklemek için bazı yardımcı yöntemlere (helper methods) sahiptir. Bazı yöntemleri bulmaya başlayalım.

Bir blok neye benzer?

Her blokta bir dizin (index), bir zaman damgası (Unix zamanında), işlemlerin bir listesi, bir ispat (daha sonra bunun üzerinde daha fazla bilgi edineceğiz fakat iş ispatı yazısına bakabilirsiniz) ve önceki blokun hash’i bulunur.

Tek bir blokun nasıl göründüğüne dair bir örnek:

block = {
    'index': 1,
    'timestamp': 1506057125.900785,
    'transactions': [
        {
            'sender': "8527147fe1f5426f9dd545de4b27ee00",
            'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
            'amount': 5,
        }
    ],
    'proof': 324984774000,
    'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}

Bu noktada, zincir fikrinin zihninizde belirginleşmiş olması lazım. Her yeni blok kendi içinde, önceki blokun hash’ini içerir. Bu çok önemlidir çünkü blok zincirlerin değiştirelemez olmasına neden olur: bir saldırgan zincirdeki bir önceki bloğu bozarsa, sonraki tüm bloklar hatalı hash’ler içerir. Blockchain oluşturma sürecindeki en önemli noktalardan biri budur.

Bütün bunlar size mantıklı geliyor mu? Gelmiyorsa, kendinize biraz daha zaman tanıyın. Eninde sonunda mantığını kavrayacaksınız.

Bir Bloğa İşlem Ekleme

Bloğa işlem (transaction) eklemenin bir yoluna ihtiyacımız olacak. Bunun için new_transaction () yöntemi sorumludur ve oldukça basittir:

class Blockchain(object):
    ...
    
    def new_transaction(self, sender, recipient, amount):
        """
        Kazılacak bir sonraki blok için yeni bir işlem oluşturur.
        :param sender:  Gönderenin adresi
        :param recipient:  Alıcının adresi
        :param amount:  Tutar
        :return:  Bu işlemi gerçekleştirecek blok dizini
        """

        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

New_transaction (), listeye bir işlem ekledikten sonra, işlemin ekleneceği -sonraki işlemin yapılacağı- sonraki bloğun dizinini döndürür. Bu daha sonra, işlemi gönderen kullanıcı için faydalı olacaktır.

Yeni Bloklar Oluşturma

Blockchain’imiz oluşturulduğunda onu bir genesis bloğu ile tohumlamak gerekir. Genesis bloğunun ne olduğunu öğrenmek için bu yazımızı okuyun. Genesis bloğu başlangıç bloğudur ve hiçbir öncülü olmayan bir bloktur. Madencilik sonucu üretilen genesis bloğumuza (veya iş ispatına) bir “kanıt” eklememiz gerekecek. Madencilik hakkında ilerleyen kısımlarda konuşacağız.

Constructor’ımızda genesis bloğunun oluşturulmasına ilaveten new_block ()new_transaction () ve hash () yöntemlerini de inceleyelim:

import hashlib
import json
from time import time


class Blockchain(object):
    def __init__(self):
        self.current_transactions = []
        self.chain = []

        # Genesis blokunu oluşturuyoruz
        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):
        """
        Blockchain içinde bir blok oluşturuyoruz
        :param proof:  İspat "İş İspatı" algoritmasıyla verilir
        :param previous_hash: (Opsiyonel)  Önceki bloğun hash değeri
        :return:  Yeni blok
        """

        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }

        # Mevcut işlem listesini sıfırlıyoruz
        self.current_transactions = []

        self.chain.append(block)
        return block

    def new_transaction(self, sender, recipient, amount):
        """
        Kazılan sonraki bloğa eklenecek yeni işlemi oluşturuyoruz
        :param sender:  Gönderen adresi
        :param recipient:  Alıcı adresi
        :param amount:  Tutar
        :return:  Bu işlemi gerçekleştirecek blok dizini
        """
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

    @property
    def last_block(self):
        return self.chain[-1]

    @staticmethod
    def hash(block):
        """
        Blokun SHA-256 hash değerini oluşturuyoruz
        :param block:  Block
        :return: 
        """

        # Dictionary'nin Ordered olduğundan emin olmalıyız, aksi halde tutarsız hash'ler olur.
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

Yukarıdaki kod gayet açıklayıcı. Temsili blok zincirimizi neredeyse bitirdik. Ancak bu noktada, yeni blokların nasıl oluşturulduğunu ya da çıkarıldığını merak ediyor olmalısınız.

İş İspatını Anlamak

İş ispatı algoritması (PoW – Proof of Work) yeni blokların blok zincirde nasıl oluşturulduğu veya çıkarıldığıyla (madencilik) ilgilidir. Blockchain oluşturma sürecinin önemli adımlarından biridir. PoW’un amacı, matematiksel bir problemi çözen bir numarayı bulmaktır. Numaranın bulunması zor olmalı (Bakınız: Zorluk), ancak hesaplama açısından -ağdaki herkes tarafından- doğrulanması kolay olmalıdır. İş ispatının arkasında yatan temel fikir budur.

İş ispatını (PoW) anlamaya yardımcı olması için çok basit bir örneğe bakacağız.

X tamsayısının hash değerinin başka bir y ile çarpılmasının 0 ile bitmesi gerektiğine karar verelim.

Yani hash (x * y) = ac23dc … 0 gibi bir şey elde edeceğiz.

Bu basitleştirilmiş örnek için x = 5 olsun. Bunu Python’da uyguluyoruz:

from hashlib import sha256
x = 5
y = 0  # y'nin ne olması gerektiğini henüz bilmiyoruz...
while sha256(f'{x*y}'.encode()).hexdigest()[-1] != "0":
    y += 1
print(f'The solution is y = {y}')

Bu örnekte çözüm y=21’dir. Üretilen hash değeri 0 ile bitmiş olur;

hash(5 * 21) = 1253e9373e...5e3600155e860

Bitcoin’de, İş İspatı algoritmasına Hashcash denir. Ve yukarıdaki temel örneğimizden çok farklı değildir. Madencilerin yeni bir blok oluşturmak için çözmeye çalıştıkları algoritma budur. Genel olarak, zorluk bir dizedeki (string) aranan karakterlerin sayısına göre belirlenir. Madenciler daha sonra çözüm için bir koin ile ödüllendirilirler.

, madencilerin çözümlerini kolayca doğrulayabilir.

Temel İş İspatı Uygulaması

Blok zincirimiz için benzer bir algoritma uygulayalım. Kuralımız yukarıdaki örneğe benzer:

Bir önceki bloğun çözümü ile kıyaslandığında, 4 tane 0 ile başlayan bir hash üretilen bir p sayısı bulalım.

import hashlib
import json

from time import time
from uuid import uuid4

class Blockchain(object):
    ...
        
    def proof_of_work(self, last_proof):
        """
        Basit bir İş İspatı algoritması:
        :param last_proof: 
        :return: 
        """

        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1

        return proof

    @staticmethod
    def valid_proof(last_proof, proof):
        """
        İspatı doğrula: hash(last_proof, proof) 4 adet 0 ile başlıyor mu?
        :param last_proof:  Önceki İspat
        :param proof:  Mevcut İspat
        :return:  True if correct, False if not.
        """

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

Algoritmanın zorluğunu ayarlamak için önde gelen sıfırların sayısını değiştirebiliriz. Ama 4 yeterli. Tek bir sıfırın eklenmesinin, bir çözüm bulmak için gereken zamana büyük bir fark yarattığını öğreneceksiniz.

Sınıfımız (class) neredeyse tamamlandı ve onunla HTTP istekleri kullanarak etkileşime geçmeye hazırız.

Adım 2: Bir API olarak Blockchain

Python Flask Framework’ünü kullanacağız. Kendisi bir mikro-framework’tür ve uç noktaları Python fonksiyonlarına eşlemeyi kolaylaştırır. Bu, HTTP istekleri kullanarak web üzerindeki blok zincirimizle konuşmamıza olanak tanır.

Üç metot oluşturacağız:

  • /transactions/new, bir bloğa yeni bir işlem oluşturmak için kullanılır.
  • /mine, sunucumuza yeni bir blok çıkarmasını söyler.
  • /chain, tam bir Blockchain döner.

Flask Kurulumu

“Sunucumuz” blockchain ağımızda tek bir düğüm (node) oluşturacaktır. Kodu oluşturalım:

import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4

from flask import Flask

class Blockchain(object):
    ...

# Düğümümüzü (Node) somutlaştırıyoruz..
app = Flask(__name__)

# Bu düğüm için genel olarak benzersiz bir adres oluşturuyoruz.
node_identifier = str(uuid4()).replace('-', '')

# Blok zincirimizi somutlaştırıyoruz..
blockchain = Blockchain()

@app.route('/mine', methods=['GET'])
def mine():
    return "Yeni blok çıkaracağız"
  
@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    return "Yeni işlem ekleyeceğiz"

@app.route('/chain', methods=['GET'])
def full_chain():
    response = {
        'chain': blockchain.chain,
        'length': len(blockchain.chain),
    }
    return jsonify(response), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Yukarıda eklemiş olduğumuz şeylerin kısa bir açıklaması:

  • Düğümümüzü (node) başlattık. Flask hakkında daha fazla bilgi için burayatıklayın.
  • Düğümümüz için rasgele bir isim oluşturduk.
  • Blockchain sınıfını hazırladık.
  • Bir GET isteği olan /mine endpoint’i oluşturduk.
  • Verileri ona gönderirken bir POST isteği olan /transactions/new endpoint’i oluşturduk.
  • Full blok zincirini döndüren /chain endpoint’i oluşturduk.
  • Sunucuyu 5000 port’undan çalıştırdık.

İşlem Endpoint’i

Bir işlem talebi aşağıdaki gibi görünecektir. Kullanıcının sunucuya gönderdiği şey budur:

{
"sender": "benim adresim",
"recipient": "başka birinin adresi",
"amount": 5
}

İşlemleri bir bloğa eklemek için kullanılan sınıf yöntemimiz zaten olduğundan, geri kalanı kolaydır. İşlem ekleme fonksiyonunu yazalım:

import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4

from flask import Flask, jsonify, request

...

@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    values = request.get_json()

    # Zorunlu alanların POST ile gönderilen verinin içinde olduğunu kontrol ediyoruz..
    required = ['sender', 'recipient', 'amount']
    if not all(k in values for k in required):
        return 'Missing values', 400

    # Yeni işlem oluşturuyoruz
    index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])

    response = {'message': f'İşlem {index} blokuna eklenecektir'}
    return jsonify(response), 201

Madencilik Endpoint’i

Madencilik endpoint’imiz büyünün gerçekleştiği yerdir. Üç şey yapmak zorundayız:

  • İş ispatını hesaplamalıyız
  • 1 adet koin veren bir işlem ekleyerek madenciyi ödüllendirmeliyiz
  • Yeni bloğu zincire ekleyerek çıkarmalı ya da kazımalıyız.
import hashlib
import json

from time import time
from uuid import uuid4

from flask import Flask, jsonify, request
...

@app.route('/mine', methods=['GET'])
def mine():
    # Sonraki kanıtı almak için iş kanıtı algoritmamızı çalıştırıyoruz...
    last_block = blockchain.last_block
    last_proof = last_block['proof']
    proof = blockchain.proof_of_work(last_proof)

    # Kanıtı bulduğumuz için ödül alıyoruz..
    blockchain.new_transaction(
        sender="0",
        recipient=node_identifier,
        amount=1,
    )

    # Yeni bloğu zincire ekleyerek çıkarıyoruz..
    block = blockchain.new_block(proof)

    response = {
        'message': "Yeni blok çıkarıldı",
        'index': block['index'],
        'transactions': block['transactions'],
        'proof': block['proof'],
        'previous_hash': block['previous_hash'],
    }
    return jsonify(response), 200

Çıkarılan bloğun alıcısının düğümümüzün adresi olduğunu unutmayın. Ve burada yaptığımız şeylerin çoğu Blockchain sınıfındaki yöntemlerle etkileşim kuruyor. Bu noktada işimiz bitti ve blok zincirimizle etkileşime geçmeye başlayabiliriz.

Adım 3: Blok zincirimizle etkileşim

Bir ağ üzerinden API’miz ile etkileşimde bulunmak için cURL veya Postman kullanabilirsiniz.

Sunucuyu çalıştırın:

$ python blockchain.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

http://localhost:5000/mine adresine GET talebi göndererek bir blok çıkarmaya çalışalım;

blockchain nedir Blockchain rehberi: Blockchain nedir, nasıl oluşturulur?

http://localhost:5000/transactions/new adresine POST talebi göndererek işlem (transaction) oluşturmaya çalışalım;

Blockchain Oluşturma

Postman kullanmıyorsanız, aynı talebi cURL kullanarak da yapabilirsiniz:

$ curl -X POST -H "Content-Type: application/json" -d '{
 "sender": "d4ee26eee15148ee92c6cd394edd974e",
 "recipient": "someone-other-address",
 "amount": 5
}' "http://localhost:5000/transactions/new"

Sunucumu restart ettim ve 2 tane daha blok çıkararak toplamda 3 blok elde ettim. Şimdi http://localhost:5000/chain adresine istek göndererek zincirin tamamını talep edelim;

{
  "chain": [
    {
      "index": 1,
      "previous_hash": 1,
      "proof": 100,
      "timestamp": 1506280650.770839,
      "transactions": []
    },
    {
      "index": 2,
      "previous_hash": "c099bc...bfb7",
      "proof": 35293,
      "timestamp": 1506280664.717925,
      "transactions": [
        {
          "amount": 1,
          "recipient": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
        }
      ]
    },
    {
      "index": 3,
      "previous_hash": "eff91a...10f2",
      "proof": 35089,
      "timestamp": 1506280666.1086972,
      "transactions": [
        {
          "amount": 1,
          "recipient": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
        }
      ]
    }
  ],
  "length": 3
}

Adım 4: Fikir birliği (Konsensüs)

Bu kısım çok güzel. İşlemleri kabul eden ve yeni blokları çıkarmamızı sağlayan temel bir Blok zincir var. Fakat Blockchain’in bütün çıkış noktası merkezi olmamasıdır. Peki merkezi bir yapı olmadan, tüm düğümlerin aynı zinciri yansıtmalarını nasıl sağlayabiliriz? Buna Konsensüs adı verilir ve ağınızda birden fazla düğüm istiyorsanız Konsensüs Algoritması çalıştırmak zorundasınız.

Yeni Düğümlerin Kaydedilmesi

Bir Konsensüs Algoritması çalıştırmaya başlamadan önce, bir düğümün ağdaki komşu düğümleri bilmesine izin vermenin bir yoluna ihtiyacımız var. Ağımızdaki her düğüm ağdaki diğer düğümlerin kayıtlarını tutmalıdır. Dolayısıyla, daha fazla endpoint’e ihtiyacımız olacak:

  1. /nodes/register: URL biçimindeki yeni düğümlerin listesini kabul etmek için.
  2. /nodes/resolve: herhangi bir uyuşmazlığı çözen konsensüs algoritmasını uygulamak için.

Blok zincir yapıcısını değiştirmeli ve düğümlerin kaydedilmesi için bir yöntem sağlamalıyız:

...
from urllib.parse import urlparse
...


class Blockchain(object):
    def __init__(self):
        ...
        self.nodes = set()
        ...

    def register_node(self, address):
        """
        Düğüm listesine yeni bir düğüm ekliyoruz..
        :param address:  Düğüm adresi. Örneğin. 'http://192.168.0.5:5000'
        :return: None
        """

        parsed_url = urlparse(address)
        self.nodes.add(parsed_url.netloc)

Düğümlerin listesini tutmak için bir set () kullandık. Bu, yeni düğümlerin eklenmesinin eş-kuvvette olmasını sağlamanın ucuz bir yoludur.

Konsensüs Algoritmasının Uygulanması

Belirtildiği gibi, bir çatışma, bir düğümün başka bir düğüme farklı bir zincire sahip olması demektir. Bunu çözmek için, en uzun geçerli zincirin yetkili olması kuralını uygularız. Başka bir deyişle, ağdaki en uzun zincir fiilen geçerlidir. Bu algoritmayı kullanarak, ağımızdaki düğümler arasında fikir birliğine varıyoruz.

...
import requests

class Blockchain(object)
    ...
    
    def valid_chain(self, chain):
        """
        Verilen bir blok zincirin geçerli olup olmadığını belirliyoruz..
        :param chain:  A blockchain
        :return:  True if valid, False if not
        """

        last_block = chain[0]
        current_index = 1

        while current_index < len(chain):
            block = chain[current_index]
            print(f'{last_block}')
            print(f'{block}')
            print("\n-----------\n")
            # Blok hash değerinin doğru olup olmadığını kontrol ediyoruz..
            if block['previous_hash'] != self.hash(last_block):
                return False

            # İş kanıtının doğru olup olmadığını kontrol ediyoruz..
            if not self.valid_proof(last_block['proof'], block['proof']):
                return False

            last_block = block
            current_index += 1

        return True

    def resolve_conflicts(self):
        """
        Bu konsensüs algoritmamızdır. Çatışmaları,
        zincirimizi ağdaki en uzun zincirle değiştirerek çözer.
        :return:  True if our chain was replaced, False if not
        """

        neighbours = self.nodes
        new_chain = None

        # Bizimkilerden daha uzun zincirleri arıyoruz...
        max_length = len(self.chain)

        # Ağımızdaki tüm düğümlerden gelen zincirleri alıp doğruluyoruz:
            response = requests.get(f'http://{node}/chain')

            if response.status_code == 200:
                length = response.json()['length']
                chain = response.json()['chain']

                # Zincirin uzunluğunu ve doğruluğunu kontrol ediyoruz..
                if length > max_length and self.valid_chain(chain):
                    max_length = length
                    new_chain = chain

        # Kendimizinkinden daha uzun ve geçerli zincir bulduğumuzda replace ediyoruz..
        if new_chain:
            self.chain = new_chain
            return True

        return False

İlk yöntem olan valid_chain (), bir zincirin her bir blok boyunca döngü yapılarak geçerli olup olmadığını kontrol etmekten ve hem hash değerinin hem de kanıtın doğrulamasından sorumludur.

resolve_conflicts () komşu düğümlerimiz arasında döngü oluşturan, zincirlerini indiren ve yukarıdaki yöntemi kullanarak doğrulayan bir yöntemdir. Uzunluğu bizimkinden daha büyük olan bir geçerli zincir bulunursa, bizimkinin yerini alır. Bu kısım çok önemlidir. Blockchain oluşturma sürecinin belki de en önemli adımlarından biridir.

İki endpoint’i API’mize kaydettirelim; bir tanesi komşu düğümler eklemek ve diğeri çatışmaları çözmek için:

@ app.route ('/ nodes / register', yöntemler = ['POST'])
def register_nodes ():
    değerleri = request.get_json ()

    nodes = değerler.get ('düğümler')
    düğümler Yok ise:
        return "Hata: Lütfen geçerli düğüm listesi sunun", 400

    düğümlerdeki düğüm için:
        blockchain.register_node (düğüm)

    yanıt = {
        'message': 'Yeni düğümler eklendi',
        'total_nodes': liste (blockchain.nodes),
    }
    dönüş jsonify (yanıt), 201


@ app.route ('/ nodes / resol', yöntemler = ['GET'])
def konsensus ():
    değiştirildi = blockchain.resolve_conflicts ()

    değiştirilirse:
        yanıt = {
            'message': 'Zincirimiz değiştirildi',
            'new_chain': blockchain.chain
        }
    Başka:
        yanıt = {
            'message': 'Zincirimiz yetkili',
            'chain': blockchain.chain
        }

    dönüş jsonify (yanıt), 200

Bu noktada isterseniz farklı bir makine kullanabilir ve ağınızda farklı düğümleri döndürebilirsiniz. Ya da aynı makinedeki farklı bağlantı noktalarını kullanarak işlemleri hızlandırabilirsiniz. Ben makinemde, farklı bir bağlantı noktasında başka bir düğüm oluşturdum ve mevcut düğümüme kaydettim. Böylece, iki düğümüm var:

http: // localhost: 5000 ve http: // localhost: 5001.

blockchain nedir Blockchain rehberi: Blockchain nedir, nasıl oluşturulur?

Sonrasında zincirin uzun olduğundan emin olmak için 2nci düğüm üzerinde yeni bloklar çıkardım. Konsensüs algoritmasının replace edildiği 1nci düğüm üzerinde GET /nodes/resolve komutunu çağırdım.

blockchain nedir Blockchain rehberi: Blockchain nedir, nasıl oluşturulur?

Ve işte tamamlandı! Blok zincirinizi oluşturma yöntemini öğrendiniz! Gidip birkaç arkadaşınızdan blok zincirinizi test etmesini isteyin.

Blokzincir nerede kullanılır?

Dünya ekonomi forumuna göre Blokzincir teknolojisi geleceğin dünyasına damga vuracak 6 trendden birisi. Alman hükümetinin yakın zamanda açıkladığı blockchain strateji belgesine göre blockchain teknolojisinden 5 alandan fayda elde edilecek.  Bu alanların başında finansal sektör geliyor. Blokzinciri teknolojisinin finansal istikrarı arttıracağı ifade ediliyor. Bu fikir Almanya’yı doğrudan blockchain konusunda inovasyon sürecine itiyor. Blokzincir çalışmalarını desteklemek için Almanya projeleri ve reel laboratuarları teşvik edecek. Bu konuda net bir mevzuat çerçevesine ihtiyaç duyulacağı belirtiliyor. Bu teknolojinin yönetim ve idari hizmetlerde de önemli dönüşümlere yön vereceği vurgulanıyor. Alman hükümeti, Blokzincir teknolojisini bilginin aktarımı konusunda da kullanmak istiyor.

Günümüzde birçok teknoloji şirketi, merkeziyetsizliği amaçlayan bu teknolojiyi benimsiyor ve bu konuda şirketlerini dönüştürüyor. Bazı şirketler ürünlerini ve hizmetlerini oluşturmak için Blokzincir kullanmayı başardılar bile. Bununla birlikte, sadece finansal temalı sektörlerin haricinde de bu teknolojiyi uygulanabilir.

Blok zinciri sağlık hizmetleri

Blockchain teknolojisi, çevrimiçi olarak yeni ve kolayca erişilebilen bir kataloglama sistemi sağlayabilir. Hastanın sağlık bilgileri kriptolu olarak şifrelenir ve bir doktor o bilgilere ihtiyaç duyuncaya kadar da güvenli bir şekilde saklanır. Patientory ve Factom gibi bazı şirketler bu şimdiden bu fikri hayata geçirme girişimlerine başladılar bile.

Blok zinciri ve turizm

Birçok ülke turistlerin ilgisini çekmeye çalışıyor. Ve şimdi bunların dikkatlerini çekebilmek için blockchain teknolojisini kullanıyorlar. Bazı şirketler, İsviçre’deki Crypto Valley gibi yerlere, kripto para birimi temalı geziler düzenlemekte. Yine Travala Şirketi turizm hizmetlerinde NEO isimli kripto paranın alt yapısını kullanıyor.

Blok zinciri ve gıda

XYZcan tarafından oluşturulan bir “Gıda Tedarik Zinciri 2.0” block zinciri var. Sensör sistemleri, akıllı sözleşmeler ve blockchain teknolojisinden meydana geliyor. Foodcoin, insanlara, işlem ücretlerinden ve fiyat dalgalanmalarından korkmadan dünya çapında işlemler yapma olanağı veren bir token.

Çin yönetimi gıda ithalatını blokzincir ile takip etmeyi planlıyor. Bu konuda VeChain teknik destek vermek için hazır.

Lütfen Bkz: VeChain projesi Çin resmi ajansında: VET pump mı geliyor?

Blok zinciri ve sosyal hizmetler

2017 yılında, kullanıcılar arasında iletişim becerilerini geliştirmeyi amaçlayan bazı arkadaşlık ICO’larını ve benzeri diğer projeleri biliyoruz. blokzincir tabanı, kullanıcılara erişimi kolay, kullanışlı ve güvenilir bir ortam sağlamakta. Ripple, Coil projesi ile benzer bir oluşum içerisinde

Blok zinciri ve hayır İşleri

Blok zinciri teknolojisi yardım işlerinde de adını duyurmuştur. Kripto para birimleri, bağış yapmanın en hızlı ve en güvenli yollarından biridir. Hele de bazı küçük ülkelere yardım etmek istiyorsanız, -bu en iyi yoldur diyebiliriz. AidCoin veya GiftCoin bunlara en güzel örnekler. Yolsuzluklar, bankalar aracılığıyla dağıtılan devlet yardımlarının itibarını azalttığı için, yardım kurumları, kriptoların potansiyeli ile daha çok ilgileniyorlar.

Blok zinciri teknolojisi ve geleceği 

Blok zinciri için 2019 yılı tam bir dönüm noktası oldu. Çin Komünist Parti Lideri ve aynı zamanda Çin Devleri Başkanı Xi Jinping, Ekim 2019’da Komünist Partini Siyasi Büro toplantısında blockchain teknolojisinin geleceğini ilgilendiren önemli bir karar aldı. Bu kararlar Çin Devlet Politikası haline geldi. Jinping’e göre Blok zinciri teknolojisi geleceğin dünyasına şekil verecek ve reel ekonomide önemli dönüşümlere neden olacak. Çin devletinin ise bu teknolojide dünyada lider konumda olması gerekiyor.

Çin Başkanı Xi Jinping’in açıklamalarından sonra Çin Devleti Blok zinciri çalışmalarını ciddi biçimde desteklemeye karar verdi. Bu politika değişikliğinin devamı niteliğinde Shenzen Borsası Çin’de işlem gören top 50 Blok zinciri şirketi üzerinden oluşturan bir endeks yayınlama kararı aldı. Böylece Çin merkezli blockchain şirketleri hem Çin içerisinden hem de uluslararası piyasalardan önemli derecede fon çekmeye başladı. Ekim ve Kasım 2019 döneminde hem Çin borsalarında hem de Nasdaq’da blockchain şirketleri ciddi değer kazanmaya başladı.

Umarım bu rehber size yeni bir şeyler yaratmak için ilham kaynağı olmuştur. Kripto paralar konusunda çok mutlu ve umutluyum, çünkü Blockchain’in ekonomileri, hükümetleri ve kayıt tutma konusundaki düşüncelerimizi hızla değiştireceğine inanıyorum.

Yazıyı beğendiyseniz ya da eklemek istedikleriniz varsa lütfen yorum yazınız.

Blockchain oluşturma kodunun tamamını buradan indirebilirsiniz.

Lütfen yorum yapınız

E-posta hesabınız yayımlanmayacak.