# 区块

# 介绍

区块是一种包含在公共账簿(区块链)里的聚合了交易信息的容器数据结构。它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。每一个区块都指向前一个区块,所有的区块从后向前链接在一起共同组成了一条区块链。 对每一个区块进行SHA256加密哈希,可生成一个哈希值。可以通过该哈希值在区块链上找到唯一的区块。每一个区块头中都包含一个父区块的哈希,但可以暂时拥有多个子区块,这种情况被称为"区块链分叉"。区块链分叉只是暂时存在,只有当多个不同区块被不同的旷工几乎同时发现时才会发生。最终,只有一个子区块会成为区块链的一部分。因此,在用区块高度来指定某个区块时,同一个高度可能存在不止一个区块。 由于区块头中包含"父区块哈希值"字段,所以当父区块哈希值发生变化时,当前区块的哈希值也会发生变化,当前区块的哈希值发生变化又将导致其后区块的哈希值发生变化,以此类推。这种多米诺骨牌效应将保证该区块不会改变,除非强制重新计算该区块所有后续的区块。

# 区块结构

区块的结构如下表所示,一个区块主要包含区块头以及构成区块主体的所有交易信息。区块主体的大小远远大于区块头的大小。

字段 描述
区块头 组成区块头的几个字段
交易数 区块体中交易的数量
交易 区块体中的所有交易信息

# 区块头结构

区块头结构如下表所示:

字段 描述
版本 版本号,用于跟踪软件/协议的更新
高度 区块的高度
父区块哈希值 引用区块链中父区块的哈希值
时间戳 该区块产生的时间
Nonce 用于工作量证明算法的计数器
难度目标 该区块工作量证明算法的难度目标
Merkle根 该区块中交易的Merkle树根哈希值以及交易状态的Merkle树根哈希值

# 区块标识符:区块头哈希值和区块高度

区块哈希值是通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。区块哈希值可以唯一地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块的哈希值。区块的哈希值并不包含在当前区块的数据结构里,但它会被下一个区块作为"父区块哈希"引用。 第二种标识区块的方式是通过区块在区块链中的位置,即区块高度。第一个区块的高度为0,每一个随后的区块都比前一个区块高出一个位置。和区块哈希值不同的是,区块高度不是唯一的标识符。两个或两个以上的区块可能有相同的高度,这种情况称之为区块链分叉。另外,区块的高度会被存储在区块的数据结构中。

# 区块的验证

当新区块在网络中传播时,每一个节点在将它转发到其他节点之前,会进行一系列的测试去验证它,这确保了只有有效的区块会在网络中传播。一个节点接收到一个新的区块时会按照一个标准清单会该区块进行验证,若没有通过验证,这个区块将被拒绝。它包括:

  • 区块的版本是否大于等于父区块的版本
  • 区块的高度是否等于父区块的高度加1
  • 区块的"父区块哈希"字段是否等于父区块的哈希
  • 区块的时间戳不得超过当前时间未来一个小时且不得小于最近11个区块的中间时间戳
  • 难度目标是否符合要求
  • 工作量证明是否达到给定的难度目标
  • coinbase的金额是否符合当前高度
  • 计算得到的交易的Merkle树根哈希值是否与区块头中的一致
  • 计算得到的交易状态的Merkle树根哈希值是否与区块头中的一致
  • 对区块体中每一笔交易进行验证
上次更新: 2021/8/11下午3:57:51