Bech32 編碼
Bech32,是比特幣使用的一種地址與資料編碼格式,由可讀性字元集 Base32 字元集與 Checksum 校驗機制組成,主要用於 SegWit 隔離見證 地址格式,如 bc1 開頭地址,以及後續 Bech32m 擴展格式。

Bech32,是比特幣使用的一種地址與資料編碼格式,由可讀性字元集 Base32 字元集與 Checksum 校驗機制組成,主要用於 SegWit 隔離見證 地址格式,如 bc1 開頭地址,以及後續 Bech32m 擴展格式。
Bech32 並不是加密技術,而是一種編碼格式。任何人取得 Bech32 字串後,都可以解碼還原原始資料。因此 Bech32 的目的在於資料表示、人類可讀性優化與錯誤檢測,而非保護資料內容。
Bech32 基本概念
-
字元集 Base32-like Encoding Bech32 使用 32 個字元組成的字元集: qpzry9x8gf2tvdw0s3jn54khce6mua7l
為降低人為輸入錯誤,Bech32 排除以下容易混淆字元:
- 1(避免與分隔符混淆)
- b
- i
- o 此外 Bech32 不區分大小寫輸入,但標準輸出通常為全小寫,用來避免 OCR、手動輸入或複製時的錯誤。
-
人類可讀部分 HRP (Human Readable Part) Bech32 地址由三部分構成:
- HRP
- 區分不同網路(mainnet / testnet)
- 提供語意資訊(例如 lightning / bitcoin)
- 分隔符
- 使用固定字元1,分隔 HRP 與資料區
- 資料區
- 以 5-bit 分組 Base32 group 表示,而非 byte-based encoding。
- Witness Version 見證版本
- Witness Program 公鑰雜湊或 script hash
- HRP
-
Checksum 校驗碼
- Bech32 使用專門設計的 Polymod checksum,模 2¹⁵ 多項式系統
- 檢測輸入錯誤
- 防止字元替換或位移錯誤
- 提高整體可偵錯性
- 流程概念
- 將 HRP 進行擴展
- 與資料部分組合
- 套用 polymod 演算法
- 生成固定長度 6 個字元 checksum
- 驗證時要求 Polymod 結果必須等於 1
- Bech32 使用專門設計的 Polymod checksum,模 2¹⁵ 多項式系統
Bech32 運作方式
-
HRP 人類可讀部分 設定地址的前綴字串,Human-Readable Part,例如比特幣主網為 bc,用來識別網路類型。
-
資料 5-bit 轉換 將輸入的原始 Byte 資料 8-bit,重新切分為 5-bit 一組,數值範圍 0~31。
-
加入分隔符 在 HRP 之後加上固定分隔符號 1,用來區隔前綴與後續的資料區塊。
-
計算 Checksum 將 HRP 與 5-bit 資料組合後,透過特製的 BCH 編碼算法的多項式除法,計算出 6 個字元,30 bits 的校驗碼。校驗碼的產生目標是讓整個 Bech32 字串經過 Polymod 驗證時,其最終運算結果固定等於 1。
-
附加 Checksum 將 6 個字元的 Checksum 加入整個資料串的尾端。
-
Bech32 字元映射 將所有 5-bit 的數值與 Checksum,對照 Bech32 專屬字元表,移除容易混淆的 b、o、i、1,轉換為最終的全小寫字串。
-
字串輸出 產生最終的 Bech32 編碼字串。
Bech32 應用
-
隔離見證 SegWit 地址格式
- P2WPKH(Pay to Witness Public Key Hash)
- P2WSH(Pay to Witness Script Hash)
-
Lightning Network
- invoice 編碼
- payment request
-
QR Code / 機器讀取
- 提供辨識錯誤容忍度
Bech32 使用示例
- 假設某筆資訊要件
- HRP:bc
- witness version:0
- data(hex) [ 00 11 22 33 44 55 66 77 88 99 ]
- data 轉換為 8-bit 總二進位 bit stream 流資料
- [ 00000000000100010010001000110011010001000101010101100110011101111000100010011001 ]
- bit stream 轉換 為 5-bit groups
- 包含最前面的 Version 0,總共 17 個數字 [ 0, 0, 0, 17, 4, 8, 25, 20, 8, 21, 11, 6, 14, 30, 4, 9, 19 ]
- 計算 Checksum 校驗碼
- Bech32 的校驗碼計算需要把 HRP (bc) 轉化為校驗多項式的輸入,再加上上述的 17 個 5-bit 數值,透過 BCH(1023, 1017) 演算法計算出一個 30-bit 的值。
- 經過 Bech32 Checksum 公式(BCH 模數運算)計算後,得到的 6 個 5-bit 校驗碼數值
- [20, 10, 10, 24, 28, 20]
- 5-bit groups 與 Checksum 校驗碼 映射 Base32 數值
- [ qqqxve98e2gftlu9j833kx8 ]
- 最終 Bech32 字串
- [ bc1qqqxve98e2gftlu9j833kx8 ]
Bech32 / Bech32m 相關 BIP
- BIP 173:Base32 address format for native v0-16 witness outputs (Bech32)
- BIP 350:Bech32m format for v1+ witness addresses (Taproot / future upgrades)

更多文章