区块头与区块体
区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。

每个区块包含两个部分。
● 区块头(Head):记录当前区块的特征值。
● 区块体(Body):存储实际数据。
区块头包含了当前区块的多项特征值。

区块头记录当前区块的元信息,包含当前版本号、上一区块的哈希值、时间戳、随机数、MerkleRoot 的哈希值等数据,用于衔接区块链并验证数据完整性。
区块体的数据记录通过 MerkleTree 的哈希过程生成唯一的 MerkleRoot 记录于区块头。

生成时间:
● 实际数据(即区块体)的哈希。
● 上一个区块的哈希。
01 区块头
区块头由三组区块元数据组成。
第一组:引用父区块哈希值的数据,这组元数据用于该区块与区块链中前一区块相连接。
第二组:难度、时间戳、nonce,与挖矿竞争相关。
第三组:Merkle 树根,一种用来有效总结区块中所有交易的数据结构。一共 80 个字节。
区块哈希值可以唯一、明确地标识一个区块,任何节点通过对区块头进行哈希计算都可以独立获取该区块哈希值。
关于区块的哈希值,请注意区块哈希值实际上并不包含在区块的数据结构里,不管是该区块在网络传输时,或者是它作为区块链的一部分被存储在某个节点的永久性设备上时。相反,区块哈希值是当该区块从网络被接受时由每个节点计算出来的。区块的哈希值可能会作为区块元数据的一部分被存储在一个独立的数据库表里,以便于索引和更快地从磁盘检索区块。

02 区块体
区块体存储着这个区块的详细数据(Data),这个数据包含若干行记录,可以是交易信息,也可以是其他某种信息。
区块与Hash是一一对应的,Hash可以当做是区块的唯一标识。

区块与Hash的一一对应
区块体中记录了该区块存储的交易数量以及交易数据。
平均每个交易至少是 250 个字节,平均每个区块至少包含超过 500 个交易信息。因此,一个包含所有交易的完整区块比区块头大 1000 倍不止。


为了节约区块的存储空间,区块内的交易数量字段采用了压缩存储。在读取交易数量之前,会先读取 numTransactionsBytes 字段值。
● 如果该值小于 253,则用直接将该值作为交易数量。
● 如果该值等于 253,则读取之后的 2 个字节作为交易数量。
● 如果该值等于 254,则读取之后的 4 个字节作为交易数量。
● 否则,读取之后的 8 个字节作为交易数量。