跳至主要內容
Standards Track Final

BIP-173: Bech32 地址格式

定義 SegWit 地址的 Bech32 編碼格式,以 bc1 開頭。

Pieter Wuille, Greg Maxwell 2017年3月20日
BIP 編號

173

類型

Standards Track

狀態

Final

創建日期

2017-03-20

摘要

BIP-173 定義了 Bech32 編碼格式,用於原生隔離見證(SegWit)地址。 這種新的地址格式以 bc1 開頭, 提供比傳統 Base58Check 地址更好的錯誤檢測能力和更高的使用效率。

動機

傳統的 Base58Check 地址格式存在幾個問題:

  • 混合大小寫:容易混淆類似字符(如 O/0, l/1)
  • 雙擊選擇問題:大小寫混合導致複製不便
  • 校驗和弱:只能檢測錯誤,無法定位錯誤位置
  • 二維碼效率低:混合大小寫需要使用低效的二進制模式

Bech32 解決了這些問題:

  • 全小寫:避免大小寫混淆,便於閱讀和輸入
  • 強校驗和:能檢測並定位最多 4 個錯誤字符
  • 二維碼友好:全大寫版本可使用高效的字母數字模式
  • 清晰的字符集:排除了所有容易混淆的字符

Bech32 字符集

Bech32 使用 32 個字符,特意排除了容易混淆的字符:

q p z r y 9 x 8 g f 2 t v d w 0 s 3 j n 5 4 k h c e 6 m u a 7 l

排除的字符:1bio(與數字 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-141:隔離見證定義
  • BIP-84:原生 SegWit 派生路徑
  • BIP-341:Taproot
  • BIP-350:Bech32m(Taproot 地址編碼)
已複製連結
已複製到剪貼簿