ENS正向与反向解析为何不一致? 图 1
ENS正向与反向解析为何不一致? · 图 1

钱包把0x地址显示成alice.eth时,往往同时用到了两套相反方向的记录。正向解析回答“alice.eth应转到哪个地址”;反向解析回答“这个地址希望显示什么名称”。二者由不同记录控制,所以不一致并不罕见。

收款时走的是正向解析

应用先在ENS注册表找到名称对应的resolver,再调用resolver读取地址记录。对以太坊主网地址,结果应是20字节地址;对其他链,resolver可能按coin type保存另一种地址格式。转账界面必须显示最终解析出的完整地址,并让用户确认网络。

展示名称时走的是反向解析

地址的反向节点可设置一个候选primary name。任何能控制该地址反向记录的主体都可能声称某个名称,因此安全界面不能到此为止。它应再对候选名称做一次正向解析,只有结果回到原地址时才显示为已验证名称。

这个闭环可以写成:

  1. address → reverse record → candidate name;
  2. candidate name → resolver → resolved address;
  3. resolved address必须等于起始address。

不等时可以显示原始地址,或把名称标为“未正向验证”,不能把候选名称当身份认证。

为什么用户刚更新却仍看到旧结果

ENS记录是链上状态,但钱包、网关和应用会缓存。更新resolver、addr或primary name后,不同服务刷新时间可能不同;再加上latest与finalized读取差异,短时间出现两种答案是可能的。排查时固定chainId与区块号,直接调用当前resolver,再对比应用缓存。

现象可能原因核验动作
名称能收款但地址不显示名称未设置反向记录查询reverse节点
地址显示名称但正向不匹配反向仍指向旧名称,或候选名称未经正向验证执行双向闭环
同名在不同链地址不同使用了多链coin type核对目标网络记录
不同钱包结果不同缓存或resolver支持差异固定区块直接查询

名称不是转账地址的替代备份

ENS所有权、resolver和记录都可能变更;名称到期、被转移或resolver升级后,解析结果也会变化。大额转账应重新解析并核对完整地址,企业白名单应保存名称与地址的绑定时间和区块,而不是永久信任一个字符串。

正向记录还可能经过解析器

名称节点在Registry里保存owner、resolver和TTL,真正的地址记录由resolver返回。客户端先对名称做namehash,找到resolver,再按币种调用addr;多链地址使用coinType区分,不能把所有结果都当20字节EVM地址。若resolver更换但新合约没有迁移记录,名称看似存在却会解析为空。

反向解析结果只能作为展示候选。应用拿到name后必须再做一次正向解析,并确认所得地址等于当前地址,才能展示为已验证名称。缓存也要同时考虑Registry/Resolver变化,避免用户更新记录后仍长时间显示旧名称。

历史状态可用eth_call固定区块复现,看到相似地址时结合代币与地址核验;代理resolver或封装合约还可参考ERC-1967实现读取