python交易记录链的实现过程详解
作者:charles_lun 时间:2022-09-01 19:44:46
接着上篇的内容,这里实现一个交易记录链,废话不多说,先看图:
跟之前的逻辑类似,但也有少许不同,这里多了一个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 = "Idon't love "
m1.validate()
m2.validate()
m3.validate()
print(m1)
print(m2)
print(m3)
except InvalidateMessage as e:
print(e)
查看打印结果:
跟上面的逻辑完美契合,然后我们在测试下篡改数据的结果:
当然,你也可以尝试不用try…except 看下结果。
来源:https://blog.csdn.net/baidu_17508977/article/details/80525007
标签:python,交易记录,链


猜你喜欢
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2024-04-27 16:17:33

MySQL/MariaDB 如何实现数据透视表的示例代码
2024-01-13 16:12:18
简单介绍Python中的struct模块
2023-09-22 16:27:01
Python的Django框架中模板碎片缓存简介
2022-11-20 11:00:28
Go语言题解LeetCode561数组拆分
2023-06-20 22:49:14
JS 函数的 call、apply 及 bind 超详细方法
2024-04-30 10:42:28
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2023-11-22 20:04:41
解决python明明pip安装成功却找不到包的问题
2021-05-21 14:50:40
Python私有属性私有方法应用实例解析
2022-11-08 05:09:03
Kali Linux安装ipython2 和 ipython3的方法
2022-07-16 04:57:52
常用的Git便捷操作合集
2022-02-19 08:16:47
Go语言sync包与锁实现限制线程对变量的访问
2024-02-21 13:52:29
Python类如何定义私有变量
2023-04-18 11:23:23
js中int和string数据类型互相转化实例
2024-05-02 17:25:57
pandas数据预处理之dataframe的groupby操作方法
2022-07-07 19:27:56

解决pytorch 保存模型遇到的问题
2021-12-13 08:26:37
Python中输入和输出(打印)数据实例方法
2021-03-25 22:32:11

Python pip更新的两种方式详解
2022-07-06 20:00:29

基于SQL中的数据查询语句汇总
2024-01-28 07:06:09
Layui 数据表格批量删除和多条件搜索的实例
2024-04-10 10:43:56