BIP-173: Bech32 地址格式
定義 SegWit 地址的 Bech32 編碼格式,以 bc1 開頭。
173
Standards Track
Final
2017-03-20
摘要
BIP-173 定義了 Bech32 編碼格式,用於原生隔離見證(SegWit)地址。 這種新的地址格式以 bc1 開頭, 提供比傳統 Base58Check 地址更好的錯誤檢測能力和更高的使用效率。
動機
傳統的 Base58Check 地址格式存在幾個問題:
- ✗ 混合大小寫:容易混淆類似字符(如 O/0, l/1)
- ✗ 雙擊選擇問題:大小寫混合導致複製不便
- ✗ 校驗和弱:只能檢測錯誤,無法定位錯誤位置
- ✗ 二維碼效率低:混合大小寫需要使用低效的二進制模式
Bech32 解決了這些問題:
- ✓ 全小寫:避免大小寫混淆,便於閱讀和輸入
- ✓ 強校驗和:能檢測並定位最多 4 個錯誤字符
- ✓ 二維碼友好:全大寫版本可使用高效的字母數字模式
- ✓ 清晰的字符集:排除了所有容易混淆的字符
Bech32 字符集
Bech32 使用 32 個字符,特意排除了容易混淆的字符:
排除的字符:1、
b、
i、
o(與數字 1、8、1、0
容易混淆)
地址結構
Bech32 地址由三部分組成:
bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
│ │ │
│ │ └─ 校驗和(6 字符)
│ └─ 數據(見證版本 + 見證程序)
└─ 人類可讀部分(HRP)
人類可讀部分 (HRP)
標識網路類型:bc 用於主網,
tb 用於測試網。 HRP 與數據部分之間用
1 分隔。
見證版本
數據的第一個字符表示見證版本。q = 0(SegWit v0),
p = 1(SegWit v1/Taproot)。
見證程序
對於 v0 地址,見證程序是公鑰哈希(20 字節,P2WPKH)或腳本哈希(32 字節,P2WSH)。 對於 v1 地址,見證程序是 32 字節的 Taproot 公鑰。
校驗和
6 個字符的 BCH 校驗和,使用特殊的多項式設計。 能保證檢測最多 4 個字符的錯誤,並能定位錯誤位置。
地址類型比較
| 類型 | 前綴 | 長度 | 範例 |
|---|---|---|---|
| P2WPKH | bc1q | 42 字符 | bc1qar0srrr7xfkvy5... |
| P2WSH | bc1q | 62 字符 | bc1qrp33g0q5c5txsp... |
| P2TR (Taproot) | bc1p | 62 字符 | bc1p0xlxvlhemja6c4... |
編碼過程
將見證程序編碼為 Bech32 地址的步驟:
1. 確定 HRP(主網: "bc", 測試網: "tb")
2. 創建數據數組:
- 見證版本(0-16)
- 見證程序(轉換為 5-bit 組)
3. 計算校驗和:
checksum = bech32_create_checksum(hrp, data)
4. 組合地址:
address = hrp + "1" + encode(data) + encode(checksum)
JavaScript 範例
// 使用 bech32 庫
import { bech32 } from 'bech32';
// 編碼 P2WPKH 地址
function encodeP2WPKH(publicKeyHash) {
const words = bech32.toWords(publicKeyHash);
words.unshift(0); // 見證版本 0
return bech32.encode('bc', words);
}
// 解碼 Bech32 地址
function decodeBech32(address) {
const { prefix, words } = bech32.decode(address);
const version = words[0];
const program = bech32.fromWords(words.slice(1));
return { prefix, version, program };
}
錯誤檢測能力
Bech32 的 BCH 校驗和具有以下保證:
| 錯誤類型 | 檢測能力 |
|---|---|
| 單字符錯誤 | 100% 檢測 |
| 兩字符錯誤 | 100% 檢測 |
| 三字符錯誤 | 100% 檢測 |
| 四字符錯誤 | 100% 檢測 + 定位 |
| 五字符及以上 | 99.9999% 檢測 |
Bech32m 修正
BIP-350 引入了 Bech32m,修正了原始 Bech32 在某些情況下的弱點。 Taproot 地址(bc1p...)使用 Bech32m 編碼,而 SegWit v0 地址(bc1q...) 繼續使用原始 Bech32。錢包實現必須正確區分這兩種編碼。
二維碼優化
Bech32 地址在二維碼中特別高效:
| 地址類型 | 二維碼模式 | 每字符位數 |
|---|---|---|
| Base58 (混合大小寫) | 二進制 | 8 位 |
| Bech32 (全大寫) | 字母數字 | 5.5 位 |
這意味著 Bech32 地址的二維碼可以比 Base58 地址小約 30%,更容易掃描。
實現注意事項
- 1. 大小寫處理
地址應以全小寫或全大寫形式呈現,混合大小寫是無效的。
- 2. 長度驗證
見證版本 0 只接受 20 或 32 字節的程序,其他長度無效。
- 3. 版本識別
確保正確識別見證版本,以使用正確的校驗和算法(Bech32 vs Bech32m)。
- 4. 向前兼容
錢包應該能夠發送到未知見證版本的地址,以支持未來的升級。
相關 BIP
相關 BIP
延伸閱讀: 查看 GitHub 上的完整 BIP-173 文件