Base58

Base58是一组把二进制数据表示为文本的编码,使用58个字母和数字。比特币的字母表是123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz。它省略0、O、I和小写l以减少视觉混淆,也不使用标点和空格。[1]
Base58是编码,不是加密或密钥派生算法。编码私钥不会计算出公钥;解码一个Base58字符串也不能证明其数据适用于某个程序。
编码
编码时把字节序列视为大整数,反复除以58,并用余数选择字母表中的字符。比特币格式中的前导零字节用前导字符1表示。解码执行相反的转换。
普通Base58没有错误检测。Base58Check通常把版本字节或其他前缀与有效载荷组合,附加双重SHA-256哈希的前四个字节作为校验和,再进行Base58编码。[2]校验和能发现许多意外抄写错误,但它不是数字签名。
变体与取舍
“Base58”并不代表唯一的通用字母表。比特币的base58btc和Flickr的Base58采用不同字符顺序,因此不能仅因两者都有58个符号,就用一种变体解码另一种变体的文本。[3]
58不是2的幂,因此Base58符号不能与固定数量的输入位或字节对齐。通用编码器需要对整个大整数进行进制转换,而不能像Base64那样直接按位分组。这样可产生紧凑、无标点的标识符,但不便处理较长二进制数据;这也是较新的比特币地址格式采用32进制字母表的原因之一。[4]
在比特币中的用途
Base58Check用于传统P2PKH和P2SH比特币地址、私钥的Wallet Import Format(WIF),以及BIP 32扩展公钥和扩展私钥的序列化。[5]软件必须验证解码后数据的长度和预期前缀。
Bitcoin Core的描述符文档列出了可见的主网前缀:P2PKH为1,P2SH为3;测试网P2PKH可由m或n开头,测试网P2SH可由2开头。[6]这些字符是编码版本字节产生的结果,不能由应用程序手工安全地添加或删除。
原生SegWit地址使用Bech32。BIP 173为见证版本0引入Bech32,并指出Base58的局限,包括大小写混合对二维码编码效率的影响。[4]BIP 350为见证版本1至16规定Bech32m,而版本0继续使用Bech32。[7]
Base58区分大小写。改变字母大小写、删除前导1或替换字符都会改变字节或导致校验失败。
参见
参考资料
- ↑ Bitcoin Core,“base58.h”,2026年9月15日查阅。
- ↑ Bitcoin Developer Reference,“Transactions: Address Conversion”,2026年9月15日查阅。
- ↑ Multiformats,“Multibase table”,2026年9月15日查阅。
- ↑ 4.0 4.1 BIP 173: Base32 address format for native v0-16 witness outputs,2026年9月15日查阅。
- ↑ BIP 32: Hierarchical Deterministic Wallets,2026年9月15日查阅。
- ↑ Bitcoin Core,“Output Script Descriptors”,2026年9月15日查阅。
- ↑ BIP 350: Bech32m format for v1+ witness addresses,2026年9月15日查阅。