以太坊ENS注册表的存储机制解析
在去中心化互联网的生态中,以太坊域名系统(Ethereum Name Service, ENS)扮演着“区块链上的DNS”角色,它将人类可读的域名(如alice.eth)映射到以太坊地址、内容哈希(如IPFS)或其他区块链资源,而ENS的核心枢纽——注册表(Registry),则是整个系统的“数据基石”,负责管理域名的所有权、层级关系及解析器关联,本文将深入解析ENS注册表的存储机制,揭示其如何通过智能合约与区块链状态实现去中心化的域名管理。
注册表:ENS的“中央索引”
ENS注册表本质上是一个部署在以太坊区块链上的智能合约(主网地址为0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e),其核心功能是维护一个全局的“域名-数据”映射表,与传统DNS的 centralized 数据库不同,注册表的所有数据都存储在以太坊的状态存储中,由全节点共同维护,具备透明、防篡改、去中心化的特性。
注册表的核心设计目标是:
- 层级化管理:支持类似DNS的层级域名结构(如
subdomain.example.eth); - 所有权控制:确保域名的所有者(owner)拥有唯一修改权限;
- 动态解析:通过关联“解析器(Resolver)合约”,将域名映射到任意类型的数据(地址、文本、哈希等)。
注册表的核心数据结构
注册表合约的存储逻辑围绕一个核心的mapping展开,其结构可简化为:
mapping(bytes32 => Record) public records;
bytes32:域名的“名称哈希(Namehash)”,用于将人类可读的域名转换为固定长度的哈希值,作为存储的键;Record:结构体,存储域名的核心数据,包含三个关键字段:
struct Record {
address owner; // 域名所有者地址
address resolver; // 关联的解析器合约地址
uint64 ttl; // 解析记录的缓存时间(秒,0表示不缓存)
}
名称哈希(Namehash):层级域名的“唯一标识”
ENS通过名称哈希算法将层级域名转换为bytes32格式的哈希,作为mapping的键,该算法的规则是:
- 根域名(如
.eth)的namehash为0x0000000000000000000000000000000000000000000000000000000000000000(32字节的零); - 子域名的
namehash通过递归计算:namehash(subdomain.example.eth) = keccak256(abi.encodePacked(namehash(example.eth), keccak256(bytes('subdomain'))))。
eth的namehash为0x93cdeb708b7545dc66ab5dcbbg7a4be66c1d1a0b6c7a8c1d1a0b6c7a8c1d1a0b6(简化示例);alice.eth的namehash为keccak256(abi.encodePacked(namehash(eth), keccak256(bytes('alice'))))。
这种设计实现了:
- 层级隔离:不同层级的域名哈希唯一,避免冲突;
- 存储高效:用固定长度的哈希替代长字符串,节省链上存储空间。
Record结构体:域名的“三元组”
Record是注册表存储的核心数据单元,包含三个关键信息:
(1)所有者(owner)
域名的“拥有者”,可以是外部账户(EOA)或智能合约,所有者拥有对域名的绝对控制权,包括:
- 修改解析器(
setResolver); - 更新TTL(
setTTL); - 转移所有权(
setOwner)。
所有者权限通过以太坊的签名验证机制保障,只有使用owner私钥签名的交易才能修改对应域名的记录。
(2)解析器(resolver)
解析器是一个独立的智能合约,负责将域名映射到具体数据,注册表本身不存储域名对应的地址或内容,而是通过解析器实现“按需解析”。
- 若
alice.eth需要映射以太坊地址,其解析器需实现addr()函数,返回0x...地址; - 若需要映射IPFS内容,解析器需实现
contenthash()函数,返回bzz://或ipfs://哈希。
解析器的灵活性是ENS的核心优势
发布于:2026-09-16,除非注明,否则均为原创文章,转载请注明出处。

