9.BTC-分叉

分叉的本质,就是对整个比特币网络“宪法”(即共识规则)的修改。

共识规则是所有节点用来判断一笔交易或一个区块是否“合法”的黄金标准。例如,“一个区块的大小不能超过1MB”、“只有提供了正确的私钥签名才能花费比特币”等等,这些都是共识规则。当我们要改变这些规则时,就必须通过协议分叉来完成。协议分叉是比特币作为一个去中心化、开源项目进行演化、升级和修复的核心机制。它主要分为两种类型:软分叉和硬分叉。

硬分叉 (Hard Fork)

硬分叉是对协议规则的一次根本性改变,通常是放宽了限制或引入了全新的、与旧规则不兼容的逻辑。新规则产生的区块,在旧节点的眼中是完全非法、无效的

核心特征:

  • 不向后兼容:旧节点会坚决拒绝新节点产生的区块。
  • 导致永久分裂:如果社区未能就升级达成压倒性共识,网络将不可避免地分裂成两条独立的区块链。一条遵循旧规则(原链),一条遵循新规则(新链)。
  • 需要所有人生态位升级:所有希望跟随新链的参与者(矿工、交易所、钱包服务商、用户)都必须升级他们的软件。
  • 创造“分叉币”:链分裂后,一条新的加密货币随之诞生。原链上的持有者通常会在新链上获得等量的“分叉币”。

例子:比特币现金 (Bitcoin Cash, BCH)

  • 规则变化:最核心的改变是将区块大小上限从1MB直接提升到8MB(后来又提升到32MB)。
  • 分歧根源:关于如何解决比特币扩容问题的理念之争。BTC社区主张通过SegWit等软分叉方式在现有框架内优化,而BCH社区则认为最直接有效的方式就是扩大区块这个“容器”本身。
  • 结果:由于1MB以上的区块对于BTC的旧节点来说是绝对无效的,这次升级只能以硬分叉形式进行。2017年8月,区块链发生分裂,比特币现金(BCH)从此成为一条独立的链,拥有自己的开发团队、社区和市场价格。

重放攻击

如果一个硬分叉没有做好防护措施,那么重放攻击就会大规模发生,造成巨大的混乱和用户资产损失。


首先,我们来理解为什么会存在这个问题。

  1. 共享的历史:在硬分叉的那一刻,两条链(例如BTC和BCH)拥有完全相同的历史记录。这意味着,你的地址、私钥、以及你拥有的未花费的币(UTXO)在两条链上是一模一样的。
  2. 交易的本质:一笔交易本质上是一段经过你私钥签名的数据,它授权将你某个地址上的币发送到另一个地址。
  3. 问题的根源:因为你的私钥在两条链上都是合法的,那么一笔为动用你分叉前资产而创建的交易,其签名在两条链上都会被识别为有效

重放攻击是指,一笔在一个区块链上广播的有效交易,被别有用心的人(或无意地)拿到另一条链上去重新广播(即“重放”),并且也被成功确认为有效交易。

一个具体的例子:

  1. 分叉发生:假设你在硬分叉前拥有10个币(我们称之为 pre-fork coin)。分叉后,你在A链上有10个币(比如BTC),在B链上也有10个币(比如BCH)。
  2. 你的意图:你只想花掉A链上的10个BTC,于是你创建了一笔交易:“将我的10个BTC发送给小明”,然后用你的私钥签名并广播到BTC网络。
  3. 攻击发生
    • 网络中的任何人(包括小明、矿工或监控网络的攻击者)都可以看到这笔公开的交易数据。
    • 他将这段交易数据原封不动地复制下来。
    • 然后,他把这段数据广播到B链(BCH)网络
  4. 灾难性后果
    • BCH的节点收到这笔交易后进行验证。它们会发现,签名是合法的(因为是你的私钥签的),地址也是合法的,要花费的币也确实存在于BCH链上(因为历史是共享的)。
    • 于是,BCH节点确认了这笔交易。
    • 结果就是:你原本只想支付10个BTC,但因为重放攻击,你账户里的10个BCH也在你不知情或非本意的情况下,被发送到了小明的BCH地址上。

虽然这不是严格意义上“同一个币花了两次”的双重支付,但它导致了你的资产在另一条链上被非自愿地移动,其效果和危害与双重支付非常相似。

为了防止这种混乱,负责任的硬分叉项目必须实施“重放保护”。

重放保护的核心思想是:让分叉后的两条链的交易格式互不兼容,从而使得一条链上的交易在另一条链上注定是无效的。

实现方式通常是在交易需要签名的数据中,加入一个独一无二的标识符,这个标识符只属于其中一条链。这个标识符通常被称为 链ID (Chain ID)

  • 新链(例如BCH) 会强制要求所有新创建的交易在签名时必须包含 CHAIN_ID = BCH 这个数据。
  • 旧链(例如BTC) 的规则里没有这个 CHAIN_ID 字段。

这样一来:

  1. 当你创建一笔BCH交易时,你的签名实际上是针对 (交易数据 + BCH链ID) 进行的。这笔交易在BCH链上是有效的。但如果把它重放到BTC网络,就是无效的”
  2. 反之,一笔标准的BTC交易不包含链ID。如果把它重放到BCH网络,BCH节点也会认为是无效的。

通过这种方式,两条链的交易就被“染色”了,彼此不再兼容,重放攻击也就从根本上被杜绝了。

软分叉 (Soft Fork)

软分叉是对区块链协议的升级,它具有向后兼容性。这意味着,升级后的新规则仍然可以被未升级的旧节点识别为有效

这就像是对规则的“收紧”。例如,原来规定区块大小不能超过2MB,软分叉可以将规则修改为“区块大小不能超过1MB”。旧节点看到1MB的区块时,会认为它符合“不超过2MB”的旧规则,因此会接受它。但反过来,如果旧节点产生了一个1.5MB的区块,新节点会根据更严格的新规则拒绝它。

软分叉的主要特点:

  • 向后兼容:未升级的节点仍然可以参与网络并验证交易,因为新规则产生的区块在旧规则下也是有效的。
  • 不会强制分裂:软分叉通常不会导致区块链分裂成两条独立的链。
  • 只需要大多数矿工支持:只要有足够多的矿工(通常是绝大多数算力)升级并执行新规则,网络就可以平稳过渡。因为他们生产的符合新规则的链会成为最长的链,根据比特币的共识机制,所有节点(包括未升级的)最终都会遵循这条最长链。
  • 风险较低:由于其向后兼容的特性,软分叉被认为是更安全、侵入性更小的升级方式。

注意:

对于那些选择不升级的矿工来说,软分叉的经济后果可能比硬分叉更直接、更不友好。因为在软分叉中,网络引入了比以前更严格的新规则。

一个没有升级的矿工仍然按照旧的、更宽松的规则打包交易和创建区块,这个矿工可能会花费大量的算力和电力,成功地挖出了一个符合旧规则的区块。然而,这个区块很可能因为不符合新的、更严格的规则,而被已经升级的大多数矿工节点拒绝。

当一个区块被网络的大多数人拒绝时,它就成了一个“孤块”(Orphan Block),无法被添加到最长的主链上。这意味着,挖出这个区块的矿工将得不到任何区块奖励(新产生的BTC)和交易费。他们之前为挖这个块付出的所有成本(电费、设备损耗)都白费了。

同时,软分叉的成功激活主要依赖于绝大多数的矿工(算力)来强制执行新规则,而节点的“同意”则体现在最终接受并验证这些新规则上。为了确保网络平稳过渡且不会意外分裂,社区通常会要求一个远高于51%的矿工算力来支持升级。在近期的比特币软分叉升级中(如SegWit和Taproot),采用了一种叫做“BIP 9版本比特”或类似的机制。它设定了一个规则:在一个特定的难度调整周期内(约两周,即2016个区块),必须有至少90%或95%的区块被挖出时包含了“支持升级”的信号。只有达到这个压倒性的多数,升级才会被“锁定”,并在一段时间后正式“激活”。

对于矿工来说,需要压倒性的绝大多数算力支持

虽然矿工负责打包区块和执行规则,但全节点(Full Nodes) 负责独立验证每一笔交易和每一个区块。它们是网络的最终“法官”。

  • 用户激活的软分叉 (UASF - User Activated Soft Fork):这是一个非常重要的概念。即使绝大多数矿工都支持某个软分叉,如果这个分叉对用户(由节点代表)不利,用户可以联合起来拒绝接受矿工打包的区块。从理论上讲,如果足够多的经济节点(如交易所、钱包服务商和大量个人用户节点)都升级并决定从某个特定时间点开始执行新规则,它们就可以有效地“迫使”矿工遵守新规则。因为如果矿工挖出的区块不被这些经济节点接受,那么这个区块里的比特币在经济上就变得毫无价值。
  • 节点的角色是“接受”而非“投票”:节点的算力为零,它们不能像矿工那样通过挖矿来投票。它们的权力来自于它们对规则的坚持。当软分叉被矿工激活后,升级了的节点会开始执行更严格的新规则。未升级的节点虽然仍能接收区块(因为向后兼容),但它们无法独立验证新规则下的所有细节。最终,在经济活动和最长链原则的引导下,整个网络都会趋向于接受新规则。

因此,软分叉的实施需要:

  1. 压倒性的矿工算力支持(通常要求90%或95%,远超50%)来负责执行和强制推行新规则。
  2. 经济多数的节点支持(尤其是交易所、钱包等重要参与者)来最终验证和接受新规则,从而赋予升级真正的经济价值。