术语表 /节点与软件
区块头链
又称最佳区块头链、Header chain。
- 区块头链是什么?
- 区块头链是节点已验证的、由80字节区块头组成的序列,其长度可能比节点实际已下载的区块数据领先数千个区块。
节点同时跟踪两样东西:它所认可的区块头,以及它已存储的区块主体。每个区块头仅重80字节,因此一年的区块头(约52,560个区块)合计约4.2 MB。正是这一体积差异,使钱包能够在远早于知道某个具体区块内容之前,就得知区块链的当前高度和累计总工作量。
运作方式
区块头链按累计工作量证明排序,而不是按所含区块的数量排序。
每个区块头都指明其父区块,因此节点所获知的区块头集合构成的是一棵树,而不是一条直线。累计总工作量最大的那条分支就是最佳区块头链,节点也会记住落败的分支,以防其中某条分支日后反超。Bitcoin Core 将这棵树保存在区块索引中,这是 blocks/index 目录下的一个小型 LevelDB 数据库,与存放交易的原始区块文件完全分开。
由于这棵树得以保留,节点可以描述自身的不确定性。getchaintips 命令会列出节点已知的每个链尖,并附上状态:active 表示节点正在跟随的分支,headers-only 表示从未获取区块主体的分支,valid-fork 表示已完全验证但在竞争中落败的分支,invalid 表示违反了某项规则的分支。链重组无非是节点在拿到相应区块之后,沿着这棵树从一个链尖转到另一个链尖。
区块头能留存下来,而区块数据不能。修剪节点会删除旧的区块文件以节省空间,即使设置为 prune=550(Bitcoin Core 接受的最小设置),它仍会保留从创世区块起的每一个区块头。没有这些区块头,节点就无法检查新区块是否建立在其已接受的区块链之上,因此区块头是它永远无法舍弃的部分。
在哪里会遇到它
区块头链是节点告诉您它落后多少时所引用的那个数字。
运行 getblockchaininfo,会得到 blocks 和 headers 两个字段。headers 是最佳区块头链的高度,blocks 是其中已下载并完全验证的部分,两者之差就是尚待完成的工作。在已同步的节点上,两者相等;headers 值停滞不动的节点,是与其对等节点失去了联系,而不只是速度慢。
轻量级钱包只保存区块头。SPV 钱包或紧凑过滤器客户端仅存储区块头,并用它们确认自己关心的某笔交易处于真实的工作量证明之下。难度也可以根据区块头计算得出,因为目标值每2,016个区块重置一次,所用的只是区块链中已有的时间戳和 nBits 值,这意味着客户端无需查看任何交易,就能验证它所计算的工作量是真实的。
区块头链 vs 区块头
区块头是单个80字节的记录;区块头链则是将所有区块头一路链接回2009年1月3日创世区块的整体。当有人说轻量级客户端验证工作量证明时,这一区别就很重要。单个区块头证明某一个区块的产生代价高昂。只有由区块头组成的链(每个区块头都承诺其父区块),才能证明某个特定区块位于一段不间断的、代价高昂的工作之后,且无人悄悄替换过这些工作。