23 / 736HDR

Block Header

区块头

区块中很小的一部分,把区块内容与此前的历史连接起来,并用于验证挖矿工作。

Block Header(区块头)是比特币区块开头的一段简短记录。其中包含前一区块的指纹、汇总交易的指纹,以及验证 Proof of Work 所需的信息。具体支付记录存放在区块的其他部分。

可以把区块想成一包交易,区块头则是随包附带的记录。它不列出收款人或金额,而是保存密码学指纹:从数据计算出的简短数值,用来发现数据是否发生变化。其中一个指纹指向前一区块;另一个称为 Merkle root,汇总本区块中交易的标识符。这样,区块头就把特定内容与历史中的特定位置联系起来。但它不是交易的缩小副本,无法从指纹中还原交易内容。 [1] [4]

矿工先组装候选区块,再寻找符合要求的哈希,也就是被解释为数字的指纹。这个数字必须小于或等于规定的目标值。寻找过程称为 Proof of Work:矿工反复修改数据并重新计算,因为无法直接预测哪个结果会合格。最常见的可变字段是 nonce,即区块头中的辅助数字。为了获得更多尝试机会,矿工也可以修改在区块开头创建的特殊交易 Coinbase Transaction 中的数据。这样 Merkle root 也会改变,从而得到不同的区块头。其他节点则可以很快重算一次,验证找到的结果。 [1] [3] [4]

只下载区块头链,就能追踪区块之间的连接并验证对应的工作,无须下载所有交易。但设想一个区块拥有有效的 Proof of Work,其中却有人试图在没有必要签名的情况下花掉别人的资金。仅检查区块头无法发现这个问题。因此,Full Node 还要检查交易、签名、可用的未花费输出以及允许领取的奖励。有效的区块头并不能保证整个区块有效。 [2]

nBits 字段指定哈希必须满足的目标。它是目标值的紧凑编码,并不是区块浏览器显示的“difficulty”数值。节点还会检查,这个目标是否符合区块在链中所处位置的规则。矿工也不能任意选择时间:它必须晚于此前 11 个区块时间的中位数,也就是将这些时间排序后的中间值,同时不能过于超前于当前时间。即便如此,这个字段也不是每笔支付的准确时间,更不是记录挖矿耗时的秒表。 [2] [3]

字段的顺序和大小固定:version 占 4 字节,前一区块头的哈希占 32 字节,Merkle root 占 32 字节,time、nBits 和 nonce 各占 4 字节。无论交易有多少,总共都是 80 字节。对按这一精确格式编码的区块头连续应用两次 SHA-256,就得到区块标识符。数值字段采用 little-endian,即最低有效字节在前;哈希的内部字节顺序则不同于标识符通常的显示顺序。因此,自己重算时,不能简单地把区块浏览器显示的字段值拼起来。 [1] [4]

要获得更完整的理解,请将本词条与以下词条结合阅读: Block, Proof of Work, Merkle Tree, Nonce. 反向关联还来自: Block, Hash, SHA-256, Merkle Tree.

DOC · 001Bitcoin Core v29.0: header serialization一手来源 DOC · 002Bitcoin Core v29.0: header validation一手来源 DOC · 003Bitcoin Core v29.0: proof of work一手来源 DOC · 004Bitcoin Developer Reference: Block Headers一手来源
修订日期: 来源优先 · 非投资建议