pyhon交易记录链的实现

接着上篇的内容,这里实现一个交易记录链,废话不多说,先看图:
这里写图片描述
跟之前的逻辑类似,但也有少许不同,这里多了一个payloadhash,以及对payloadhash和prehash的hash,下面看代码实现:

import hashlib
import datetime


# 交易记录类
class DaDaMessage:

    def __init__(self, data):
        self.hash = None  # 自身hash
        self.preHash = None  # 上一个区块hash
        self.data = data  # 交易信息
        self.timestamp = datetime.datetime.now()  # 交易时间
        self.payloadHash = self.payload_hash()  # 交易后的哈希,防止篡改

    #对交易信息进行hash
    def payload_hash(self):
        sha = hashlib.md5()
        datastr = (str(self.data) + str(self.timestamp)).encode("utf-8")
        sha.update(datastr)
        return sha.hexdigest()

    #密封,锁定交易信息
    def seal(self):
        self.hash = self.hash_message()

    #将交易信息和上一个区块密封
    def hash_message(self):
        sha = hashlib.md5()
        datastr = (str(self.preHash) + str(self.payloadHash)).encode("utf-8")
        sha.update(datastr)
        return sha.hexdigest()

    #校验区块信息
    def validate(self):
        if self.hash != self.hash_message():
            raise InvalidateMessage("交易哈希鏈接唄修改")
        if self.payloadHash != self.payload_hash():
            raise InvalidateMessage("交易時間與數據被修改")

    #鏈接區塊
    def link(self,Message):
        self.preHash = Message.hash

    def __repr__(self):
        return "hash:{},preHash:{},data:{}".format(self.hash,self.preHash,self.data)

自定义异常类:

class InvalidateMessage(Exception):
    def __init__(self,*args,**kwargs):
        super(Exception,self).__init__(*args,**kwargs)

编写测试模块:

if __name__=="__main__":
    m1 = DaDaMessage("I love coins 12")
    m2 = DaDaMessage("I love coins 13")
    m3 = DaDaMessage("I love coins 14")
    try:

        m1.seal()
        m2.link(m1)

        m2.seal()
        m3.link(m2)

        m3.seal()

        m1.hash = "0xaaaajjjjj"
        m1.data = "I don't love "

        m1.validate()
        m2.validate()
        m3.validate()

        print(m1)
        print(m2)
        print(m3)
    except InvalidateMessage as e:
        print(e)

查看打印结果:
这里写图片描述
跟上面的逻辑完美契合,然后我们在测试下篡改数据的结果:
这里写图片描述
当然,你也可以尝试不用try…except 看下结果。欢迎对区块链技术感兴趣的小伙伴进群交流学习
区块链技术交流群

猜你喜欢

转载自blog.csdn.net/baidu_17508977/article/details/80525007
今日推荐