术语表 /挖矿与共识
链重组
又称区块链重组、Chain reorganization、Reorg、区块重组。
- 链重组是什么?
- 链重组是指您的节点发现一条累积工作量更多的分支后,断开其已接受的区块,并沿新分支重建链尖的过程。
节点不会跟随它最先看到的那条链。它们跟随累积工作量证明最多的那条链,当出现更优的分支时,它们会回退到分叉点,再从那里重新向前重放。比特币主链上几乎所有的链重组都只有1个区块深,并在数秒内完成;有记录以来最深的一次发生在2013年3月,深达24个区块,由软件缺陷而非攻击者造成。
运作方式
链重组分为三步,节点会自行完成全部三步,无需征询任何人。
首先,节点从当前链尖向后回退,直到两条分支共有的最后一个区块,并在回退过程中逐个撤销区块:该区块创建的输出从未花费输出集中移除,它消耗的输出被恢复,其中的交易回到内存池。然后,节点按顺序连接竞争分支的区块,并像验证刚收到的区块一样逐个验证。最后,节点重新计算内存池,丢弃现已确认的交易,保留尚未确认的交易。
安全性正体现在第二步。工作量更多是必要条件,但不是充分条件。如果挑战分支上的任何一个区块未通过某一项共识检查,节点就会停止,将该分支标记为无效,并保留自己原有的链。即使矿工拥有无限算力,也无法让节点接受向自己支付过多或重复花费同一笔输出的区块。
规则是累积工作量最多,而不是链最长。工作量根据每个区块挖出时的难度累加,因此以更高难度挖出、区块数较少的分支,可能胜过更长的分支。在比特币上,这两种衡量标准几乎总是一致,因为难度只每隔2,016个区块调整一次。
深度决定了是例行情况还是值得警惕的情况。1个区块深属于正常的日常维护。Bitcoin Core 将任何较大规模的重组视为值得关注的事件,当它发现竞争分支与当前活跃链的分歧超过6个区块时,会向运营者发出大工作量分叉警告。
购买比特币时为何重要
确认数是对链重组深度的一次押注,而您使用的每个平台都已悄然代您下了注。
在3个区块后就为充币记账的交易所,已经认定不值得为3个区块的回滚投保。等待6个区块的交易所,则对该风险给出了更高的定价。这两个数字都不来自协议,都属于平台政策,因此同一笔充币在一个平台上20分钟到账,在另一个平台上却要一个多小时。在本站评测的交易所之间转移比特币时,请先核对这一差异,再判断是否出了问题。
您的密钥不受这些情况影响。链重组可以改变哪些交易在链上以及它们的先后顺序,但无法生成签名,因此存放在您自己掌控的钱包中的比特币不在风险敞口之内。处于影响范围内的是流动中的价值:已记账但尚未被深埋的充币,您为商品而接受的一笔付款,以及您在仅1次确认时就放出现金的点对点交易。
历史上有一次具有启发意义的警示。2015年7月4日,数个大型矿池在未经验证的区块上继续挖矿,这种做法称为 SPV 挖矿,并产生了一条后来被证明无效的6个区块的链。Bitcoin.org 发布警示,建议用户在情况解决之前等待30次确认。这个教训并不是说比特币脆弱,而是说所需的深度取决于出了什么问题,而1次确认从来都算不上多。
如果您还持有规模较小的工作量证明币,请将它们的链重组历史视为一个完全独立的问题。对于确实发生过链重组的链,交易所要求的确认数要多得多,这一要求是判断一条链实际安全程度的有用公开信号。
2013年3月的24个区块链重组
比特币主链有史以来经历的最深一次链重组,是由两个软件版本对一个本应都接受的区块产生分歧造成的。
2013年2月发布的 Bitcoin 0.8以 LevelDB 取代了 Berkeley DB 存储引擎。3月11日,区块225,430到来,其中包含数量异常庞大的输入。运行0.8的节点接受了它。运行0.7的节点触及了 Berkeley DB 的锁数量上限,其配置从未设置得更高,因而拒绝了它。网络一分为二,每一方都完全确信对方是错的。
开发者在1小时内通过 IRC 协调一致,并做出了一个令人不适的决定:请矿池降级到0.7,主动放弃工作量更多的分支,因为大多数在运行的节点无法跟随那条分支。分裂持续了约6小时。当0.7链反超时,被放弃的分支已延伸到24个区块。支付处理商 OKPay 报告称,在此期间遭遇了双花。
修复在数天后随0.8.1发布,它让新节点模仿旧的上限,直到一个统一协调的切换日期。BIP50 详细记录了整个事件,是了解比特币如何应对真正紧急情况的最佳读物。这也解释了,比特币历史上最深的一次链重组为何是一个关于数据库配置、而非挖矿算力的故事。
链重组 vs 硬分叉
链重组发生在同一套规则之内,最终所有人都回到同一条链上。硬分叉则改变规则,使两条分支永远无法重新合一,并作为各自独立的资产继续增长,比特币现金在2017年8月1日就是如此。前者是对哪条有效链是最佳链的暂时分歧,后者是对什么才算有效的永久分歧。
链重组 vs 双花
链重组是一种机制;双花是利用它可以做的一件事,而且很少是实际发生的事。绝大多数链重组只是把同样的交易重新挖进另一个区块,因此没有人的付款发生变化。要实现回滚,获胜分支必须包含攻击者有意放入的冲突交易,这意味着要么拥有巨大的算力,要么运气异常好。成本更低的双花尝试从不涉及链重组,因为它们针对的是原本就从未被确认的付款。