Build Status

Dokuz taş

Türk geliştiriciler arasında blockchain'in (blockzinciri) daha iyi anlaşılabilmesi için kodlanmıştır. Sorularınız için Github'ın issues'ını kullanabilir ya da direkt twitter@onurgil ile bana ulaşabilirsiniz.

Versiyonlar

0.0.1

Kurulum ve test

Test edilen cihazlar

macOs Sierra 10.12.6 (16G29)
Raspberry PI 1 B+
Ubuntu 16.04 LTS

Kurulum ihtiyaçları

python 3.6.2
virtualenv
pip

Homebrew ile kurmak işinizi kolaylaştıracaktır.

Kurulum

git clone https://github.com/onuar/dokuztas.git
cd dokuztas
virtualenv -p python3 dokuztas/venv
source dokuztas/venv/bin/activate
pip install -r requirements.txt

Demo (Public nodes)

source dokuztas/venv/bin/activate
python dokuztas/nas.py
python noderunner.py -p 5002
python noderunner.py -p 5003 -m 1
python noderunner.py -p 5004 -m 1

5003 ve 5004 miner olarak görev yapıyor (-m parametresi). 5003'ün ve 5004'ün farklı konfigürasyonlara sahip bilgisayarlar olma durumunu test edebilmek için, dokuztas.blockchain.Blockchain.mine metodundaki Hardware spec simülasyonu section'unu açabilirsiniz. Fakat unit test'ler çalıştırılırken, kapatılması unutulmamalıdır.

Postman kullanıyorsanız, postman_queries.json dosyasını import ederek direkt test etmeye başlayabilirsiniz.

ya da

curl -d '{"tx":"1 Turkcoin from A to B"}' -H "Content-Type: application/json" -X POST http://127.0.0.1:5002/add

Demo (Ledger ve mining)

source dokuztas/venv/bin/activate
python
>>> from dokuztas.blockchain import Blockchain, PendingBlock
>>> chain = Blockchain()
>>> chain._generate_genesis()
>>> new_block = PendingBlock()
>>> txs = ['Barış, Fırat\'a 100 coin gönderdi',
            'Fırat, İrgin\'e 50 coin gönderdi',
            'İrgin, Mert\'e 25 coin gönderdi',
            'Mert, Onur\'a 12,5 coin gönderdi',
            'Onur, Özgen\'e 6,25 coin gönderdi',
            'Özgen, Uğur\'a 3,125 coin gönderdi']
>>> new_block.add_txs(txs=txs)
>>> def always_run():
        return False
>>> chain.mine(pending_block=new_block, stop_mining_check = always_run)

Testleri çalıştırmak için

source dokuztas/venv/bin/activate
pytest

Açıklamalar

node.mine()

İlk mine işleminin tetiklenmesi, 10 tx'in eklenip, 11. tx'in gelmesi ile başlamaktadır. Bu işlem tamamlandığında, sırada bekleyen block'lar varsa bunlar mine edilir, yoksa bekleyen txs'ler mine edilmeye başlanılır. Her bekleyen 10 tx, 1 block'un içine eklenerek bekletilir. Örn:

25 tane tx eklenmişse, 10'ardan iki tane block ve 5 tane tx bekletilir. İlk olarak block'lar mine edilmeye başlanılır.

blockchain.calculate_merkle(txs)

Root hash'i hesaplamak için her bir ikili elemanın hash'i alınır, bunlar ayrıca hashlenir. Eğer listedeki eleman sayısı tek sayı ise, sonuncu elemanın hash'i ayrıca hesaplanır. Çıkan hash'ler aynı fonksiyona parametre olarak tekrar gönderilir. Örn:

3 txs varsa 3. elemanın hashi ayrı hesaplanır, ilk iki elemanın hash'leri ayrı hesaplanır. hash_list'te iki tane hash olmuş olur. Bu iki hash'in de hash'lerinin hesaplanması için, fonksiyon tekrar çağırılır. 2 txs varsa, iki txs'in hash'leri hesaplanır ve bu hash'ler birleştirilerek tekrar hash alınır. Sonuç olarak elde tek hash vardır ve bu root hash olarak geri döndürülür.

blockchain.mine()

sırada bekleyen txs'lerin merkle root hash'lerini hesaplamak ve block'a eklemek içindir.

Yol haritası

Eklenecek özellikler