这一篇我们介绍“区块”的“五脏六腑”,也就是它的详细组成,如图

看不懂没关系,对着这张图我给大家一一剖析。
首先,每一个区块都有一个父区块和子区块,分别对应图中的左边的“父区块”和右边的“子区块”,中间也是一个区块,因为是作为典型来讲,所以图中我们列举了它的核心元素。
人们根据职能将每个区块划分为两个部分,区块头(Block Header)和区块体(Block Body)。
先了解一下区块体,区块体内包含的是一条条的交易数据,列如张三给李四转了一笔账,转账者,接收者,金额,时间等等,这些信息构成一条交易数据,每一个区块的区块体都包含着大量的交易数据(比特币的区块大小是1M,区块大小决定可容纳的数据量),可以理解为,区块体才是数据真正存储的地方。
那什么是区块头呢,区块头是整个区块的核心也是区块的元数据,它的成员变量全都是公共的,这使得它可以很方便的向调用者提供关于Block属性的操作。区块头的组成相对复杂,它的一条条信息我们详细来看。
1、Hash值
由SHA256算法计算得出得当前区块的哈希值(算法比较复杂,后面会统一讲到),也是代表当前区块的唯一值,可以理解成我们通常开发中Id的概念。每个区块都有自己的唯一Hash。
2、父哈希(Pre Hash)
上一个区块的哈希值。每个一区块当中都保存着上一个区块的Hash,可以理解为父子关系,因为除了第一个区块(创世区块),所有区块的产生都是基于前一个区块。
3、子哈希(Next Hash)
基于当前区块所产生的下一个区块的哈希值,当前区块也就是子区块的父区块。
看到这里我们明白了,区块链里面的“链”是如何体现的?其实就是由于每个区块有当前Hash 、父Hash、子Hash的概念,这些所谓的“父”,“子”形成了一套完整的顺序链条,换句话说,区块与区块之间并非杂乱无章,而是存在着严格的顺序关系。而这种顺序关系像极了链表的概念,二者的逻辑顺序均是通过链表中的指针链接次序实现的。
链表:

其实区块链和链表二者所谓的“链”,其实是同一种技术实现。
注:有一点点小的区别是区块链是非循环的,而链表是可以有循环的。
OK,咱们继续。
4、版本号(Version)
系统版本号,可以理解成日常开发中开发的软件版本。
5、区块高度(Height)
区块链网络中第几个诞生的区块序号,例如第一个区块通常也被称为创世区块,高度为0(这很程序员),第十个产生的区块高度为9(区块并不是一下子就全有的,例如比特币区块就是每10分钟产生一个,也就说区块的“出生”都是有着先后顺序的,这个顺序我们会打上标签,这个标签就是”高度“)。
6、时间戳(TimeStamp)
区块创建的时间,同时也交易数据打包进区块的时间,区块的诞生是伴随着交易数据的打包记录,保存的地方就是我们前面提到的区块体。
7、随机数(Nonce)
一个从0开始,最大长度为32位的随机数,这里就涉及到挖矿了,所谓的挖矿,就是不停地变更区块头中的随机数,并对每次变更后的区块头(block_header,)做双重SHA-256运算(即SHA256 (SHA 256(Block_Header))),将结果值哈希反转并与当前网络的目标值对应的十进制字符串做对比,如果小于目标值,则解题成功,工作量证明完成。(这里先简单了解即可,后面会重点讲到)。
8、难度目标(Target Bits)
难度值是矿工们挖矿的重要参考指标,它决定了矿工大约需要经过多少次Hash运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生都基本保持这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
难度值的调整是在每个完整节点中独立自动发生的。每隔2016个区块,所有节点都会按统一的公式自动调整难度值
公式如下:
新难度值 = 旧难度值*(过去2016个区块花费时长/20160分钟)
难度目标值= 最大目标值/新难度值
而最大目标值为一个恒定值(常量):0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
解题(挖矿)成功的依据是:
SHA256(SHA256(block_header)) < F(nBits)
即,挖矿结果的值 < 最大目标值
9、Merkle Root(默克尔树根)
Merkle Root的计算过程相对复杂,一起放到最后的算法环节进行统一详细讲解。
实际上,区块头的组成远不止这么点,这里只是为了方便讲解不让大家产生眩晕,我们只挑了一些核心元素讲解,当然,对于我们简单理解区块的概念来说已经够了。
OK,看完以上部分,相信大家对区块已经有些许理解了,不过还没完,好戏才刚刚开始,接下来才上重点中的重点。
网友评论