术语表 /地址与密钥
Base58Check
又称 Base58。
- Base58Check 是什么?
- Base58Check 是比特币最初的文本编码方式,它将二进制数据转换为由58个易于抄写的字符组成的字符串,并附加四字节校验和以发现输入错误。
该字母表去掉了人们手工抄写时容易混淆的四个字符:数字零、大写 O、大写 I 和小写 l。四字节校验和取自对载荷进行两次 SHA-256运算的结果,因此输入有误的地址会被钱包拒绝,而不会被发送到无人接收的地方,错误地址蒙混过关的概率约为42亿9,000万分之一。所有以1或3开头的地址都是 Base58Check 编码。
运作方式
每个 Base58Check 字符串由三部分组成。开头的版本字节说明数据的类型,中间的载荷是实际的字节数据,末尾的四个校验字节是对版本字节和载荷合并后连续两次应用 SHA-256所得结果的前四个字节。随后,结果以58进制而不是16进制写出,这样大幅缩短了长度,并去除了容易混淆的字形。
版本字节决定了常见的开头字符。版本0x00 表示 pay-to-public-key-hash 地址,写出后以1开头;版本0x05 表示 pay-to-script-hash 地址,写出后以3开头;版本0x80 表示钱包导入格式(Wallet Import Format)的私钥,开头为5、K 或 L。扩展密钥改用四字节版本0x0488B21E,因此所有 xpub 都以这四个字母开头。
开头的零字节需要特殊处理,否则进制转换会将其丢弃。载荷开头的每个0x00 字节会被写成一个额外的“1”字符,因此一些旧式地址尽管承载的数据量相同,却比相邻的地址更短或更长。
在哪里会遇到它
Base58Check 在比特币的第一个十年里随处可见,而在最新的格式中已不再使用。旧式地址、pay-to-script-hash 地址、WIF 私钥,以及您从钱包导出的 xprv 和 xpub 扩展密钥都使用它。以 bc1 开头的地址则不使用。
两个特点既解释了它为何流行,也解释了它为何被取代。抄写安全是其设计目的:该字母表的设计使地址在被朗读、从屏幕上抄录或刻印在金属板上时,仍能经受人为处理,而校验和则将剩余的错误变成拒绝处理,而不是资金损失。但这种编码区分大小写,迫使二维码使用字节模式,而不是更紧凑的字母数字模式;而且它只能告知您有错误,无法告知错在何处、是什么错误。
Base58Check vs Bech32
Base58Check 能检测错误,而 bech32 还能纠正错误。Bech32 在 BIP-173中定义,并于2017年被用于原生 SegWit 地址,它使用由32个字符组成的字母表,完全不含大写字母,因此整个字符串可采用二维码的字母数字模式,用更小的图像即可扫描。其 BCH 校验和可保证检测出最多四个错误字符,并能指出哪些位置存在可疑,而不是简单地校验失败。
这一后继方案本身也需要修补。原始 bech32 校验和存在长度扩展缺陷,使某些地址可能在末尾增减一个字符而不被发现,因此 BIP-350定义了 bech32m,它只更改了一个常量,以 bc1p 开头的 Taproot 地址即使用该方案。Base58Check 仍然有效,并将持续可用,但新的地址类型不再用它来定义。