Published: 14 Dec 2018 › Updated: 14 Dec 2018

Tinychain源码学习之序
Tinychain源码学习序
Tinychain是一个由python实现的比特币简易版,开发者是James O'Beirne,比特币源码开发维护团队成员之一。Tinychain的代码非常精简,总共一千多行,如果你想我一样不懂C++,又想从源码角度学习比特币,不妨从tinychain入手,理解比特币代码的架构。
快速开始
- 首先,请安装docker和docker-compose,具体步骤自行谷歌。
- 使用git获得tinychain源码:
git clone https://github.com/jamesob/tinychain.git - 确认自己机器上的版本是python3.6(3.6以上也不行)。
- 创建虚拟环境:
virtualenv --python=python3.6 venv && . venv/bin/activate - 进入tinychain目录,安装需要的依赖:
pip install -r requirements.txt - 使用
docker-compose up命令,这会产生两个tinychain节点,同时会出现两个address,把它记录下来,后面收款付款会用到。 - 开启另一个终端窗口,运行
./bin/sync_wallets命令。这个命令作用是将两个容器的tinychian节点初始的钱包信息展示出来。就像这样:
./bin/sync_wallets
Synced node1's wallet:
[2018-12-14 17:27:45,161][tinychain:1109] INFO your address is 1HGpSwYVCpCH52VxCcnNtNgXnHQcQVUyAy
3598.0 ⛼
Synced node2's wallet:
[2018-12-14 17:27:46,906][tinychain:1109] INFO your address is 153Gxg4HNyknpn88Ga9V7a2aArgZxbD6Yw
3751.999994 ⛼
注意:./bin/sync_wallets这个脚本可能会报这样的错误:AssertionError: assert len(string) == curve.baselen, (len(string), curve.baselen)
我把它改了一下,可以顺利运行,供大家参考。代码如下:
#!/bin/bash
docker-compose exec node1 cat wallet.dat > wallet1.dat
echo "Synced node1's wallet:"
./client.py balance --wallet wallet1.dat
echo
node2id=$(docker ps | grep 'node2' | awk '{print $1}')
docker cp ${node2id}:/wallet.dat ./wallet2.dat
echo "Synced node2's wallet:"
./client.py balance --wallet wallet2.dat
- 使用
./client.py balance -w wallet1.dat可以查看wallet1.dat文件对应的钱包信息。ps: wallet.dat实际上存储的是私钥。 - 当我们观察到连续挖到了好几个块,我们可以用wallet1.dat,wallet2.dat这两个钱包进行交易了。使用如下格式命令 :
./client.py send -w wallet2.dat 1898KEjkziq9uRCzaVUUoBwzhURt4nrbP8 1337 - client.py还提供了方法供我们检查交易状态,是否被矿工接受。使用如下命令格式
./client.py status e8f63eeeca32f9df28a3a62a366f63e8595cf70efb94710d43626ff4c0918a8ae8f63eeeca32f9df28a3a62a366f63e8595cf70efb94710d43626ff4c0918a8a是交易的哈希值(client.py还有更多的方法,输入./client.py --help可获取。
tinychain与比特币的不同
- 比特币将数据以字节流的形式存储到leveldb水平数据库中,tinychain只是将数据以json字符串形式存储到文本文件中。
- tinychain的交易方式只有P2PKH这一种,即付款至公钥哈希,也就是Alice付钱给Bob的这样的交易方式。比特币还支持M-N的多重签名交易方案及交易解锁脚本。
- tinychian的创世区块包含了交易信息,而比特币的创世区块没有。
- tinychain的最长链原则:区块数最多的链即为最长链,而比特币则是基于链难度chainwork的,哪条链难度更大,即为最长链。
- tinychain是通过硬编码的环境变量发现相邻节点的,比特币核心客户端则是通过DNS种子发现相邻节点。
- tinychain没有交易费
- tinychain币的最小单位是Belushis而不是Satoshis
大家可以下载tinychain的源码按照上述例子运行测试一下效果,更多的代码分析敬请期待!
Leave Tinychain源码学习之序 to:
Read more #cn posts
Best Posts From derekray
We have not curated any of derekray's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.