图解丨区块(Block)的内部结构

 2023-09-26 08:41:08发布

区块(Block)是组成区块链的基本单元结构,每个区块由区块头和区块主体组成。区块头存储结构化的数据,大小是80字节,区块主体利用一种神奇的树状结构,记录区块挖出的这段时间里所有交易信息,所需空间比较大。

区块链的总体结构

区块链之所以叫做区块链,是因为它真的就是一堆由包含交易信息的区块,通过前后首位相接起来的链式结构,每个区块都是链式结构中的一节。

每个区块都通过一个数值(父哈希值)指向前一个区块,以此类推,区块与区块连成一个链条,可以一直追溯到创始区块。

这又是一个大规模协作的例子,每个区块只需执行自己的简单的规则,就能形成一个复杂的系统。

区块连接

区块连接图示

区块的整体结构

每个区块主要包含了两部分,区块头和区块体。区块头主要用来存储本区块的一些相关属性,区块体则用来存储真实的交易数据记录。

一个区块前后分别连接了父区块和子区块,如下图:

区块的整体结构

区块的整体结构

区块的组成

平均来讲,假设一个区块内有400笔交易信息,区块主体可能比区块头大1000倍以上。虽然区块头比区块主体小,但区块头总归是脑袋,大部分功能其实都由区块头实现。

区块头

区块头图示

上图中,区块头部分括号里的数字表示各个数据所占大小,加起来刚好是80字节。

区块头内含的数据

版本号(Version)

用来标识交易版本和所参照的规则。例如安卓8.1,或者iOS11.3,区块也有自己的版本号。

前一区块哈希值

也称“父区块哈希值”,这个哈希值通过对前一个区块的区块头数据进行哈希计算(SHA256算法)得出,它的意义在于:每个新挖出的区块都按秩序接在前一个区块的后面。

这样挖出新的区块后,才能确认这个区块是跟在一个被各节点验证过的可靠的区块后头。

默克尔根(Merkle Root)

如上图,在区块主体中,所有交易信息先进行两个一组的哈希计算,这种结构叫做Merkle树(Merkle Tree),而且是一棵倒挂的树。

我们把问题简单化,假设区块主体中有4笔交易信息,分别是交易1,交易2,交易3,交易4。

Merkle树先对每个交易信息进行哈希(Hash)计算,分别得出Hash 1 、Hash 2、Hash 3、Hash 4。

到了第二层,两个一组,也就是说 Hash 1 和 Hash 2 的字符串排排坐,变成2倍长的字符串,然后算出这个字符串的哈希值,我们记做 Hash(1&2);

Hash 3 和 Hash 4 同上办法处理,得到 Hash( 3&4),再往上算,Hash(1&2)、Hash( 3&4)这两个字符串又合并,接着进行哈希运算,这个最后的哈希值就是区块头的Merkle树根。

Merkle树

Merkle树图示

Merkle树能够快速检验交易数据的完整性,即数据是否被篡改过。根据密码学中哈希函数的特点,如果有人对数据做过手脚,计算出的哈希值也会变得完全不一样。

哪怕在这4000笔交易中,只移动了一个小数点,也能从Merkle树根的哈希值发现问题。

时间戳(Time stamp)

记录这个区块生成的时间,精确到秒。每诞生一个新的区块,就会被盖上相应的时间戳,这样就能保证整条链上的区块都按照时间顺序进行排列。

难度值(Target_bits)

挖出该区块的难度目标。每产生2016个区块,数据区块运算难度会调整一次。

比如,比特币区块链网络能够自动调整挖矿的难度,让矿工每10分钟才挖出一个区块。原本需要14天才能挖完2016块区块,被算力高的矿机7天就搞定了,这就意味着到预定调整期的时候,挖矿难度会增加一倍。

随机数(Nonce)

挖矿相当于矿工做数学题,他们利用计算机或矿机的算力(hash rate),经过大量的计算(哈希碰撞),试出一个正确的区块哈希值;很多时候我们也把挖矿称作争夺记账权。

那么,矿工怎样才知道试对了哈希值呢?随机数就是这道数学题的解,挖矿过程就是在寻找这个随机数。

假设某个新区块的随机数为23333,矿工们开始尝试各种随机数,直到有个幸运星成功试到一组数字,这组数字的哈希值是

e401a2f533e853713eea21b878c1921c19fa9c8b887c1547c771ece46e13f766

而这个字符串正是随机数23333的哈希值。

随机数(Nonce)

区块的随机数(Nonce)

挖到一个新区块的节点或矿工向全网广播,对于其他矿工来说,不管还差多少就快成功,都只能放弃这个区块的记账权,转而开始验证这个区块。新区块验证通过后,成功加入区块链。

区块为什么设计成这种结构

区块链是一个分布式网络,所以数据需要存储在各个节点当中,但是比特币网络的完整数据加起来可能有几十上百个G,这不是一个普通的终端能够承受的起的,许多比特币客户端被设计成运行在空间和功率受限的设备上。

比如智能电话、平板电脑、嵌入式系统等,它们是没有办法存储比特币网络的所有数据的。

这个时候就能看到区块结构的高明之处了,比特币网络中的很多节点主要是用来验证交易的,它们只需要下载区块头,不需要下载包含在每个区块中的交易信息就能完成交易验证。

这样的不含交易信息的区块链,大小只有完整区块链的几千分之1,大大节约了终端的使用空间。

推荐阅读