使用方法
- 选择“编码”把文本或字节转换为 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 页面。