) 。下载数据的时候, 首先从可信的数据源得到正确的根 Hash , 就可以用它来校验 Hash List 了,然后通过校验后的 Hash List 校验数据块。 Hash List 如图 2-1 所示。图 2-1 Hash Li st示意图 2.3.2 Merkle Tree 和 Hash Li st Merkle Tree 可以看做 Hash List 的泛化( Hash List 可以看作一种特殊的 Merkle Tree ,即树高为2 的多叉 Merkle Tree )。在最底层,和 Hash List 一样, 我们把数据分成小的数据块, 有相应地 Hash 和它对应。但是往上走, 并不是直接去运算根 Hash , 而是把相邻的两个 Hash 合并成一个字符串, 然后运算这个字符串的 Hash , 这样每两个 Hash 就结婚生子, 得到了一个“子 Hash ”。如果最底层的 Hash 总数是单数, 那到最后必然出现一个单身 Hash , 这种情况就直接对它进行 Hash 运算, 所以也能得到它的子 Hash 。于是往上推,依然是一样的方式,可以得到数目更少的新一级 Hash ,最终必然形成一棵倒挂的树,到了树根的这个位置,这一代就剩下一个根 Hash 了,我们把它叫做 Merkle Root 。 Merkle Tree 如图 2-2 所示。在 p2p 网络下载网络之前, 先从可信的源获得文件的 Merkle Root 。一旦获得了 Merkle Root , 就可以从其他从不可信的源获取 Merkle tree 。通过可信的 Merkle Root 来检查接受到的 Merkle Tree 。如果 Merkle Tree 是损坏的或者虚假的,就从其他源获得另一个 Merkle Tree ,直到获得一个与可信 Merkle Root 匹配的 Merkle Tree 。