python区块的开发

接着上一篇交易记录整合交易类,这里描述区块的开发。

首先我们要明白一个区块,需要的内容,包括交易记录集合,时间戳,哈希,上一个区块的哈希。明白了这个,下面就容易代码开发了。

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格式下的结果:
这里写图片描述
篡改区块信息的结果,可能结果不一样,因为修改的内容不一样,报的错误也不一样:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值