基于Python实现的默克尔树
默克尔树常见的结构是二叉树,但它也可以是多叉树,它具有树结构的全部特点。 默克尔树的基础数据不是固定的,想存什么数据都可以,因为它只要数据经过哈希运算得到的哈希值。 默克尔树是从下往上逐层计算,每个中间节点是根据相邻的两个叶子节点组合计算得出的,而根节点是根据两个中间节点组合计算得出的,所以叶节点是基础。因此,底层数据的任何变动,都会传递到其父节点,一直到树的根节点。
默克尔树是区块链技术中用于保障数据不被篡改的重要安全手段之一,有着非常重要的作用。以下例子演示了通过遍历的方式构建默克尔树,并计算和显示每个步骤的哈希值。
import hashlib #用于哈希值计算 #默克尔树节点类的定义 class MerkleNode(object):def __init__(self,left=None,right=None,data=None):self.left = leftself.right = right# data中保存着哈希值self.data = data#以递归的方式构建默克尔树 def createTree(nodes):list_len = len(nodes)if list_len == 0:return 0else:while list_len %2 != 0:nodes.extend(nodes[-1:])list_len = len(nodes)secondary = []#两两合并节点,并计算其哈希值for k in [nodes[x:x+2] for x in range(0,list_len,2)]:d1 = k[0].data.encode()d2 = k[1].data.encode()md5 = hashlib.md5()md5.update(d1+d2)newdata = md5.hexdigest() node = MerkleNode(left=k[0],right=k[1],data=newdata)secondary.append(node)if len(secondary) == 1:return secondary[0]else:return createTree(secondary)#利用广度优先搜索算法对节点数据进行遍历 def BFS(root):print('开始广度优先搜索,构建默克尔树...')i=0queue = []queue.append(root)while(len(queue)>0):e = queue.pop(0)i+=1#print("Hash Value:"+str(i),e.data)if e.left != None:queue.append(e.left)if e.right != None:queue.append(e.right)print("Hash value:"+str(i),e.data)if __name__ == "__main__":blocks = ['node1','node2','node3','node4'] #示例数据,包含4个节点nodes = [] #节点初始化print("节点哈希值:")for element in blocks: #遍历示例数据md5 = hashlib.md5() #摘要算法md5.update(element.encode())d=md5.hexdigest() #计算节点的信息摘要nodes.append(MerkleNode(data=d)) #添加至默克尔树节点中print(element+":",d)root = createTree(nodes) #创建默克尔根节点BFS(root) #基于BFS算法构建默克尔树并输出所有的哈希(摘要)
运行截图如下:
基于Python实现的默克尔树相关推荐
- 默克尔树_默克尔树:正在使用中
默克尔树 Ralph C. Merkle (not pictured above), born 1952, is one of the founding fathers of Public Key C ...
- Merkle Tree(默克尔树)原理解析
Merkle Tree(默克尔树)原理解析 一.Merkle Tree 1.1 Merkle Tree的特点 二.Hash list 三.Merkle tree VS Hash list 四.Merk ...
- 默克尔树(Merkle Tree)总结
目录 为什么要有默克尔树 简介 Merkle Tree的特点 图解 创建树 检索-文件夹比较 检索-防伪 更新 插入删除 应用 数字签名 P2P网络 可信计算 区块链-简单验证支付 为什么要有默克尔树 ...
- 6.tendermint默克尔树
默克尔树概述 在ABCI应用响应Commit请求消息时,需要计算并返回当前状态的哈希,以便Tendermint 将其打包到下一个区块头里(app_hash字段). 但是,如果我们还按原来的方法计算一个 ...
- 默克尔树在区块链中的应用
1 MT(Merkle tree) 默克尔树是一种哈希二叉树,1979年由Ralph Merkle发明.与标准二叉树一样,由一组叶节点,一组中间节点和一个根节点构成.叶节点包含存储数据或其哈希值,中间 ...
- tendermint 六:默克尔树
默克尔树概述 在ABCI应用响应Commit请求消息时,需要计算并返回当前状态的哈希,以便Tendermint 将其打包到下一个区块头里(app_hash字段). 但是,如果我们还按原来的方法计算一个 ...
- 区块链杂谈---默克尔树(Merkle Tree)解析
相信了解区块链的人对默克尔树并不忙陌生,在区块链里被广泛的应用,下面我们来了解下它的算法. Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储has ...
- 147_Merkle(默克尔)树简单理解
Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点.若干中间节点以及若干叶节点组成. 结构示例图: 默克尔树的所有叶子节点,都用来存放数据.所有非叶子节点,都用来存放其所有孩子 ...
- 区块链学习1:Merkle树(默克尔树)和Merkle根
☞ ░ 前往老猿Python博文目录 ░ 一.简介 默克尔树(Merkle tree,MT)又翻译为梅克尔树,是一种哈希二叉树,树的根就是Merkle根. 关于Merkle树老猿推荐大家阅读<M ...
最新文章
- php经典操作,php数组的经典操作(遍历数组、基本操作)实例
- 在myeclipse文件中如何创建properties类型的文件,从而连接数据库
- Freebsd10.3(FreeBSD11 Beta1)使用手记
- DCMTK:以HTML格式呈现DICOM结构化报告文件的内容
- kubernetes1.8.4 安装指南 -- 7. kubernetes node安装
- Navicat Premium 未保存和已执行SQL存储位置
- Java 使用反射处理注解
- 那些年干过的事(六)—无源码修改版本号
- java虚拟机jvm下载_Java虚拟机(JVM)简介
- 原生android字体,安卓原生字体
- 港科百创 | 深光科技完成数千万元Pre-A轮融资
- UWP 中的各种文件路径(用户、缓存、漫游、安装……)
- django商城项目之历史浏览记录
- sap 双计量单位_维护计量单位的描述
- im2col的原理和实现
- VMwareWorkstation16环境下安装kali-linux-2021.2版本虚拟机(最新版本)
- 【前端】JS的BOM和DOM,事件,表单验证案例
- 我的武林秘籍设计模式之策略模式
- JSOI 2015 送礼物
- 外国语言文学类毕业论文文献包含哪些?