Informational Final
BIP-9: Version Bits
使用區塊版本號位元進行軟分叉部署的標準機制。
Pieter Wuille, Peter Todd, Greg Maxwell, Rusty Russell 2015年10月4日
BIP 編號
9
類型
Informational
狀態
Final
創建日期
2015-10-04
摘要
BIP-9 定義了一種使用區塊版本號的位元(bits)來協調軟分叉部署的機制。 它允許礦工通過設置特定位元來表示對新規則的支持,當達到閾值時自動啟用新規則。
動機
舊方法的問題
在 BIP-9 之前,軟分叉通過遞增區塊版本號來部署(如 v2、v3、v4 區塊)。這種方法有幾個問題:
- • 順序限制:多個軟分叉必須按順序部署,不能並行
- • 版本號耗盡:版本號是有限資源
- • 協調困難:難以同時追蹤多個提案的進度
BIP-9 的解決方案
BIP-9 使用版本號的單個位元而非整個版本號,允許最多 29 個軟分叉同時部署。
技術規範
版本號結構
區塊版本號(32 bits): ┌────────────────────────────────────────────────────────┐ │ 31 30 29 │ 28 27 26 25 24 23 22 21 20 ... 3 2 1 0 │ │──────────│─────────────────────────────────────────────│ │ 0 0 1 │ bit28 bit27 bit26 ... bit3 bit2 bit1 bit0 │ │──────────│─────────────────────────────────────────────│ │ 前綴 │ 可用於軟分叉信號的 29 個位元 │ └────────────────────────────────────────────────────────┘ 版本號必須以 001 開頭(前 3 bits),其餘 29 bits 用於信號。 這意味著 BIP-9 區塊版本號範圍:0x20000000 - 0x3FFFFFFF
部署參數
每個軟分叉部署需要定義以下參數:
| 參數 | 說明 |
|---|---|
| name | 部署的名稱(如 "csv", "segwit") |
| bit | 使用的位元位置(0-28) |
| starttime | 開始時間(MTP,中位時間) |
| timeout | 超時時間(MTP) |
| threshold | 啟用閾值(通常 95%,即 1916/2016 區塊) |
狀態機
每個軟分叉在每個難度調整週期(2016 區塊)會處於以下狀態之一:
DEFINED ─────────────────→ FAILED
│ ↑
│ starttime 到達 │ timeout 到達
↓ │
STARTED ──────────────────────┤
│ │
│ 達到 threshold │
↓ │
LOCKED_IN ────────────────────┘
│
│ 下一個週期
↓
ACTIVE(永久) DEFINED — 初始狀態,尚未開始信號
STARTED — starttime 已過,礦工可以開始信號
LOCKED_IN — 達到閾值,等待下一週期啟用
ACTIVE — 新規則已啟用並強制執行
FAILED — 超時未達閾值,部署失敗
使用案例
以下軟分叉使用 BIP-9 部署:
| 名稱 | 位元 | BIP | 啟用區塊 |
|---|---|---|---|
| csv | 0 | BIP-68, 112, 113 | 419,328 |
| segwit | 1 | BIP-141, 143, 147 | 481,824 |
限制與改進
BIP-9 的局限性
- • 礦工否決權:礦工可以無限期阻止啟用
- • 超時後失敗:超時後唯一選項是失敗
- • 信號 ≠ 支持:礦工可能設置信號但實際不支持
這些問題促使了 BIP-8 的提出,BIP-8 加入了「強制啟用」選項, 讓社群可以選擇在超時後強制啟用而非失敗。
總結
BIP-9 提供了一個優雅的機制來協調軟分叉部署,允許多個升級並行進行, 並讓礦工通過簡單的區塊頭信號來表達支持。雖然有其局限性, 但它成功部署了多個重要的比特幣升級。
延伸閱讀: 查看 GitHub 上的完整 BIP-9 文件
已複製連結