首页 > 其他分享 >区块链实验-构建Merkle Tree

区块链实验-构建Merkle Tree

时间:2023-05-17 21:14:33浏览次数:40  
标签:数据完整性 Tree tree 哈希 Merkle 区块 data 节点

 

 

主要内容:1.掌握Merkle Tree的基本原理。

2.编程实现Merkel Tree的构建和数据完整性验证。

实验条件:Win系统、Python

实验内容:

根据上图原理实现如下两个函数:

# 构建Merkle Tree

def BuildTree(data):

# 验证数据完整性

def Validate(hash, data):

  1. 实现思路

Merkle Tree的Python实现代码分为两个主要部分:构建Merkle树和验证数据完整性。

(1). 构建Merkle树

构建Merkle树的主要思路是逐层生成父节点。首先,我们将所有数据块的哈希值存到叶子节点中。然后,我们从下往上逐层生成父节点。对于每一层的父节点,我们依次将每两个相邻的子节点的哈希值拼接起来并求出哈希值,作为父节点的哈希值。如果最后只剩下一个节点,那么此节点就是根节点,也是Merkle树的树根。

(2). 验证数据完整性

验证数据块的完整性也是递归的过程,从树根逐层向下判断。如果当前节点是叶子节点,那么直接比较当前节点的哈希值与数据块的哈希值是否相等。如果当前节点是父节点,那么递归地验证子节点的哈希值即可。如果至少有一个子节点的哈希值能够与数据块的哈希值匹配,那么就说明该数据块属于Merkle树中。

2、Python代码如下:

import hashlib

# 构建Merkle树

def build_tree(data):

    tree = []

    # 将所有数据块的哈希值存到叶子节点

    for d in data:

        tree.append(hashlib.sha256(d.encode()).hexdigest())

    # 逐层生成父节点

    while len(tree) > 1:

        parent_level = []

        for i in range(0, len(tree), 2):

            # 如果当前节点只有一个子节点,将其复制一遍作为另一个子节点

            if i == len(tree) - 1:

                parent_level.append(tree[i] + tree[i])

            else:

                parent_level.append(tree[i] + tree[i+1])

        # 将当前层的父节点加入树中

        tree = parent_level

    return tree[0]

# 验证数据完整性

def validate(hash, data):

    # 如果当前节点是叶子节点,直接与数据块的哈希比较

    if len(hash) == 64:

        return hash == hashlib.sha256(data.encode()).hexdigest()

    # 如果当前节点是父节点,递归验证子节点

    left = hash[0:64]

    right = hash[64:]

    return validate(left, data) or validate(right, data)

# 测试

data = ["1234", "5678", "1010", "1111"]

root = build_tree(data)

print("Merkle根节点: ", root)

print("数据完整性:",validate(root, "1111"))

print("数据完整性:",validate(root, "6543"))

3、实验结果截图:

标签:数据完整性,Tree,tree,哈希,Merkle,区块,data,节点
From: https://www.cnblogs.com/guwanghui/p/17410240.html

相关文章

  • Linux基础21 进程介绍, 进程监控状态ps, 进程相关命令pstree,pgrep,pidof, 动态进程监
    1.进程的管理:当我们运行一个程序,那么我们将该程序叫进程 进程线程协程 linux起服务会有给这个服务预分配的内存结构,windows没有 2.为什么要学进程管理?为了管理架构的服务 3.程序和进程的区别1)程序:开发写出来的代码,程序是永久存在的。 2)进程:它会随着程序的终止而销......
  • 1020 Tree Traversals
    题目:Supposethatallthekeysinabinarytreearedistinctpositiveintegers.Giventhepostorderandinordertraversalsequences,youaresupposedtooutputthelevelordertraversalsequenceofthecorrespondingbinarytree.InputSpecification:Eachi......
  • web3 产品介绍 etherscan 区块链浏览器 将抽象的数据和理论可视化,小白也能看懂区块链
    Etherscan是一个广泛使用的以太坊区块链浏览器和分析平台,它为用户提供了全面的区块链数据查询和交易分析功能。在本文中,我们将介绍Etherscan的主要特点和功能,以及如何使用它来浏览以太坊区块链。一、Etherscan的特点区块链浏览器:Etherscan提供了完整的以太坊区块链浏览器,用户......
  • CF1777D Score of a Tree 题解
    题目简述给你一个\(n\)个结点根为\(1\)的树。在\(t=0\)时,每个结点都有一个值,为\(0\)或\(1\)。在每一个\(t>0\)时,每个结点的值都会变成其子结点在\(t-1\)时的值的异或和。定义\(S(t)\)为\(t\)时所有结点值的和。定义\(F(A)\)为树在\(0\let\le10^......
  • Java-Day-19( 对集合实现类的选择 + TreeSet + TreeMap )
    Java-Day-19总结-开发中如何选择集合实现类在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择先判断存储的类型(一组对象或一组键值对)一组对象(单列):Collection接口允许重复:List增删多:LinkedList[底层维护了一个双向链......
  • AtCoder Beginner Contest 207 F Tree Patrolling
    洛谷传送门AtCoder传送门简单树形dp。设\(f_{u,i,p=0/1,q=0/1}\)为\(u\)的子树中被覆盖点数为\(i\),\(u\)有没有被覆盖,\(u\)有没有被选。转移树形背包合并即可,需要分类讨论。要注意如果\(u\)没被覆盖,\(v\)选了,或者\(u\)选了,\(v\)没被覆盖,被覆盖点数要\(+1\)。......
  • el-tree 根据多个结果筛选树状图(增加checkbox勾选)
    <template><divclass="wrapper-jjy"><el-dialogtitle="接警员查找"v-model="jjyDialogVisible":draggable="true"width="735px"height="300":close-on-click-modal="true&q......
  • 赫夫曼树HuffmanTree
    赫夫曼树HuffmanTree1.基本概念路径:在树中,从一个节点到另外一个节点之间的分支构成这两个节点之间的路径;路径长度:路径上的分支数称为路径长度;若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1;节点的权:对树中的节点赋一个具有某种含义的数值,则该数值称为该......
  • vue node报错ERESOLVE unable to resolve dependency tree
    解决:ERESOLVEunabletoresolvedependencytree小张不厌学于2022-08-2517:00:44发布30549收藏102文章标签:npmvue.js前端版权华为云开发者联盟该内容已被华为云开发者联盟社区收录加入社区NPM版本问题报错的解决方案在安装项目依赖时,很大可能会遇到安装不成功的问题......
  • Layui+dtree实现左边分类列表,右边数据列表
    效果如下代码实现<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>帖子类别</title><metaname="renderer"content="webkit"><metahttp-equiv="X-UA-Compatible&q......