Merkle Tree

在学习bitcoin最初的论文的时候,第一次知道了merkle tree。不懂这是什么,于是学习一下吧。

from Wikipedia

In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node is labelled with the hash of a data block and every non-leaf node is labelled with the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure verification of the contents of large data structures. A Merkle tree is recursively defined as a binary tree of hash lists where the parent node is the hash of its children, and the leaf nodes are hashes of the original data blocks.

Demonstrating that a leaf node is a part of a given binary hash tree requires computing a number of hashes proportional to the logarithm of the number of leaf nodes of the tree;[1] this contrasts with hash lists, where the number is proportional to the number of leaf nodes itself.

The concept of hash trees is named after Ralph Merkle who patented it in 1979.

翻译一下:

在密码学和计算机科学中,哈希树或Merkle树是一种树形数据结构,其中每个叶节点用数据块的hash标记,并且每个非叶节点用其子节点的标签的加密hash标记。 哈希树能有效和安全地验证大型数据结构的内容。 Merkle树被递归地定义为hash列表的二叉树,其中父节点是其子节点的hash,并且叶节点是原始数据块的hash。

证明叶节点是给定二进制哈希树的一部分需要计算与树的叶节点数的对数成比例的多个哈希值; [1]这与哈希列表形成对比,哈希列表的数量与 叶节点本身的数量。

哈希树的概念以1979年获得专利的拉尔夫·梅克尔命名,所以叫merkle tree。

至此,原来就是hash tree啊。

Merkle 树的原理:

它使用的是单向哈希。哈希树的顶部为顶部哈希(top hash),亦称根哈希(root hash)或主哈希(master hash)。它是通过并联两个子哈希来往树上爬直到找到根哈希。单向哈希可以避免碰撞,而且由于它是确定性算法,因此不会也不可能存在两个一样的文本哈希。

Merkle Tree可以看做Hash List的泛化(Hash List可以看作一种特殊的Merkle Tree,即树高为2的多叉Merkle Tree)。

在最底层,和哈希列表一样,我们把数据分成小的数据块,有相应地哈希和它对应。但是往上走,并不是直接去运算根哈希,而是把相邻的两个哈希合并成一个字符串,然后运算这个字符串的哈希,这样每两个哈希就结婚生子,得到了一个”子哈希“。如果最底层的哈希总数是单数,那到最后必然出现一个单身哈希,这种情况就直接对它进行哈希运算,所以也能得到它的子哈希。于是往上推,依然是一样的方式,可以得到数目更少的新一级哈希,最终必然形成一棵倒挂的树,到了树根的这个位置,这一代就剩下一个根哈希了,我们把它叫做 Merkle Root[3]。

在p2p网络下载网络之前,先从可信的源获得文件的Merkle Tree树根。一旦获得了树根,就可以从其他从不可信的源获取Merkle tree。通过可信的树根来检查接受到的Merkle Tree。如果Merkle Tree是损坏的或者虚假的,就从其他源获得另一个Merkle Tree,直到获得一个与可信树根匹配的Merkle Tree。

Merkle Tree和Hash List的主要区别是,可以直接下载并立即验证Merkle Tree的一个分支。因为可以将文件切分成小的数据块,这样如果有一块数据损坏,仅仅重新下载这个数据块就行了。如果文件非常大,那么Merkle tree和Hash list都很到,但是Merkle tree可以一次下载一个分支,然后立即验证这个分支,如果分支验证通过,就可以下载数据了。而Hash list只有下载整个hash list才能验证。

Merkle Tree的操作

这篇文章图文并茂写的很好
http://www.cnblogs.com/fengzhiwu/p/5524324.html

Merkle Tree在区块链作用

那么为什么用hash tree在区块链上?

能快速检查和归纳大量数据,被用在区块中记录交易记录的完整性.
超简易merkle tree
ABCD 是merkle的根. 要证明C 有效性,所需要的只是D , 只要证明C|D=CD , AB , 就可以证明AB|CD=ABCD ( | | 表示串联).
假如有人提出X , D , 和AB,并说X 是树节点的一部分,那么可以非常容易地证明他在说谎,因为X 不是merkle 根ABCD 的一部分。所有在数字货币交易中需要记住的只是自己的交易和区块头。

merkle数在bitcoin里有2个主要作用

归纳一个区块里全部交易为一个32字节值hash值。

​ 比特币使用Merkle树的方式进行验证,相对于哈希列表,Merkle树是一种哈希二叉树,它的明显的一个好处是可以单独拿出一个分支来(作为一个小树)对部分数据进行校验,更加高效。下面的区块结构图中,区块体就包含这样一个Merkle树,Merkle树被用来归纳一个区块中的所有交易
在这里插入图片描述

区块中缺少哪些交易,可以快速验证,复杂度在2log2(N)
当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效

我觉得对于如何应用,这篇文章写的很好:
https://blog.csdn.net/little_prog/article/details/79263342

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值