简介
Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希
值。术语“树”在计算机学科中常被用来描述一种具有分支的数据结构,但是树常常被倒置显示,“根”在图的上部同时“叶
子”在图的下部。来一张图直观体验下:
如何计算
其中HA 是数据块A的hash,........ HP数据块P的hash。HAB是 HAB=SHA256(SHA256(HA + HB))。HA和HB被连接在一起,作为HAB的输入,然后层层hash,直到产生root hash。这是完美的计算,刚好两两配对。如果出现奇数个节点怎么办?默认的做法是 一旦出现奇数个节点,那么最后那个无法配对的节点hash将会被复制一份,也就是说自己和自己配对。
有何用途
源码地址:/1261385937/merkle
1、快速比较大量数据。对每组数据要先进行 排序,然后构建Merkle树,如果root hash一样,则2组数据一致,否则不相同。hash计算速度可以很快速度,所以可以在预计时间内完成Merkle树的构建,利用Merkle树能带来巨大的比较性能优势。
root hash天差地别,2组数据不一样。其实只有hash3的最后一个字节(3)和hash7的最后一个字节(4)不一样。
2、快速定位修改。如果某个叶子节点的数据发生改变,那么该叶子数据的hash必然会发生改变,层层传递后最终会导致root hash发生改变。通过自顶向下的查询,O(lgN)时间可以定位到哪个数据块发生改变。
index的返回值是3 ,即第4个数据块不一样。
区块链中的Merkle树
Merkle树主要用于区块链中的:
1、区块中所有交易的指纹,即root hash 。任何一个交易变动都会导致root hash改变。
2、轻量级客户端的SPV验证。
假如要验证TXB是否存在区块中,向相应的区块获取 HA,HCD。随后利用HA,HCD计算出hash root HABCD,再与本地比区块头中的merkle root比较,如果相同,则表示TXB存在区块中。
到这,不知道有没有人想到 干嘛那么麻烦,HB直接发给相应区块,这个hash如果存在,相应区块直接返回个true不就行了?这样的话,恶意节点会作弊,直接告诉你true,即使没有存在。而想伪造一棵包含HB的Merkle树且Merkle根和本地区块头中的Merkle根相同,基本是不可能的。