术语表 /挖矿与共识
区块头
又称 Header。
- 区块头是什么?
- 区块头是区块的80字节摘要,包含版本、前一区块头哈希、默克尔根、时间戳、nBits 和随机数(nonce),也是矿工实际计算哈希的部分。
矿工从不直接对支付数据计算哈希。他们对这个固定大小的记录计算哈希,它通过默克尔根锁定交易列表,并通过前一区块头哈希锁定此前的每一个区块。每个区块只有八十字节,因此自2009年1月以来的完整区块头链可以轻松存放在手机上,而这一点正是轻量级验证得以成立的根本原因。
运作方式
区块头由六个字段按固定顺序组成,各字段的字节偏移量从不改变。
版本占据第0至3字节。前一区块头哈希占据第4至35字节。默克尔根占据第36至67字节。时间戳以自 Unix 纪元起的秒数表示,位于第68至71字节。nBits 是编码后的难度目标,位于第72至75字节。随机数占据第76至79字节。所有字段均以小端序存储,因此在区块浏览器中看到的十六进制内容,与原始区块转储中的十六进制相比,字节顺序看起来是反的。
区块哈希并不是这些字段之一。它是对这80字节连续两次运行 SHA-256得出的,节点自行推导而不是直接信任它,这正是区块无法对自身身份说谎的原因。工作量证明就是同一运算再加一次比较:得出的数值必须小于或等于 nBits 所编码的目标。
其中两个字段的规则会让人意外。时间戳不必准确,只需大于前十一个区块时间戳的中位数,并且与接收节点自身时钟相差不超过两小时,因此时间略有错序的区块头是正常且有效的。版本字段也不再是简单的计数器。BIP9 下的软分叉信号和 BIP320 下的版本滚动都会借用其中的若干位,所以现代区块头中的版本号是一个位字段,而不是发行版本号。
在哪里会遇到它
区块头是新节点最先下载的内容,也是许多钱包唯一保留的内容。
Bitcoin Core 自0.10版起(发布于2015年2月)采用先同步区块头的方式。节点获取并验证区块头链,确认其带有真实的工作量证明,然后才请求区块主体,由于已经知道要找什么,它可以同时向多个对等节点请求。轻客户端止步于第一步:SPV 或 Neutrino 钱包保留区块头,并检查交易的默克尔分支是否与其中某个区块头相连。每个区块头80字节,900,000个区块头的链为72 MB,这就是它能在移动数据网络下运行的原因。
创世区块头是最典型的可供检视的例子。其版本为1,前一区块头哈希全为零,默克尔根以4a5e1e4b 开头,其后依此类推,时间戳为1231006505,对应2009年1月3日,nBits 值为0x1d00ffff,随机数为2083236893。您可以自行对这80字节计算哈希,得到以十个零开头、广为人知的区块哈希。如果想查看其他任何区块头,Bitcoin Core 的 RPC 命令 getblockheader 恰好返回这些字段,不多也不少。