行业资讯

帮助中心 >  产品文档 >  架构 >  区块链基础架构之数据层(中)

Merkle树是一类基于哈希值的二叉树或多叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值,是将该节点的所有子节点的组合结果的哈希值。Merkle树是区块链的重要数据结构,其作用是快速归纳和校验区块数据的存在性和完整性。在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时, Merkle树会大大减少数据的传输量以及计算的复杂度,在安全性上仅仅依赖于哈希函数的安全性。Merkle树通常包含区块体的底层(交易)数据库,区块头的根哈希值(MerkleRoot)以及所有沿底层区块数据到根哈希的分支,运算过程一般是将区块体的数据进行分组哈希,并将生成的新哈希值插入 Merkle树中,如此递归直到只剩最后一个根哈希值并记为区块头的 Merkle根。

(一)、Merkle树特点

Merkle树特点如下:

① Merkle树是一种树,大多数是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;

② Merkle树的叶子节点的值是数据集合的单元数据或者单元数据哈希值;

③非叶子节点的值是根据它下面所有的叶子节点值然后按照哈希算法计算而得出的。

区块链中的 Merkle树用于存储交易信息,每个交易两两配对,构成 Merkle树的叶子节点,进而生成整个Merkle树。Merkle树有诸多优点,首先是极大地提高了区块链的运行效率和可扩展性,使得区块头只需包含根哈希值而不必封装所有底层数据;其次是 Merkle树可支持“简化支付验证”协议,即在不运行完整区块链网络节点的情况下,也能够对(交易)数据进行检验,使得用户可以通过从区块头得到的 Merkle树根和别的用户所提供的中间哈希值列表去验证某个交易是否包含在区块中。利用一个节点出发到达 Merkle树的根所经过的路径上存储的哈希值,可以构造一个 Merkle证明,验证范围可以是单个哈希值这样的少量数据,也可以是验证可能扩至无限规模的大量数据。提供中间哈希值的用户并不需要是可信的,因为伪造区块头的代价很高,而中间哈希值如果伪造的话会导致验证失败。

(二)、Merkle哈希树

如图所示为一个 Merkle哈希树,节点A的值必须通过节点C、D上的值计算而得到。叶子节点C、D分别存储数据块001和02的哈希值,而非叶子节点A存储的是其子节点C、D的组合的哈希值,这类非叶子节点的哈希值被称作路径哈希值,而叶子节点的哈希值是实际数据的哈希值。

若C、D、E和F存储了一组数据块的哈希值,当把这些数据从张三传输到李四后为验证传输到李四的数据完整性,只需要验证张三和李四上所构造的 Merkle树的根节点值是否一致即可。如果一致,表示数据在传输过程中没有发生改变。假如在传输过程中E对应的数据被人篡改,通过 Merkle树很容易定位找到(因为此时,根节点、B和E所对应的哈希值都发生了变化),定位的时间复杂度为(log(n))。比特币的轻量级节点所采用的SPV验证就是利用 Merkle树这一优点。

为验证数据块003所对应的交易包含在区块中,除了 Merkle树根外,用户只需要节点A对应的哈希值Hash(C,D)以及节点F所对应的哈希值Hash(004)。除了数据块003外,他并不需要其他数据块所对应的交易明细。通过3次哈希计算,用户就能够确认数据块003所对应的交易是否包含在区块中。实际上,若区块包含图中所对应的 Merkle树,且区块所包含的4个交易的容量均达到最大值,下载整个区块可能需要超过400000个字节,而下载两个哈希值加上区块头部仅需要120个字节,可以减少很大的传输量。

(三)、非对称加密

非对称加密是现代密码学历史上一项伟大的发明可以很好地解决对称加密中提前分发密钥的问题。顾名思义,非对称加密算法中,加密密钥和解密密钥是不同的,分别称为公钥(public key和私钥(private key)。私钥一般需要通过随机数算法生成,公钥可以根据私钥生成。公开密钥是对外公开的,而私有密钥是保密的,其他人不能通过公钥推算出对应的私钥。每一个公开密钥都有其相对应的私有密钥,如果我们使用公开密钥对信息进行了加密,那么则必须有对应的私有密钥才能对加密后的信息进行解密;而如果是用私有密钥加密信息,则只有对应的公开密钥才可以进行解密。在区块链中,非对称加密主要用于信息加密、数字签名等场景。

非对称加密算法的优点是公、私钥分开,不安全通道也可使用。其缺点是处理速度(特别是生成密钥和解密过程)往往比较慢,一般比称加解密算法慢2~3个数量级;同时加密强度也往往不如对称加密算法。非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等经典数学难题进行保护。代表算法包括:RSA, Diffie-Hellman-密钥交换、 ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ec)、sm2等系列算法。

①RA:经典的公钥算法,1978年由 Ron Rivest、 Adi Shamir、 Leonard Adleman共同提出,三人于2002年因此获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。

② Diffie-Hellman-密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。

③ EIGamal:由 Taher EIGamal设计,利用了模运算下求离散对数困难的特性,被应用在PGP等安全工具中。

④椭圆曲线(Elliptic Curve Cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在1985年 Neal由 Koblitz和 Victor Miller分别独立提出。ECC系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。

⑤m2(ShangMi2):国家商用密码算法,由国家密码管理局于2010年12月17日发布,同样基于椭圆曲线算法,加密强度优于RSA系列算法。

非对称加密算法一般适用于签名场景或密钥协商,但不适于大量数据的加解密。目前普遍认为RSA类算法可能在不远的将来被破解,一般推荐可采用安全强度更高的椭圆曲线系列算法。

(四)、时间戳

时间戳是指从格林尼治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,通常是一个字符序列,唯一地标识某一刻的时间。在比特币系统中,获得记账权的节点在链接区块时需要在区块头中加盖时间戳,用于记录当前区块数据的写入时间。每一个随后区块中的时间戳都会对前一个时间戳增强工作量证明,形成一个时间递增的链条。时间戳技术本身并没有多复杂,但在区块链技术中应用时间戳却是一个重大创新,时间戳为未来基于区块链的互联网和大数据增加了一一个时间维度,使得数据更容易追溯,重现历史也成为可能。同时,时间戳可以作为存在性证明( Proof of Existence)的重要参数,它能够证实特定数据必然在某特定时刻是的确存在的,这保证了区块链数据库是不可篡改和不可伪造的,这也为区块链技术应用于公证、知识产权注册等时间敏感领域提供了可能。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: