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写的windows服务不能启动的问题
Apr 15 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
Python的Flask开发框架简单上手笔记
Nov 16 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
Python中 map()函数的用法详解
Jul 10 Python
Python并发之多进程的方法实例代码
Aug 15 Python
Linux下多个Python版本安装教程
Aug 15 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
python标准库os库的函数介绍
Feb 12 Python
django API 中接口的互相调用实例
Apr 01 Python
python爬虫泛滥的解决方法详解
Nov 25 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
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
JavaScript 高效运行代码分析
2010/03/18 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
Python中index()和seek()的用法(详解)
2017/04/27 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
快速了解Python相对导入
2018/01/12 Python
Python使用functools实现注解同步方法
2018/02/06 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python字典的常用方法总结
2019/07/31 Python
python获取整个网页源码的方法
2020/08/03 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
同程旅游英文网站:LY.com
2018/11/13 全球购物
智能电子应届生求职信
2013/11/10 职场文书
少儿节目主持串词
2014/04/02 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
欠条样本
2015/07/03 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python