使用方法
- 选择“编码”生成 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)。