python区块及区块链的开发详解


Posted in Python onJuly 03, 2019

接着上一篇交易记录整合交易类,这里描述区块的开发。

首先我们要明白一个区块,需要的内容,包括交易记录集合,时间戳,哈希,上一个区块的哈希。明白了这个,下面就容易代码开发了。

import datetime
import hashlib
from Message import DaDaMessage, InvalidMessage
from Transaction import Transaction
class Block:
  #不定参数,*args,区块集合
  def __init__(self, *args):
    self.messagelist = [] # 存储多个交易记录
    self.timestamp = None # 存储多个记录最终锁定时间
    self.hash = None
    self.preHash = None
    if args:
      for arg in args:
        self.add_message(arg)

  def add_message(self, message): # 添加 交易信息
    # 区分第一条与后面多条,是否需要链接
    if len(self.messagelist) > 0:
      message.link(self.messagelist[-1]) # 链接最后一个
    message.seal() # 密封
    message.validate() # 校验
    self.messagelist.append(message)
  def link(self, block): # 区块链接
    self.preHash = block.hash
  def seal(self): # 密封当前hash
    self.timestamp = datetime.datetime.now()
    self.hash = self.hash_block()
  def hash_block(self): # 密封上一块哈希,时间戳,交易记录的最后一个

    return hashlib.sha512(
      (str(self.timestamp) + str(self.preHash) + str(self.messagelist[-1].hash)).encode("utf-8")).hexdigest()
  def validate(self): # 校验
    for i, message in enumerate(self.messagelist): # 每个交易记录校验一下
      message.validate() #每一条交易记录校验
      if i > 0 and message.prev_hash != self.messagelist[i - 1].hash:
        raise InvalidBlock("无效的block,交易记录被修改为在第{}条记录".format(i)+str(self))
    return str(self) + "Ok"
  def __repr__(self):
    return "money block= hash:{},prehash:{},len:{},time:{}".format(self.hash, self.preHash, len(self.messagelist),
                                    self.timestamp)

自定义异常:

class InvalidBlock(Exception):
  def __init__(self,*args,**kwargs):
    super(Exception,self).__init__(*args,**kwargs)

编写测试模块:

if __name__=="__main__":
  t1 = Transaction("yicheng", "ddd1", 100)
  t2 = Transaction("yicheng", "ddd2", 200)
  t3 = Transaction("yicheng", "ddd3", 300)
  t4 = Transaction("yicheng", "ddd4", 400)
  m1 = DaDaMessage(t1)
  m2 = DaDaMessage(t2)
  m3 = DaDaMessage(t3)
  m4 = DaDaMessage(t4)
  try:
    block1 = Block(m1, m2, m3)
    block1.seal()
    #测试篡改数据
    #m3.data = "你妹的直播"
    #block1.messagelist[0] = m3
    print(block1.validate())
  except InvalidMessage as e: #交易记录被修改
    print(e)
  except InvalidBlock as e: #区块被修改
    print(e)

测试结果如下,为了打印需要,我改成了md5格式下的结果:

python区块及区块链的开发详解

篡改区块信息的结果,可能结果不一样,因为修改的内容不一样,报的错误也不一样:

python区块及区块链的开发详解

至此,已经完成了:交易记录,区块的开发,现在进行区块链的开发就比较容易了。实现代码如下:

from Block import InvalidBlock, Block
from Message import InvalidMessage, DaDaMessage
from Transaction import Transaction
# 区块链
class Dada_BlockCoin:
  def __init__(self):
    self.blocklist = [] # 装载所有区块
  def validate(self):#校验所有区块
    for i, block in enumerate(self.blocklist):
      try:
        block.validate()
      except InvalidBlockCoin as e:
        raise InvalidBlockCoin("区块校验错误,区块索引{}".format(i))
  def add_block(self, block): # 增加区块
    if len(self.blocklist) > 0:
      block.link(self.blocklist[-1]) #连接区块
    block.seal()#密封
    block.validate()#校验
    self.blocklist.append(block)#添加到区块链中
  def __repr__(self):
    return "Dada_BlockCoin:{}".format(len(self.blocklist))

自定义异常:

class InvalidBlockCoin(Exception):
  def __init__(self, *args, **kwargs):
    super(Exception, self).__init__(*args, **kwargs)

编写测试模块:

if __name__ == "__main__":
  t1 = Transaction("yicheng", "ddd1", 100)
  t2 = Transaction("yicheng", "ddd2", 200)
  t3 = Transaction("yicheng", "ddd3", 300)
  t4 = Transaction("yicheng", "ddd4", 400)
  t5 = Transaction("yicheng", "ddd5", 500)
  t6 = Transaction("yicheng", "ddd6", 600)
  m1 = DaDaMessage(t1)
  m2 = DaDaMessage(t2)
  m3 = DaDaMessage(t3)
  m4 = DaDaMessage(t4)
  m5 = DaDaMessage(t5)
  m6 = DaDaMessage(t6)
  try:
    yin1 = Block(m1, m2)
    yin1.seal()
    yin2 = Block(m3, m4)
    yin2.seal()
    yin3 = Block(m5, m6)
    yin3.seal()
    # 篡改区块
    #yin3.messagelist.append(m1)
    coin = Dada_BlockCoin() # 区块链
    coin.add_block(yin1)
    coin.add_block(yin2)
    coin.add_block(yin3)
    coin.validate()
    print(coin)
  except InvalidMessage as e:
    print(e)
  except InvalidBlock as e:
    print(e)
  except InvalidBlockCoin as e:
    print(e)

测试结果如下:

python区块及区块链的开发详解

篡改区块链,测试模块区块链的内容,可以任意篡改,测试结果如下:

python区块及区块链的开发详解

这里已经完成了数据层的部分开发,其余部分后续会完善。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
在Python中使用M2Crypto模块实现AES加密的教程
Apr 08 Python
列举Python中吸引人的一些特性
Apr 09 Python
python开发之字符串string操作方法实例详解
Nov 12 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
python3实现字符串的全排列的方法(无重复字符)
Jul 07 Python
python高阶爬虫实战分析
Jul 29 Python
python区块及区块链的开发详解
Jul 03 Python
Python list运算操作代码实例解析
Jan 20 Python
python实现飞行棋游戏
Feb 05 Python
基于Python绘制个人足迹地图
Jun 01 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
python交易记录整合交易类详解
Jul 03 #Python
python交易记录链的实现过程详解
Jul 03 #Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 #Python
python简单区块链模拟详解
Jul 03 #Python
python使用递归的方式建立二叉树
Jul 03 #Python
python挖矿算力测试程序详解
Jul 03 #Python
如何用Python做一个微信机器人自动拉群
Jul 03 #Python
You might like
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python实现的几个常用排序算法实例
2014/06/16 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
在Pycharm中设置默认自动换行的方法
2019/01/16 Python
Python3简单实现串口通信的方法
2019/06/12 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
初中英语课后反思
2014/04/25 职场文书
看上去很美观后感
2015/06/10 职场文书
值班管理制度范本
2015/08/06 职场文书
调解协议书范本
2016/03/21 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server