北京大学肖臻老师《区块链技术与应用》公开课第 10 讲的主题是**"比特币的分叉:硬分叉与软分叉"**。这节课非常重要,因为它解释了在去中心化系统中,当协议(规则)发生升级时,网络是如何达成共识(或分裂)的。
以下是本课程内容的结构化详细总结:
一、 分叉的背景 (Background)
在中心化系统中(如 Windows 更新),软件升级很简单:厂商发布补丁,用户强制或选择更新。但在去中心化 的比特币网络中,没有中心权威,节点升级是自愿的。如果一部分节点升级了软件(接受新规则),而另一部分没有,就会产生协议不兼容,从而导致分叉。
二、 硬分叉 (Hard Fork)
定义 :当比特币协议发生改变,且**新节点产生的区块被旧节点视为"非法"**时,就会发生硬分叉。这通常是因为新协议收紧了规则,或者改变了区块结构,导致旧节点无法认可。但更常见的硬分叉定义场景是:扩大了区块限制(例如从 1MB 扩大到 4MB)。
-
场景举例(区块扩容):
-
旧规则:区块大小上限 1MB。
-
新规则:区块大小上限 4MB。
-
结果:
-
新节点:挖出了一个 2MB 的大区块。
-
旧节点 :看到这个 2MB 的区块,认为它违反了"1MB 上限"规则,直接拒绝,并在原来的链上继续挖矿。
-
新节点:认可这个 2MB 区块,并在其后面继续挖矿。
-
最终结局:由于旧节点永远不会接受新节点挖出的大区块,网络永久分裂成两条链(一条旧链,一条新链)。这两条链上的币在分叉后虽然各自独立,但共享分叉前的历史。
-
社区分裂 :硬分叉往往伴随着社区的分裂。例如,BCH (Bitcoin Cash) 就是比特币的一次硬分叉,支持大区块的人去挖 BCH,坚持 1MB 的人留在 BTC。
三、 软分叉 (Soft Fork)
定义 :当比特币协议发生改变,新节点产生的区块能够被旧节点认可(视为合法) ,但这通常意味着新协议收紧了规则(限制更多)。
-
场景举例(区块大小限制缩小 - 假设):
-
旧规则:区块大小上限 1MB。
-
新规则:区块大小上限 0.5MB(新节点自愿只挖小区块)。
-
结果:
-
新节点:挖出的 0.5MB 区块,完全符合旧节点的"1MB 以内"标准。
-
旧节点:欣然接受新节点的区块,并在其后继续挖矿。
-
问题点 :如果旧节点挖出了一个 0.8MB 的区块(符合旧规则,但不符合新规则)?
-
新节点:会拒绝这个 0.8MB 区块。
-
关键 :只要新节点的算力超过 50%,新链就会比旧链长。根据"最长合法链"原则,旧节点最终会放弃自己挖出的 0.8MB 分叉,转而认可新节点的最长链。
-
最终结局:不会产生永久分叉。旧节点虽然不知道新规则,但只要跟着最长链走,依然能在同一个网络中工作(尽管它们挖出的不符合新规则的块会被孤立)。
四、 实际案例:P2SH (Pay to Script Hash)
这是一个典型的软分叉案例。
- 背景:最初比特币只有 P2PK (Pay to PubKey) 等简单形式。为了支持多重签名等复杂功能,引入了 P2SH。
- 旧节点眼中的 P2SH:看起来像是一笔简单的转账,只要哈希对得上就放行(旧节点验证规则很简单)。
- 新节点眼中的 P2SH:不仅哈希要对得上,还需要执行后面复杂的赎回脚本(Redeem Script),验证通过才放行。
- 结论:新节点加了更严的检查,但旧节点觉得也没毛病(只是检查得松),所以兼容性得以保持。
五、 软分叉中的"假阳性"风险
对于旧节点来说,软分叉其实是一种"欺骗"。
- Coinbase 域的利用:在某些软分叉中(如隔离见证 SegWit),新规则的数据被藏在旧节点不检查的区域(如 Coinbase 交易的输入域)。
- 安全性:旧节点没有验证这部分新规则的安全性,所以理论上它的安全性降低了(变成了"半个轻节点")。但只要大多数算力掌握在升级后的新节点手中,系统整体依然是安全的。
六、 总结对比
| 特性 | 硬分叉 (Hard Fork) | 软分叉 (Soft Fork) |
|---|---|---|
| 规则变化方向 | 通常是放宽规则(如 1MB -> 4MB) | 通常是收紧规则(限制更多) |
| 旧节点反应 | 拒绝新节点的区块(认为非法) | 接受新节点的区块(认为合法) |
| 兼容性 | 向下不兼容(必须全网升级) | 向下兼容(旧节点可暂不升级) |
| 结果 | 如果有人坚持旧规则,会产生两条永久存在的链 | 只要新算力 > 50%,只会有一条链 |
| 典型案例 | ETH / ETC 分叉,BTC / BCH 分叉 | P2SH, SegWit (隔离见证) |
💡 核心逻辑链
- 去中心化升级难 部分升级,部分不升级。
- 新旧规则冲突
- 如果是旧节点不认新块 硬分叉(路断了,各走各的)。
- 如果是旧节点认新块 (但可能反过来新不认旧) 软分叉(只要新算力够强,旧节点被迫跟随)。
