ENS 在 2023 年 4 月进行了大量更新,本站 “教程” 和 “文档” 中的相关内容已经过时。 如需了解最新的使用说明或技术文档,请到 ENS 官方提供的 支持文档 进行查阅。

ENSIP-8: 接口发现

作者 Nick Johnson <nick@ens.domains>
状态 完结
提交时间 2019-03-05

摘要

这个 ENSIP 指定了一种方法,用于公开与 ENS 名称或地址 (通常是合约地址) 相关联的接口,还允许应用程序发现这些接口并与之交互。接口既可以由目标合约 (如果有的话) 实现,也可以由任何其他合约实现。

动机

EIP-165 支持接口发现——确定给定地址的合约是否支持所请求的接口。然而,在许多情况下,能够发现与其他合约实现的名称或地址相关联的功能是很有用的。

例如,代币合约本身可能不提供任何类型的“原子交换”功能,但可能有相关的合约提供。通过 ENS 接口发现,代币合约可以公开该元数据,通知应用程序在哪里可以找到该功能。

规范

定义了 ENS 解析器的新解析类型,包括以下方法:

function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address);

该接口在 EIP-165 标准下的接口 ID 是 0xb8f2bbb4.

给定 ENS 名称的 namehash 值 node 和 EIP-165 interfaceID,此函数返回该接口的实现者的地址。如果没有与该节点的接口 ID 匹配的接口,则返回 0。

interfaceImplementer 返回的地址必须指向一个智能合约。

返回地址的智能合约应该实现 EIP-165。

实现此接口的解析器可以使用一种回退策略: 如果用户没有显式提供匹配的接口,则查询 addr() 返回的合约,如果请求的接口被该合约支持,则返回其地址,否则为 0。如果这样做,则必须确保在目标合约恢复时返回 0,而不是恢复。

此字段可用于正向解析和反向解析。

原理

解决这个问题的一种简单方法是将此方法直接添加到目标合约中。然而,这样做有几个缺点:

  1. 每个合约必须维护自己的接口实现列表。
  2. 修改此列表需要访问控制,而合约以前可能不需要访问控制。
  3. 这项支持必须在合约起草时就设计好,并且不能在合约起草后再进行修改。
  4. 只支持一个规范的接口列表。

而使用 ENS 解析器可以弱化这些缺点,使任何人都可以将接口与名称关联起来,即使是以前没有考虑到这一点的合约。

向后兼容性

不存在向后兼容性问题

实现

ensdomains/resolvers 中的公共解析器代码仓库实现了这个接口。

版权

通过 CC0 放弃版权及相关权利。

转载本站内容请注明出处和链接。咨询 ENS 问题或加入 ENS 中文社区请联系 我们