在去中心化的世界里,一长串由字母和数字组成的以太坊地址(如 0x742d35Cc6634C0532925a3b844Bc454e4438f44e)不仅难以记忆,还容易输错,为了解决这个问题,以太坊域名系统(Ethereum Name Service, ENS)应运而生,它就像互联网上的DNS,为复杂的以太坊地址提供了易于人类理解的别名,vitalik.eth,ENS是如何将这个看似简单的域名解析回对应的以太坊地址或其他标识符的呢?本文将详细解析ENS的工作原理。
简单回顾一下ENS,ENS是一个基于以太坊区块链的分布式、开放和可扩展的命名系统,它的核心功能是将人类可读的名称(如 alice.eth)映射到机器可读的标识符上,最常见的就是以太坊地址,但也可以是其他类型的地址,如比特币地址、IPFS内容标识符(CID)甚至是文本记录。
ENS由两个主要部分组成:


.eth。.eth TLD的注册器通常是一个智能合约,它规定了域名的注册规则(如拍卖、价高等)。ENS解析过程本质上是智能合约之间的交互,查询者通过节点(如MetaMask、Infura或自己运行的节点)发起请求,最终获取目标记录,以下是详细的解析步骤:
在解析之前,ENS首先会对输入的域名进行规范化处理,这包括:

Alice.ETH 会被规范化为 alice.eth。ENS采用分层结构,类似于DNS,解析器是通过查询域名的“所有权合约”(即“记录合约”)来确定的,具体步骤如下:
.eth TLD的注册合约(如 ETHRegistrarController)发起请求,询问 alice.eth 这个域名的解析器地址是什么,TLD注册合约会返回该域名的“记录合约”地址,或者直接返回解析器地址(取决于注册器和解析器的设置)。sub.alice.eth,查询器会先查询 alice.eth 的记录合约,获取其子域解析器设置。alice.eth 设置了特定的子域解析器,则使用该解析器;否则,继续向上查找,直到找到负责该层级的解析器。一旦确定了与域名关联的解析器合约地址,查询器就会向该解析器合约发起一个特定的调用,请求获取所需的记录类型。
ENSResolver 接口,该接口定义了标准的解析方法,如 resolve(bytes name, bytes calldata data) 或特定类型的便捷方法如 addr(bytes32 node)。bytes32)。alice.eth 的节点标识符是 keccak256(bytes("alice.eth"))。alice.eth 对应的以太坊地址。解析器返回的结果最终会通过节点传递给发起查询的用户钱包(如MetaMask)或应用程序,应用程序可以根据这个结果进行后续操作,例如向该地址发送ETH或代币。
alice.eth让我们以解析 alice.eth 为以太坊地址为例,走一遍完整流程:
alice.eth。alice.eth(小写)。node = keccak256(bytes("alice.eth")),得到一个32字节的哈希值。.eth TLD注册合约查询 node 对应的解析器地址。.eth 注册合约返回 alice.eth 域名记录合约的地址(或者直接返回解析器地址,如果它本身也处理解析)。alice.eth 的记录合约查询其关联的解析器地址。alice.eth 当前配置的解析器合约地址(一个公共解析器合约或用户自定义的解析器合约)。addr(node) 调用。node 查询其内部存储,找到 alice.eth 对应的以太坊地址,并将其返回。app.ens.domains)或集成ENS功能的钱包(如MetaMask)注册.eth或其他支持的TLD域名。.eth域名即可自动解析。