MPT的全称是Merkle Patricia Tree, 从这里可以看出MPT是Merkle Tree + Patricia Tree。接下来就来讲讲这两种树:

Merkle Tree

区块链P2P网络中,如果需要传输的数据很大,就需要同时从多个机器上下载数据,而且很可能有些机器是不稳定(可能下载速度很慢)或者不可信的(需要重新下载)。为了快速下载大块数据并验证,更好的办法是把大文件分割成小的数据块(例如把大文件分割成4K为单位的小数据块)。这样的好处是如果小块数据在传输过程中损坏了或者是错误的数据,那么只要重新下载这一块数据就行了,不用重新下载整个文件。

由于只有大文件内容的hash, 当其中一块小数据错误时,我们是能检出由小块数据拼凑出来的大数据是错误的,但是我们不知道哪块小数据是错误的,就没法通过重传错误的小数据来纠正。哪怎么处理呢?为每个小块生成hash, 节点先把小块数据的hash都下载下来,然后就可以一个一个验证小块数据是否正确了。那问题又来了,小块数据的hash的正确性谁来保证呢?这个由信任节点来保证,比如BT论坛上的bt种子文件,这个种子文件就记录了原始文件的小块数据的hash. 验证问题解决了,但是多出来了很多小块数据hash,当数据很大时,这个hash数据量也不小。因而Merkle Tree出来了,它可以解决这个问题。

小块数据的hash两两组合再次生成新的hash,然后新生成的hash又两两合并生成更新的hash,直至最后两个hash生成一个hash root,这个叫merkle root(默克尔根)。可见merkle tree和传统bt分片技术只是对小块数据hash的组织方式不一样。参考以太坊:www.300gu.com

看到上面的图,你可能会说,merkle tree不是生成更多hash数据了啊,怎么能降低数据传输量。确实,对于数据发送方来说,相比传统分片技术,它是需要保存完整merkle tree, 会多占用一点空间。但是对于接受方来说,它在验证某一块数据不需要下载全部hash,只需一段merkle 路径即可,比如下图中的hash1, h12, h02这3个hash

如果要验证slice2数据的正确性,只需要拿到hash1, h12, h02这3个hash再加上本地存储的root hash,就可以验证了。需要传输的hash数据量从n变为log2n.

Patricia Tree

patricia tree 前缀树,是一种编码方式,它是传统trie的改进。

Trie树

Trie,又称前缀树或字典树,是一种有序树状的数据结构,其中的键通常是字符串,常用语存储Key-value数据结构。

Trie与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,节点对应的key是根节点到该节点路径上的所有节点key值前后拼接而成,节点的value值就是该key对应的值。根节点对应空字符串key。

如果key是英文单词,trie的每个节点就是一个长度为27的指针数组,index0-25代表a-z字符,26为标志域。

上面的存储的数据如下:

[‘A’] = V1, [‘AB’] = V3, [‘B’] = V2, [‘BA’] = V4, [‘BAA’] = V5, [‘ZAABA’] = V6

从上面可以看出ZAABA这个key,没有和任何其他key共享字段,但是却产生了6层,这种无用的深度增加有什么方法减少吗?Patricia Tree就可以解决这个问题

Merkle Patricia Tree对trie的改进

上面tries出现的问题的根本原因是每个前置节点只能表示一个字母,key有多长,树的深度就会多长,不管这个key有没有和其他key共享部分key。因而允许一个节点表示变长的key就可以解决这个深度,具体以官方的下图为例:

上图存储的key-value如下:

从前面结构图可以看出,Merkle Patricia Tree有4种类型的节点:

叶子节点(leaf),表示为[key,value]的一个键值对。和前面的英文字母key不一样,这里的key都是16编码出来的字符串,每个字符只有0-f 16种,value是RLP编码的数据

扩展节点(extension),也是[key,value]的一个键值对,但是这里的value是其他节点的hash值,通过hash链接到其他节点

分支节点(branch),因为MPT树中的key被编码成一种特殊的16进制的表示,再加上最后的value,所以分支节点是一个长度为17的list,前16个元素对应着key中的16个可能的十六进制字符,如果有一个[key,value]对在这个分支节点终止,最后一个元素代表一个值,即分支节点既可以搜索路径的终止也可以是路径的中间节点。分支节点的父亲必然是extension node

空节点,代码中用null表示

原理解释

插入第一个<a711355, 1.0>,由于只有一个key,直接用leaf node既可表示

接着插入a77d337,由于和a711355共享前缀’a7’,因而可以创建’a7'扩展节点。

接着插入a7f9365,也是共享’a7’,只需新增一个leaf node.

最后插入a77d397,这个key和a77d337共享’a7’+’7d’,因而再需要创建一个’7d’扩展节点

转载于:https://www.cnblogs.com/qingpingseo/p/8882948.html

以太坊Merkle Patricia Tree(MPT)技术深度解读相关推荐

  1. Merkle Patricia Tree (MPT) 树详解

    1.    介绍 Merkle Patricia Tree(简称MPT树,实际上是一种trie前缀树)是以太坊中的一种加密认证的数据结构,可以用来存储所有的(key,value)对.以太坊区块的头部包 ...

  2. Merkle Patricia Tree (MPT) 以太坊merkle技术分析

    转载自:https://blog.csdn.net/zslomo/article/details/53434883 一 传统merkle树缺陷 我的这篇博客merkle tree 分析 详细解释了me ...

  3. 014-数据结构-树形结构-基数树、Patricia树、默克尔树、梅克尔帕特里夏树( Merkle Patricia Tree, MPT)...

    一.基数树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Radi ...

  4. Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范

    Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范 2017/4/15 posted in  Solidity深入浅出系列 Merkle Patricia Tree1,梅克尔帕特 ...

  5. Merkle Patricia Tree 梅克尔帕特里夏树(MPT)详细介绍

    Merkle Patricia Tree [1],梅克尔帕特里夏树,提供了一个基于加密学的,自校验防篡改的数据结构,用来存储键值对关系.后文中将简称为MPT.尽管在本规范范围内,我们限定键值的类型只能 ...

  6. 以太坊Merkle tree学习

    转载自:http://www.cnblogs.com/fengzhiwu/p/5524324.html /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所 ...

  7. MPT(Merkle Patricia Tree)树结构示例

    MPT(Merkle Patricia Tree): 参考深入浅出以太坊MPT(Merkle Patricia Tree) MPT树结构示例1: rootHash扩展节点 prefix 0 prefi ...

  8. Merkle Patricia Tree 详解

    转载自 https://ethfans.org/toya/articles/588 1. 前言 1.1 概述 Merkle Patricia Tree(又称为Merkle Patricia Trie) ...

  9. 【以太坊源码】mpt实现

    转载自:click here trie/encoding.go encoding.go主要处理trie树中的三种编码格式的相互转换的工作. 三种编码格式分别为下面的三种编码格式. KEYBYTES e ...

  10. Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范(笔记)

    Merkle Patricia Tree1,梅克尔帕特里夏树,提供了一个基于加密学的,自校验防篡改的数据结构,用来存储键值对关系.后文中将简称为MPT.尽管在本规范范围内,我们限定键值的类型只能是字符 ...

最新文章

  1. oracle dg状态查询,oracle dg状态检查及相关命令
  2. 史上最被低估的两个学科!它们远比你想的更重要!
  3. [C++] 哈希计数
  4. 如何通过 Python 和 OpenCV 实现目标数量监控?
  5. 技术检验检测管理系统之样品检验模块概况(四)
  6. 35、IFE任务34——听指令的小方块(二)
  7. 利用Java手写简单的httpserver
  8. cpoint 两个点距离_Wasserstein距离学习笔记
  9. DCT和IDCT原始公式计算
  10. 用命令如何返回上级目录
  11. Aspect基础使用方法
  12. Oracle创建表空间,用户,及权限
  13. 最新微信hook3.0二次开发C#源码介绍
  14. 基于OpenCV的条形码区域检测(一)
  15. 【PP-2】定义生产调度员
  16. Java基于局域网(LAN)的聊天室软件-内附源码
  17. 采用原笔迹电子签名有什么好处
  18. Python模拟登陆大连交通大学教务在线
  19. 2021年电工(中级)试题及解析及电工(中级)模拟试题
  20. 千万不要和男生说:世界上没有奥特曼,否则你会见识到真正的奥特曼。

热门文章

  1. 执行计划有时不准确_一张表格,帮助学生制定良好每日学习计划,提升学习积极性主动性...
  2. 崩了导致代码都乱了_抖音崩了?别慌,你的快乐还在
  3. javascript 变量及作用域(栈、堆、块级作用域、执行环境)详细篇
  4. 二十、Oracle学习笔记:编写存储过程
  5. 4.jvm初体验-内存溢出问题的分析与解决
  6. 大数据,数据分析,机器学习,架构等相关系统名称名词解释
  7. Ubuntu 15.04 Gogs(git 版本库) 二进制安装
  8. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_18-CMS前端页面查询开发-页面原型-创建页面和定义路由...
  9. ES6深入浅出_汇总贴
  10. LeetCode:三个数的最大乘积【628】