python实现默克尔根(Merkle root)

I have yet to meet a person who understands blockchain but don't believe in it.                            ——by CZ

本文将使用python实现比特币的默克尔根。
源码地址PYchain/merkle.py


默克尔树介绍

python实现默克尔根(Merkle root)_第1张图片

将区块中要包含的交易信息依次排序,每条交易信息进行hash,从第0条交易开始,对每两个交易的哈希(hash)相加结果进行哈希(hash),若交易个数为奇数,最后一个交易复制自己的哈希值进行哈希,然后多次迭代直到最后只有一个哈希值,该哈希值就是默克尔根(Merkle root),整个树状结构数据就是默克尔树.

python实现

定义函数merkle_tree,输入为交易哈希值列表,上例中的[Ha, Hb, Hc,],输出为经过一次相加hash之后的列表[Hash( Ha+Hb),Hash(Hc+Hc)],
递归最终得到Merkle root。

def merkle_tree(hash_t_list):
    if len(hash_t_list) == 1:
        return hash_t_list[0]
    new_list = []
    # len(hash_t_list)-1为列表末尾数的下标
    for i in range(0, len(hash_t_list)-1, 2):
        new_list.append(merkle_hash(hash_t_list[i], hash_t_list[i+1]))
    if len(hash_t_list) % 2 == 1:
        new_list.append(merkle_hash(hash_t_list[-1], hash_t_list[-1]))
    return merkle_tree(new_list)

定义函数merkle_hash, 比特币中hash为两次hashlib.sha256()

def merkle_hash(a,b):
    c = (a+b).encode()
    c = hashlib.sha256((hashlib.sha256(c).hexdigest()).encode()).hexdigest()
    return c

默克根为什么重要?

工作量证明是基于区块头的,默克尔根(merkle root)会放入区块头,如果将区块信息增删,或任意交易信息改变,默克尔根(merkle root)都会改变,从而让原来的工作量证明无效。在确认交易信息时,通过对比交易hash值更便捷,占用内存小,树状结构查询效率更高。

测试

python实现默克尔根(Merkle root)_第2张图片

你可能感兴趣的:(python实现默克尔根(Merkle root))