Base58Check 編碼
Base58Check,是比特幣使用的一種資料編碼格式,由 Base58 編碼與 Checksum 校驗碼組成,主要用於比特幣地址、私鑰匯出格式 WIF,Wallet Import Format,以及其他需要避免輸入錯誤的重要資料。

Base58Check,是比特幣使用的一種資料編碼格式,由 Base58 編碼與 Checksum 校驗碼組成,主要用於比特幣地址、私鑰匯出格式 WIF,Wallet Import Format,以及其他需要避免輸入錯誤的重要資料。
Base58Check 並不是加密技術,而是一種編碼格式。任何人取得 Base58Check 字串後,都可以解碼還原原始資料。因此 Base58Check 的目的在於資料表示與錯誤檢測,而非保護資料內容。
相比於常見的 Base64 編碼,Base58Check 移除了容易混淆的字元,使人類閱讀、抄寫與輸入時更不容易發生錯誤,同時透過 Checksum 機制驗證資料是否完整。
Base58Check 基本概念
-
字元集 Base58-like Encoding Base58 是一種使用 58 個字元表示資料的編碼方式,其字元集如下
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
為了降低人為辨識錯誤,Base58 移除了以下容易混淆的字元:
- 數字 0(零)
- 大寫 O(字母 O)
- 大寫 I(字母 I)
- 小寫 l(字母 l)
-
Checksum 校驗碼 Base58Check 在編碼資料時,會額外加入校驗碼。 校驗碼是將原始資料進行兩次 SHA-256 雜湊運算後,取前 4 個位元組(4 Bytes)作為驗證碼附加於資料尾端。
-
Version Prefix 版本前綴 Base58Check 通常會在原始資料前加入版本位元組,用來表示資料類型。透過版本前綴,可以讓不同類型的資料產生不同格式的編碼結果。
- 0x00 代表比特幣主網 P2PKH 地址,編碼後通常以
1開頭 - 0x05 代表比特幣主網 P2SH 地址,編碼後通常以
3開頭 - 0x80 代表比特幣主網 WIF 私鑰,編碼後通常以
5,K,L開頭
- 0x00 代表比特幣主網 P2PKH 地址,編碼後通常以
-
位元組陣列 Base58Check 處理的是位元組陣列 Byte Array,而非文字字串。文件中常見的十六進位 Hex,或文字形式資料,通常只是方便閱讀的表示方式。實際進行 SHA-256 計算、Checksum 產生與 Base58 編碼時,皆以底層二進位位元組資料進行運算。
Base58Check 運作方式
-
加入版本前綴 首先在原始資料前方加入 Version Prefix。
-
計算 Checksum 將資料進行兩次 SHA-256 雜湊運算。
SHA-256(SHA-256(data))
取結果前 4 Bytes 作為 Checksum。
-
附加 Checksum 將 Checksum 加入原始資料尾端。
-
Base58 字元映射 將完整資料轉換為 Base58 字串。
-
字串輸出 產生最終的 Base58Check 編碼字串。
Base58Check 應用
-
比特幣 Legacy 地址
- P2PKH
- P2SH
- P2SH-P2WPKH
- P2SH-P2WSH
-
WIF 私鑰 Wallet Import Format 使用 Base58Check 將私鑰轉換為方便儲存與輸入的字串格式。
-
資料完整性驗證 透過 Checksum 機制,可以快速偵測使用者輸入錯誤或資料損毀。
-
避免人工輸入錯誤 移除容易混淆的字元後,可降低人工抄寫與輸入失誤的機率。
Base58Check 使用示例
-
假設某筆資訊要件
- Version Byte(版本位元組):
00(代表比特幣 P2PKH 地址) - data(Hex):
- [ 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 ]
- Version Byte(版本位元組):
-
拼接資訊
- Version Byte + data
- [ 000102030405060708090A0B0C0D0E0F1011121314 ]
-
計算取得前 4 位元組校驗碼 Checksum
- SHA256(SHA256(version + data))
- [ 4d547f63 ]
-
組合映射為 Base58 編碼
- version + data + checksum
- 除以 58 取餘數(進位制轉換),直到商為 0。 每次得到的餘數(0~57),對照 Base58 的專用字元表
- [ 6YvM7VREjL8YvM7VREjL8YvN9R9z ]
-
前導零修正
- 因為最前面有 Version Byte**
00,在 Base58 演算法中,前端每有一個00位元組,就要在最終字串最前面直接補一個字元1
- 因為最前面有 Version Byte**
-
最終 Base58Check 字串
- [ 16YvM7VREjL8YvM7VREjL8YvN9R9z ]
Base58Checksum 相關 BIP
- BIP 13:Address Format for Pay-to-Script-Hash (P2SH)
- BIP 32:Hierarchical Deterministic Wallets(xpub / xprv)
- BIP 38:Passphrase-Protected Private Key

更多文章