python 快速实现区块链 - Go语言中文社区

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端启动
Server启动

client端启动
client
client
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] 比特币维基百科

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/g8433373/article/details/81195058
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-05-07 22:00:12
  • 阅读 ( 2128 )
  • 分类:区块链

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢