MPT(Merkle Patricia Tree)树结构示例
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)树结构示例相关推荐
- Merkle Patricia Tree (MPT) 树详解
1. 介绍 Merkle Patricia Tree(简称MPT树,实际上是一种trie前缀树)是以太坊中的一种加密认证的数据结构,可以用来存储所有的(key,value)对.以太坊区块的头部包 ...
- Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范
Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范 2017/4/15 posted in Solidity深入浅出系列 Merkle Patricia Tree1,梅克尔帕特 ...
- Merkle Patricia Tree 梅克尔帕特里夏树(MPT)详细介绍
Merkle Patricia Tree [1],梅克尔帕特里夏树,提供了一个基于加密学的,自校验防篡改的数据结构,用来存储键值对关系.后文中将简称为MPT.尽管在本规范范围内,我们限定键值的类型只能 ...
- Merkle Patricia Tree 详解
转载自 https://ethfans.org/toya/articles/588 1. 前言 1.1 概述 Merkle Patricia Tree(又称为Merkle Patricia Trie) ...
- Merkle Patricia Tree (MPT) 以太坊merkle技术分析
转载自:https://blog.csdn.net/zslomo/article/details/53434883 一 传统merkle树缺陷 我的这篇博客merkle tree 分析 详细解释了me ...
- Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范(笔记)
Merkle Patricia Tree1,梅克尔帕特里夏树,提供了一个基于加密学的,自校验防篡改的数据结构,用来存储键值对关系.后文中将简称为MPT.尽管在本规范范围内,我们限定键值的类型只能是字符 ...
- 014-数据结构-树形结构-基数树、Patricia树、默克尔树、梅克尔帕特里夏树( Merkle Patricia Tree, MPT)...
一.基数树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Radi ...
- 04.区块链的那些事儿-以太坊中的 Patricia Tree
本节主要讨论以太坊中存储的 Patricia Tree 比特币只有1棵Merkle树,而以太坊的每一个区块头,并非只包含1棵Merkle Tree,而是包含了3棵Merkle Tree,分别对应了三种 ...
- 细品以太坊的“四棵树”——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. ...
最新文章
- 纤涂覆层材料的研究与总结
- 中兴智能视觉大数据公交车专用道移动智能电子警察系统功能、特点及优势详细介绍...
- android gridview item 大小,关于GridView item动态宽度的问题
- Atmosphere 1.0:支持Java/JavaScript的异步通信框架
- 【渝粤教育】电大中专消费者行为学 (3)作业 题库
- 如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制
- python语言变量随时命名随时赋值_Python变量及数据类型用法原理汇总
- 目标检测——如何让模型过拟合
- 51单片机的初了解(4)
- [2178]链表的有序集合 (链表的插排法+重复元素的删除) SDUT
- MySQL-第十三篇使用ResultSetMetaData分析结果集
- java的酒店房间管理系统
- oracle 查看cdb,Oracle基础操作——CDB-PDB
- springBoot 修行之路1
- 山石网科面经(附参考回答)
- android 画圆形 bitmap,在android中画圆形图片的几种办法
- 刷屏!日本内政部向国民宣传5G的短视频:未来将是这样!
- 【附源码】计算机毕业设计SSM宁夏旅游信息管理系统
- Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别
- 产品经理的职业生涯规划是怎么样的?