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

ENS 公共解析器

源代码

公共解析器是一个通用的 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 news ( 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 addr(bytes32 node, uint coinType) external view returns(bytes memory);

根据传入参数 nodecoinType 返回相应区块链的地址,如果没有,则返回 0 。

这个函数的接口 ID 为 0xf1cb7e06

这个函数的详细信息请参阅 EIP 2304

返回值是加密货币地址的原生二进制格式,而且每种区块链地址都有不同的编码和解码方式。

例如,比特币地址 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa 按照 base58check 算法解码为 21 字节的 0062e907b15cbf27d5425399ebf6f0fb50ebb88f18 ,再通过 scriptPubkey 算法转换为 25 字节的 76a91462e907b15cbf27d5425399ebf6f0fb50ebb88f1888ac ;而 BNB 地址 bnb1grpf0955h0ykzq3ar5nmum7y6gdfl6lxfn46h2 按照 Bech32 算法转换为二进制表示得到 40c2979694bbc961023d1d27be6fc4d21a9febe6

要将二进制表示转换为地址,请使用 address-encoder(地址编码器)的 formatsByCoinType[SYMBOL].encoder(binary) 方法。

如果 coinType 在指定节点 node 上不存在,则返回零长度的字符串。

设置区块链地址

function setAddr(bytes32 node, uint coinType, bytes calldata addr) external;

将与 nodecoinType 相应的区块链地址设置为 addr

coinType 是加密货币类型索引,它由 SLIP44 定义。

要将地址转换为二进制表示,请使用 address-encoder(地址编码器)的 formatsByCoinType[SYMBOL].encoder(binary) 方法。

只能由 node 的所有者调用。

该操作会触发以下事件:

event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress);

获取规范名称

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 ,详细信息请参阅 EIP1577

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 可选的标准值有:

键值 含义
email 电子邮箱地址
url 网址(URL)
avatar 用作头像或标识的图像的网址
description 名称的描述信息
notice 关于名称的通知
keywords 逗号分隔的关键字列表,按重要性由高到低排列,与此字段有交互的客户端可以通过设置一个阈值来选择忽略哪些内容

此外,任何人都可以指定特定于服务提供商的键值,这些键值必须以 com. 作为前缀。目前已知的特定于服务提供商的键值如下:

键值 含义
com.twitter Twitter 标识符
com.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);

多重调用

function multicall(bytes[] calldata data) external returns(bytes[] memory results)

允许用户在一次操作中设置多条记录。

使用 encodeABI 函数对合约调用进行编码,并将其传递给 data

前端使用情况如下:

var addrSet = resolver.contract.methods['setAddr(bytes32,address)'](node, accounts[1]).encodeABI();
var textSet = resolver.contract.methods.setText(node, "url", "https://ethereum.org/").encodeABI();
var tx = await resolver.multicall([addrSet, textSet], {from: accounts[0]});
转载本站内容请注明出处和链接。咨询 ENS 问题或加入 ENS 中文社区请联系 我们