《精通比特币》第七章“区块链”解读——区块链基础知识篇

本章,我将深入浅出的介绍区块链如何首尾相连、区块的结构、Merkle树的原理以及Merkle如何验证交易存在等常用知识,可帮助你清晰的了解区块链的内部结构。

建议阅读时长:8分钟

第1节 简介

区块链是将包含交易信息的区块由后向前有序链接起来的数据结构。形象的来讲,区块链类似于一个垂直堆砌的栈,创世区块作为栈底的第1个区块,后面新生成的区块依次在上面堆砌。所以,在区块链里面,用“高度”表示某区块与首区块之间的距离;用“顶端”或“顶部”表示最新添加的区块。

每个区块,由区块头和交易信息两部分组成(这两部分的具体信息,后文会有阐述)。区块头中包含连接上一区块的“父区块哈希值”,每个区块的唯一性标识是对区块头中的信息进行SHA256计算得到的哈希值,所以当“父区块哈希值”发生变化时,“子区块的哈希值”也会发生变化,对应的“孙区块哈希值”也会有连锁的变化,而每产生一个区块需要花费很大的计算。所以一旦一个区块有很多代以后,这种瀑布效应将保证该区块不会被改变,除非强制重新计算该区块后续的所有区块,这样的重新计算需要花费巨大的计算量。所以一个长区块链的存在可以让区块链的历史不可改变,这也是比特币系统安全性的一个关键特征。

第2节 区块结构

区块是区块链中聚合了交易信息的容器数据结构,它由一个包含描述数据属性的区块头和紧跟其后的构成区块主体的交易组成。每个区块的区块头大小为80字节,每个区块至少包含500笔交易,每笔交易平均至少250字节,所以一个区块中的交易数据大小至少为125000字节,比区块头的1000倍还要大,这也是简易支付验证(SPV)客户端只存储区块头来完成交易验证的原因,能节省很大空间。

关于简易支付验证的过程,可以参考“

第六章 比特币网络解读

”中的介绍。

第3节 区块头

区块头中包含3类数据。第1类数据是“父区块哈希值”,用来连接上一区块;第2类数据是时间戳、难度和随机数,记录创建该区块时的挖矿信息;第3类数据是交易数据的Merkle根哈希值,该字段是对本区块所有交易数据的总结。具体字段描述如下:

时间戳、难度目标和随机数,会在下一章中详细介绍。

第4节 区块标识符

区块标识符,指可以定位到是哪个区块的代号每个区块的标识符,有2种:区块哈希值和区块高度。

区块哈希值,是对区块头的所有数据信息进行二次哈希计算得到的,该哈希值依赖于区块头中的数据,只要区块头中的值发生变化,区块哈希值即会变化。区块哈希值可唯一定位到一个区块,是区块的唯一性标识。就像根据身份证号能对应唯一的公民一样。

仔细核对区块中的字段可以发现:区块中只记录了父区块的哈希值,并没有存储当前区块的区块哈希值。区块哈希值没有存储在区块链完整数据库中,而是当该区块从网络被接收时由每个节点计算出来的,由节点存储在一个单独的数据库表中,以便后续快速的搜索区块。

区块高度,是区块离创世区块的距离,如区块高度为30000,则代表其为区块链中的第30001个区块(创世区块的区块高度为0)。通过区块高度可以确定区块在区块链中的位置,但是区块高度不是区块的唯一性标识,这是因为同一时间可能会有多个矿工产生同一高度的区块,导致出现区块链分叉,虽然分叉是暂时的,但需要等到后续至少产生6个新区块时,才能确定对应高度的区块。就像姓名,可以用来称呼对方,但是可能会出现很多人是相同的名字,所以姓名可能会对应到很多人。

第5节 Merkle树

在区块的区块头中,有一个字段Merkle树根,该字段用来汇总区块内的所有交易并用于快速校验区块内是否存在某笔交易。

Merkle 树的原理:

简单的说,Merkle树就是一个哈希二叉树,父节点是2个子节点SHA256之后的结果,叶子节点是对交易数据SHA256之后的结果。

如上图所示,叶子节点为交易1—交易8,先对交易1—交易8分别进行哈希计算,得到每个交易的哈希值,如Hash1—Hash8,得到叶子节点。再对交易哈希值两两进行SHA256计算,如果叶子节点是奇数个,会将最后一个节点复制一份,再进行哈希计算后得到其父节点,如Hash12——Hash78。逐层向上递归,依次两两哈希,直到只有一个根节点,即Merkle树根。

如何使用Merkle树验证交易是否存在?

使用Merkle树,可以很快捷的验证交易是否存在。比如,验证交易4是否存在,只需要知道从交易4的哈希值到计算根节点的路径上需要参与计算的最少个数哈希值即可,所以只需要提供Hash3、Hash12、Hash5678,即可构建从交易4到跟节点的验证路径。

当全节点检测到待验证交易存在于某个区块中时,会给SPV请求方返回区块头和Merkle路径,这里的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如何验证交易存在等知识,有了清晰具体的认识。

如果对文中的表述有疑义或者存在表述有误的地方,欢迎在留言区讨论交流,一起精通比特币。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180908G07VTO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券