经过身份验证的数据结构ADS(学前准备)
Merkle Trees
-
简单介绍
默克尔树(Merkle Trees)是一种二叉树(在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。[1]),它由一个根节点,一组中间节点和一组叶子节点组成。 -
(默克尔树的结构)Merkle trees structure
Merkle trees由一个根节点,一组中间节点和一组叶子节点组成。根节点表示是最终的那个节点,且只有一个。叶子节点可以有很多,但是不能再扩散也就是没有子节点了。如下图所示:
图中的节点解释如下:
| 节点名称 | 结构与作用 |
|---|---|
| Root | 根节点,所有的子节点汇总到这里,像一棵倒立的树。 |
| Hash: | 能将任意长度的二进制明文映射为较短的二进制串的算法,也叫“哈希”算法,如MD5,SHA系列等,哈希后的结果也称哈希值。 |
| Data0 … Data3 | 这些代表的是具体的原始数据 |
| B0,B1…B3 | 这些是把原始数据进行哈希运算后得到对应的哈希值 |
Data0和是B0是对应的关系,也就是说B0的哈希值对应的是Data0这一条数据,唯一对应的。
3. 具体实现步骤
第一步:把最底层的Data0…Data3这四条数据,每一条单独进行Hash,得出4个哈希值作为叶子节点。
第二步:把相邻的两个叶子节点的哈希值拿出来再进行Hash,如B0+B1 Hash后得出B4。
第三步:递归执行这样的Hash操作,直到最终Hash出一个根节点,就结束了。
这就是默克尔树的运行原理,在图中展现是:B0+B1 Hash得出B4,B2+B3 Hash得出B5,B4+B5 Hash得出Root根节点。由于每个节点上的内容都是哈希值,所以也叫“哈希树”。
4. 默克尔树的特性
第一特性:任意一个叶子节点的细微变动,都会导致Root节点发生翻天覆地的变化,可以用来判断两个加密后的数据是否完全一样
第二特性:快速定位修改,如果Data1中数据被修改,会影响到B1,B4和Root,当发现根节点Root的哈希值发生变化,沿着Root - > B4 - > B1最多通过O(logn)时间即可快速定位到实际发生改变的数据块Data1.
第三特性:零知识证明,它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。<br。比如怎么证明某个人拥有Data0…Data3这些数据呢?创建一棵如图所示的默克尔树,然后对外公布B1,B5,Root;这时Data0的拥有者通过Hash生成B0,然后根据公布的B1生成B4,再根据公布的B5生成Root,如果最后生成的Root哈希值能和公布的Root一样,则可以证明拥有这些数据,而且不需要公布Data1,Data2,Data3这些真实数据。如图:
5.比特币中的应用
默克尔路径:上图中Root - > B4 - > B1 这就是一条路径,表示从根节点到叶子节点所经过的节点组成的路径。
比特币中,默克尔树被用作归纳一个区块中的所有交易,同时生成整个交易集合的数字签名,且提供了一种校验区块是否存在某交易的高效途径,就是默克尔路径。生成默克尔树需要递归地对各个子节点进行哈希运算,将新生成的哈希节点插入到默克尔树中,直到只剩一个哈希节点,该节点就是默克尔树的根节点。
默克尔树查找交易的高效性:
假设一个区块中有16笔交易,根据上文提到的公式O(logn) 可以算出16的对数是4,也就是要找到这个区块中的任意一笔交易,只需要4次就可以了,它的默克尔路径会保存4个哈希值:
解释一下,
- 一笔交易大概250 Byte左右
- 路径数代表哈希值的数量,路径数是4表示这条路径存了4个哈希值,每个哈希值是32 Byte
- 区块大小 = 交易数 * 250 Byte
- 路径大小 = 路径数 * 32 Byte
比特币中的默克尔树:

可以看出,当区块大小由16笔交易(4KB)增加至262144笔交易(65MB)时,为证明交易存在的默克尔路径长度增长极其缓慢,仅仅从128字节到576字节。有了默克尔树,一个节点能够仅下载区块头(80字节/区块,里面包含上一区块头的哈希值,时间戳,挖矿难度值,工作量证明随机数,包含该区块交易的默克尔树的根哈希值),**然后通过从一个满节点回溯一条小的默克尔路径就能认证一笔交易的存在,而不需要存储或者传输大量区块链中大多数内容,这些内容可能有几个G的大小。**这种不需要维护一条完整的区块链的节点,又被称作简单支付验证(SPV)节点,它不需要下载整个区块而通过默克尔路径去验证交易的存在。再来献上一张V神画的图,在比特币网络中找出了TX3的默克尔路径:
默克尔树的应用场景其实很广泛,比较典型的就是P2P下载。在点对点网络中作数据传输的时候,会同时从多个机器上下载数据,而且很多机器可以认为是不稳定或者不可信的。为了校验数据的完整性,更好的办法是把大的文件分割成小的数据块(例如,把分割成2K为单位的数据块)。这样的好处是,如果小块数据在传输过程中损坏了,那么只要重新下载这一快数据就行了,不用重新下载整个文件。
怎么确定小的数据块没有损坏哪?只需要为每个数据块做Hash。BT下载的时候,在下载到真正数据之前,我们会先下载一个Hash列表。那么问题又来了,怎么确定这个Hash列表本事是正确的哪?答案是把每个小块数据的Hash值拼到一起,然后对这个长字符串在作一次Hash运算,这样就得到Hash列表的根Hash。下载数据的时候,首先从可信的数据源得到正确的根Hash,就可以用它来校验Hash列表了,然后通过校验后的Hash列表校验数据块。
除了P2P下载外,默克尔树还可以被用来快速比较大量的数据,因为当两个默克尔树根相同时,则意味着所代表的数据必然相同。还有就是可以用来实现零知识证明(零知识证明指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。举个例子,你要我向你证明我拥有某一把钥匙,这个时候我不需要直接拿钥匙给你看,而是用这个钥匙开锁拿出所在柜子中的某一样东西给你看以此来证明我拥有这把钥匙)。[2]
6. 总结:
介绍了什么是默克尔树,以及它的三个特性和在比特币中的应用。核心就是将大量数据进行哈希运算后增加其分布式索引性能,通过维持一个较小的高效索引(默克尔路径)进而管理复杂的大量数据。
参考链接:
1.https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/
2.https://blog.youkuaiyun.com/weixin_37504041/article/details/80474636
3.https://my.oschina.net/sunqichao/blog/1809976
内容参考网络,整理,发布,侵权,联系删除

1494

被折叠的 条评论
为什么被折叠?



