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.
macOs Sierra 10.12.6 (16G29)
Raspberry PI 1 B+
Ubuntu 16.04 LTS
python 3.6.2
virtualenv
pip
Homebrew ile kurmak işinizi kolaylaştıracaktır.
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
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
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)
source dokuztas/venv/bin/activate
pytest
İ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.
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.
sırada bekleyen txs'lerin merkle root hash'lerini hesaplamak ve block'a eklemek içindir.