作者 | 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,而不是恢复。
此字段可用于正向解析和反向解析。
原理
解决这个问题的一种简单方法是将此方法直接添加到目标合约中。然而,这样做有几个缺点:
- 每个合约必须维护自己的接口实现列表。
- 修改此列表需要访问控制,而合约以前可能不需要访问控制。
- 这项支持必须在合约起草时就设计好,并且不能在合约起草后再进行修改。
- 只支持一个规范的接口列表。
而使用 ENS 解析器可以弱化这些缺点,使任何人都可以将接口与名称关联起来,即使是以前没有考虑到这一点的合约。
向后兼容性
不存在向后兼容性问题
实现
ensdomains/resolvers 中的公共解析器代码仓库实现了这个接口。
版权
通过 CC0 放弃版权及相关权利。