Merkle Tree与区块链

2023-11-02

什么是merkle tree

假设你已经知道了什么是哈希算法以及哈希是用来干啥的。

网络传输数据的时候,A收到B的传过来的文件,需要确认收到的文件有没有损坏。如何解决?

有一种方法是B在传文件之前先把文件的hash结果给A,A收到文件再计算一次哈希然后和收到的哈希比较就知道文件有无损坏。

但是当文件很大的时候,往往需要把文件拆分很多的数据块各自传输,这个时候就需要知道每个数据块的哈希值。怎么办呢?

这种情况,可以在下载数据之前先下载一份哈希列表(hash list),这个列表每一项对应一个数据块的哈希值。对这个hash list拼接后可以计算一个根hash。实际应用中,我们只要确保从一个可信的渠道获取正确的根hash,就可以确保下载正确的文件。

似乎很完美了。但是还不够好!

上面基于hash list的方案这样一个问题:

有些时候我们获取(遍历)所有数据块的hash list代价比较大,只能获取部分节点的哈希。

有没有一种方法可以通过部分hash就能校验整个文件的完整性呢?

答案是肯定的,merkle tree能做到。它长这样子:

这里写图片描述

特点如下:

1、数据结构是一个树,可以是二叉树,也可以是多叉树(本BLOG以二叉树来分析)

2、Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据HASH。

3、Merke Tree非叶子节点value是其所有子节点value的HASH值。

很明显,这种结构跟hash list相比较,根哈希不是用所有的数据块哈希拼接起来计算的,而是通过一个层级的关系计算出来的。

在上图中,叶子节点node7的value(v7) = hash(f1),是f1文件的HASH;而其父亲节点node3的value = hash(v7, v8),也就是其子节点node7 node8的值得HASH

其它应用场景

文件下载

假设我有两台机器,A和B,有一个文件从A传输到B。B首先获取可信的文件merkle tree,当文件下载完毕后,B通过自己构建的merkle tree根节点和获取的根节点比较,如果不一致,通过这种二叉树的结构可以在log(N)的复杂度快速定位到出错的数据块。

副本同步

一个集群里的所有机器,需要保持数据的同步,如果数据不一致,需要快速的定位到不一致的节点。

可以在每台机器上针对每个区间里的数据构造一棵Merkle Tree,这样,在两台机器间进行数据比对时,从Merkle Tree的根节点开始进行比对,如果根节点一样,则表示两个副本目前是一致的,不再需要任何处理;如果不一样,则遍历Merkle Tree,定位到不一致的节点也非常快速

merkle tree应用在区块链上

下面是本文的重点。

比特币系统的区块链中,每个区块都有一个merkle tree。

这里写图片描述

可以看到merkle root哈希值存在每一个区块的头部,通过这个root值连接着区块体,而区块体内就是包含着大量的交易。每个交易就相当于前面提到的数据块,交易本身有都有自己的哈希值来唯一标识自己。

什么是SPV

为了更好的解释,这里先插播一个概念,SPV。也就是中本聪描述到的“简化支付验证” 正是有了SPV,才让区块链和比特币更加广泛的被传播。

我们大部分人在电脑安装的比特币钱包都是轻量级(非全节点)的,也就是本地并没有所有的区块数据(上百G)。理论上来说,要验证一笔交易,钱包需要遍历所有的区块找到和该笔交易相关的所有交易进行逐个验证才是可靠的。

但是轻量级的钱包没有完整的数据,如何验证一笔支付的合法性呢?

merkle tree就起到了关键的作用。

当然SPV有它的局限性(这个有空再写文章细讲)。

这里是分割点


比特币系统是如何验证一笔交易的合法性呢?

首先区块链中每个区块中的merkle tree的根哈希都是公开可信的。假设现在alice转账给bob一个比特币,比特币钱包需要确认这笔交易是否被包含在了区块链中。

这里写图片描述

入上图所示,
假设我们要判断HK代表的交易是否存在,只需要生成一个仅有 4 个哈希值长度的 Merkle 路径,来证明区块中存该笔交易。该路径有 4 个哈希值(在图中由蓝色标注)HL、HIJ、HMNOP 和 HABCDEFGH。

由这 4 个
哈希值产生的认证路径, 再通过计算另外四对哈希值 HKL、 HIJKL、 HIJKLMNOP
和 Merkle 树根(在图中由虚线标注),任何节点都能证明 HK(在图中由绿色
标注)包含在 Merkle 根中。

具体认证路径的生成,主要是通过遍历。有专门的算法,有兴趣的可以自行搜索相关的论文

参考

[1] http://www.cnblogs.com/fengzhiwu/p/5524324.html

[2] <<精通比特币>>

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

Merkle Tree与区块链 的相关文章

  • Java+SSM+Vue 毕业设计 房屋出租出售管理系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 2 1 系统开发流程 3 2 2 操作流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向
  • STL之lexicographical_compare

    lexicographical compare and lexicographical compare 3way the latter is not part of the C standard 功能 Returns true if the
  • pip豆瓣源

    豆瓣源地址 https pypi douban com simple 使用方法 pip install 需要的包名 i https pypi douban com simple 豆瓣源也解决了我使用清华源或阿里源的时候Anaconda下载的
  • 字符数组学习

    有关办公中内容读取和写入的 是很常见的 需要通过移位和偏移 计算每次的地址 再累加运算 一种是字符数组 另一种是字符串常量 它们在内存中的存储位置不同 字符数组可以读取和修改 而字符串常量只能读取不能修改 比如这样字符串 NOVO4CCC6

随机推荐

  • 网络5层体系结构中的数据传输过程

    5层网络体系结构 应用层 运输层 网络层 网际层 数据链路层 物理层 物理层 主要任务 考虑怎样才能在连接各种计算的传输媒体上传输数据比特流 数据链路层 mac层 主要任务 在同一个局域网中 分组怎样从一个主机传送到另一个主机 不经过路由器
  • Java 介绍与环境搭建

    文章目录 Java 介绍与环境搭建 Java 背景介绍 Java 背景故事 Java 三大平台 Java SE Java ME Java EE Java 跨平台工作原理 平台与跨平台 跨平台工作原理 JDK 下载和安装 下载 JDK 安装
  • 【imx6ull】视频监控项目(usb摄像头+ffmepeg)

    文章目录 前言 1 总体方案介绍 2 配置v4l2驱动与UVC驱动 3 v4l2应用编程测试摄像头 4 ffmepg移植 总结 前言 参考视频 韦东山老师手把手带你从0开始自己做一个视频监控系统 1 总体方案介绍 这篇文章写的很好 很容易理
  • cmake——project

    命令project用于设置项目的名称 project
  • 关于VISIO工具栏、菜单栏消失的解决办法

    关于VISIO工具栏 菜单栏消失的解决办法 1 打开注册表编辑器 2 VISIO 2000 HKEY CURRENT USER Software Visio Visio2000 Toolbars 删除上述键值 再启动VISIO 2000就可
  • 查看占用指定端口的程序

    netstat lntup grep 8080
  • 【半监督学习】5、Efficient Teacher

    文章目录 一 背景 二 方法 2 1 Dense Detector 2 2 Pseudo Label Assigner 2 3 Epoch Adaptor 三 效果 论文 Efficient Teacher Semi Supervised
  • brpc组件bvar源码解析(四)Sampler、SamplerCollector和Window类簇

    1 Sampler类 Sampler是所有采样类的基类 采样类中最重要的是take sample函数 采样类的schedule函数调用之后 它的take sample函数将会被一个专门的线程每1秒定时调用 Sampler类的定义 Sampl
  • Redis持久化存储RDB(写时复制)/AOF

    快照 RDB save 会阻塞当前Redis服务器 直到持久化完成 线上应该禁止使用 明确时间点 关机维护 bgsave fork一个子进程 由子进程负责持久化过程 父进程发生写操作修改内存数据时 Copy On Write 才会真正去分配
  • NFS服务详解

    文章目录 一 NFS概述 二 NFS工作原理 2 1NFS工作流程 2 2挂载原理 三 NFS服务部署 3 1常用命令 3 2服务器端配置 3 3客户端配置 3 4服务测试 四 总结 一 NFS概述 1 概述 NFS是一种基于TCP IP
  • 分享菜鸟学Python,从入门到进阶的心得

    来自一位投稿粉丝的学习心得 从最初学Python从爬虫开始 到数据分析 再到GUI的实现 以及后来的机器学习和深度学习文章 我与大家已经走过了好几个月的时间 在这几个月的时间里 我通过文章与大家一同学习 一同进步 向大家展示了如何通过Pyt
  • 第三章 分类模型-随机森林知识点详细总结

    机器学习算法系列 第一章 Python Spark 分类模型 逻辑回归知识点详细总结 第二章 分类模型 决策树知识点详细总结 第三章 分类模型 随机森林知识点详细总结 第四章 分类模型 支持向量机SVM知识点详细总结第五章 关联分析 apr
  • CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager

    在游戏的开发过程中 需要使用到大量的图片 音频等资源来 从而带来管理上的困难 Asset Manager 资源管理模块具备加载资源 查找资源 销毁资源 缓存资源 Asset Bundle 等功能 帮助开发者管理其资源的使用 一 资源的加载
  • IHO ENC

    IHO ENC Electronic Navigation Chart is specially specified for marine navigation and defined by IHO International Hydrol
  • CMD批处理实现dot命令自动运行更新

    CMD批处理实现dot命令自动运行更新 前言 一 编写bat脚本 二 解释 总结 前言 最近学习dot语言 我们知道 运行dott脚本大致有两种方法 使用Gvedit编辑dot代码并直接点击运行按钮运行 使用记事本编辑工具编辑号dott脚本
  • 通过adb命令卸载小米手机预设的应用

    文章目录 准备环境 具体步骤 附 准备环境 首先介绍adb命令 ADB是Android Debug brige 是一种用于于安卓设备通信的命令行工具 卸载应用需要用到这个命令 adb命令安装方法 1 adb工具下载 下载适合您的系统的 AD
  • 什么是 I18N 和 L10N ?

    什么是 I18N 和 L10N I18N 是 internationalization 的缩写形式 意即在 i 和 n 之间有 18 个字母 本意是指软件的 国际化 与之类似 L10N 是 localization 的缩写形式 意即在 l
  • 用python写一个hello world、把代码写下来_编程与下厨房:如何教女友写Python(二:不从Hello World开始...

    一 不从 Hello World 开始 但凡是介绍编程语言的入门书籍 都会把 hello world 这个句子的输出作为第一个程序的示例 这种约定俗成的做法就像是新居进火的仪式一般具有非凡的意义 但是在这里 我们并不打算将Python的第一
  • Windows中d3dcompiler_33.dll丢失怎么解决

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个d3dcompiler 33 dll文件进行安装
  • Merkle Tree与区块链

    什么是merkle tree 假设你已经知道了什么是哈希算法以及哈希是用来干啥的 网络传输数据的时候 A收到B的传过来的文件 需要确认收到的文件有没有损坏 如何解决 有一种方法是B在传文件之前先把文件的hash结果给A A收到文件再计算一次