merkle tree

  merkle tree 是用来存储hash值的一棵树,其叶子是数据块的hash值,非叶子节点是其对应子节点的串联字符串的hash。
  hash是一个把任意长度数据映射成固定长度的函数。对于数据完整性校验,最简单的方法是对整个数据做Hash运算得到固定长度的Hash值,然后把得到的Hash值公布在网上,这样用户下载到数据之后,对数据再次进行Hash运算,比较运算结果和网上公布的Hash值进行比较,如果两个Hash值相等,说明下载的数据没有损坏。
  hash list:为了校验数据完整性,更好的办法是把大的文件分割成小的数据块。这样的好处是,如果小的数据块在传输过程中损坏了,那么只要重新下载这一块数据就可以了,不用下载整个文件。怎么确定晓得数据块没有损坏呢,只需要对每个数据块做hash。BT下载的时候,在下载到真正数据之前,我们会先下载一个hash列表。怎么确定这个hash列表是正确的呢,把每个小数据块的hash值拼到一起,然后对这个长字符串作一次hash运算,这样就得到hash列表的根hash(top hash 或root hash)。下载数据的时候,首先从可信的数据源得到正确的根hash,就可以用它来校验hash列表,然后通过校验hash列表校验数据块。
  merkle tree可以看做hash list的泛化。在最底层,和哈希列表一样,把数据分成小的数据块,有相应的hash和它对应。往上走,并不是直接运算根哈希,而是把相邻两个hash合并成一个字符串,然后运算这个字符串的hash,这样每两个hash就结婚生子得到一个子hash。如果最底层hash总数是单数,那最后必然有一个单身hash,这种情况就直接对它进行hash运算,也能得到它的子hash。往上推,必然形成一棵倒挂的树,到了树根的位置,只剩下一个根hash了,我们把它叫做merkle root。
  在p2p网络下载之前,先从可信的源获得文件的merkle tree 树根。一旦获得了树根,就可以从其他不可信源获取merkle tree。通过可信的树根检查接收到的merkle tree。如果merkle tree损坏或者是虚假的,就从其他源获得另一个merkle tree,直到获得一个与可信根匹配的merkle tree。
  merkle tree和hash list主要的区别是,可以直接下载并验证merkle tree的一个分支。因为可以将文件切分成小的数据块,如果有一块数据块损坏,仅仅下载这个数据块就可以了。如果文件非常大,那么merkle tree和hash list都可以,但merkletree一次下载一个分支,然后立即执行这个分支,如果分支验证通过,就可以下载数据了,而hash list只有下载整个hash list才能验证。

你可能感兴趣的:(区块链)