merkle tree(hash tree)

merkle tree(hash tree)_第1张图片
merkle tree即为hash tree,以下都用hash tree表示。
hash tree使得可以对大型数据结构的内容进行有效且安全的校验。
hash tree是hash list和hash chain的一般化形式。
hash trees 主要用于p2p网络中保证数据的完整性。

原理

  • Hash tree是一种树,大多数是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点。
  • 叶节点的value是数据块的HASH。
  • 非叶节点的value是根据它下面所有的子节点Hash或值(对于叶子节点),然后按照Hash算法计算而得出的。
    • hash parent = hash ( hash child1 + hash child2 … + hash childn) ,其中 + 表示字符串连接。

hash tree与hash list的主要不同点在于,hash tree的一个分支可以在一次中被下载,且每一个分支的完整性可以立即被校验即便整颗树的数据还未完整。

second preimage attack(二次原像攻击)

在hash tree中,不能从根节点(root node)推导出树的深度(depth),使得存在被二次原像攻击的可能:伪造一棵具有相同根节点但存在不同分支的hash tree。
一个简单的防范方法
校验透明性(Certificate Transparency):在计算叶节点的HASH时,前置0x00到数据,前置0x01到内部节点的hash值。有一些实现是通过前置树的深度到节点value来限制树的深度。因此, 任何提取的HASH链都定义为仅当前缀在每一步中减少并且在到达叶时仍为正值时才有效。

操作

build/构建

  • 时间复杂度:O(n)
  • 过程
    • 计算出页节点数据的HASH,得到最底层非页节点的HASH。
    • 从底向上,逐层计算每个节点的HASH,直到根节点。
      merkle tree(hash tree)_第2张图片

check_consensus/一致性校验

  • 时间复杂度:log2(n)
  • 过程
    • 从根节点开始,逐层校验对应节点的HASH值。全部有效为一致,否则无效。
      merkle tree(hash tree)_第3张图片

update/更新数据

  • 时间复杂度:log2(n)
  • 过程
    • 从数据节点对应的叶节点开始,逐层重新计算HASH直到根节点。

应用

通常,hash tree运用如SHA-2(即SHA-224,SHA-256,SHA-512等)来作散列操作。但在对安全性要求没那么高,仅需保证数据不会被无意地损坏的情况下,可以使用checksum的算法(如CRC)。
在P2P网络下载文件之前,通常都是从可信的源(如朋友,可信度高的网站)获取根HASH。当我们拥有根HASH之后,就可以从不一定可信的源(如P2P网络中的节点)获取整个hash tree的数据。根据根HASH,可以校验出哪些节点是有效的,哪些是无效的。

bitcoin

比特币区块链使用的是二叉hash tree,散列算法是二次SHA-256 HASH。
这里写图片描述

  • 如果叶节点是奇数,则会用最后一个节点来补充为偶数,该操作称为平衡
    merkle tree(hash tree)_第4张图片

  • 校验
    merkle tree(hash tree)_第5张图片

你可能感兴趣的:(算法)