使用方法
- 選擇「編碼」把文字或位元組轉換為 Base58,或選擇「解碼」把 Base58 字串還原為資料。
- 選擇字母表。預設的 Bitcoin 字母表同樣用於 IPFS 和 Solana。
- 輸入或貼上內容。如果是雜湊、公鑰等原始位元組,請把輸入方式切換為「十六進位」。
- 只有當字串帶有 4 位元組校驗和時才需要開啟 Base58Check,然後複製或下載結果。
什麼是 Base58?
Base58 是為比特幣設計的二進位轉文字編碼。它的字母表由數字和拉丁字母組成,但去掉了四個容易看錯的字元:0(數字零)、O(大寫 o)、I(大寫 i)和 l(小寫 L)。字母表中也沒有 +、/、=,因此雙擊就能選中整個字串,放進 URL 也無需轉義。
與 Base64 不同,Base58 不按位分組,而是把整個輸入當作一個大整數,用 58 進製表示。因此它沒有填充,改動一個位元組可能會影響很多輸出字元。開頭的零位元組在數值上沒有意義,為了保留它們,每個前導零位元組都會寫成字母表的第一個字元(Bitcoin 字母表中是 1)。編碼結果約為原資料的 1.37 倍。
Base58 的常見用途
- 比特幣。傳統地址和 WIF 私鑰採用 Base58Check,即帶版本位元組和校驗和的 Base58。
- IPFS。CIDv0 內容識別符號是 SHA-256 多重雜湊(multihash)的 Base58 形式,所以這類 CID 長度為 46 個字元,並以
Qm開頭。 - Solana。公鑰、賬戶地址和交易簽名都使用不帶校驗和的普通 Base58。32 位元組的公鑰通常編碼為 43 或 44 個字元。
- Flickr 和 XRP Ledger。Flickr 短連結使用 Flickr 字母表;XRP 地址使用 Ripple 字母表,這也是它們以
r開頭的原因。
如果要在 Base58 和原始位元組之間轉換,可以使用 Base58 轉十六進位 和 十六進位轉 Base58。如果只需要由字母和數字組成的 ID,也可以瞭解 Base62。
Base58 字母表
| 字母表 | 字元(按順序) |
|---|---|
| Bitcoin | 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz |
| Flickr | 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ |
| Ripple | rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz |
三種字母表包含相同的 58 個字元,只是順序不同。用一種字母表編碼的字串,換成另一種字母表解碼會得到不同的位元組,或者直接報錯。
在程式碼中使用 Base58
# Python(pip install base58)
import base58
base58.b58encode(b'hello') # b'Cn8eVZg'
base58.b58decode('Cn8eVZg') # b'hello'
// JavaScript(npm install bs58)
import bs58 from 'bs58';
bs58.encode(new TextEncoder().encode('hello'));
編碼規格
| 字母表 | 1-9 A-Z a-z,去掉 0 O I l |
|---|---|
| 輸出體積 | 約 137%(大數進位轉換) |
| 填充 | 無(前導零位元組編碼為 1) |
| 標準 | Bitcoin Base58 |
| 區分大小寫 | 是 |
編碼範例
| 輸入 (UTF-8) | 輸出 |
|---|---|
Hello, World! | 72k1xXWG59fYdzSNoA |
Base64.is | r1Nm3AS7ZcnN |
你好 | 2xuZUfBKa |
常見問題
為什麼前導零位元組會變成 1?
Base58 把輸入轉換成一個整數,而開頭的零位元組不會改變這個數值。為了保留它們,每個前導零位元組都寫成字母表的第一個字元,在 Bitcoin 字母表中就是
1。所以 32 個零位元組會編碼成 32 個連續的 1。Base58 區分大小寫嗎?
區分。大寫和小寫字母代表不同的數值,改動任意一個字元的大小寫都會改變解碼結果,或者讓字串變得無效。
Base58 和 Base58Check 有什麼區別?
Base58Check 在編碼前追加 4 位元組校驗和(雙重 SHA-256 雜湊的前 4 個位元組),用來發現輸入錯誤。在本頁開啟 Base58Check 選項即可使用,詳細說明見 Base58Check 頁面。