使用方法
- 把 Base58 字串貼上到輸入框中,空格和換行會被自動忽略。
- 在輸出中檢視十六進位形式的解碼位元組。
- 複製十六進位結果,或點選「交換」把十六進位轉回 Base58。
Base58 如何轉換成十六進位
Base58 把整個字串看作一個用比特幣字母表寫成的大數。這套字母表共 58 個字元,去掉了 0、O、I 和 l。轉換成十六進位,就是把同一個數改用 16 進位寫出,每個位元組對應兩位十六進位數字,不會多出或丟失任何內容。
資料開頭的零位元組在數值上等於零,所以 Base58 把每個零位元組記作一個前導 1,也就是字母表的第一個字元。解碼時,每個前導 1 都會還原為一個 00 位元組。例如 115Q 解碼為 0000ff;Solana 的 System Program 地址由 32 個 1 組成,解碼後正好是 32 個零位元組。轉換在瀏覽器本地完成。
比特幣、Solana 和 IPFS 範例
下方十六進位中的空格是為了區分各部分而新增的:
比特幣地址(P2PKH,創世區塊)
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
00 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 c29b7d93
版本 | hash160(20 位元組)| 校驗和(4 位元組)
Solana 公鑰(SPL Token 程式)
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9
32 位元組,沒有版本位元組,也沒有校驗和
IPFS CIDv0
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG
12 20 9d6c2be50f706953479ab9df2ce3edca90b68053c00b3004b7f0accbe1e8eedf
sha2-256 | 長度 32 | 摘要
傳統比特幣地址以 1 開頭,是因為版本位元組為 00;P2SH 地址以 3 開頭,解碼後的版本位元組是 05。
Base58Check 校驗和會保留在位元組中
比特幣地址和 WIF 私鑰使用 Base58Check:編碼前,會在資料末尾追加 4 個校驗位元組,取自對資料做兩次 SHA-256 的結果。本頁使用普通 Base58,校驗和會像其他資料一樣被解碼出來,顯示為最後 8 位十六進位數字。因此,傳統地址的 hash160 就是開頭 00 與校驗和之間的 40 位十六進位數字。
如果要確認地址完整無誤,並得到去掉校驗和的資料,請在 Base58Check 頁面解碼。Solana 金鑰和 IPFS 雜湊不帶校驗和,用普通 Base58 解碼即可。
在程式碼中把 Base58 轉成十六進位
# Python (pip install base58)
import base58
base58.b58decode('115Q').hex() # '0000ff'
// JavaScript (npm install bs58)
import bs58 from 'bs58';
Buffer.from(bs58.decode('115Q')).toString('hex'); // '0000ff'
常見問題
為什麼比特幣地址解碼後是 25 個位元組,而不是 20 個?
傳統地址包含 1 位元組版本號、20 位元組的公鑰 hash160 和 4 位元組校驗和。普通 Base58 解碼會把三部分全部輸出,所以得到 50 位十六進位數字。去掉第一個位元組和最後四個位元組,剩下的就是 hash160。
為什麼開頭的每個 1 都變成了 00?
在 Base58 中,字元 1 表示數值零。如果把資料當作普通數字處理,開頭的零位元組就會消失,所以每個零位元組都寫成一個 1,解碼時再還原為 00 位元組。
為什麼提示字元無效?
Solana 公鑰有多長?
正好 32 個位元組,也就是 64 位十六進位數字。寫成 Base58 通常是 43 或 44 個字元;以零位元組開頭的金鑰可能更短,System Program 地址就是一個例子。