冠军
,也是对区块链非常感兴趣,看了一段时间以太坊,比特币源码,感觉大致框架是差不多的,在代码层面上来说,图灵完备
和非图灵完备
感觉就是两者最大的区别之一,下面我按照自己的理解,用python简单的实现了一个区块链,大致700多行代码,可能python真的比较吊吧,所有的加密算法都封装好了,没学过密码学
的表示很爽,下面讲解下实现的过程,基本原理就不说了,可以参考这里。clone
下来:$ git clone https://github.com/MrPaoBrother/blockchain.git
git
的朋友直接下载也是一样的第三方库
安装好:$ sudo pip install pycrypto
$ sudo pip install flask
blockchain_server
目录下找到bootstrap.py
文件:python bootstrap.py
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] 比特币维基百科