当前位置: 首页 > news >正文

苏州网站建设制作公司网站建设预算策划

苏州网站建设制作公司,网站建设预算策划,大淘客做网站,竞价sem托管参考文献: Merkle Tree & Hash-based SIGMerkle Tree 实现以太坊 Merkle Patricia Tree 全解析Merkle Patricia Tree (梅克尔帕特里夏树) 详解 文章目录MPT 结构基本操作GetInsertDelete其他MPT 结构 Merkle Patricia Tree 是以太坊的关键算法之一。它是一种 …

参考文献:

  1. Merkle Tree & Hash-based SIG
  2. Merkle Tree 实现
  3. 以太坊 Merkle Patricia Tree 全解析
  4. Merkle Patricia Tree (梅克尔帕特里夏树) 详解

文章目录

  • MPT 结构
  • 基本操作
    • Get
    • Insert
    • Delete
  • 其他

MPT 结构

Merkle Patricia Tree 是以太坊的关键算法之一。它是一种 16 进制的前缀树(key 编码在 Path 中),具有三种节点:

  1. Branch
    • 具有至少 2 个孩子,至多 16 个孩子
    • 具有以该路径结束(key)的对应 value
    • 附带字段 nodeFlag,包括
      • hash, 本节点的 Hash 值
      • gen, 诞生标记,最近一次被写入/修改的时间
      • dirty,节点是否被修改,若是则 hash 置空以更新
  2. Leaf
    • 和 Branch 类似,除了把 children 换成 key
    • 这个 key 用于处理一段后缀不存在相同前缀其他节点的情况
  3. Extension
    • 与 Leaf 相同,除了把 value 替换为 ptr/idx
    • 这个 ptr/idx 用于持久化存储 MPT 时的检索

以太坊中 Leaf 和 Extension 共享定义,为了在持久化存储中做区分,需要将 Hex 编码替换为 Hex-Prefix 编码

  • 如果 Extension 的 key 为偶数长度 Hex 编码,那么在最前面补 0x00
  • 如果 Extension 的 key 为奇数长度 Hex 编码,那么在最前面补 0x1-
  • 如果 Leaf 的 key 为偶数长度 Hex 编码,那么在最前面补 0x20
  • 如果 Leaf 的 key 为奇数长度 Hex 编码,那么在最前面补 0x3-
  • 最终的 prefix || key 是偶数长度的 Hex 编码

MPT 的整体结构如下:

  1. 树根是一个 Extension 节点,它的 ptr/idx 是其 Branch(或者 Leaf,如果是树桩)子节点的 Hash 值
  2. Branch 节点的 children 存储 16 个孩子各自的 Hash 值
  3. Branch 节点的 children 可以是 Leaf 或者 Extension 节点
  4. Extension 节点的 ptr/idx 是其子节点(branch 或者 leaf)的 Hash 值
  5. 如果该路径是多个 key 的前缀,那么创建 Extersion 以及 Branch
  6. 如果该路径只是单个 key 的前缀,那么创建 Leaf

换句话说,extension 的作用是存储 branch 或 leaf 的 Hash 值(也是索引),branch 的作用是存储最少 2 个、最多 16 个子树的 Hash 值(也是索引),通常 leaf 的父节点是 branch(除非只有一个 extension 作为树桩的根)

在这里插入图片描述

基本操作

Get

假设需要查找 inp_key 的节点,

  1. 当前是 leaf 节点,判断它的 path || key 是否等于 inp_key,输出它的 value 或者 false
  2. 当前是 extension 节点,判断它的 path || key 是否是 inp_key 的前缀,决定是否递归检索 ptr/idx 指向的子节点,或者输出 false
  3. 当前是 branch 节点,如果 path 等于 inp_key,那么输出它的 value
  4. 当前是 branch 节点,如果 pathinp_key 的前缀,那么递归检索下一个 hex 所对应的 children 节点(leaf, extension, empty)

Insert

假设需要插入 inp_key 的节点,

  1. 利用 Get 方法,获取 inp_key 所能匹配的最长前缀节点
  2. 如果它是 leaf 节点,判断 path || key 是否等于 inp_key
    1. 相等,那么更新它的 value
    2. 否则,新建一个 extension 节点和 branch 节点,前者的 key 是最长的公共前缀,后者的两个 children 分别指向原始的 leaf(或者填入 value 如果是前缀的话)和一个新建的 leaf
  3. 如果它是 extension 节点,过程和 leaf 的相似
  4. 如果它是 branch 节点,
    1. 如果 path 等于 inp_key,那么更新它的 value
    2. 如果 pathinp_key 的前缀,那么将对应的 children 指向一个新建的 leaf
  5. 最后,从下向上重建 Merkle Tree

Delete

假设需要删除 inp_key 的(单个)节点,

  1. 利用 Get 方法,获取 inp_key 所能匹配的最长前缀节点
  2. 如果它是 leaf 节点,判断 path || key 是否等于 inp_key
    1. 相等,那么删除它,并判断它的 branch 父节点是否仍具有至少 2 个孩子(包括它的 value 视为一个孩子),作相应的合并调整
    2. 否则,不存在 inp_key 节点,返回 false
  3. 如果它是 extension 节点,那么
    1. 如果 path 等于 inp_key,这是一种非法操作(删除整个子树?)
    2. 如果 path || key 不等于 inp_key,那么返回 false
    3. 不会发生 path || keyinp_key 前缀的情况,这一定会匹配到 extension 的孩子
  4. 如果它是 branch 节点,
    1. 如果 path 等于 inp_key,那么删除 value,但是不要递归删除它的孩子(这个 branch 存储的完整 key 是其他 key 的前缀)
    2. 否则,这意味着不存在 inp_key 节点(不然最长前缀节点不会是 branch 而应该是 extension 或 leaf),返回 false
  5. 最后,从下向上重建 Merkle Tree

其他

如果要求 {key: value} 具有相同长度的键,那么 branch 节点可以移除其 value 域(此时不存在某路径是其他路径的前缀),相应的 Get、Insert、Delete 可以被适当简化。

每个节点都是变长的连续数据块(均包含 keyvalue 域之一),节点的引用是 Hash 值。在内存中,可以利用 std::map 来管理;在磁盘中,如果树很大(无法一次性加载到内存)则使用数据库来管理。

http://www.dtcms.com/a/579588.html

相关文章:

  • 网站建设主持词ps在线图片编辑
  • 企业网站建设教程视频易语言 wordpress登录注册
  • 海南省建设考试网站成品网站包含后台么
  • php网站 更改logo唐山网站专业制作
  • Flutter版本管理工具FVM
  • 网站开发购物店12345汽车网址大全
  • 中山市 做网站运营一个企业网站的推广方案
  • 空包网站建设属于哪类wordpress调用函数大全
  • 网站做视频的软件叫什么wrix 网站开发
  • 网站一键制作整改网站建设情况
  • 做网站推销产品效果怎么样直播间网站建设
  • 单页网站订单系统怎么改邮箱wordpress怎么添加留言板
  • 个人博客网站的建设结构图如何推广企业官方网站内容
  • 微博营销网站二级建造师报考条件2021考试时间
  • reason: unable to verify the first certificate 如何处理
  • 建设公司网站需要什么销售app哪个好用
  • 品牌网站策划描述网站开发的流程
  • 网站二级域名如何设置校园网站建设说明书
  • 营销型网站建设总结网站页面模板 建设中
  • 移动互联时代网站建设php网站空间购买
  • 哈尔滨大型网站制作网站的备案all
  • 网网站建设与制作手机有办法做网站吗
  • 济宁专业建网站西安网站建设案例
  • 集团微网站建设wordpress定义页面带html
  • 网站设计制作wordpress 数据库
  • 建设企业网站电话是多少创意响应式网站建设
  • 360 的网站链接怎么做携程旅行的网站建设
  • 南平做网站建设网站门户
  • 身份证--困惑
  • 小程序app开发seo0577