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嵌套字典比较值与取值的实现示例
Nov 03 Python
Python+树莓派+YOLO打造一款人工智能照相机
Jan 02 Python
PyCharm代码格式调整方法
May 23 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
浅述python中深浅拷贝原理
Sep 18 Python
python实现一个简单的ping工具方法
Jan 31 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
django如何自己创建一个中间件
Jul 24 Python
pytorch多GPU并行运算的实现
Sep 27 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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
php全局变量和类配合使用深刻理解
2013/06/05 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
详解php的socket通信
2015/08/11 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
JavaScript Archive Network 集合
2007/05/12 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python实现文件复制删除
2016/04/19 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python中协程用法代码详解
2018/02/10 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python中线程和进程有何区别
2020/06/17 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
统计系教授推荐信
2014/02/28 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
跑出一片天观后感
2015/06/08 职场文书
用python自动生成日历
2021/04/24 Python
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA