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端启动
python 快速实现区块链_第1张图片

client端启动
python 快速实现区块链_第2张图片
python 快速实现区块链_第3张图片
python 快速实现区块链_第4张图片

核心代码讲解

代码结构

  • 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,解决冲突等等

python 快速实现区块链_第5张图片

总结

  • 该项目只是一个初稿,项目中还有很多不完善的地方,后期会慢慢完善,也是刚入门,确实有一定难度,一直认为高并发和去中心化是很难共存的,现在去中心化是可以做到,但是效率很难提高,而效率提升上去了,去中心化问题又很难保证,所以现在很多公司都打着去中心化的名义其实只是有几个超级节点,巨大的中心,哈哈。
  • 最后,读者有问题欢迎留言。

参考资料

[1] 以太坊白皮书

[2] 比特币白皮书

[3] 以太坊源码分析

[4] python 区块链实现

[5] 比特币维基百科

你可能感兴趣的:(区块链)