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简单实现基于SSL的IRC bot实例
Jun 15 Python
Python实现在线音乐播放器
Mar 03 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
Pandas 同元素多列去重的实例
Jul 03 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
Python实现Selenium自动化Page模式
Jul 14 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
python实现端口转发器的方法
2015/03/13 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python猴子补丁知识点总结
2020/01/05 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
python代码区分大小写吗
2020/06/17 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
联想德国官网:Lenovo Germany
2018/07/04 全球购物
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
个人简历中的自我评价怎么写
2014/01/26 职场文书
教师校本培训方案
2014/02/26 职场文书
经典英文广告词
2014/03/18 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
降消项目实施方案
2014/03/30 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
闪闪的红星观后感
2015/06/08 职场文书
结婚纪念日感言
2015/08/01 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书