从零开始学习区块链——Merkle tree 是什么?
贝壳手表CCT
2018-07-30
热度45040

Hash函数是一个散列函数,任意长度的数据通过散列算法都会得到固定长度的输出。

来源:贝壳手表CCT

哈希函数

Hash函数是一个散列函数,任意长度的数据通过散列算法都会得到固定长度的输出。

特点:

1、哈希函数可以起到压缩丝信息的作用;

2、它具有不可逆性;

3、 对输入敏感,两个非常相似但有细微差别的输入通过运算得到的数值差距很大;

4、抗碰撞性很强。

基于哈希函数以上特点,它在区块链中有很多应用。比如,数据完整性校验。将数据进行哈希运算得到长度固定的哈希值,然后把这个哈希值传播到网络中,用户在下载数据时,同样对数据进行哈希计算,将计算结果与网络中传播的哈希值是否一样,以此来判断数据有没有被损坏。

哈希列表

点对点网络中数据的传输会从很多计算机上下载数据,其中会出现很多机器不稳定或者不可信的问题,一旦数据源不稳定,数据损坏,就需要从新下载,效率很低。因此,一个大的文件通常被分割成好多小数据块进行传输是很可行的,如果在传输过程中某个小数据块被损坏,只要重新下载这一块就可以了,这样就大大提高了效率。

哈希列表,就是将整个数据分成若干小数据块,对每个小数据块进行哈希计算得到若干哈希值,探后再将这些哈希值拼成一个长串字符,在对长串字符进行哈希计算,得到一个哈希值,这样就构成了一个哈希列表,这个哈希值被称为根哈希。数据校验的时候,先验证根哈希,如果根哈希一致,数据就是正确的。


Merkle 树

Merkle树是泛化的哈希列表。我们具体了解一下。

首先将整个数据分成多个小数据块(L1、L2、L3、L4),分别计算出对应的哈希值(Hash0-0、Hash0-1、Hash1-0、Hash1-1)。这些哈希值构成了Merkle树的最底层,然后将两个相邻的哈希值(Hash0-0、Hash0-1)合并成一串字符,再进行哈希计算得到一个新的哈希值(Hash0),它被称为两个哈希的“子哈希”,然后循环这个操作,层层计算,每次计算哈希值的数量都减少二倍,直到最后只有一个哈希,这个哈希叫做“根哈希”。


Markle树的特点:

1. 是一棵倒挂的树,具有树结构的特点,大多是二叉树;

2. 最底层是叶子节点,叶子节点是小数据块的哈希值;

3. 非叶子节点是由它下面的两个叶子节点结合的字符串的哈希值。

Markle树的验证

在点对点网络下载数据之前,需要先从可信信息源获得该文件Markle树的根哈希,整个Markle树可以从任意信息源获取。以可信信息源获得的Markle树为标杆,检验获取的Markle树是否受损或虚假即可。

如果两台计算机(A、B)的Markle树进行检验,其中HASH0-0是不一致的,校验过程:

首先对比根哈希,发现不一致;

分别对比Hash1和Hash2,发现Hash1不一致,Hash2一致;

检查Hash这支下面的Hash0-0和Hash0-1,发现Hash0-0不一致,Hash0-1一致;

Hash0-0为叶子节点,获取其目录信息;

检索完毕。

这个过程采用的是二分法,这样就可以减少检查的工作量,提高效率。


文章声明:本文为MarsBit专栏作者作品,版权归作者所有,不代表MarsBit观点。

本内容旨在传递行业动态,不构成投资建议或承诺。
为你推荐

商务合作:TG:@Lottie96