EIP-55 地址校验和:大小写为什么不能随便改

以太坊地址里的大小写并不总是随意排布,它们可以承载 EIP-55 校验信息。本文讲清地址本体与校验和的区别,解释为什么改成全小写不能修复错误,以及校验通过为何仍可能转错人或转错链。

EIP-55 地址校验和:大小写为什么不能随便改

你复制了一个以太坊地址,钱包却提示“校验和错误”。有人说,把字母全部改成小写就好了。修改之后,报错果然消失了。可是,地址真的被修复了吗?

不一定。软件可能只是把全小写文本当作没有附带大小写校验信息的输入接受了。原本能够提醒你的检查线索被去掉,但如果地址中某个数字或字母已经抄错,那个错误并不会因此消失。

地址校验和擅长发现一部分输入错误,不负责证明收款方是谁。消除报错、通过校验和确认收款人正确,是三个不同的动作。

一、先分清地址本体和它的显示形式

这里讨论的是以太坊常见的二十字节地址及其十六进制表示,不是所有区块链都适用的一套通用规则。通常看到的形式是 0x 加四十个十六进制字符,字符范围包括数字和字母 a 到 f。

在十六进制数值层面,字母大小写表达的是同一个值。因此,只改变字母大小写,不会改变这二十字节的地址本体。但是,显示文本可以额外利用大小写,携带用于检查输入的线索。

这就是通常所说的 EIP-55 地址校验和,规范页面也称 ERC-55。它没有把地址改成更长的一串数字,而是根据地址内容计算哪些字母应当大写,哪些保持小写。

下面是该规范公开的测试用例,仅供观察格式,不是收款地址,请勿向它转账:

0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed

把这串字母全部转换成小写,仍然可以解析出相同的二十字节地址。但原先的大小写排列不再原样保留,软件对两种输入采用的校验策略也可能不同。这正是“数值相同”与“输入保护相同”不能混为一谈的原因。

二、大小写是怎样算出来的

从概念上看,规则可以分成几步:先取得不含前缀的小写十六进制地址文本,对该文本使用规范指定的 Keccak-256 哈希,再利用哈希结果对应位置的十六进制值,决定地址中各字母的大小写。数字本身没有大小写,因此保持不变。

更具体地说,对地址里的字母,如果对应的哈希十六进制值达到八,就使用大写,否则保留小写。这个过程是确定性的:相同地址按照同一规则计算,应得到相同的规范化结果。

普通用户不需要手算,开发者也应优先使用经过测试的地址工具。只检查字符串以 0x 开头、长度是否正确,或者是否只包含十六进制字符,都还没有完成这一步校验。

需要补充一个细节:按规则计算出来的地址,偶尔也可能恰好全部大写或全部小写。规范本身就提供了这类测试用例。所以,“看起来大小写混合”不是有效性的证明,“看起来全小写”也不能单凭外观就判定为错误。

检查层次能发现什么不能说明什么
长度与字符范围缺字符、非法字符等格式问题这个地址就是预期收款方
大小写校验和一部分抄写或输入不一致地址所有者可信
收款方与网络核对是否符合本次转账意图未来所有操作都没有风险
双手在键盘上输入内容,配文地址本体与校验信息
地址字符表达目的地,大小写还可以提供额外的输入检查线索。

三、为什么转成全小写不能算修复

以 ethers 的地址处理文档为例,它说明:混合大小写输入会触发相应的校验,校验不符合预期时会报错;非校验形式的地址则可以由工具转换为规范化形式。

想象一个原本正确的地址,在复制过程中有一位数字变了,但大小写排列仍来自原地址。校验有机会发现这种不一致。若程序先把全部字母转成小写,再为改变后的地址重新生成校验形式,得到的只是“另一个地址自己的正确校验和”。

这就像在抄错的门牌号后面重新附上一份格式检查结果。新结果内部可以自洽,却不会自动知道你原来想找哪扇门。算法没有收款人的身份信息,当然也无从替你还原意图。

因此,面对校验和错误,应该回到可信来源重新取得完整地址,而不是试着修改字符直到钱包接受。也不要把“去掉所有大小写后就能发出”当作转账成功的充分条件。

对开发者,更合理的输入流程是先保留并检查用户原始文本,再根据明确规则规范化展示。如果在验证之前一律转小写,就可能主动丢掉用户原本提供的检查信息。数据库如何存储与页面如何展示,也应与输入验证分开设计。

四、校验和通过,为什么仍可能转错人

任何一个地址,都可以按照公开规则计算自己的校验和。这并不需要收款方出示身份证明,也不要求它属于某个知名项目。因此,攻击者控制的地址同样可以具有完全有效的校验形式。

一种常见风险是“地址投毒”:交易记录中出现一个与熟悉地址首尾相似、但中间不同的地址,用户下次从历史记录里复制时误选了它。Etherscan 的地址投毒说明介绍了这类利用相似外观的误导方式。

此时,问题不是校验算法算错,而是你选中了一个不同但格式有效的目的地。只检查前后几位、看到钱包没有红色警告就确认,仍可能把钱发给错误对象。

二维码、联系人名称和浏览器标签也不能被理解成自动完成全部身份核对。它们可以让输入更方便,但二维码本身可能来自错误页面,联系人也可能是之前误存的。最重要的是取得地址的渠道是否可信,以及本次确认的完整地址是否符合预期。

这也解释了为什么校验和不是密码学签名。它没有证明某个人控制这个地址,更没有证明某个网站获得了该地址所有者的授权。有关地址与密钥的关系,可以接着看私钥、公钥与钱包地址。

五、EIP-55 不会替你确认网络

标准 EIP-55 校验计算不包含网络标识。相同的地址本体,在采用这种表示方式的不同网络中可以呈现相同的校验形式,但各网络上的余额、合约代码和服务支持情况并不因此相同。

例如,收款平台只支持某条链上的某种资产,而你在另一条网络提交了转账。地址格式再正确,也不能替平台增加对那条网络的支持。是不是同一串字符,与平台能不能按你的预期入账,是不同的问题。

EIP-1191提出把 Chain ID 纳入一种链相关校验形式,但不能由此假定所有钱包、网络或地址输入框都使用了它。识别网络时仍要查看实际产品和协议的支持方式。

关于网络标识,可以阅读什么是 Chain ID。收款前应分别确认网络、资产和目的地址,不能让一个地址校验结果代替另外两个检查。

手持手机查看屏幕,配文校验通过后仍要核对收款方
地址是否符合格式,与它是不是你要付款的对象,需要分别确认。

六、遇到报错或地址变化,怎样处理更稳妥

先暂停提交,保留错误提示与原始输入,再回到可信的收款页面或通过可靠渠道向对方确认。检查有没有漏掉字符、夹带空格、复制到缩略显示,或者使用了不同网络的地址说明。

重新取得地址后,核对完整字符串和网络信息。如果设备或网页显示的地址在复制粘贴后出现了无法解释的变化,应先排查来源与设备环境,不要反复试发来判断哪个地址“能成功”。转到错误地址也可能在链上显示成功。

使用硬件钱包时,核对设备上实际确认的目的地址,而不只看电脑页面上的文字。首次使用新收款方式时,可在确认网络及平台最低入账要求后谨慎进行小额验证,但必须核实预期收款方确实到账;仅有成功回执还不够。

小额测试也不是万能保险。若后续复制了另一个地址、网络发生切换,或者收款方本身不可信,之前的测试并不能覆盖这些变化。每次签名前,仍需要让最终交易内容与自己的转账意图一致。

小结:记住五条边界

  • 大小写通常不改变地址字节,但可以承载校验信息。
  • 长度正确和校验通过,都不等于收款方身份已经确认。
  • 遇到校验报错,回到可信来源复核,不靠强制小写绕过。
  • 不要只看地址首尾,也不要从陌生历史记录中随手复制。
  • 网络、资产、完整目的地址与实际到账,要分别检查。

校验和是一道有用的输入保护。保留它的价值,同时看清它不负责的部分,才能让“地址看起来没问题”变成一次更完整的核对。


本文为「链上指南」原创技术科普,不构成任何投资建议。文中规范地址仅为公开测试用例,请勿向其转账;具体输入校验与网络支持以对应钱包和服务为准。

配图来自 Unsplash:Emile Perron、Damian Zaleski、Quilia;照片用于辅助阅读,不是模型测试或合约验证截图。