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 相关文章推荐
Python3 queue队列模块详细介绍
Jan 05 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
python字符串和常用数据结构知识总结
May 21 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
python根据时间获取周数代码实例
Sep 30 Python
关于Tensorflow分布式并行策略
Feb 03 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
python Scrapy爬虫框架的使用
Jan 21 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 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处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
微信API接口大全
2015/04/15 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
javascript表单验证和Window详解
2014/12/11 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
Python数据类型详解(一)字符串
2016/05/08 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
python 实现控制鼠标键盘
2020/11/27 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
给面试官的感谢信
2014/02/01 职场文书
小学生学习感言
2014/03/10 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
电子工程求职信
2014/07/17 职场文书
房产公证书样本
2015/01/23 职场文书
学校运动会加油词
2015/07/18 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书