2.Merkle树
前面介绍了区块头哈希值、区块高度和区块头的结构,接着来看看区块体。区块体存储着交易信息,在区块中它们是以一棵Merkle树的数据结构进行存储的,而Merkle树是一种用来有效地总结区块中所有交易的数据结构。Merkle树是一棵哈希二叉树,树的每个叶子节点都是一笔交易的哈希值。同样以比特币为例,在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹即Merkle树根,且提供了一种校验区块是否存在某交易的高效途径。生成一棵Merkle树需要递归地对每两个哈希节点进行哈希得到一个新的哈希值,并将新的哈希值存入Merkle树中,知道两两结合最终只有一个哈希值时,这个哈希值就是这一区块所有交易的Merkle根,存储到上面介绍的区块头结构中。
下面通过一个实例来对Merkle树进一步的介绍。图1.5是一棵只有4笔交易的Merkle树,即交易A、B、C和D
第一步,需要使用两次SHA256算法对每笔交易数据进行哈希运算,得到每笔交易的哈希值,这里可以得到Ha、Hb、Hc、Hd这4个哈希值,也就是这棵Merkle树的叶子节点,例如,
Ha=SHA256(SHA265(交易A)
第二步,对两个叶子节点Ha、Hb 的哈希值同样使用两次SHA256进行组合哈希运算,将会得到一个新的哈希值Hab,对Hc、Hd进行同样的操作将获得另一个哈希值Hcd,例如
Hab=SHA256(SHA256(Ha+Hb))
第三步,对现有的两个哈希值Hab、Hcd进行第二步中的组合运算,最后将得到一个新的哈希值Habcd,此时我们已经没有了其他同高度节点,所以最后的Habcd就是这一棵Merkle树的Merkle根。之后将这个节点的32字节哈希值写入到区块头部Merkle根字段中。Merkle树的整个形成过程结束。
Habcd=SHA256(SHA256(Hab+Hcd))
因为Merkle树是一棵二叉树,所以它需要偶数个叶子节点,也就是偶数笔交易。但是在很多情况下,某个区块的交易数目会出现奇数笔。对于这种情况,Merkle树的解决方案是将最后一笔交易进行一次复制,以此构造成偶数个叶子节点,这种偶数个叶子节点的二叉树叶称为平衡树。
图1.6展示的是一棵更大的Merkle树,由16个交易构成。通过图示,可以发现,不管一个区块中有一笔交易还是十万笔交易,最终都能归纳成一个32字节的哈希值作为Merkle树的根节点。
当需要证明交易列表中的某笔交易存在时,一个节点只需计算log2N个32字节的哈希值,就可以形成一条从Merkle树根到特定交易的路径,Merkle树的效率如表1.2所示
3.非对称加密与数字签名
非对称加密是区块链技术中用于安全性需求和所有权认证是采用的加密技术,常见的非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)和ECDSA(椭圆曲线数字签名算法),等等。与对称加密算法不同的是,非对称加密算法需要两个密钥:公开密钥和私有密钥。基于非对称加密算法可以使通信双方在不安全的媒体上交换信息,安全地达成信息的一致。公开密钥是对外公开的,而私有密钥是保密的,其他人不能通过公开密钥推算出对应的私钥。每一个公开密钥都有其相对应的私有密钥,如果我们使用公开密钥对信息进行 加密,那么则必须有对应的私有密钥才能对加密后的信息进行解密;而如果是用私有密钥加密信息,则只有对应的公开密钥才可以进行解密。在区块链中,非对称加密主要用与信息加密,数字签名等场景。
在信息加密场景中,如图1.7所示,信息发送者A需要发送一个信息给信息接收者B,需要先使用B的公钥对信息进行加密,B收到后,使用自己的私钥就可以对这一信息进行解密,而其他人没有私钥,是没办法对这个加密信息进行解密的。
而在数字签名场景中,如图1.8所示,发送者A先用哈希函数对原文生成一个摘要然后使用私钥对摘要进行加密,生成数字签名,之后将数字签名与原文一起发送给接收者B;B收到信息后使用A的公钥对数字签名进行解密得到摘要,由此确保信息是A发出的,然后再对收到的原文使用哈希函数产生摘要,并与解密得到的摘要进行对比,如果相同,则说明收到的信息在传输过程中没有被修改过。