以太坊地址为何能靠大小写查错?EIP-55 校验和的算法与盲区 图 1
以太坊地址为何能靠大小写查错?EIP-55 校验和的算法与盲区 · 图 1

以太坊地址是四十个十六进制字符,数字和字母混在一起,抄错一位就可能把币转到别人的地址上。比特币地址自带校验码,以太坊地址早年却没有——直到 EIP-55 提出了一个很取巧的办法:不改地址长度、不加任何后缀,只靠字母的大小写就把校验信息藏了进去。这篇讲清它怎么算出来的、能拦什么错误,以及拦不住什么。

地址为什么留了大小写这个空子

以太坊地址是公钥经 Keccak-256 哈希后取最后二十字节,写成十六进制就是四十个字符。协议解析十六进制时不区分字母大小写,也就是说 0xfb69... 写成全小写和全大写指向同一个账户。正是这个“大小写都合法”的自由度,给校验位留了空间:把字母按某种规则故意大写或小写,等于在地址表面之下多传了一条暗信息,而且老软件完全不受影响。

十六进制里十个数字六个字母,四十个字符平均有十五个字母,所以平均能携带约十五比特的校验信息。数字没法用大小写做文章,这是这套方案天然的分布前提。

算法本身:对地址的哈希决定每个字母的大小写

EIP-55 的规则很短。先把地址去掉 0x 前缀转成全小写,把这串小写字符当作 ASCII 文本算一次 Keccak-256,得到六十四位十六进制哈希。然后逐位扫描原地址:遇到数字照抄;遇到字母时,看哈希串同一位置的那个十六进制数字,如果它大于等于 8,就把这个字母大写,否则小写。EIP-55 文本明确状态为 Final,两位作者分别是 Vitalik Buterin 和 Alex Van de Sande。

十六进制地址在哈希波束下逐位定大小写的示意

它能拦住什么

钱包在粘贴地址后按同样算法重算一遍:大小写模式对不上,说明地址有笔误,弹警告让用户确认。EIP-55 给出的量化结论是,随机输错的地址碰巧通过校验的概率约为 0.0247%,也就是万分之二点五左右——因为全小写或全大写永远合法,这是最坏情形下的均值,实际打字错误多半会打中某个字母位而触发警报。对复制漏字符、改错一两位这类日常失误,这层检查非常有效。

它拦不住什么

校验位只对“无意笔误”有效。攻击者若用软件生成一个全新的完整地址,它可以顺带算出完全合法的 EIP-55 大小写;把剪贴板里的地址整体替换成攻击者地址,校验一样通过。所以转账时仍要肉眼核对地址的首尾若干字符,大额转账先转一笔小额确认,这些习惯不能被校验位替代。另外,很多钱包默认显示全小写地址,此时校验信息等于没有启用;接收方地址来自智能合约或跨链场景时,还要先确认选对了网络。

拿一个例子走一遍

EIP-55 附带了四个测试向量,其中一个地址原文是 0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359。对全小写的十六进制串做 Keccak-256,得到 5cfac663f45837b409c4d3dc1cef5f4759734f4989dd53a31b1265734c0b28f4 这六十四个十六进制字符(笔者用独立实现复算验证过);把地址串与哈希串逐位对齐,地址里凡是字母的位置,只要对应哈希位落在 8 到 f 之间就转大写,结果写成 0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359。注意两个容易踩的实现坑:哈希的输入是小写地址字符串的 ASCII 字节,不是地址的原始二十字节;判断用的是哈希串的第 i 个字符本身,而不是把哈希当成比特流去数第 4i 位。两条都写对,钱包和区块浏览器显示的地址大小写才会一致。

小结

EIP-55 是“向后兼容加校验”的经典样本:地址一个字节没变,旧系统照常解析,新系统多了一道防误检。理解它之后再看转账确认页,你会知道那串忽大忽小的字母不是排版故障,而是对地址原文再哈希后的指纹;它值得信任,但它防的是手滑,不是对手。本文只做协议机制的中性说明,不构成任何投资建议;涉及大额转账请以官方钱包文档与链上核实流程为准。