公共解析器
公共解析器是一个通用的ENS解析器,它适用于大多数标准的ENS用例。域名的所有者可以使用公共解析器更新相应的ENS记录。
公共解析器遵循以下EIP提案:
- EIP137 - Contract address interface (
addr()). - EIP165 - Interface Detection (
supportsInterface()). - EIP181 - Reverse resolution (
name()). - EIP205 - ABI support (
ABI()). - EIP619 - SECP256k1 public keys (
pubkey()). - EIP634 - Text records (
text()). - EIP1577 - Content hash support (
contenthash()).
虽然
公共解析器提供了一个方便的默认解析器,但仍然存在许多其他的解析器实例和版本。调用者不能假设域名使用的是公共解析器的最新版本,或是解析器包含了这里描述的所有方法。要检查一个解析器是否支持某个特性,请参见接口检查支持。
接口检查支持
function supportsInterface(bytes4 interfaceID) external pure returns (bool)
ENS使用ERC165进行接口检测。ERC165要求支持它的合约实现一个名为supportsInterface的函数,该函数接收一个接口ID并返回一个布尔值,这个布尔值表示是否支持该接口。
接口ID由包含在接口中的每个函数的4字节函数ID通过异或计算而来。例如,addr(bytes32)的函数ID为 0x3b3b57de,因为它是以太坊地址接口中唯一的函数,所以它的接口ID也是 0x3b3b57de,因此调用supportsInterface(0x3b3b57de)将为任何支持addr()的解析器返回 true。
ERC165的接口ID为 0x01ffc9a7,因此supportsInterface(0x01ffc9a7)对于任何支持ERC165的合约(也就是对于任何解析器)都将返回true。
注意,公共解析器不公开设置属性值函数的显式接口,因此对于指定的设置属性值函数,目前没有办法对其进行自动检查。
获取以太坊地址
function addr(bytes32 node) external view returns (address)
返回与给定的node关联的以太坊地址,如果没有则返回0。
这个函数的接口ID为 0x3b3b57de。
这个函数的详细信息请参阅EIP137。
设置以太坊地址
function setAddr(bytes32 node, address addr) external;
将与给定的node 关联的以太坊地址设置为addr。
只能由node的所有者调用。
该操作会触发以下事件:
event AddrChanged(bytes32 indexed node, address a);
获取规范域名
function name(bytes32 node) external view returns (string memory);
返回与给定的node关联的规范ENS域名,专门用于反向解析。
这个函数的接口ID为 0x691f3431.
这个函数的详细信息请参阅EIP181。
设置规范域名
function setName(bytes32 node, string calldata name) external;
为给定的node设置规范ENS域名name。
只能由node的所有者调用。
该操作会触发以下事件:
event NameChanged(bytes32 indexed node, string name);
获取内容散列
function contenthash(bytes32 node) external view returns (bytes memory);
返回node的内容散列(如果存在的话)。涉及的值会被格式化为机器可读的multicodecs,详细信息请参阅EIP 1577。
contenthash用于存储IPFS和Swarm内容散列,可以将ENS域名解析到托管在这些分布式网络上的内容(如网站)。
这个函数的接口ID为 0xbc1c58d1。
这个函数的详细信息请参阅EIP1577。
设置内容散列
function setContenthash(bytes32 node, bytes calldata hash) external;
将给定node的内容散列设置为hash。
只能由node的所有者调用。
涉及的值会被格式化为机器可读的multicodecs,详细信息请参阅EIP1577。
该操作会触发以下事件:
event ContenthashChanged(bytes32 indexed node, bytes hash);
获取合约ABI
ABI(bytes32 node, uint256 contentTypes) external view returns (uint256, bytes memory);
返回与给定node匹配的ABI定义(如果存在的话)。contentTypes是调用者可以接受的二进制编码。如果指定了多个内容类型,解析器将选择一个返回。目前支持的内容类型有:
| 内容类型ID | 描述 |
|---|---|
| 1 | JSON |
| 2 | zlib压缩的JSON |
| 4 | CBOR |
| 8 | URI |
ABI返回内容类型ID和ABI数据的二元组。如果没有找到合适的内容类型ID的数据,则内容类型ID返回0,ABI数据将是空字符串。
这个函数的接口ID为 0x2203ab56。
这个函数的详细信息请参阅EIP205。
设置合约ABI
function setABI(bytes32 node, uint256 contentType, bytes calldata data) external
为node设置或更新ABI数据。contentType是给定的内容类型ID,而且必须给定一个类型ID;data包含经过编码的ABI数据。如果要清除域名的ABI数据,请将data设置为空字符串。
只能由node的所有者调用。
该操作会触发以下事件:
event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
获取公钥
function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y)
以二元组(x, y)的形式返回node的ECDSA SECP256k1公钥。如果没有设置公钥,则返回(0, 0)。
这个函数的接口ID为 0xc8690233。
这个函数的详细信息请参阅EIP619。
设置公钥
function setPubkey(bytes32 node, bytes32 x, bytes32 y) external
将node的ECDSA SECP256k1公钥设置为(x, y)。
只能由node的所有者调用。
该操作会触发以下事件:
event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);
获取文本数据
function text(bytes32 node, string calldata key) external view returns (string memory)
检索node的文本元数据。每个域名可能有多个元数据片段,每个片段由一个唯一的键值key标识。如果node中由键值key标识的文本数据不存在,则返回空字符串。
key可选的标准值有:
| 值 | 含义 |
|---|---|
| 电子邮箱地址 | |
| url | 网址(URL) |
| avatar | 用作头像或标识的图像的网址 |
| description | 域名的描述信息 |
| notice | 关于域名的通知 |
| keywords | 逗号分隔的关键字列表,按重要性由高到低排列,与此字段有交互的客户端可以通过设置一个阈值来选择忽略哪些内容 |
此外,任何人都可以指定特定于服务提供商的密钥,这些密钥必须以vnd.作为前缀。目前已知的特定于服务提供商的密钥如下:
| 值 | 含义 |
|---|---|
| vnd.twitter | Twitter称呼 |
| vnd.github | Github用户名 |
这个函数的接口ID为 0x59d1d43c。
这个函数的详细信息请参阅EIP634。
设置文本数据
function setText(bytes32 node, string calldata key, string calldata value) external
将node中由唯一键值key标识的文本元数据设置为value,同时会覆盖掉之前node中由key标识存储的所有内容。如果要清除文本字段,请将其设置为空字符串。
只能由node的所有者调用。
该操作会触发以下事件:
event TextChanged(bytes32 indexed node, string indexedKey, string key);