共識機制
深入理解比特幣的工作量證明共識機制、難度調整算法和分叉處理。
什麼是共識?
在分散式系統中,共識是指所有參與者對某個狀態達成一致的過程。 比特幣網路沒有中央權威,卻能讓全球數萬個節點對「誰擁有多少比特幣」達成一致。 這是通過工作量證明(Proof of Work, PoW)機制實現的。
核心問題: 在沒有中央機構的情況下,如何防止同一筆比特幣被花費兩次(雙重支付)? 答案是:讓所有人同意一個統一的交易順序。
工作量證明 (PoW)
工作量證明是一種讓礦工證明他們付出了計算資源的機制。 礦工需要找到一個特殊的數字(nonce),使得區塊頭的雜湊值小於目標值。
挖礦過程
收集交易
從 mempool 選擇交易,構建候選區塊
構建區塊頭
包含前區塊雜湊、Merkle 根、時間戳等
嘗試 nonce
不斷改變 nonce 值,計算區塊頭雜湊
檢查結果
如果雜湊 < 目標值,找到有效區塊;否則繼續
廣播區塊
找到有效區塊後,立即廣播到網路
雜湊函數特性
比特幣使用 SHA-256 雜湊函數。它有以下關鍵特性:
- • 單向性:從輸出無法反推輸入
- • 雪崩效應:輸入微小變化導致輸出完全不同
- • 確定性:相同輸入永遠產生相同輸出
- • 抗碰撞:找到兩個相同雜湊的輸入極其困難
難度調整
比特幣設計為平均每 10 分鐘產生一個區塊。為了維持這個節奏, 網路每 2016 個區塊(約兩週)自動調整一次難度。
# 難度調整公式 新難度 = 舊難度 × (實際時間 / 目標時間) # 目標時間 目標時間 = 2016 區塊 × 10 分鐘 = 20160 分鐘 ≈ 2 週 # 調整限制:最多 4 倍,最少 1/4 倍 if 調整係數 > 4: 調整係數 = 4 if 調整係數 < 0.25: 調整係數 = 0.25
為什麼是 10 分鐘?
10 分鐘是安全性和使用便利性之間的平衡:
- • 足夠長,讓新區塊有時間傳播到全網
- • 減少「孤塊」(orphan blocks)的產生
- • 防止礦池過度中心化
- • 同時不會讓用戶等待太久
最長鏈規則
當網路中出現多個有效區塊時,節點遵循「最長鏈規則」(實際上是累計工作量最大的鏈):
| 情況 | 處理方式 |
|---|---|
| 收到更長的鏈 | 切換到新鏈(重組) |
| 收到相同長度的鏈 | 保留先收到的,等待下一個區塊 |
| 收到較短的鏈 | 忽略 |
分叉類型
臨時分叉
當兩個礦工幾乎同時找到有效區塊時,網路會暫時分裂。 這是正常現象,通常在 1-2 個區塊後自動解決。
軟分叉 (Soft Fork)
軟分叉是向後相容的升級。舊節點仍能驗證新規則產生的區塊, 但可能無法使用新功能。例如:SegWit、Taproot。
硬分叉 (Hard Fork)
硬分叉是不向後相容的變更。未升級的節點會拒絕新規則的區塊, 可能導致永久性網路分裂。比特幣社群通常避免硬分叉。
| 特性 | 軟分叉 | 硬分叉 |
|---|---|---|
| 向後相容 | 是 | 否 |
| 升級強制性 | 可選 | 必須 |
| 分裂風險 | 低 | 高 |
| 範例 | SegWit, Taproot | BCH 分裂 |
共識規則類型
Bitcoin Core 實現了多層共識規則:
區塊級規則
- • 區塊大小 ≤ 4MB (weight)
- • 時間戳在合理範圍內
- • 難度值正確
- • Merkle 根正確
- • Coinbase 獎勵正確
交易級規則
- • 輸入 UTXO 存在且未花費
- • 簽名有效
- • 輸出 ≤ 輸入
- • 不是雙重支付
- • 腳本執行成功
相關 BIP
延伸閱讀: 《精通比特幣》 第 10 章深入講解了挖礦和共識機制。