python 快速实现区块链
·
区块链快速开发
前言
- 最近区块链越来越火了,前几天跟几个大佬在DoraHacks x BCH Faith Hack 上拿了个
冠军,也是对区块链非常感兴趣,看了一段时间以太坊,比特币源码,感觉大致框架是差不多的,在代码层面上来说,图灵完备和非图灵完备感觉就是两者最大的区别之一,下面我按照自己的理解,用python简单的实现了一个区块链,大致700多行代码,可能python真的比较吊吧,所有的加密算法都封装好了,没学过密码学的表示很爽,下面讲解下实现的过程,基本原理就不说了,可以参考这里。
实战
环境
- MacOs 10.13.2
- vim 8.0
- python 2.7
项目地址
- 先把项目
clone下来:
$ git clone https://github.com/MrPaoBrother/blockchain.git
- 如果没装
git的朋友直接下载也是一样的
安装
- 运行前先把相关的
第三方库安装好:
$ sudo pip install pycrypto
$ sudo pip install flask
运行
- Blockchain Server:
- 进入到
blockchain_server目录下找到bootstrap.py文件:
python bootstrap.py
- Blockchain Client:
- 进入到
blockchain_cli目录下找到bootstrap.py文件:
python bootstrap.py
- 运行成功后,可以看到如下几张图:
server端启动
client端启动
![]()
![]()
核心代码讲解
代码结构
app: 代表下面都是应用,应用间隔离,相关功能都抽象出来放在pyutil中app/blockchain_cli: 客户端,用来测试server端的也就是底层链的,其中block_data存放节点同步过来的数据,domain/dal是数据维护层,读者可以自行添加,作用是防止客户端直接操作数据库,wallet是存放用户钱包地址的目录,用户新建钱包时候会将记录存在该文件中。blockchain_server是区块链服务端,下面的block_data相当于存储的库,写的简单一些方便运行,客户端同步数据就从这里同步。log是存放日志的地方,各个app会有自己的psm(每个app文件中的settings.py文件中可以看到)定义,每个app可以通过log查看状态pyutil是通用类,也就是公共库,一些抽象出来的代码,可以放入这里面
核心函数
def proof_of_work(self):
"""
工作量证明Pow
:return:
"""
last_block = self.chain[-1]
last_hash = self.hash(last_block)
nonce = 0
while self.valid_proof(self.chain[-1].transactions, last_hash, nonce) is False:
nonce += 1
return nonce
def valid_chain(self, chain):
# 1 后一个区块的hash是否等于前一个区块的hash
# 2 每一个区块的随机数nounce是否正确
if not chain:
return False
last_block = chain[0]
current_index = 1
while current_index < len(chain):
block = chain[current_index]
if block.pre_hash != self.hash(last_block):
return False
transactions = block.transactions[:-1]
transaction_elements = ['sender_address', 'recipient_address', 'value']
transactions = [OrderedDict((k, transaction[k]) for k in transaction_elements) for transaction in
transactions]
if not self.valid_proof(transactions, block['previous_hash'], block['nonce'], settings.hard):
return False
last_block = block
current_index += 1
return True
- 下图中
Blockchain就是区块链的核心类,包括注册节点,创建区块,POW,解决冲突等等

总结
- 该项目只是一个初稿,项目中还有很多不完善的地方,后期会慢慢完善,也是刚入门,确实有一定难度,一直认为
高并发和去中心化是很难共存的,现在去中心化是可以做到,但是效率很难提高,而效率提升上去了,去中心化问题又很难保证,所以现在很多公司都打着去中心化的名义其实只是有几个超级节点,巨大的中心,哈哈。 - 最后,读者有问题欢迎留言。
参考资料
[1] 以太坊白皮书
[2] 比特币白皮书
[3] 以太坊源码分析
[4] python 区块链实现
[5] 比特币维基百科
更多推荐


所有评论(0)