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读写ini文件示例(python读写文件)
Mar 25 Python
简单的编程0基础下Python入门指引
Apr 01 Python
Python中list初始化方法示例
Sep 18 Python
pygame实现弹力球及其变速效果
Jul 03 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
python中 logging的使用详解
Oct 25 Python
python实现列表的排序方法分享
Jul 01 Python
Django ValuesQuerySet转json方式
Mar 16 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
k-means 聚类算法与Python实现代码
Jun 01 Python
Python中有几个关键字
Jun 04 Python
使用K.function()调试keras操作
Jun 17 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 编程安全性小结
2010/01/08 PHP
理解PHP中的stdClass类
2014/04/18 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
Python中返回字典键的值的values()方法使用
2015/05/22 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python图形用户接口实例详解
2019/12/16 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
如何用python处理excel表格
2020/06/09 Python
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
教师求职推荐信范文
2013/11/20 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
大学学风建设方案
2014/05/04 职场文书
师范生求职信
2014/06/14 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
滞留工资返还协议书
2014/10/19 职场文书
1000字打架检讨书
2014/11/03 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis