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 Django框架实现自定义表单提交
Mar 25 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
python 正确保留多位小数的实例
Jul 16 Python
Python列表list常用内建函数实例小结
Oct 22 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
python 字符串格式化的示例
Sep 21 Python
深度学习小工程练习之垃圾分类详解
Apr 14 Python
python opencv将多个图放在一个窗口的实例详解
Feb 28 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设计模式 Proxy (代理模式)
2011/06/26 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
vue组件的写法汇总
2018/04/12 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
python实现2048小游戏
2015/03/30 Python
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
python图像和办公文档处理总结
2019/05/28 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
儿子婚宴答谢词
2014/01/09 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
大学团日活动总结书
2015/05/11 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
Mysql如何查看是否使用到索引
2022/12/24 MySQL