一文读懂:区块链中的Merkle树

2023-11-07

​我们知道,区块链中每个区块包括区块头和区块体两部分。

————————

个人技术公众号:解决方案工程师

欢迎同领域的朋友关注、相互交流。

————————

像在CSDN一样,分享技术,分享代码,分享方案文档,分享白皮书。

区块体中包含了由区块链系统产生的一系列交易数据,并以Merkle根的形式保存在区块头中,与前一区块的哈希值、时间戳和版本号等组成一个完整的区块。

上图表示的是比特币的区块结构,其区块头中还包含了难度目标、随机数Nonce等数据,以支持 PoW 共识机制中的挖矿运算。

区块间采用链式结构进行连接,具体表现为每个区块的区块头中都包含了前一区块的哈希值,从而形成一条不可更改的完整区块数据链。链式结构带来的好处是能够顺藤摸瓜的定位到任意一条数据的位置,使得区块链具有溯源的功能。 

区块链系统可以采用基于交易的数据模型或基于账户的数据模型。基于交易的数据模型将表明交易来源的输入和表明交易去向的输出组合到一起,使得每笔交易可追溯。基于账户的数据模型能够快速查询用户余额和业务状态数据。

由于智能合约需要执行复杂的业务逻辑,因而更适合通过基于账户的数据模型进行构建。 

为了控制区块大小,区块链系统中通过哈希函数将原始交易数据编码为特定长度的字符串哈希值进行储存。

哈希函数也称散列函数,可以把一个空间的数据集尽可能均匀的映射到另外一个比原数据集更小的空间,即对于输入的任意长度字符串 都可以输出长度固定的 H(x) ,且无法通过 H(x) 反推得到 x 。

原始交易数据的哈希值通过Merkle树的形式进行组织。

那么,接下来讲解一下,Merkle树的原理及作用。

Merkle树中文译为梅克尔树或默克尔树。

以比特币中使用的二叉Merkle树为例,每条交易的哈希值就是一个叶子节点,从下往上将两个相邻叶子节点的组合哈希作为新的哈希值,新的哈希值成为树节点继续与相邻的树节点组合成新的哈希值。

在重复一定次数后直到形成唯一的根节点。最后得到的Merkle根需要保存到区块头中,以便仅需通过区块头就可以对交易进行简单支付验证,这一过程也成为SPV(Simplified Payment Verification)。

对于Merkle树而言,并不需要知道整棵Merkle树中每个节点的值,可以通过节点的值、Merkle根的值和相关路径来快速验证该节点是否属于该Merkle树,从而快速验证该区块中是否包含了某条交易。 

此外,时间戳用于标记区块顺序。时间戳表示自格林威治时间 1970 年 1 月 1 日 0 时 0 分 0 秒到当前时刻的总秒数,是一种完整且可验证的电子证据,能够为某一数据提供特定时间点的存在性证明。

区块链根据时间戳的先后顺序通过链式结构将一个个区块关联起来,因此篡改区块数据的难度以时间的指数倍增加,区块链越长篡改难度就越高,这也是确保区块链不可更改性的重要因素之一。 

总结一下Merkle树的作用:

(1)快速比较大量数据:当两个Merkle树的根哈希值相同时,说明所代表的的数据都相同。

(2)快速定位修改:当两个Merkle树的根哈希值相同时,说明所代表的的数据都相同快速定位修改:如下图,如果交易C发生改变,那么就会导致N2、N5和Merkle根发生改变。所以,我们想要快速定位,只需要沿着Merkle根→N5→N2就可以定位到交易C发生改变。

(3)零知识证明:例如,想要证明一组交易中包含某个交易A,但又不想让对方知道交易A的具体内容,那么就可以构建Merkle树,如上图,向对方公布N0、N1、N4和根节点,对方就可以确认交易A的存在,但无法知道交易A的具体内容。

————————

个人技术公众号:解决方案工程师

欢迎同领域的朋友关注、相互交流。

————————

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文读懂:区块链中的Merkle树 的相关文章

随机推荐

  • Java——Intellij IDEA出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver处理办法

    Intellij IDEA出现 Exception in thread main java lang ClassNotFoundException com mysql jdbc 处理办法 解决方法 File gt project struc
  • git修改提交记录的邮箱

    前言 旧仓库迁移到新的git仓库 而新仓库开启了规则 检查 Git 提交的提交者 Committer 和提交作者 Author 必须是已验证的邮箱 于是 旧的代码仓库无法整库迁移 提交时提示 remote 提交 52954f93882138
  • vue 循环input获取值

    html代码 循环input v model绑定
  • c语言中的语义错误和语法错误,C语言程序中对错误的调试

    程序调试 现在我们已经可以编写一个简单的 C语言程序了 但是你可能会犯一些简单的错误 程序的错误通常叫做 bug 而发现和修正这些错误的过程叫做调试 下面有一个带有一些错误的程序 看看你能找出多少 语法错误 上面的程序中包含了几个语法错误
  • linux grep 使用

    1 grep 单独使用 搜素指定目录中包含指定字符的文件 例如 grep r words 搜素当前目录中包含 words 字符的文件 grep r words wc 搜素当前目录中包含 words 字符的文件 只显示 包含该字符的数量 2
  • gre 填空78-89

    section 78 median 1 Kinetic dynamic energizing Immutable not capable of or susceptible to change 2 It is often argued th
  • idea build 报错,maven install 正常运行

    pom中引的包 代码写的时候也有提示 写完也不报错 build 或者 run 或者 debug 启动就报错 提示程序包xxx无法找到 原来是idea 自身的问题 首先执行maven 命令 mvn idea idea 再点击idea的菜单fi
  • 被包围的棋子 Surrounded Regions

    问题 Given a 2D board containing X and O capture all regions surrounded by X A region is captured by flipping all O s into
  • 浅谈MVC(jsp+servlet+JavaBean简单实例)

    MVC Model View Controller 旨在分离模型 控制 视图 是一种分层思想的体现 项目实例 购物车商品管理 总体设计 1实现DBHelper类 2创建实体类 3创建业务逻辑类 DAO 4创建控制层 5创建页面层 1数据库连
  • Android面试回忆录:Service有几种启动方式?,android开发工程师

    如果需要做耗时的操作 你会怎么做 问题便这样展开了 一个人是否真正懂得原理会灵活运用 一下子便能看出来 当面试者回答到线程和Handler方式时 我会再问一下对方 是否知道IntentService 在什么场景下使用IntentServic
  • 文件操作之文件下载、文件读取

    本文章仅做学习交流 如有违法行为 上传者自行负责 原理 原理案例 检测 怎么寻找文件下载漏洞 利用方面 文件目录的获取分两种 文件类型 常见文件 敏感文件 实际案例演示 Javaweb文件下载代码 当贝市场 通过功能点找到漏洞 RoarCT
  • win10下使用mmdet训练自己的数据模型

    win10下使用mmdet训练自己的数据模型 1 环境配置 2 制作自己的coco数据集 3 进行训练 4 计算测试图像的交并比 参考文献 1 环境配置 1 查看自己cuda版本 2 查看自己python版本 3 安装pytorch 官方地
  • 项目实训(树莓派)(七)树莓派4B下的ubuntu系统下命令行的使用-磁盘管理部分

    目录 前言 实验目的 实验内容 实验环境 实验步骤 1 df命令 2 fdisk命令 磁盘分区 3 hdparm命令 显示与设定硬盘参数 4 lsblk命令 查看系统的磁盘 5 vgextend命令 扩展卷组 前言 通过前面的实验 我们已经
  • 【MySQL笔记】正确的理解MySQL的MVCC及实现原理

    MVCC多版本并发控制 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 首先声明 MySQL 的测试环境是 5 7 前提概要 什么是 MVCC 什么是当前读和快照读 当前读 快照读和 MVCC 的关系 MVCC
  • 数字水印技术

    数字水印技术在信息安全中属于数字版权保护方面的技术 数字水印通过嵌入或附加数字信息到数字媒体中 可以追踪和证明数字媒体的来源 版权 真伪等 数字水印可以被用于防止盗版 保护知识产权 证明数字证据的真实性等应用场景 从而保障信息安全和维护合法
  • jQuery学习

    1 jQuery概述 1 1 JavaScript 库 JavaScript 库 即library 是一个封装好的特定的集合 方法和函数 从封装一大堆函数的角度理解库 就是在这个库中 封装了很多预先定义好的函数在里面 比如动画animate
  • BAJT 中高级 Java 面试题答案

    1 请问你做过哪些JVM优化 使用什么方法达到什么效果 vm调优主要也就是内存空间的分配 最终策略 提高系统性能 主要策略有 1 增加eden空间 让更多的对象留在年轻代 2 大对象直接放到老年代 以免扰乱年轻代高频率的gc XX Pete
  • 怎么查找电脑中的流氓软件_1个神器彻底删除流氓软件,瞬间清出十几个G,你的电脑有救了!...

    在使用电脑中 我们总会遇到一些流氓软件 不仅严重拖慢了电脑的运行速度 还不定时地弹出一个又一个的 定时炸弹 毋庸置疑 这些定时炸弹就是各种烦人的广告和弹窗了 尽管我们通过常规的方式把它卸载 但它还会卷土重来 那么对于那些卸载了仍会有文件残留
  • SpringCloud:SpringCloud生态的组成,组件的介绍(一)

    springCloud官方文档 https www springcloud cc 中文网 https spring io projects spring cloud 官方网 SpringCloud是什么 Spring Cloud是一个基于S
  • 一文读懂:区块链中的Merkle树

    我们知道 区块链中每个区块包括区块头和区块体两部分 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 像在CSDN一样 分享技术 分享代码 分享方案文档 分享白皮书 区块体中包含了由区块链系统产生的一系列交易数据 并以Merk