Merkle树

Posted by BY on July 17, 2018

Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。

区块的组成:

一个区块是由区块头区块体组成。区块体则是所有 transaction 的集合,区块头由六个部分组成:

  • 上一个区块头的 Hash,previous hash。由上个区块的 block header 进行 double sha256 生成。32 bytes。
  • 时间戳,timestamp。4 bytes。
  • 挖矿难度值 target。4 bytes。
  • 工作量证明随机数,nonce。Miner 通过 nonce 达到某一个 target,达到这个 target 的 diffculty 随着时间的推移会越来越大。
  • merkle root,merkle root 可以简单理解为 transaction set 的一个唯一 hash 标识。32 bytes。
  • version。4 bytes。
02000000 ........................... 区块版本号: 2

b6ff0b1b1680a2862a30ca44d346d9e8
910d334beb48ca0c0000000000000000 ... 前一区块的256位Hash值
9d10aa52ee949386ca9385695f04ede2
70dda20810decd12bc9b048aaab31471 ... 前一区块的256位Hash值

24d95a54 ........................... 从1970-01-01 00:00 UTC开始到现在,以秒为单位的当前时间戳
30c31b18 ........................... 挖矿难度值
fe9f0864 ........................... 从0开始的32位随机数

比特币的 SPV(Simplified Payment Verification 简单支付验证) 机制,保证了每次只需要下载区块头(80 bytes),而不需要加载整个区块。平均每个 transaction 至少是 250 bytes,而且平均每个区块包含 2000 个transaction。因此,包含完整交易的区块比区块头的 4k 倍还要大。

比特币中的 Merkle Tree

1

如上图所示,L1 可以看做是 blockchain 中的一笔 transaction。 在比特币中确认一个 transaction 是否合法有四个步骤:

  1. 从网络中获取并保存最长链的所有区块头信息。
  2. 根据 block header 验证这个 transaction 所在的区块是否在上面的最长链中。block header 在 Merkle block 中获取。
  3. Merkle block 中的 Merkle 路径获得所需要验证的 hash。
  4. 根据这些 hash 值计算出一个 Merkle Root。计算出 Merkle Root 值和区块头中的 Merkle Root 是否相等。

当节点探测到某交易符合所要的检索类型,它将以 Merkleblock 消息的形式发送该区块。Merkleblock 消息包含区块头和一条连接目标交易与 Merkle 根的 Merkle 路径。

2

如上图所示我们相验证交易 K 是否合法即是否包含在区块中。Merkleblock 中返回的 Merkle 路径会包含 H(L),H(IJ),H(MNOP),H(ABCDEFGH),根据这五个 hash 值就可以确定一个 Merkle Root