本章将介绍区块链如何端到端连接、区块的结构、Merkle树的原理、Merkle如何验证交易的存在等常识,可以帮助你一目了然了解区块链的内部结构。
第一节简介区块链是一种数据结构,将包含交易信息的区块从后向前依次链接起来。从视觉上看,区块链类似于垂直堆叠的堆栈。创世块是堆栈底部的第一个块,新生成的块依次堆叠在其顶部。因此,在区块链中,“高度”用来表示某个区块与第一个区块之间的距离; “top”或“top”用于表示最新添加的块。
每个区块由两部分组成:区块头和交易信息(这两部分的具体信息后面会有说明)。区块头包含连接到前一个区块的“父区块哈希值”。每个区块的唯一标识是通过SHA256算法对区块头中的信息计算出的哈希值,所以当“父区块哈希值”的“哈希值”发生变化时,“子区块哈希值”也会发生变化,而对应的“孙区块哈希值”也会发生链式变化,每生成一个区块都需要大量的计算。所以一旦一个区块之后有很多代,这个瀑布效应会保证这个区块不会被改变,除非这个区块的所有后续区块都被强制重新计算,这需要巨大的计算量。所以长链的存在可以让区块链的历史不可变,这也是比特币系统安全性的一个关键特征。
第二节区块结构区块是区块链中聚合交易信息的容器数据结构。它由描述数据属性的块头和构成块体的事务组成。每个区块的区块头大小为80 字节,每个区块至少包含500 笔交易,每笔交易平均至少250 字节,因此一个区块中的交易数据大小至少为125,000 字节,高于区块头它比它大1000倍,这就是为什么简单支付验证(SPV)客户端只存储区块头来完成交易验证,这样可以节省大量空间。
简单的支付验证流程可以参考《第六章比特币网络解读》中的介绍。
第三节区块头区块头包含3种数据。第一类数据是“父块哈希值”,用于连接上一个块;第二类数据是时间戳、难度和随机数,记录了区块创建时的挖矿信息;第三类数据是交易数据的默克尔根哈希值,该字段是本区块所有交易数据的汇总。具体字段说明如下:
块头字段
下一章将详细介绍时间戳、难度目标和随机数。
第四节块标识符块标识符是指可以定位到哪个块的代码。每个区块有两种标识符:区块哈希值和区块高度。
区块哈希值是对区块头中的所有数据信息进行二次哈希计算得到的。哈希值取决于区块头中的数据。只要区块头中的值发生变化,区块哈希值就会发生变化。区块哈希值可以唯一定位一个区块,是区块的唯一标识。就像可以根据身份证号码对应到唯一的公民一样。
仔细查看区块中的字段后发现,区块中只记录了父区块的哈希值,并没有存储当前区块的区块哈希值。区块哈希值不存储在区块链全数据库中,而是由每个节点在从网络接收到区块时计算得出,并由节点存储在单独的数据库表中,以供后续快速搜索区块。
区块高度是区块与创世区块之间的距离。如果区块高度为30000,则表示它是区块链中的第30001个区块(创世区块的区块高度为0)。区块在区块链中的位置可以通过区块高度来确定,但是区块高度并不是区块的唯一标识,因为可能同时有多个矿工产生相同高度的区块,导致区块链分叉,虽然分叉是暂时的,但需要等到后续产生至少6个新区块后,才能确定对应高度的区块。就像名字一样,可以用来称呼对方,但是同名的人可能很多,所以名字可能对应很多人。
Section 5 Merkle tree 在区块的区块头中,有一个字段Merkle tree root,用于汇总区块中的所有交易,用于快速验证区块中是否存在某笔交易。
Merkle树的原理:
简单来说,默克尔树是一棵哈希二叉树,父节点是两个子节点经过SHA256后的结果,叶子节点是交易数据经过SHA256后的结果。
Merkle树结构
如上图所示,叶子节点为交易1-交易8。首先对交易1-交易8进行哈希计算,得到每笔交易的哈希值,如Hash1-Hash8,得到叶子节点。然后将交易哈希值成对进行SHA256计算。如果有奇数个叶子节点,则复制最后一个节点,然后进行哈希计算得到其父节点,如Hash12——Hash78。一层一层递归,依次两两哈希,直到只有一个根节点,即默克尔树的根。
如何使用Merkle 树验证交易的存在?
使用默克尔树,可以快速验证交易是否存在。比如要验证交易4的存在,只需要知道从交易4的哈希值到计算根节点的路径上需要参与计算的哈希值的最小个数,这样你只需要需要提供Hash3、Hash12、Hash5678。构建从事务4 到根节点的验证路径。
当全节点检测到区块中存在待验证的交易时,会将区块头和Merkle 路径返回给SPV 请求者。这里的Merkle路径不会包含区块中的所有交易,而只会返回请求的从交易到Merkle根节点计算最小哈希值的交易,如前所述,如果需要验证交易4,你只需要需要知道3个哈希值,可以大大提高验证效率,节省本地空间。下图为SPV节点根据返回的Merkle路径计算出根节点,并与区块头的Merkle根值进行比较
,来证明交易是否存在:
如果根据Merkle路径计算出的根节点与区块头中的Merkle树根一致,则代表交易存在于该区块,反之,则交易不存在于该区块。
我们知道,不同字符串碰撞到同一个sha256的概率极小,那么double sha256的概率就是它的平方,而merkle root是经过一层一层计算上来的,如果一个区块只有一个(或2个)交易,那么就是double^(2+1) sha256,而如果是4个交易,就有double^(4 + 2 + 1) sha256,更何况一个区块有那么多交易,要经过merkle运算得到一个相同的hash,几乎是不可能的,因此,在merkle验证中用一个伪造的交易hash来得到一个已知来merkle root是不可能的。
另外,Merkle树还可应用于所下载文件的完整性验证,感兴趣的朋友可以查阅学习下。
第6节 总结
通过本章的学习,相信你对区块链如何首尾相连、区块的结构、Merkle树的原理以及Merkle如何验证交易存在等知识,有了清晰具体的认识。