Tinychain源码学习之序

in #bitcoin5 years ago (edited)

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的源码按照上述例子运行测试一下效果,更多的代码分析敬请期待!

Sort:  

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

Coin Marketplace

STEEM 0.28
TRX 0.12
JST 0.034
BTC 63582.29
ETH 3267.43
USDT 1.00
SBD 3.93