跳转至

9. 比特币 (BTC) 分叉 (Fork)

分叉的类型

  1. 分叉攻击 (Forking Attack / Deliberate Fork):

    • 这是指恶意矿工故意制造分叉的行为。
    • 目的: 通常是进行双花攻击 (Double Spending)。攻击者先在原链上发起一笔交易(例如支付给商家),然后秘密在另一条分叉链上挖出包含冲突交易(支付回给自己)的区块。如果攻击者的分叉链长度超过了原链并被全网接受,原链上的交易就会被回滚(无效),而攻击者成功拿回了花出去的钱(双花)。
    • 实现难度: 在比特币中,成功实施分叉攻击需要掌握全网大部分算力 (51% 攻击),成本极高,非常困难。
  2. 协议分叉 (Protocol Fork):

    • 当比特币网络的协议规则发生改变,且网络中的节点没有同时、统一地升级时,就会发生协议分叉。
    • 根据规则改变的兼容性,协议分叉分为两种主要类型:硬分叉 (Hard Fork)软分叉 (Soft Fork)

硬分叉 (Hard Fork)

  • 定义: 引入向后不兼容 (Backward Incompatible) 的协议更改。即新规则下产生的区块或交易会被遵循旧规则的节点视为无效 (Invalid)
  • 触发原因: 需要对比特币协议进行重大、不兼容的修改,例如:
    • 增加区块大小限制 (Block Size Limit)(如 1MB -> 4MB 例子)。
    • 修改共识算法核心机制(如 PoW 转 PoS)。
    • 添加新的操作码 (Opcode) 或显著改变脚本行为。
  • 节点升级要求: 需要所有参与网络的节点(矿工、全节点、钱包等)都升级到新版本软件,才能继续在同一个网络中无缝运行。如果有一部分节点拒绝升级...
  • 分叉过程与结果:
    • 已升级的节点(新节点)按照新规则挖矿和验证。
    • 未升级的节点(旧节点)拒绝接受新节点产生的区块(因为它们违反了旧规则),继续按照旧规则挖矿。
    • 结果是网络永久分裂成两条独立运行的区块链:
      • 新链 (New Chain): 运行新规则,由已升级节点维护。新节点认可旧链的历史区块(向后兼容历史),但只在新规则下挖新块。新链通常拥有大部分算力,能更快地产出区块,成为事实上的“最长链”。
      • 旧链 (Old Chain): 运行旧规则,由未升级节点维护。旧节点拒绝新链的所有区块。旧链算力较低,增长缓慢。
    • 永久性分裂: 两条链拥有共同的创世区块历史,但在分叉点之后各自独立发展,互不承认对方的区块和交易。它们成为两种不同的加密货币。
    • 例子: 比特币现金 (BCH) 从比特币 (BTC) 的分叉(区块大小增加);以太坊 (ETH) 和 以太坊经典 (ETC) 的分叉(DAO 黑客事件回滚)。
  • 避免交易紊乱:
    • 分裂后,两条链上的地址格式、交易结构可能相同。
    • 在一条链上有效的交易,在另一条链上可能也有效(重放攻击风险)。
    • 解决方案:通常在硬分叉升级中加入 重放保护 (Replay Protection)独特的链标识符 (Chain ID),使一条链上的交易在另一条链上明确无效,防止交易被意外重播到错误的链上造成双花或资产损失。
  • 笔记修正: 硬分叉不需要所有节点都更新才能避免永久分叉。恰恰相反,只要有节点不更新,永久分叉就必然发生。新链的成功取决于能否获得足够的算力、社区和经济支持来持续发展。旧链也不会消失,只要还有支持者运行节点和挖矿。

软分叉 (Soft Fork)

  • 定义: 引入向后兼容 (Backward Compatible) 的协议更改。即新规则是旧规则的一个子集 (Stricter Rules)。新规则下产生的区块或交易会被遵循旧规则的节点视为有效 (Valid),但反过来不一定成立(旧规则下可能产生被新节点视为无效的区块/交易)。
  • 触发原因: 通常是收紧现有规则在现有规则框架内增加新的含义,例如:
    • 减少区块大小限制(如笔记中的 1MB -> 0.5MB 例子 - 注:这是理论说明,实际比特币从未这样做过)。
    • 引入新的共识规则,如:
      • BIP 34: 要求区块版本号递增并在 Coinbase 交易中包含区块高度。
      • BIP 66: 严格 DER 编码签名验证。
      • P2SH (Pay to Script Hash): 通过软分叉激活(笔记中提到的关键案例!)。新节点执行额外的赎回脚本验证步骤,旧节点只看到 OP_HASH160 <hash> OP_EQUAL 这个他们能理解的简单脚本。
      • SegWit (隔离见证): 通过软分叉激活,改变了交易数据的结构和 Merkle 树计算方式。
    • 赋予现有区块/交易结构中未使用或未定义的字段 (如 Coinbase 的 extra data 域) 新的含义或约束(笔记中提到的 Coinbase 改造例子)。
  • 节点升级要求: 只需要大多数算力 (通常是 >50%) 升级到新规则软件即可。未升级的旧节点可以继续运行。
  • 分叉过程与结果:
    • 已升级的节点(新节点)按照更严格的新规则挖矿和验证。
    • 未升级的节点(旧节点)仍然接受新节点产生的区块(因为新块也满足旧规则),也接受旧节点产生的区块(只要它们满足旧规则)。
    • 如果旧节点产生了一个只满足旧规则但违反新规则的区块(例如,包含了一个新节点认为无效的交易,或大小超过新限制),这个区块会被新节点拒绝,成为一个孤块 (Orphan Block)
    • 临时性分叉: 这种违反新规则的区块是偶然产生的(通常因为旧节点未升级)。当新节点占多数算力时,它们挖出的符合新旧规则的链会更快增长成为最长链。旧节点会跟随这条最长链(它们认为有效),而孤立的无效块会被丢弃。因此,软分叉通常不会导致永久性的区块链分裂,网络最终会统一到新规则上。
    • 向后兼容性: 旧节点感知不到新规则的存在,它们只是继续遵循原来的规则。新规则对它们来说是“隐形”的。
  • 新节点的额外验证: 如笔记所述,新节点通常需要比旧节点多验证一步或应用更严格的规则(如验证赎回脚本内容、检查 SegWit 签名、检查 BIP 要求的字段等)。
  • 笔记修正:
    • 软分叉成功的关键是大多数算力 (>50%) 接受并执行新规则,而非“半数以上的节点更新”(节点数不是共识的决定因素,算力才是)。只要多数算力执行新规则,链就会稳定在新规则下。
    • “旧节点认可新节点”更准确的说法是:旧节点接受新节点产生的区块(因为它们满足旧规则)。
    • “新节点不认可旧节点”是指新节点会拒绝那些违反新规则的区块(即使它们满足旧规则),导致这些区块成为孤块。
    • 软分叉是向后兼容的,允许旧节点在未升级的情况下继续参与网络(尽管可能产生孤块)。

关键对比总结 (Hard Fork vs. Soft Fork)

特征 硬分叉 (Hard Fork) 软分叉 (Soft Fork)
兼容性 向后不兼容 向后兼容
规则变化 引入新规则,放宽根本改变限制 收紧现有规则或在框架内增加含义
旧节点看新块 无效 (拒绝) 有效 (接受)
新节点看旧块 通常有效 (认可历史) 可能无效 (如果违反新规则)
节点升级要求 必须所有节点升级才能维持单链 只需多数算力升级即可维持单链
结果 永久性区块链分裂 (两条独立链) 临时性分叉/孤块,最终统一到新规则链
例子 BTC -> BCH; ETH -> ETC P2SH; SegWit; BIP 34, 66, 9x 系列
升级风险 高 (分裂风险) 低 (旧节点可继续运行)
重放风险 高 (通常需要 Chain ID/重放保护) 低或无

总结

  1. 区分分叉攻击与协议分叉: 前者是恶意行为 (51%攻击),后者是协议升级的自然结果。
  2. 理解硬分叉本质: 向后不兼容,必然导致永久性链分裂 (两条链)。关键在于新规则下产生的块被旧节点拒绝。成功依赖社区支持,非所有节点升级
  3. 理解软分叉本质: 向后兼容,通常不会导致永久分裂。新规则是旧规则的更严格子集。新节点产生的块被旧节点接受,但新节点会拒绝违反新规则的旧节点块(孤块)。成功依赖多数算力升级
  4. 掌握核心案例:
    • 硬分叉: 区块大小增加 (BCH),共识机制改变。
    • 软分叉: P2SH (核心案例!), SegWit (核心案例!), BIP 34 (区块高度), BIP 66 (严格签名), Coinbase 域新用途 (如 extra nonce 扩展)。
  5. 理解节点视角: 硬分叉中,新旧节点互相拒绝对方的新块;软分叉中,旧节点接受新块,新节点拒绝无效旧块。
  6. 了解重放风险与防护: 硬分叉后需要 Chain ID/重放保护防止交易在错误链上生效。
  7. 明确算力的作用: 在软分叉中,算力(而非节点数)是决定链能否稳定在新规则下的关键。在分叉攻击中,算力(51%)是攻击成功的基础。