跳转到内容

Base58

来自BitcoinWiki
Base58
Base58。

Base58是一组把二进制数据表示为文本的编码,使用58个字母和数字。比特币的字母表是123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz。它省略0OI和小写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可由mn开头,测试网P2SH可由2开头。[6]这些字符是编码版本字节产生的结果,不能由应用程序手工安全地添加或删除。

原生SegWit地址使用Bech32。BIP 173为见证版本0引入Bech32,并指出Base58的局限,包括大小写混合对二维码编码效率的影响。[4]BIP 350为见证版本1至16规定Bech32m,而版本0继续使用Bech32。[7]

Base58区分大小写。改变字母大小写、删除前导1或替换字符都会改变字节或导致校验失败。

参见

参考资料