Merkle tree proof

本文介绍了Merkle Tree的基础概念,包括其在区块链中的应用和Merkle Proof(路径证明)。通过实例展示了如何构建一个包含64个叶节点的Merkle Tree,并解释了如何打开和验证特定叶节点的路径。此外,还提供了多个编程语言的Merkle Tree实现链接以及Python代码示例,用于构建、打开和验证Merkle Proof。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 引言

前序博客有:

推荐 直观形象展示Merkle tree的网站

在这里插入图片描述
Merkle proof又名Merkle path,为重新计算merkle root所需的最小节点数。
如上图,为了证明node2在root hash为65C7C87E2731AE97D0BE89EA3299A544FD28DE6A的Merkle tree中,仅需提供Node 1,Node 34和Node 567,即可生成root Node 1234567。

Merkle tree proof相关代码实现有:

2. stark-anatomy中merkle proof解析

针对的代码为:

详细的merkle proof测试用例见test_merkle():【运行指定测试文件并显示打印日志pytest test_merkle.py -s。运行指定测试用例并显示打印日志pytest test_merkle.py::test_merkle -s。】
1)构建具有64个leaf的merkle tree:

	n = 64
    leafs = [urandom(int(urandom(1)[0])) for i in range(n)]
    root = Merkle.commit_(leafs)

	H = blake2b

    def commit_( leafs ):
        assert(len(leafs) & (len(leafs)-1) == 0), "length must be power of two"
        if len(leafs) == 1:
            return leafs[0]
        else:
            # 对左右leaf未做hash运算,直接拼接再hash。递归调用。
            return Merkle.H(Merkle.commit_(leafs[:len(leafs)//2]) + Merkle.commit_(leafs[len(leafs)//2:])).digest()

	def commit( data_array ):
		# 对最底层的data分别进行hash运算,生成的为leafs。
        return Merkle.commit_([Merkle.H(bytes(da)).digest() for da in data_array])

2)Open第 i i i个leaf的path:

	def open_( index, leafs ):
        assert(len(leafs) & (len(leafs)-1) == 0), "length must be power of two"
        assert(0 <= index and index < len(leafs)), "cannot open invalid index"
        if len(leafs) == 2:
            return [leafs[1 - index]]
        elif index < (len(leafs)/2): # 递归调用。
            return Merkle.open_(index, leafs[:len(leafs)//2]) + [Merkle.commit_(leafs[len(leafs)//2:])]
        else:
            return Merkle.open_(index - len(leafs)//2, leafs[len(leafs)//2:]) + [Merkle.commit_(leafs[:len(leafs)//2])]

    def open( index, data_array ):
        return Merkle.open_(index, [Merkle.H(bytes(da)).digest() for da in data_array])

3)Verify第 i i i个leaf的path:

	def verify_( root, index, path, leaf ):
        assert(0 <= index and index < (1 << len(path))), "cannot verify invalid index"
        if len(path) == 1:
            if index == 0: # 区分左右叶子
                return root == Merkle.H(leaf + path[0]).digest()
            else:
                return root == Merkle.H(path[0] + leaf).digest()
        else:
            if index % 2 == 0:
                return Merkle.verify_(root, index >> 1, path[1:], Merkle.H(leaf + path[0]).digest())
            else:
                return Merkle.verify_(root, index >> 1, path[1:], Merkle.H(path[0] + leaf).digest())

    def verify( root, index, path, data_element ):
        return Merkle.verify_(root, index, path, Merkle.H(bytes(data_element)).digest())

参考资料

[1] Merkle proofs Explained.
[2] Zero-knowledge proofs in identity systems
[3] ZKProof Zero-Knowledge Proofs for Set Membership
[4] Zero Knowledge Proofs and Merkle Trees – An overview before diving into it
[5] Data Validation
[6] Understanding Merkle pollards

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值