比特币节点是验证区块和交易的程序。Reorg 是比特币节点转向另一条有效分支的过程:这条分支积累了更多 Proof of Work,也就是挖矿所证明的工作量。节点会重新评估最近的区块和其中的付款。这不会改变比特币规则,也不会给任何人一个撤销他人付款的按钮。
安娜收到 20,000 聪,聪是比特币的小单位。钱包显示一次确认:付款已经进入她的节点接受的一个区块。随后,节点发现另一条竞争中的有效分支,里面暂时没有这笔付款。当这条分支积累的挖矿工作量更多时,节点便转向它。这样替换部分历史的过程就叫 Reorg。即使没有人盗取安娜的密钥或修改签名,她的付款也可能重新等待确认。决定采用哪条分支的不是投票,也不只是区块数量,而是 chainwork:各区块按照其难度所证明的工作量之和。无效分支即使工作量更多,也会被节点拒绝。 [1] [4]
安娜接下来看到什么,取决于新分支。如果其中也包含这笔付款,付款仍然是已确认状态,但确认次数可能变化。如果没有,Bitcoin Core 可以尝试把它放回 Mempool,也就是节点暂存未确认、等待进入区块的交易列表。但并不保证一定能放回。先前交易的输出记录了金额以及花费这笔资金的条件。新分支可能已经通过另一笔交易花掉了同一笔资金;也可能缺少要花费的先前交易输出,或者不满足时间限制等接收条件。因此,重新等待的付款,与新历史已经不允许的付款,是两种不同情况。 [1]
一次确认指包含付款的那个区块。每增加一个后续区块,就多一次确认,也增加了竞争分支必须超过的工作量。因此,最新区块中的付款有一次确认;付款在已接受历史中埋得越深,替换这段历史通常就越困难。但任何有限的确认次数,都不能从数学上保证替换绝不可能发生。商家和交易平台因此会根据付款金额及可接受的风险,设定等待要求。 [3] [5]
Reorg 本身不能证明有人攻击网络。两名矿工可能几乎同时找到接在同一个前块之后的区块。信息传播并非瞬间完成,不同节点便可能短暂跟随不同的链尾。一条有效分支积累更多工作量后,节点转向它;被放弃的区块就是 Stale Block。不过,攻击者也可能利用相同机制进行 Double Spend,试图让一段把同一笔资金付往别处的历史被接受。因此,需要弄清节点为何切换分支,以及哪些付款受到了影响。 [4] [5]
发生 Reorg 时,节点仍使用同一套规则,只是在符合这些规则的历史之间选择。Hard Fork 则会改变有效性规则,使新旧软件可能对同一个区块作出不同判断。因此,重组本身既不创造新货币,也不改写比特币规则。下面几节介绍节点如何在技术上完成历史切换。 [4]
Tip 指节点当前接受分支中的最新区块。分叉点是当前活动链与替代分支共有的最后一个区块。重组深度通常表示为了回到这个共同祖先,必须从活动链末端断开多少个区块。深度为一个区块的 Reorg 替换链末端;更深的重组会回滚多个已确认区块。深度取决于具体节点当前的视角。 [1]
Full Node 会自行检查规则。下面的函数名对应 Bitcoin Core 中的具体实现。Bitcoin Core 不会只选择高度最高或最受欢迎的分支。候选链在激活时必须满足节点的共识规则;更高的 chainwork 不能让无效区块变得有效。FindMostWorkChain 选择工作量最高、尚未被判定为无效的候选链。这不代表已完成全部验证:ActivateBestChain 在连接区块时还会进行进一步检查。已知无效的分支会被排除。 [1]
UTXO 是尚未花费的交易输出;UTXO 集合收录这些可用输出。Undo 数据保存撤销一个区块影响所需的信息。DisconnectTip 和相关验证逻辑按相反顺序撤销被断开区块的影响。已花费的 UTXO 会恢复,被移除区块创建的输出则失去确认状态。因此 Bitcoin Core 保存撤销数据,以便精确重建分叉点处的 UTXO 集。 [1]
这里的 rollback 指回到断开那些区块之前的状态;chainstate 是节点与所接受历史相对应的工作状态。回滚后,ConnectTip 按正向顺序连接 chainwork 更高的分支上的区块。每笔交易都要根据重建的 UTXO 集和相应高度生效的规则重新验证。最终 chainstate 对应一段明确的历史,而不是两个分支交易的混合。 [1]
Coinbase Transaction 是区块中的第一笔交易,用来分配矿工奖励。高度 h 表示区块在链中的位置。Coinbase 交易是例外:区块断开后,它不会返回 mempool。按照共识规则,在高度 h 创建的 coinbase 输出最早可在区块 h + 100 中花费。当链末端为 h + 99 时,来源区块已有 100 次确认,成熟条件允许将花费交易纳入下一个区块。如果 Reorg 移除了包含 coinbase 的区块,该区块奖励会从活动 chainstate 中消失。依赖被移除历史的后续交易也可能变为无效。 [1] [2] [3]
下面列出的是特定程序版本中的函数名,不是钱包用户还需要执行的操作。Bitcoin Core v29.0 的步骤明确:FindMostWorkChain 找到 chainwork 最高且尚未被判定无效的候选链,ActivateBestChainStep 可以断开当前链末端,ConnectTip 验证并连接替代区块,MaybeUpdateMempoolForReorg 重新检查被断开区块中的交易。激活过程中可能发现候选链无效,然后继续寻找其他分支。较大规模的 Reorg 需要处理更多断开和连接的区块,因此可能延长 ActivateBestChain 的执行时间。 [1]
要获得更完整的理解,请将本词条与以下词条结合阅读: 确认, Proof of Work, Stale Block, 双重支付, Full Node, UTXO. 反向关联还来自: 确认, 双重支付, Coinbase交易, Soft Fork.