首页
登录 | 注册

【数据结构】Merkle tree学习

描述

学习比特币的数据结构看到的,原来以为是一种刚出来的数据结构,阅读了一些文档后才发现这个数据结构是蛮经典的。比如在下小电影的时候也会用到这个东西。

学习

hash

用到这个首先要先知道hash,关于hash的原理和生成我不清楚,这个太底层了。一般可以理解是某一些特定的算法可以为某个文件生成指定长度的唯一字符串,而这个字符串可以代表这个文件。如果两个文件的hash值一致,可以认为这两个文件是一样的。

比如有这么一个场景,要从网站下载某一个文件,网络传输不太稳定,那么可以通过检查hash的方式进行判断。网站的文件处提供了一个MD5加密的hash值,下载下来的文件也进行MD5的加密,如果hash值一样,说明两个文件是一样的,可以放心使用。如果不一样,说明在传输过程中丢包了,文件不完整,或者是中途有人拦截篡改了文件,都会导致文件的无法使用。

应用场景

P2P下载

P2P下载就是点对点下载,不一定是从服务器中获取资源,而是从别的用户处获取到资源进行传输。这就会出现下载的用户越多,这个资源的下载速度越快。因为其中会有算法从较近的用户处获取。

P2P下载一个文件,它会从多个用户处获取到这个文件的一部分数据,然后同时进行下载,这样可以加快速度。这样有一个问题需要解决,怎么知道各个部分的数据都是对的。这时就需要Merkle tree。

【数据结构】Merkle tree学习

图中A分成了B和C两个部分,在分的时候算出B和C的hash值,传输结束检查接收到的数据的hash值是否一致,一致说明传输的包是对的。接下来就是要进行数据合并。A的hash值可以通过B+C的hash值相加(字符串的相加就是拼接,如 “g7jd” + “6qi8” = “g7jd7qi8”)再进行hash计算得到hash值,然后再进行比较,可以得到数据是否一致。文件的包可以无限分,Merkle tree也可以通过这样的计算进行处理。

bitcoin

比特币的区块中保存交易记录就是通过这样的处理方式。
【数据结构】Merkle tree学习

这里的处理方法是先把实际的交易信息如转账人、收钱人、转账金额等交易信息进行hash加密计算,然后得到交易的hash值。然后将相邻的两个交易hash值进行相加,然后再进行hash加密计算得到下一级的hash值。如此这般向上,最终得到一个根节点hash,这个就是区块的所有交易信息汇总。

实现

这个数据结构说到底还是一种树的实现,只要熟悉树结构,实现还是蛮简单的,但是这个页面有限,我就不写了。



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号