在密码学货币领域,默克尔树是一种很高效的方法,用于证明一大组数值中存在一个特定的数值,而且将数据存储量降到了最低。本文介绍了默克尔树,并且展示了如何通过存储多个层级的默克尔树分支而非根节点的方式来大量减少重复证明(即 “默克尔树截顶(Merkle pollard)”)。

哈希函数

哈希函数可以把一段任意长度的数据(即下图中的水果名)变成一个固定长度的值(即“哈希值”)。例如,下图中 “Apple” 和 “Orange” 的哈希值如下所示:

-哈希值-

哈希函数有很多特征,其中最显著的两点是:(1)即使输入值仅有毫厘之差,得到的哈希值也会迥然不同;(2)从数学上来说很难根据哈希值倒推出输入值(通常来说,没有比反复试错更快的方法)。

默克尔树

默克尔树指的是将多个输入值和它们的哈希值结合起来压缩成某个固定长度的值。

默克尔树的顶端是各种输入值,被称为“叶节点”。每个叶节点经过哈希得到上一层分支,相邻两个分支拼接在一起之后哈希得到中间支。一层一层哈希之后,最后得到一个哈希值,即默克尔根节点。默克尔树的示例图如下:

-默克尔树-

上图所示的默克尔树有 8 个输入值,分为 4 层。根节点就是位于最末端的 0xd576...ffd9

正如上文所述,即使输入值极为近似,得到的哈希值也是迥然不同的。如果输入值发生了变化,会影响到默克尔树的各个层次,最后得出完全不同的根节点。例如,将输入值中的 “Peach” 改为 “Pear” 之后,这个默克尔树都会发生变化,如下图所示:

-一处改动对整个默克尔树的影响(如灰色阴影部分所示)-

默克尔树是可再生的:如果把完全相同的输入值按照同样的顺序排列,默克尔树的分支和根节点始终会得出同样的哈希值。

默克尔路径

默克尔路径指的是某个输入值到默克尔根节点之间所有哈希值的集合。下图显示了输入值 “Peach” 的默克尔路径:

-"Peach" 的默克尔路径-

默克尔证明

默克尔证明指的是不需要知道一个数据集合中的其他值就能证明某个值属于这个集合。

-默克尔证明-

默克尔证明需要三样东西:输入值(红色标记)、中间支哈希值(绿色标记)和默克尔根节点(蓝色标记)。每个输入值对应的中间支哈希值集合各不相同。

区块链系统经常会用到默克尔证明,证明某个数据集合内存在某个输入值,这样就不需要将整个数据集合都存储在区块链上了。假设一个以太币合约内有一个白名单列表, 只允许列表内的账户购买以太币。如果将白名单内每个账户信息都存储在区块链上,势必要付出很高的成本。在这种情况下,只需要创建一个默克尔树,再将根节点存储在区块链上即可。

例如,如果将根节点存储在一个智能合约上,这个智能合约很容易就能证明某个账户包含在白名单内:这个账户需提供中间支哈希值(合约所有者通过某种链下方式提供给账户持有者),智能合约将这个账户的哈希值依次与中间支哈希值进行哈希计算。如果最后得出的结果与默克尔根节点一致的话,就证明这个账户确实在白名单里。

请注意最后两张图中默克尔路径和默克尔证明的哈希值之间的关系。在同一棵树的同一个层级中,默克尔证明的哈希值与默克尔路径的哈希值是相互关联的。由此可见,默克尔证明能够重塑输入值的默克尔路径,这就是为什么最终结果是默克尔根节点的原因。

至此,可以看出默克尔证明具有以下特征:

  • 在链上存储默克尔证明所需的空间远远小于直接存储输入值所需的空间
  • 在链上公开存储默克尔证明也不会暴露整个输入值集合
  • 要证明某个输入值集合内是否存在某个值,验证默克尔证明的成本低于核对整个输入值集合的成本

重复证明

在上文的例子中,每个账户只需要发送一个默克尔证明,就能够验证自己是否在白名单上。

此外,默克尔树还可以用作概率性知识证明(通常被称为 STARKs ),每一次知识证明都能使我们(即 “验证者、挑战者”)更加确信:默克尔树的创建者(即 “证明者” )知道所有的构成值。在这种情况下,证明者通常会根据包含几十个乃至成百上千个输入值的默克尔树生成上百个证明。这些证明会连同默克尔根节点一起发送给验证者,来验证它们的有效性。

让我们紧接着上面的例子来探究重复证明,下面三幅图分别是由同一个默克尔树生成的三个不同的证明:

-同一个默克尔根的重复证明-

可以看出总共发送了一个默克尔根节点和三个证明,加起来共有 10 个哈希值:根节点有 1 个,其余三个证明各有 3 个。

有没有效率更高的做法?可以看出默克尔树的第一个层次只有两个值 c0b7...da30 和 6ff9...8e3d ,但(在提供这一层次的哈希值时)三个证明总共发送了 3 个哈希值(每个证明 1 个)。那么,如果一开始提供的部分不仅包括最低层次的哈希值(即默克尔根),还提供更上一层次的哈希值,效率会不会更高?

-扩展式默克尔根节点的重复证明-

(校对注:对比上两组图可以发现,第一种证明方式需要发送 10 个哈希值,但第二种证明方式只需要发送 9 个,所以确实提高了效率)

默克尔树截顶

扩展默克尔根也可以说是给默克尔树截顶,也就是只保留默克尔根节点和少数几层中间支。默克尔树截顶的顺序是按照根节点上方的中间支层数决定的(一个 0 阶默克尔截顶即是默克尔根)。1 阶默克尔截顶包含一层中间支,如下图所示:

- 1 阶默克尔截顶-

2 阶默克尔截顶包含两层中间支,如下图所示:

- 2 阶默克尔截顶-

如果同一个默克尔树存在多个重复证明,采用默克尔树截顶会减少证明的大小(因为每个证明所含的哈希值会减少)以及验证证明所需的时间(因为每次验证所需计算的哈希值会减少)。要求得默克尔截顶的最佳阶数,只需对证明数量取 2 的对数,再向下取整。下图是一个低阶默克尔树截顶表,显示了包含 4096 个输入值的默克尔树可节省的空间和时间,如下所示:

-不同阶数的默克尔树截顶所带来的优势-

使用默克尔树截顶能够节省大量存储空间。例如,一个 STARK 测试证明如果使用的是默克尔根节点,需要 564 KB 的存储空间,如果使用的是默克尔树截顶,只需要 346 KB 的存储空间,减少了 40% 。传输并验证证明所需的时间也会减少。

实现样例

https://github.com/wealdtech/go-merkletree/ 提供了采用 Go 语言实现的默克尔树截顶。


原文链接: https://medium.com/@jgm.orinoco/understanding-merkle-pollards-1547fc7efaa
作者: Jim McDonald

什么是 Merkle Pollard相关推荐

  1. 科普 | 什么是稀疏默克尔树多值证明

    译者注:以太坊网络是一台富状态(stateful)的世界计算机,其状态包括状态余额.交易流水号(nonce).合约代码及合约存储内容等.在技术上,这些状态数据是靠一种叫做 "默克尔树&quo ...

  2. Merkle山脉(Merkle Mountain Range)详解

    这篇文章介绍Merkle Mountain Range,翻译过来是Merkle山脉.百度上还没有Merkle Mountain Range ,或者Merkle山脉这两个关键词,这算是第一篇给它起名的中 ...

  3. Merkle Tree(梅克尔树)算法解析

    Merkle Tree概念   Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶 ...

  4. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...

    Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...

  5. Java实现算法导论中Pollard的rho启发式方法

    Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...

  6. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  7. IPFS: Merkle DAG数据结构

    今天带大家来深入探索一下IPFS的核心数据结构Merkle DAG 什么是 Merkle DAG? Merkle DAG是IPFS系统的核心概念之一,当然Merkle DAG并不是IPFS团队发明的, ...

  8. 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析

    在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...

  9. 经常在比特币中看到的merkle树是什么?

    区块基础-merkle树    Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的 ...

最新文章

  1. 采用Filter的方法解决Servlet的编码问题
  2. Connect模块解析 转载
  3. 一气发了3个patch
  4. [mmu/cache]-cache在linux和optee中的应用-InProgress
  5. WatchDog工作原理
  6. 结对项目——最大子数组
  7. 懒人建站 前台设计及特效
  8. python 3d绘图立方体_python绘制3D立方体
  9. element ui el-dialog 居中,并且内容多的时候内部可以滚动
  10. php 网关接口,[PHP] 通用网关接口CGI 的运行原理
  11. 手机按键触发事件--隐藏APP到任务后台
  12. Oracle数据库初学者入门教程
  13. 如何用vba把word文档的每页单独保存为一个word文档
  14. 国家规定的三级分销违法吗?
  15. QT QGraphicsItem飞舞的蝴蝶
  16. android开发收藏功能实现,Android使用Realm数据库如何实现App中的收藏功能
  17. 程序员初学者频繁使用count(*),被组长批评后怒怼:性能并不拉垮
  18. 苹果企业开发者账号申请记录
  19. UE4_发射器启动错误:运行引擎需要DX11特性等级10.0
  20. JAVA之对象的克隆

热门文章

  1. 有什么软件可以把文字变成语音?声音多点更好了
  2. 支付宝O2O行业解决方案大解析。
  3. 促销活动的2个环节与7个关键点
  4. Xshell如何配置并远程连接Linux服务器详解
  5. 系统wmiprvse.exe占用CPU非常高,求解决
  6. OpenCV+TensorFlow图片手写数字识别(附源码)
  7. oracle数据库的预定义的对象类型
  8. 一个研究生毕业后的职业规划 -----我今年39岁了,25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训。
  9. android q测试机型,华为公布安卓Q首批适配机型:一共有8款
  10. 计算机相关单词 1000+