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 e8f63eeeca32f9df28a3a62a366f63e8595cf70efb94710d43626ff4c0918a8a
e8f63eeeca32f9df28a3a62a366f63e8595cf70efb94710d43626ff4c0918a8a是交易的哈希值(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的源码按照上述例子运行测试一下效果,更多的代码分析敬请期待!
Can you post in English?
Posted using Partiko iOS
Sorry, I just want to post it on CN node,but I choose multiple nodes.
No problem dear
Posted using Partiko iOS