46 / 736STALE

Stale Block

留在主链之外的有效区块

Stale Block 是留在旁支上的有效 Bitcoin 区块。它不一定与欺诈有关:两个矿工可能几乎同时找到区块,随后网络只沿其中一条分支继续前进。

Stale Block 符合 Bitcoin 的规则,但不属于活动链,也就是某个节点(验证区块和交易的计算机)用来计算确认次数、判断哪些资金可以花费的交易历史。选择哪条有效分支,取决于其累计的挖矿工作量。对收款人来说,这可能意味着少了一次确认、需要继续等待,并不意味着比特币自动丢失。

设想矿工安娜和帕维尔都在同一个最新区块之后挖掘下一个区块。安娜先找到了新区块,但消息还没传到帕维尔那里,他也找到了自己的区块。两个区块都可能有效,只是包含的交易略有不同。验证区块和交易的节点得知两个区块的先后顺序不同,因而会暂时沿不同的链末端继续。一旦某条有效分支累积了更多工作量,节点验证后就会转向它。留在被放弃分支上的区块,便称为 Stale Block。 [1]

Bitcoin 需要一份统一的历史,避免同一笔资金被成功花费两次。因此,仅仅确认两个区块各自符合规则还不够,节点还必须选择沿哪条有效分支前进。区块是否有效,与选择哪条链,是两个不同的问题。Stale Block 的工作量证明(Proof of Work)、交易和签名都可以正确,却仍然不属于选中的历史。这并不等于它有缺陷或存在欺诈。 [1] [2]

假设帕维尔的区块包含了你的付款,钱包已经显示一次确认。如果最终安娜的分支胜出,就要看这条分支里有什么。相同交易也可能在其中,于是仍然有确认。否则,交易可能返回 Mempool,即节点本地保存未确认交易的列表,等待另一个区块。但返回并非必然:交易必须仍可被接受,而且不能与新的历史冲突。如果新历史已经包含另一笔花费同一资金的交易,原付款就不能同时在其中获得确认。 [2]

普通付款与 Coinbase Transaction 不同。后者是区块中的第一笔交易,用来给矿工分配奖励,包括新发行的比特币和交易手续费。如果帕维尔的区块留在活动链之外,其 coinbase 奖励便不能在这份历史中花费。它不会像普通付款一样转入 Mempool。然而,帕维尔用掉的电力并不会回来。因此,矿工不只要找到区块,也希望尽快把消息传给其他人。 [1] [2]

有些文章和区块浏览器也把 Stale Block 称为 Orphan Block。两者常被当作同义词,但更精确的含义有区别。Orphan Block 指节点尚不知道其前一个区块、因此暂时无法把它接入链中的区块。Stale Block 的前一个区块可以已知,区块本身也可以有效,只是位于选中分支之外。节点缺少验证输入所需的前序交易时,相应交易也会被称为 orphan。因此,要留意具体来源使用这个词时究竟指什么。 [1]

如果节点原本已经使用帕维尔的区块,随后改用安娜的分支,就发生了 Reorg:节点替换了自己认定为活动历史的一部分。这也是钱包确认次数可能变化的原因。示例中的短暂竞争,即使矿工都诚实也会发生。不过,攻击者可能试图利用历史切换实施 Double Spend,也就是让另一笔花费同一资金的付款被接受。单凭 Stale Block 不能证明这种意图,还要检查事件经过及可能冲突的交易。 [1] [2]

新区块的消息不会瞬间传遍世界。传播时间越长,其他矿工就可能越久不知道它,继续在同一个前序区块上工作。传输速度、节点间的连接,以及传播时间相对于出块间隔的长短,都有影响。Stale Rate 指已发现的有效区块中,没有留在活动链里的比例。它不是 Bitcoin 规则规定的固定百分比。比较数据时,还要考虑观察时段,以及观察者实际看到了哪些区块。 [1] [3]

BIP152 规范描述了 Compact Block Relay。节点往往已经从自己的 Mempool 知道新区块中的大部分交易,因此不必再次接收这些交易的全部内容。短标识符让它能用现有数据重建区块,再请求缺少的交易。这样可以节省传输数据,并在适当条件下让节点更早得知新区块。它改善的是传播方式,而不是有效性规则,也不能完全避免两个矿工几乎同时找到区块。 [3]

一条分支的累计工作量在技术上称为 chainwork。它既不测量实际耗电,也不按计算机数量投票。每个区块都会增加一个由其 Proof of Work 难度推导的数值;Proof of Work 就是挖矿工作的证明。因此,“更长的链获胜”不如“chainwork 更多的有效分支获胜”准确。节点必须检查规则是否得到遵守,再多的工作量也不能让无效交易变得有效。另外,stale 描述的是区块相对于某个节点此刻所选历史的位置。 [1] [2]

区块浏览器很实用,但显示的是其服务自身的视角。自己的 Full Node,也就是验证规则的完整节点,能让你查看独立接受的历史。如果节点保存着该区块的数据,Bitcoin Core 的 getblock 会对活动链之外的区块返回 confirmations: -1。如果数据缺失,例如已在裁剪存储时被删除,命令会报错。这个数值本身并不能证明区块已经通过全部有效性检查。要判断其位置,还应查看 hash(区块标识符)、前一个区块、高度(它前面的区块数量)和 chainwork;具体付款的结果则要单独核实。两个区块可以高度相同,却有不同的 hash。 [4] [5]

要获得更完整的理解,请将本词条与以下词条结合阅读: Reorg, 确认, Block, Block Header, Proof of Work, 挖矿. 反向关联还来自: Reorg, Mining Pool, Hashrate, Selfish Mining.

DOC · 001Bitcoin Developer Guide — Block Chain文档 DOC · 002Bitcoin Core v29.0 — chain activation and mempool reconciliation一手来源 DOC · 003BIP 152 — Compact Block Relay规范 DOC · 004Bitcoin Core v29.0 — getblock文档 DOC · 005Bitcoin Core v29.0 — block RPC implementation一手来源
修订日期: 来源优先 · 非投资建议