MPT(Merkle Patricia Tree):

参考深入浅出以太坊MPT(Merkle Patricia Tree)

MPT树结构示例1:


rootHash扩展节点 prefix 0

prefix shared nibble next node
rootHash 1 6 hashA
hashA 分支节点
hashB 00 6f hashD
hashD 分支节点
hashE 1 7 hashF
hashF 分支节点
hashG 3 5 coin

MPT树结构示例2:


如图所示:

总共有2个扩展节点,2个分支节点,4个叶子节点。

其中叶子结点的键值情况为:

节点的前缀:

5 MPT树的操作
下面从MPT树的更新,删除和查找过程来说明MPT树的操作。

1 更新

函数_update_and_delete_storage(self, node, key, value)

i. 如果node是空节点,直接返回[pack_nibbles(with_terminator(key)), value],即对key加上终止符,然后进行HP编码。

ii. 如果node是分支节点,如果key为空,则说明更新的是分支节点的value,直接将node[-1]设置成value就行了。如果key不为空,则递归更新以key[0]位置为根的子树,即沿着key往下找,即调用_update_and_delete_storage(self._decode_to_node(node[key[0]]),key[1:], value)。

iii. 如果node是kv节点(叶子节点或者扩展节点),调用_update_kv_node(self, node, key, value),见步骤iv

iv. curr_key是node的key,找到curr_key和key的最长公共前缀,长度为prefix_length。Key剩余的部分为remain_key,curr_key剩余的部分为remain_curr_key。

a) 如果remain_key==[]== remain_curr_key,即key和curr_key相等,那么如果node是叶子节点,直接返回[node[0], value]。如果node是扩展节点,那么递归更新node所链接的子节点,即调用_update_and_delete_storage(self._decode_to_node(node[1]),remain_key, value)

b) 如果remain_curr_key == [],即curr_key是key的一部分。如果node是扩展节点,递归更新node所链接的子节点,即调用_update_and_delete_storage(self._decode_to_node(node[1]),remain_key, value);如果node是叶子节点,那么创建一个分支节点,分支节点的value是当前node的value,分支节点的remain_key[0]位置指向一个叶子节点,这个叶子节点是[pack_nibbles(with_terminator(remain_key[1:])),value]

c) 否则,创建一个分支节点。如果curr_key只剩下了一个字符,并且node是扩展节点,那么这个分支节点的remain_curr_key[0]的分支是node[1],即存储node的value。否则,这个分支节点的remain_curr_key[0]的分支指向一个新的节点,这个新的节点的key是remain_curr_key[1:]的HP编码,value是node[1]。如果remain_key为空,那么新的分支节点的value是要参数中的value,否则,新的分支节点的remain_key[0]的分支指向一个新的节点,这个新的节点是[pack_nibbles(with_terminator(remain_key[1:])),value]

d) 如果key和curr_key有公共部分,为公共部分创建一个扩展节点,此扩展节点的value链接到上面步骤创建的新节点,返回这个扩展节点;否则直接返回上面步骤创建的新节点

v. 删除老的node,返回新的node

l 删除

删除的过程和更新的过程类似,而且很简单,函数名:_delete_and_delete_storage(self, key)

i. 如果node为空节点,直接返回空节点

ii. 如果node为分支节点。如果key为空,表示删除分支节点的值,直接另node[-1]=‘’, 返回node的正规化的结果。如果key不为空,递归查找node的子节点,然后删除对应的value,即调用self._delete_and_delete_storage(self._decode_to_node(node[key[0]]),key[1:])。返回新节点

iii. 如果node为kv节点,curr_key是当前node的key。

a) 如果key不是以curr_key开头,说明key不在node为根的子树内,直接返回node。

b) 否则,如果node是叶节点,返回BLANK_NODE if key == curr_key else node。

c)如果node是扩展节点,递归删除node的子节点,即调用_delete_and_delete_storage(self._decode_to_node(node[1]),key[len(curr_key):])。如果新的子节点和node[-1]相等直接返回node。否则,如果新的子节点是kv节点,将curr_key与新子节点的可以串联当做key,新子节点的value当做vlaue,返回。如果新子节点是branch节点,node的value指向这个新子节点,返回。

l 查找

查找操作更简单,是一个递归查找的过程函数名为:_get(self, node, key)

i. 如果node是空节点,返回空节点

ii. 如果node是分支节点,如果key为空,返回分支节点的value;否则递归查找node的子节点,即调用_get(self._decode_to_node(node[key[0]]), key[1:])

iii. 如果node是叶子节点,返回node[1] if key == curr_key else ‘’

iv. 如果node是扩展节点,如果key以curr_key开头,递归查找node的子节点,即调用_get(self._decode_to_node(node[1]),key[len(curr_key):]);否则,说明key不在以node为根的子树里,返回空

学习时间:

提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点


学习产出:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个

MPT(Merkle Patricia Tree)树结构示例相关推荐

  1. Merkle Patricia Tree (MPT) 树详解

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

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

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

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

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

  4. Merkle Patricia Tree 详解

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

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

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

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

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

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

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

  8. 04.区块链的那些事儿-以太坊中的 Patricia Tree

    本节主要讨论以太坊中存储的 Patricia Tree 比特币只有1棵Merkle树,而以太坊的每一个区块头,并非只包含1棵Merkle Tree,而是包含了3棵Merkle Tree,分别对应了三种 ...

  9. 细品以太坊的“四棵树”——Merkle Patricia Trie

    目录 1. 基础算法 1.1 Merkle Tree 1.2 Trie 1.3 Patricia Trie 2. Merkle Patricia Trie 2.1 节点类型 2.2 Key 定义 2. ...

最新文章

  1. 纤涂覆层材料的研究与总结
  2. 中兴智能视觉大数据公交车专用道移动智能电子警察系统功能、特点及优势详细介绍...
  3. android gridview item 大小,关于GridView item动态宽度的问题
  4. Atmosphere 1.0:支持Java/JavaScript的异步通信框架
  5. 【渝粤教育】电大中专消费者行为学 (3)作业 题库
  6. 如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制
  7. python语言变量随时命名随时赋值_Python变量及数据类型用法原理汇总
  8. 目标检测——如何让模型过拟合
  9. 51单片机的初了解(4)
  10. [2178]链表的有序集合 (链表的插排法+重复元素的删除) SDUT
  11. MySQL-第十三篇使用ResultSetMetaData分析结果集
  12. java的酒店房间管理系统
  13. oracle 查看cdb,Oracle基础操作——CDB-PDB
  14. springBoot 修行之路1
  15. 山石网科面经(附参考回答)
  16. android 画圆形 bitmap,在android中画圆形图片的几种办法
  17. 刷屏!日本内政部向国民宣传5G的短视频:未来将是这样!
  18. 【附源码】计算机毕业设计SSM宁夏旅游信息管理系统
  19. Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别
  20. 产品经理的职业生涯规划是怎么样的?

热门文章

  1. 使用UltraISO(软碟通)制作系统盘 / U盘启动-linux版、 双系统的运行
  2. 计算机方向的研究生(转)
  3. 碎碎念No.01 你是个自信的人嘛
  4. Python V-ing 变化小程序
  5. 如何通过ARX程序直接设置当前视图为顶视图(底视图)等?
  6. ubuntu下使用GeographicLib库
  7. 计算机语言指令数据用0,汇编语言-中国大学mooc-题库零氪
  8. WPF Excel导入01
  9. 2006考研阅读Text4翻译
  10. CASIA-HWDB数据集下载和预处理