ENS 架构
ENS 有两个主要组件:注册表 和 解析器。
ENS 注册表是一个智能合约,该合约维护所有名称和子名称列表,并存储关于每个名称的三个关键信息:
- 名称的所有者
- 名称的解析器
- 名称下所有记录的缓存存活时间(即 TTL)
名称的所有者可以是外部帐户(用户)或智能合约。注册器就是一个拥有顶级名称的智能合约,并按照合约中的规则将该名称的子名称分发给用户。
ENS 注册表中的名称所有者可以:
- 为名称设置解析器和 TTL
- 将名称的所有权转让给另一个地址
- 更改子名称的所有权
ENS 注册表非常简单,它的存在只是为了将名称映射到负责解析这个名称的解析器。
解析器负责将名称转换为地址。只要是符合解析器相关标准的智能合约,都可以在 ENS 中作为解析器程序。通用解析器服务于需求简单的用户,比如不经常更改地址的用户。
每个记录类型(以太坊地址、内容哈希等)都定义了一个或多个方法,解析器必须实现这些方法才能提供这类记录。新的记录类型可以随时通过 EIP 标准化程序进行定义,因此不需要为了支持它们而对 ENS 注册表或现有的解析器进行更改。
在 ENS 中解析一个名称需要两个步骤:首先,询问注册表是哪个解析器负责解析该名称,然后,向该解析器查询解析结果。
在上面的例子中,我们想找到 “foo.eth” 指向的以太坊地址。首先,我们询问注册表是哪个解析器负责解析 “foo.eth” ;然后,我们向该解析器查询 “foo.eth” 的地址。
Namehash
智能合约中的资源限制使得直接与可读的名称交互效率低下,因此ENS只使用固定长度的256位加密哈希。为了从名称生成哈希的同时仍然保留其层次性,ENS 使用了名为 Namehash 的算法。例如,“alice.eth” 的 Namehash 为 0x787192fc5378cc32aa956ddfdedbf26b24e8d78e40109add0eea2c1a012c3dec ,Namehash 只是用来在 ENS 内部表示名称。
Namehash 是一个递归过程,可以为任何有效的名称生成唯一的哈希。从任意一个名称的 Namehash 开始(比如 “alice.eth” 的 Namehash)可以推导出任意子名称的 Namehash(比如 “iam.alice.eth” 的 Namehash),而且推导过程中不需要知道或处理 “alice.eth” 这个可读的原始名称。正是这个特性使得 ENS 能够成为一个层次性的系统,且不必在内部处理可读的文本字符串。
在使用 Namehash 进行哈希之前,首先需要借助 UTS-46 标准对名称进行规范化,确保名称中的字母与大小写无关,并禁止使用无效字符。任何对名称进行哈希和解析的操作都 必须 首先对其进行规范化,以确保所有用户获得 ENS 的一致性。
有关 Namehash 和规范化如何工作的详细信息,请参阅后续的文档。