在去中心化应用和区块链生态系统中,域名系统扮演着至关重要的角色,它将复杂的机器可读地址(如以太坊钱包地址 0x1234...abcd)转换为易于人类理解和记忆的名称(如 alice.eth),以太坊域名系统(Ethereum Name Service, ENS)正是基于此理念构建的,而其核心——注册表(Registry)的存储机制,则是整个系统稳定运行的基石,本文将深入探讨ENS注册表如何在以太坊区块链上进行存储,以及其设计的关键考量。
ENS注册表是什么?
ENS注册表是一个智能合约,它维护了一个中央数据库,记录了哪些域名是可用的,以及每个域名的所有者是谁,同时它还定义了如何管理这些域名的子域名,这个注册表本身并不存储具体的域名解析记录(如 alice.eth 指向的 0x1234...abcd),而是存储了指向负责管理该域名及其子域名的“解析器(Resolver)”合约的地址,以及所有者和管理员的权限信息。
注册表的核心数据结构
ENS注册表智能合约主要采用两种核心数据结构来存储信息:
-
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
-
namehash到owner和resolver的映射 (更早期的版本或简化理解):- 在更早的ENS设计中,或者为了简化理解,可以认为注册表直接存储了
namehash到owner(所有者)和resolver(解析器)的映射,但在当前的ENS注册表中,owner信息是通过另一个重要的映射owners来存储的。
- 在更早的ENS设计中,或者为了简化理解,可以认为注册表直接存储了
-
owners(映射 - Mapping):- 这是一个从“节点”到“所有者(owner)”地址的映射,记录了每个域名的当前所有者,所有者拥有对该域名进行配置(如更改解析器、设置子域名所有者等)的权限。
- 存储示例:
owners[alice_eth_node_hash] = alice_eth_owner_address
存储在以太坊区块链上
ENS注册表的所有上述数据结构都存储在以太坊区块链上,是部署在以太坊主网(或其他兼容以太坊的区块链,如Polygon、Arbitrum等)上的一个特定地址的智能合约中。
这意味着:
- 去中心化与抗审查性: 注册表数据不由任何单一实体控制,而是由以太坊网络共识机制维护,确保了其去中心化和抗审查特性,只要以太坊网络存在,ENS注册表及其记录就存在。
- 透明性与可验证性: 任何人都可以通过区块链浏览器(如Etherscan)查询ENS注册表合约的地址,并查看其中的公开数据,如域名的所有者、解析器地址等。
- 永久性与不可篡改性: 一旦数据被写入注册表合约并得到网络确认,就几乎不可能被篡改或删除(除非通过特定的治理机制或智能合约升级,但这通常需要极高的共识)。
- Gas成本: 在注册表上写入数据(如注册新域名、更改所有者、更新解析器)需要支付以太坊Gas费,因为这是在执行区块链交易。
注册表与解析器的分工协作
理解ENS注册表的存储,必须将其与解析器(Resolver)区分开来:
- 注册表(Registry): 相当于一个“电话簿总机”,它不记录具体的“电话号码”(如以太坊地址),只记录“某个姓名”(域名)对应的“分机号”(解析器合约地址),并告诉你谁有权管理这个“姓名”(所有者)。
- 解析器(Resolver):
