基于Python实现的默克尔树

       默克尔树常见的结构是二叉树,但它也可以是多叉树,它具有树结构的全部特点。 默克尔树的基础数据不是固定的,想存什么数据都可以,因为它只要数据经过哈希运算得到的哈希值。 默克尔树是从下往上逐层计算,每个中间节点是根据相邻的两个叶子节点组合计算得出的,而根节点是根据两个中间节点组合计算得出的,所以叶节点是基础。因此,底层数据的任何变动,都会传递到其父节点,一直到树的根节点。

      默克尔树是区块链技术中用于保障数据不被篡改的重要安全手段之一,有着非常重要的作用。以下例子演示了通过遍历的方式构建默克尔树,并计算和显示每个步骤的哈希值。

import hashlib #用于哈希值计算
#默克尔树节点类的定义
class MerkleNode(object):
    def __init__(self,left=None,right=None,data=None):
        self.left = left
        self.right = right
        # data中保存着哈希值
        self.data = data

#以递归的方式构建默克尔树
def createTree(nodes):
    list_len = len(nodes)
    if list_len == 0:
        return 0
    else:
        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=0
    queue = []
    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算法构建默克尔树并输出所有的哈希(摘要)

运行截图如下:

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值