在钱包里粘贴一个以 1 或 3 开头的比特币地址时,你会注意到它只包含大小写字母和数字,没有容易看错的几个符号字符。这种写法叫 Base58Check,是比特币最早期的编码方案。本文拆解它的设计:为什么不用十六进制,末尾几个字符凭什么能报警。
从 Base58 说起
计算机内部的哈希结果是十六进制串,又长又难抄。Base58 借用了数字显示的思路:把一串字节当作一个大整数,对 58 取余反复除算,把商和余数映射到 58 个选定符号上,得到更短的文本。这 58 个符号来自 Base62(0 到 9、A 到 Z、a 到 z)删去四个字符:数字 0、大写 O、大写 I、小写 l。删它们的原因非常务实——在很多字体里这四个字形几乎无法区分,而地址往往要人手抄或人眼比对。这就是 Base58 名字里 58 的来历,它和比特币的 2100 万上限、58 个币没有任何关系。
Check 的部分:4 字节校验和
纯 Base58 仍然防不了漏抄一位。比特币在编码前先在原始数据后面附加 4 字节校验值:把数据整体做两次 SHA256 哈希,取结果的开头 4 字节拼到数据尾部,然后对“数据加校验”的整体做 Base58 编码。校验值由数据本身决定,所以任何一处抄错、调换相邻字符、多打一个字符,重新计算出的校验和都会与字符串尾部对不上。这就是地址和私钥导入串末尾那几个字符的全部职责:让软件能确定性地说“这串东西你抄错了”。需要明确边界:校验和只保证“发现错误”,不提供任何防伪能力——把地址里的收款人字符改掉,照样能构造出一个校验通过的合法地址,所以核对地址必须逐字符核对完整串,而不是只看长度或开头。
哪些东西用它编码
最常见的是两类地址:以 1 开头的旧式公钥哈希地址和以 3 开头的脚本哈希地址,编码前数据部分会先加一个版本字节(比如主网公钥哈希地址的版本字节是 0x00)。此外,WIF 格式的私钥导入串、测试网的 t 开头地址、比特币 URI 里的部分字段,也走同一套流程。版本字节还兼任网络标识:主网和测试网的同一类数据版本字节不同,因此正确实现的钱包能直接认出“测试网地址误填进主网”这类错误。
为什么新地址不用它了
2017 年隔离见证启用后,比特币新推荐地址使用 Bech32 编码:以 bc1 开头、全小写、自带纠错能力,且纠错算法比“重算哈希比对”更适合人眼局部修正。已有文章对比过地址格式辨别,本文只补编码层的视角:Base58Check 属于“防手误”的一代设计,Bech32 是它的换代方案,但旧地址在链上依然有效——编码只是信封,里面的脚本才是内容。
为什么十六进制被淘汰
同样 25 字节的数据,十六进制要写 50 个字符,Base58 只需要 34 个左右——字母表从 16 个符号扩到 58 个,每字符承载的信息接近翻三倍。字符串越短,抄错、漏抄的绝对概率越低,贴在便签和二维码边缘的空间也越省。所以比特币早期选择它,一半是密度账,一半是字形账:既要比十六进制短,又要把最容易看混的四个字符请出去。
快速问答
问:地址里出现字母 o 合法吗?答:不合法,Base58 字母表根本没有小写 o,出现即说明粘贴内容不是比特币地址。问:校验和能发现多少个字符抄错?答:它按重算哈希比对,几乎能发现所有单字符错与常见换位,但不是数学上完备的纠错码,发现错误是概率极高的事件而非绝对保证。问:这种编码浪费多少空间?答:每个字节约承载 5.86 比特信息,比 Base64 略低,这是为可读性付出的代价。
风险提示:本文为编码与地址机制科普,不构成投资建议。转账前请通过多渠道逐字符核对完整地址,校验通过不代表地址属于你要付款的人。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。