术语表 /挖矿与共识
孤块
- 孤块是什么?
- 孤块是指其父区块尚未被您的节点见到的区块,因此无法被验证或连接,这与大多数人使用这个词时的所指并不相同。
这个词有两种用法。在协议中,它描述的是乱序到达的区块,没有已知的祖先区块可供其连接;在日常用语中,以及在大多数区块浏览器上,它指的是一个只是在竞争中落败的有效区块,这类区块的准确叫法是陈旧区块。Bitcoin Core 在2015年2月发布的0.10版本中,已完全不再保留孤块。
运作方式
孤块只存在于收到区块与得知其归属位置之间的空档期。
验证是按顺序进行的。要检查一个区块,需要该区块之前一刻的未花费输出集合,而这个集合要通过按顺序应用此前的每一个区块来构建。如果交给节点的区块缺少父区块,节点可以验证区块头中的工作量证明,但其他一概无法验证:无法验证手续费,无法验证区块补贴,也无法验证是否有输入已被花费。这样的区块是无法验证,而不是无效。
旧版本的 Bitcoin Core 会把这类区块暂存在内存中,等待缺失的父区块出现。这是必要的,因为区块是按通告来请求的,对等节点很容易乱序发送。先同步区块头的方式消除了这一需要。节点现在会先下载并检查由80字节区块头组成的链,然后才请求任何一个区块体,这意味着它始终知道新到达的区块应归属何处,并且可以同时向多个对等节点请求区块体而不会混乱。孤块池在同一版本中被删除,在现代节点上,几乎不可能再产生真正的孤块。
有一样东西保留了这个名称。Bitcoin Core 仍然维护一个孤立交易池,用于存放其输入尚未见到的交易,默认最多保存100笔,其依据是一个合理的假设:缺失的父交易很可能只是晚到几秒。因此,当这个词出现在 Core 自身的日志或配置中时,它指的是交易,绝不是区块。
在哪里会遇到它
“孤”这个词主要留存于描述其他事物的场合。
区块浏览器是造成混淆的最大来源:有几家会发布“孤立区块”页面,列出因竞争区块获胜而被舍弃的有效区块,新闻报道也沿用这一标签。矿池仪表盘也是如此,所报告的孤块率实际上是陈旧区块率。山寨币文档大多抄自比特币早期的维基,对这两种含义不加区分地使用同一个词。
Bitcoin Core 则不然。向它查询其所知的相互竞争的分支,它会报告每个分支的末端区块,状态为 active、valid fork、valid headers、headers only 或 invalid 之一。其中没有孤块状态,因为这个词曾经描述的情形已不再出现。
对读者来说,有用的判断方法是看该区块是否曾经被检查过。如果有人能告诉您它的高度、交易数量以及挖出它的矿池,那么这个区块就已被完整验证并在竞争中落败,您要用的词就是陈旧区块。
孤块 vs 陈旧区块
孤块因父区块未知而无法验证。陈旧区块则已经过验证,完全有效,只是因为同一高度的另一个区块先被接续构建,才被放弃。几乎所有说“孤块”的人指的都是陈旧区块,包括几家区块浏览器,因此在依据某个信息来源得出结论之前,值得先问清它指的是哪一种。对用户而言,两者都不会让您付出任何代价:被舍弃区块中的付款会回到内存池,通常在一两个区块内再次被挖出。