使用方法
- 選擇「編碼」生成 Base58Check 字串,或選擇「解碼」校驗字串並還原位元組。
- 編碼時把輸入切換為「十六進位」,先輸入版本位元組,再輸入有效載荷,例如 00 加上 20 位元組的 HASH160。
- 保持 Base58Check 選項開啟。編碼時會自動追加校驗和,解碼時會自動校驗。
- 解碼時貼上字串並把輸出設為「十六進位」,得到的是去掉校驗和後的版本位元組和有效載荷。
Base58Check 的工作原理
- 先寫一個表示資料型別的版本位元組,後面接有效載荷,例如 20 位元組的公鑰雜湊。
- 對這些位元組做一次 SHA-256,再對結果做一次 SHA-256,取前 4 個位元組作為校驗和。
- 把校驗和追加到末尾,然後整體用 Base58 編碼。每個前導
0x00位元組都會變成1。
本工具只對你輸入的位元組計算校驗和,不會自動新增版本位元組,所以請把版本位元組放在輸入的開頭。解碼時,工具會對除最後 4 個位元組以外的部分重新計算校驗和:一致則返回版本位元組和有效載荷,不一致則提示校驗和錯誤。隨機輸錯一個字元而恰好通過校驗的機率大約只有四十億分之一。
常見版本位元組
| 版本位元組 | 資料 | 編碼結果開頭 |
|---|---|---|
0x00 | 比特幣 P2PKH 地址(20 位元組 HASH160) | 1 |
0x05 | 比特幣 P2SH 地址(20 位元組指令碼雜湊) | 3 |
0x6F | 比特幣測試網 P2PKH 地址 | m 或 n |
0x80 | WIF 私鑰(32 位元組,壓縮公鑰對應的私鑰再加 0x01) | 5,壓縮格式為 K 或 L |
以 bc1 開頭的 SegWit 和 Taproot 地址使用 Bech32 編碼,而不是 Base58Check,無法在這裡解碼。XRP Ledger 地址使用相同的校驗方式,但字母表不同,請在「字母表」選項中選擇 Ripple。
範例:從 HASH160 到地址
與比特幣創世區塊相關的那個知名地址,由版本位元組 00 和一個 20 位元組的 HASH160 組成。以十六進位輸入並開啟 Base58Check,就能得到這個熟悉的地址:
輸入(十六進位) 00 62e907b15cbf27d5425399ebf6f0fb50ebb88f18
輸出 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
在程式碼中,Python 的 base58 包提供 b58encode_check() 和 b58decode_check(),npm 包 bs58check 提供 encode() 和 decode()。
編碼規格
| 字母表 | 1-9 A-Z a-z,去掉 0 O I l |
|---|---|
| 輸出體積 | 約 137%,另加 4 位元組校驗和 |
| 填充 | 無 |
| 標準 | Bitcoin Base58Check |
| 區分大小寫 | 是 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | gTazoqFvnegwaKM8v1B33sR |
Base64.is | 6XgW4KVJr8DBmZEAeJ |
你好 | DrMzxHL43oWHbW |
常見問題
為什麼解碼時提示校驗和錯誤?
可能是輸錯了字元、選錯了字母表,或者該字串只是不帶校驗和的普通 Base58。Solana 地址、IPFS CID 等普通 Base58 字串請在 Base58 頁面解碼。
工具會自動新增版本位元組嗎?
不會。校驗和是對你輸入的位元組計算的,因此版本位元組必須包含在輸入中。把輸入切換為「十六進位」,先輸入版本位元組,例如比特幣地址用
00。可以解碼 WIF 私鑰嗎?
可以。在「解碼」中貼上私鑰並選擇十六進位輸出,會得到
80、32 位元組私鑰,壓縮格式的私鑰末尾還有一個 01。解碼完全在瀏覽器本地進行,但處理真實私鑰時仍需謹慎。可以解碼 bc1 開頭的地址嗎?
不可以。原生 SegWit 和 Taproot 地址使用 Bech32 或 Bech32m,這是另一種帶獨立校驗和的編碼。在比特幣中,Base58Check 只用於以 1 或 3 開頭的傳統地址(測試網為 m、n 或 2)。