比特币系统数据结构 Merkle tree

疫情期间,看了区块链相关,北京大学 肖臻研究员 的《区块链技术与应用》课程,课程传送门,方便复习做下笔记啦

什么是Merkle tree

哈希树(hash tree;Merkle tree),在密码学及计算机科学中是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签 。哈希树能够高效、安全地验证大型数据结构的内容,是哈希链的推广形式[1]。

哈希树的概念由瑞夫·墨克于 1979 年申请专利,故亦称墨克树(Merkle tree)。

概述

哈希树中,哈希值的求取通常使用诸如SHA-2的加密哈希函数,但如果只是用于防止非故意的数据破坏,也可以使用不安全的校验和获取,比如CRC。

哈希树的顶部为顶部哈希(top hash),亦称根哈希(root hash)或主哈希(master hash)。以从 P2P 网络下载文件为例:通常先从可信的来源获取顶部哈希,如朋友告知、网站分享等。得到顶部哈希后,则整棵哈希树就可以通过 P2P 网络中的非受信来源获取。下载得到哈希树后,即可根据可信的顶部哈希对其进行校验,验证数据是否完整、是否遭受破坏。

比特币中的Merkle tree

  • 比特币中,每一个数据库其实是一种交易tx(Transaction)
  • 用Merkle tree的好处:轻节点只要存放root hash,就能检测出树种任何节点的修改。
  • 每个区块分为两个部分
    • Block header 块头 \color{red}{有根哈希值,没有交易具体内容}有根哈希值,没有交易具体内容
    • Block body 快身 \color{red}{有交易列表}有交易列表
  • 节点(节点指的是区块链网络中的计算机,包括手机、矿机、服务器…)
    • 全节点 full node:保存Block header 和 Block body
    • 轻节点 light node(手机上的比特币钱包):只保存Block header

轻节点如何证明某个是写入区块链的?

如下图所示:

tx是我需要验证的交易是否存入区块链

比特币系统数据结构 Merkle tree

利用tx可计算出哈希值H()\color{green}{H()}H(),然后向全节点请求获取哈希值H()\color{red}{H()}H(),如下图标志的位置

比特币系统数据结构 Merkle tree

然后上一步两个H()可以计算得到图示的这个哈希值H()\color{green}{H()}H(),再向全节点请求获取哈希值H()\color{red}{H()}H()

比特币系统数据结构 Merkle tree

上一步两个H()可以计算得到图示的这个哈希值H()\color{green}{H()}H(),再再向全节点请求获取哈希值H()\color{red}{H()}H()。最后的H()\color{green}{H()}H()和H()\color{red}{H()}H()算出一个root hash和本身轻节点所保存的root hash对比验证,得出该交易是否在区块链中。

比特币系统数据结构 Merkle tree

上一篇:Merkle Tree and Zero Knowledge Proof


下一篇:轻节点如何验证交易的存在