在去中心化应用和区块链生态系统中,域名系统扮演着至关重要的角色,它将复杂的机器可读地址(如以太坊钱包地址 0x1234...abcd)转换为易于人类理解和记忆的名称(如 alice.eth),以太坊域名系统(Ethereum Name Service, ENS)正是基于此理念构建的,而其核心——注册表(Registry)的存储机制,则是整个系统稳定运行的基石,本文将深入探讨ENS注册表如何在以太坊区块链上进行存储,以及其设计的关键考量。

ENS注册表是什么?

ENS注册表是一个智能合约,它维护了一个中央数据库,记录了哪些域名是可用的,以及每个域名的所有者是谁,同时它还定义了如何管理这些域名的子域名,这个注册表本身并不存储具体的域名解析记录(如 alice.eth 指向的 0x1234...abcd),而是存储了指向负责管理该域名及其子域名的“解析器(Resolver)”合约的地址,以及所有者和管理员的权限信息。

注册表的核心数据结构

ENS注册表智能合约主要采用两种核心数据结构来存储信息:

  1. records (映射 - Mapping):

    • 这是最核心的存储部分,它是一个从“节点(node)”到“解析器(resolver)”地址的映射。
    • “节点”是什么? 在ENS中,每个域名(如 alice.eth)及其子域名(如 bob.alice.eth)都被转换为一个唯一的、固定长度的哈希值,这个哈希值就是“节点”,转换过程通常是:将域名按“.”分割,然后从右到左依次进行SHA-256哈希,并将前一个哈希结果作为当前哈希的一部分。eth的节点是eth的哈希,alice.eth的节点是sha256(sha256('alice') || sha256('eth')),以此类推,这种设计使得即使是很长的域名也能生成固定长度的标识,并且子域名的节点可以基于父域名的节点高效计算。
    • “解析器”是什么? 解析器是一个智能合约,负责将域名解析为具体的数据,如以太坊地址、内容哈希(IPFS)、文本记录等,注册表中的records映射只记录了某个域名当前使用的解析器地址,具体的解析逻辑由解析器合约实现。
    • 存储示例: records[alice_eth_node_hash] = resolver_contract_address
  2. namehashownerresolver 的映射 (更早期的版本或简化理解):

    • 在更早的ENS设计中,或者为了简化理解,可以认为注册表直接存储了namehash随机配图