深入比特币原理(九)——Merkle树

孤人 提交于 2019-12-27 20:28:02

作者 Aaron 发表于 2018-03-01 14:24:02

文章来源:华为云社区

原文地址:https://bbs.huaweicloud.com/blogs/102343

 

 

Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构,比特币的交易信息存储为Merkle树结构。
 

比特币Merkle树结构示例:

每一个叶子节点代表一个交易的Hash值,如HA = SHA256(SHA256(Transaction A))
两个叶子节点合并后进行Hash计算,形成父节点,如HAB = SHA256(SHA256(HA + HB))

1q.png

Merkle树是一种平衡二叉树,如果交易数量为奇数,最后的叶子节点会被复制,组成偶数的叶子节点,如下:

2q.png

从Merkle树的结构可以看出,任意一个叶子节点的交易被修改,叶子节点Hash值就会变更,最终Merkle Root的Hash值就会改变。所以确定的Merkle Root可以准确的作为一组交易的唯一摘要。

下面我们来看一下如何通过Merkle树验证一笔交易
假设我们要验证区块中存在Hash值为HK的交易,我们仅需要知道HL、HIJ、HMNOP、HABCDEFGH(蓝色框)即可计算出HKL、HIJKL、HIJKLMNOP与Root节点哈希(虚线框),如果最终计算得到的Root节点哈希与区块头中记录的哈希一致,即代表该交易在区块中存在。

3q.png

使用Merkle路径验证交易,可以大大降低验证交易时需要传输的数据量,这种验证方式在SPV节点上被应用,SPV节点在需要验证交易时会向全节点请求Merkle路径信息,这是为什么SPV节点只需要存储区块头即可验证交易的原因

随着区块中的交易增多,区块大小将线性增长,而Merkle路径的大小增长却极其缓慢,如下表所示:

4q.png

从上表可以看到,区块内交易数从16笔增加到65535笔时,区块大小从4KB增加到16MB,但是梅克尔路径大小仅从128bytes增加到512bytes

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!