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,交易记录,链
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
解析Go 中的 rune 类型
2023-09-19 11:59:16
![](https://img.aspxhome.com/file/2023/8/95368_0s.jpg)
scrapy-redis源码分析之发送POST请求详解
2021-05-19 05:24:03
python Django中models进行模糊查询的示例
2023-08-02 05:54:09
python re.match()用法相关示例
2023-07-21 05:12:30
Python处理mysql数据库
2010-12-03 16:23:00
Python Flask前后端Ajax交互的方法示例
2021-09-07 09:09:21
![](https://img.aspxhome.com/file/2023/0/75230_0s.png)
在 Python 中使用 7zip 备份文件的操作
2022-10-01 10:05:56
python多进程 主进程和子进程间共享和不共享全局变量实例
2022-11-05 11:42:56
![](https://img.aspxhome.com/file/2023/1/85261_0s.jpg)
JS中from 表单序列化提交的代码
2023-09-09 22:54:01
Python爬虫防封ip的一些技巧
2022-07-02 20:03:44
![](https://img.aspxhome.com/file/2023/0/76810_0s.jpg)
在ASP中使用类,实现模块化
2008-10-15 14:57:00
Python基于Socket实现的简单聊天程序示例
2022-12-22 09:14:50
![](https://img.aspxhome.com/file/2023/7/78457_0s.png)
Python 绘图和可视化详细介绍
2021-02-16 18:17:31
python环境下安装opencv库的方法
2022-03-22 10:11:24
![](https://img.aspxhome.com/file/2023/0/84930_0s.png)
如何实现固定长度的自动编号?
2010-06-03 10:08:00
CSS Sprites对CSS布局的意义、优点和缺点介绍
2008-07-14 07:22:00
canvas 2d 环形统计图手写实现示例
2023-07-13 16:35:23
![](https://img.aspxhome.com/file/2023/1/55911_0s.jpg)
python高效过滤出文件夹下指定文件名结尾的文件实例
2023-08-03 13:55:13
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2023-09-11 15:11:50
HTML在线编辑器的实现难点
2010-06-26 12:58:00