想要了解一样事物,将其拆开重新组装一遍是最快的方式,在动手操作中了解其是如何运作的,了解每个组件的具体作用。本文主要写如何搭建一个区块链实例,源码在这里,是由Daniel van Flymen开发的。详细教程在这里,本文只是快速搭建与运行。
环境
首先你需要一个基本的Linux环境,我仅在WSL Ubuntu上测试过,以下的步骤不保证在其他Linux上兼容但是WSL Ubuntu是一定没问题的。
安装WSL我就不详细写了,网上教程大把,如果配置不来WSL可以参考这篇文章。
系统安装好后你还需要一个http工具,用来进行API交互。
依赖
该项目需要python3.6+并依赖Flask、Requests库。如果不知道系统自带的python版本可以使用此命令查看“python -v
”,ubuntu自带了python3,所以只需要安装Flask和Requests即可:
pip install Flask==0.12.2 requests==2.18.4Copy
如果没有安装pip:
sudo apt install python3-pipCopy
运行
你可以去github下载源码也可以从我的备份站点下载:
#下载源码curl -O https://down.tstrs.me/blockchain/blockchain.py#运行python3 blockchain.pyCopy
显示如下输出就是运行正常:
但如果出现了这样的错误:
可以使用以下命令修复错误并且重新运行即可:
pip3 install flaskCopy
调试
正常运行的话一个完整的区块链就搭建好了。下面的步骤就是如何使用该区块链了。
挖矿
在postman里请求 http://localhost:5000/mine
来挖矿(GET):
交易
创建一个交易请求,请求 http://localhost:5000/transactions/new
(POST):
查看所有区块
使用postman请求http://localhost:5000/chain
可以得到所有区块信息(GET):
共识
到这里我们就已经有一个基本的区块链可以挖矿和接受交易了,但是区块链的系统理应是分布式的,既然是分布式的,那如何使所有的节点链保持一致呢?
首先我们要让它知道与它相邻的节点,每个节点都要保存网络中其他节点的记录。在当一个节点与另一个节点有不同的链时,就会产生冲突,所以就需要制定一个规则:这个网络中最长的链就是最权威的
,使用这个规则在网络中的节点之间达成共识。
注册节点
你可以在另一台机器上再运行节点,也可以在当前机器上不同的端口运行两个实例。我用的方法是后者:
#获取另一个脚本该脚本端口5001.当然你也可以自己复制一份,要修改端口只需要修改blockchain.py文件的最后一行“port=”后的数字即可设置端口 curl -O https://down.tstrs.me/blockchain/blockchain1.pypython3 blockchain1.pyCopy
这样我就有两个节点了http://127.0.0.1:5000
和http://127.0.0.1:5001
,注册一个新节点:
使用postman请求 http://127.0.0.1:5001/nodes/request
(POST):
{"nodes": ["http://127.0.0.1:5000"] }Copy
返回的信息如图所示就是添加节点成功了。
同步
然后我在节点0上挖一些新的块,确保链条更长。之后在节点1上调用一致性算法/nodes/resolve
(GET):
其中短的链被一致性算法取代。
区块链确实蛮好玩的,不过我似乎发现了一个很大的漏洞啊,既然短的链会被长的链替换,假设有人从比特币的创世区块开始硬分叉,并且离线运行到超过当前高度,再入网岂不是就可以替换掉原有链?不过这个算力是无法想象的,在量子计算机出现之前我认为这类数字货币加密货币都是很安全的。
参考资料