Merkle树算法解析及python实现

本文介绍了Merkle树的概念及其在分布式系统、P2P和区块链中的应用。Merkle树是一种数据结构,通过计算哈希值确保数据的完整性和正确性。文中提供了一个简单的Python实现,展示了如何构建Merkle树并获取proof。proof可用于验证数据的完整性,例如在多源下载中使用Merkle树进行数据校验。
摘要由CSDN通过智能技术生成

Merkle tree概念
在分布式系统、P2P应用中或者是区块链中,会经常使用一种数据结构Merkle tree(默克尔树),这里我们将讨论Merkle树算法解析及python实现。

Merkle树看起来非常像二叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值,所以有时候Merkle tree也表示为Hash tree,如下图所示:

在这里插入图片描述

构造Merkle tree时:
(1)对data blocks分别计算哈希值(sha256等算法);
(2)每层两两计算获得hash值;(如图)
(3)直至计算至最上一层,得到proof。

proof可以用来检验数据的完整性和正确性,即一个data block的改动或缺失,就会导致proof的改变。
同时,merkle树可以用于数据传输,同时从多个机器下载数据的不同部分,可以提高效率。常见的迅雷的p2p下载,即采用这种模式,从多台机器下载,并用merkle tree检验数据的完整性和正确性。
算法实现
我们采用python进行简单的merkle树实现,获得proof及高度。

import hashlib

def hash_data(data, hash_function = 'sha256'):
    "hash function"
    hash_function = getattr(hashlib, hash_function)
    data = data.encode('utf-8')
    return hash_function(data).hexdigest()

def concat_and_hash_list(lst, hash_function = 'sha256'):
    lst1 = []
    for i in lst:
        lst1.append(hash_data(i))
    # print(lst1)

    assert len(lst1)>2, "no tracnsactions to be hashed"
    n = 0 #merkle树高度
    while len(lst1) >1:
        n += 1
        if len(lst1)%2 == 0:
            v = []
            while len(lst1) >1 :
                a = lst1.pop(0)
                b = lst1.pop(0)
                v.append(hash_data(a+b, hash_function))
            lst1 = v
        else:
            v = []
            l = lst1.pop(-1)
            while len(lst1) >1 :
                a = lst1.pop(0)
                b = lst1.pop(0)
                v.append(hash_data(a+b, hash_function))
            v.append(l)
            lst1 = v
    return lst1, n+1


l = ['a', 'b', 'c',"d"]
print(concat_and_hash_list(l))

参见https://github.com/jingyadong/merkle-tree-implementation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值