区块链/等级 II · 运作机制/2.3 区块与链/课程 1
区块头
锚定整条链的80字节元数据
材料具有原始十六进制显示功能的区块浏览器十六进制编辑器或在线 SHA-256 哈希计算器
好奇
- 一个仅有80字节的结构,如何在密码学上对价值数百万美元的交易数据作出承诺?
- 有哪些具体规则可以防止矿工操纵时间戳字段来获取优势?
- 为什么智能手机无需下载比特币网络的全部历史记录就能验证其安全性?
探索
- 每个比特币区块都以一个80字节的区块头开始,其后是长度可变的交易列表。虽然每个区块的交易列表最多可达约400万字节,但只有区块头会用于工作量证明哈希计算和链的识别。这种悬殊的大小差异意味着区块头相当于整个区块的“紧凑指纹”,使节点能够在下载大量数据之前先处理元数据。
- 第一个字段是“版本号”,占4字节。它原本用于记录软件的迭代次数,现在则用于根据BIP9规范传递与软分叉相关的信号。矿工们会设置特定的版本号,以表明自己在新共识规则生效前对其的支持态度。该字段还包含一些约束条件;例如,BIP34要求版本号为2的区块在coinbase交易脚本中嵌入区块高度信息,这体现了区块头如何在整个网络中推动结构上的变化。
- “上一个区块哈希”(32字节)存放前一个区块头的双SHA-256哈希值,从而将每个区块与其父区块相连。一旦某个历史区块中的任意一个字节发生变化,该区块的哈希值也会随之改变,进而切断与后续所有区块的链接。正是这条哈希链保证了:若不为其后所有区块重新完成计算工作,历史数据就无法被篡改。
- “默克尔根”(32字节)是该区块中所有交易的密码学指纹。它通过对交易ID两两递归哈希,直到只剩下一个值而得出。这种结构支持简化支付验证(SPV):轻客户端只需这个默克尔根和少量兄弟哈希,即可证明某笔交易包含在该区块中,而无需下载完整区块。
- “时间戳”(4字节)以Unix纪元秒为单位记录区块的生成时间。为防止操纵,共识规则对这一字段进行了限制:其值必须大于前11个区块时间的中位数;如果它比节点自身的时钟快两小时以上,则会被该节点拒绝(自Bitcoin Core 27起使用节点的系统时间,早期版本使用经对等节点校正后的时间)。这些约束确保区块时间保持合理的准确度,以便用于难度计算,同时也容许因网络传播延迟而产生的一定偏差。
- 其余字段为“nBits”(4字节),即工作量证明目标值的紧凑编码;以及“nonce”(4字节),即矿工为找到有效哈希而不断变换的任意数值。由于区块头体积很小,存储自2009年以来的全部区块头只需不到100MB的空间。轻客户端可以保存这全部历史,独立验证所有工作量证明约束,并在不检查交易的前提下,认定累计工作量最大的链是有效的。
关键事实
- 比特币区块头恰好由六个字段组成,共80字节。
- “版本”字段包含根据 BIP9 规定的软分叉信号位。
- 区块的时间戳必须大于前11个区块时间戳的中位数,且不得比验证节点的时钟快两小时以上。
- 由于包含交易数据,一个完整区块的大小可接近其区块头的5万倍。
- 存储从创世区块以来的全部比特币区块头只需不到100MB的存储空间。
- “nBits”字段以紧凑的uint32格式存储难度目标值。
练习 九、六、三、一
9收集列出在区块浏览器上可以从一个区块中读到的9项内容:区块头的六个字段,以及由它们推导出的区块哈希、区块高度和难度。
6归类将这9个要素分为6类:链式关联、交易承诺、时间、挖矿目标、挖矿搜索以及衍生值。
3提炼将这6类归纳为区块头为网络承担的3项职能。
1凝结用一句话从密码学承诺的角度,界定80字节的区块头与数兆字节的交易列表之间的关系。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。