你每天都在粘贴钱包地址,但几乎没人想过:为什么比特币地址像乱码,以太坊地址却混着大小写?花一小时从零写校验器,你会发现这背后是两套完全不同的工程思维。
我用250行纯浏览器JavaScript实现了三种校验算法——Base58Check(比特币 legacy)、Bech32/Bech32m(比特币隔离见证)、EIP-55(以太坊)。每写一种,都像在读一份设计文档。
Demo:https://sen.ltd/portfolio/address-decoder/
GitHub:https://github.com/sen-ltd/address-decoder
Satoshi的"够用就好":Base58Check
比特币创世地址的结构简单到像填空题:
[版本号 1字节] [载荷 20字节] [校验和 4字节] = 25字节
编码用Base58——比特币专属字母表,刻意剔除了0、O、I、l这6个容易看混的字符。校验和是SHA-256套娃两次,取前4字节。
为什么哈希两次?2009年的防御性编程。当时SHA-256有长度扩展攻击的风险,双哈希是保险。按今天的威胁模型,单轮就够了,但比特币改不了——硬分叉的代价太大。
4字节校验和 = 32位,误码率1/40亿,实际为零。代价是地址长得像噪音:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa。
实现时有个坑:Base58里"1"字符专门用来编码前导0x00字节,和真正的58进制转换是分开的。漏掉这一步,所有以0x00开头的地址(包括主网P2PKH,也就是绝大多数真实地址)都会少一个字节。我第一次测试就栽在这。
隔离见证的"纠错优先":Bech32/Bech32m
2017年比特币引入隔离见证,顺便换了地址格式。Bech32不再用哈希校验,改用BCH码——一种能纠正错误的纠错码,不是只能检测。
地址结构变成:
[人类可读前缀 "bc"] [分隔符 "1"] [数据部分] [校验和 6字符]
6字符校验和,比Base58的4字节更短,但能纠正最多2个字符的错误。这是关键差异:Base58Check只能告诉你"错了",Bech32能告诉你"错在哪"。
字母表也换了:全小写,去掉1、b、i、o,剩下32个字符。专为手写和语音朗读优化——读地址时不用纠结大小写,也不会把1念成i。
Bech32m是2021年的小修正,改了校验和的最终常量,防止某些极短输入的校验漏洞。旧Bech32地址在新实现里依然能验,但新地址必须用Bech32m生成。
写代码时最头疼的是Base32转换和BCH多项式计算。没有标准库,得自己查BIP-141和BIP-350的参考实现。Satoshi的代码6行搞定,Bech32m要60行——复杂度不在一个量级。
以太坊的"事后补丁":EIP-55
2015年以太坊上线时,地址根本没有校验。就是裸十六进制:0xde709f2102306220921060314715629080e2fb77,大小写随意,转错账没人拦你。
2016年的EIP-55是个聪明的 hack:十六进制大小写在字节层面无意义(0xa = 0xA),但可以作为额外信号。把地址做小写哈希,然后让地址的每个字符大小写跟着哈希位走——哈希位为1就大写,为0就小写。
验证时重新算一遍哈希,比对大小写模式。匹配就是合法地址,不匹配就是手滑输错。
这设计有三重好处:不增加长度(还是40字符)、向后兼容(旧地址直接当小写验)、肉眼可辨(大小写混排看起来"更随机")。代价是只能检测错误,不能纠正,而且校验强度不如Base58Check——40个字符里只有部分参与校验,不是全部。
实现最简单:哈希→位运算→大小写比对,15行代码。但设计哲学最微妙——它不是"从一开始就防错",而是"发现没防错之后,用最小代价补上"。
三种哲学,三种取舍
写完之后,三种设计的优先级清晰可辨:
Base58Check:防御性优先。2009年的威胁模型、双哈希保险、视觉防混淆字母表。每一项都是"当时能想到的最坏情况"。
Bech32m:用户体验优先。纠错能力、全小写、语音友好。比特币从"极客玩具"变成支付工具,地址必须能被普通人读写。
EIP-55:兼容性优先。不破坏现有地址、不增加长度、实现极简。以太坊早期快速迭代,不能承受格式大改。
这些差异写在字节里,但根子在团队背景和使用场景。Satoshi独自开发,假设用户懂技术;隔离见证是委员会设计,要照顾交易所和钱包厂商;以太坊2016年还在野蛮生长,EIP-55是个不打扰任何人的补丁。
为什么这值得花时间
大多数开发者直接调库:validate_address(addr),三行代码收工。但当你亲手把SHA-256写两遍、把BCH多项式展开、把EIP-55的位运算拆清楚,你会理解为什么比特币地址那么长、为什么以太坊地址大小写乱飞、为什么有些钱包能纠正你的输错而有些只能报错。
这些不是"实现细节",是产品决策的化石。每个字节都在回答一个问题:当时的设计者认为什么最重要?
下次粘贴地址时,多看一眼。那些看似随机的字符,是十多年工程权衡的沉积岩。
代码开源在GitHub,Demo可以在线试。如果你也在写钱包、做跨链工具、或者单纯好奇——建议自己实现一遍。比读十篇白皮书都管用。
热门跟贴