头图

区块链中的默克尔树

上节我们提到区块的头信息中是包含了一个默克尔根的字段
区块链的头信息中为什么要存在这个字段呢?使用默克尔树这种数据结构是为什么呢?接下来我们就来解释一下。

默克尔树也常被称为二叉哈希树。是由默克尔在1979年时候提出来的,默克尔树常常作用于快速的比较数据及检验某个元素是否存在的业务场景中。之所以默克尔树擅长做这几个场景,和它自身的结构特性密不可分。我们来看下它的数据结构

这个就是存储在区块头信息中的默克尔根的数据结构
image.png

我们看到最下面的数据Tx0、Tx1、Tx2、Tx3的是区块链上的交易数据,首先他们会被哈希。在比特币中,哈希算法使用的是sha256,并且哈希是会做两次的,是双重哈希。
那为什么要用双重哈希?这个之后可以单独展开研究下,目前比较可靠的说法,比特币网络使用双重哈希的算法,其实并不是为了避免哈希的生日攻击,比较有说服力的分析是因为双重哈希是用来防御长度扩展攻击的,

通过对交易数据的哈希,我们得到了hash01和hash23,这个哈希值的产生是通过连接两个子节点的值哈希后得到的

比如 hash01 = sha256(sha256(hash0+hash1))

我们通过这种方式可以生成任何层级的默克尔树,最后的哈希值就是一个根节点,我们称为默克尔根
我们可以通过默克根很方便的对比两组数据是否相同,同时如果树中关联的数据有变更,那么我们通过哈希值也能很快定位到修改的数据。

还有重要的一个作用就是拥有“零知识证明”的能力。什么是“零知识证明”,根据wiki的解释零知识证明是一方(证明者)向另一方(检验者)证明某命题的方法,特点是过程中除“该命题为真”之事外,不泄露任何资讯。回到我们区块链的网络上,假如我们需要验证TX0是否存在,我们除了TX0的本身信息以外,我们只需要获取Hash1,Hash23和Root hash就能证明TX0是否存在,我们在证明的过程中并没有依赖其他的交易信息数据。

默克尔树在区块链中提供了所有交易的信息摘要

默克尔树的应用-简化了支付的验证

默克尔树在比特币网络中的一大应用就是简化了支付的验证。特币中的节点一类是完全节点,它维护着完整的区块链信息。而有些节点是轻量化的,并不会维护完整的区块链信息,它们是轻量级的节点,这类节点在验证交易的时候就会使用到简化支付验证(SPV)

那默克尔树和这个SPV有什么关系?我们来看下SPV的大致过程可以分为下面几步:
第一步:我们获取到一个需要验证的交易哈希,其中交易相关的区块链消息头和认证路径,节点是通过类似于订阅的merkleblock消息获取到,merkleblock简单的说就是SPV通过布隆过滤器接收了自身感兴趣地址的相关交易的消息

第二步:我们获取一个最长区块链的区块头信息,这个最长链的区块信息可以向其他节点询问以保证获取了最长的区块信息

第三步:我们获取到交易的认证路径,认证路径就是通过X个节点形成一条从交易到根的路径。这个X的确认公式就是 log2(T) = X,T就是对应就是交易的数量。比如我们拥有16笔交易,那么通过 log2(16)=4 只需要4个节点就能确认这笔交易。这4个节点就构成了认证路径。相较于全节点数据,这个数据量要小的多

第四步:计算默克尔根证明交易确实包含在这个区块中,再确认这个区块是否在最长区块链中,以此来验证交易的有效性

所以基于默克尔树的验证,大大减少了数据的依赖以及逻辑的复杂度,降低了存储的成本,但同时由于缺少全部信息的副本,也存在连接虚假节点被恶意攻击的风险,便捷与风险往往是一把双刃剑


Hades
1 声望0 粉丝