解析至以太坊地址
ENS 中最简单和最常用的函数是域名解析函数。域名可以关联多种类型的资源,其中最常见的是以太坊地址。借助 ENS 库,将域名解析为以太坊地址很简单:
采用 ensjs 时:
var address = await ens.name('resolver.eth').getAddress(); |
采用 web3.js 时:
var address = ens.getAddress('alice.eth'); |
采用 ethjs-ens 时:
var address = await ens.lookup('alice.eth'); |
采用 ethers.js 时:
var address = await provider.resolveName('alice.eth'); |
ethers.js 还能支持在任何需要使用地址的地方也可以使用 ENS 域名,也就是说一般不需要直接调用 resolveName
。例如,要查询一个账户的余额,你可以这样做:
var balance = await provider.getBalance('alice.eth'); |
或者,实例化一个合约:
const abi = [ |
采用 go-ens 时:
address, err := ens.Resolve(client, "alice.eth") |
采用 web3.py 时:
address = ns.address('alice.eth') |
采用 web3j 时:
String address = ens.resolve("alice.eth"); |
web3j 同样支持在任何需要使用地址的地方也可以使用 ENS 域名,所以你通常不需要直接与 EnsResolver
对象交互。例如,要实例化一个合约接口,你可以这样做:
YourSmartContract contract = YourSmartContract.load( |
如果不借助 ENS 库,解析的过程可以分为三步:
- 对将要解析的域名进行规范化和哈希,详细信息请参阅 域名处理。
- 在 ENS 注册表上调用
resolver()
,并将第 1 步输出的哈希作为参数传递,然后resolver()
会返回负责解析这个域名的解析器的地址。 - 使用 resolver 接口 ,在第 2 步返回的解析器地址上调用
addr()
,并将第1步输出的哈希作为参数传递。
对多币地址解析的支持是通过重载 addr()
来实现的。要解析多币地址,必须要有相应加密货币的 Namehash 和符合 SLIP44 规范的链 ID 。例如,要解析一个比特币地址,可以调用 addr(hash, 0)
。注意,返回的地址是用二进制表示的,因此要通过解码来得到文本格式的地址,详细内容请参阅 EIP2304 。
使用
addr()
进行解析时,必须将来自解析器 0x00…00 的返回值视为未设置的记录。否则,在用户配置了解析器却没有为域名设置解析地址的情况下,可能导致用户的资金被发送到空地址!
解析至其他资源
除了以太坊地址,ENS 还支持将域名解析至许多其他类型的资源,其中包括其他加密货币的地址、存储在 Swarm 或 IPFS 中的数据的内容哈希、合约接口(ABIs)和基于文本的元数据。查询这些信息的过程因采用的ENS库而有所差异,相关信息,请参阅所选库的文档。
如果不借助 ENS 库来实现这些类型的解析,同样需要遵循上面介绍过的3步过程,只是在第 3 步中调用的不再是 addr()
,而是解析器上与这些类型相对应的函数。
反向解析
“正向” 解析实现了从域名到地址的映射,而反向解析是指从地址映射回域名或其他元数据。ENS 支持反向解析,以便应用程序用 ENS 域名代替显示十六进制地址。
反向解析是通过专用域名 addr.reverse 和解析器的 name()
函数实现的。 addr.reverse 的所有权属于一个专用的注册器合约,该合约将子域名分配给相应地址的所有者。例如,地址 0x314159265dd8dbb310642f98f50c066173c1259b 可以要求使用 314159265dd8dbb310642f98f50c066173c1259b.addr.reverse ,并设置解析器和解析记录。通过这个解析器的 name()
函数可以取得与该地址关联的域名。
ENS 并不强制要求反向记录的准确性。例如,每个人都可以声明其地址的域名为 “alice.eth” 。所以,为了确保声明是准确的,你必须始终对返回的域名执行正向解析,并检查正向解析得到的地址是否与原始地址匹配。
大多数 ENS 库提供了执行反向解析的功能:
采用 ensjs 时:
const address = '0x1234...'; |
采用 web3.js 时:
Not supported.
采用 ethjs-ens 时:
var address = '0x1234...'; |
采用 ethers.js 时:
var address = '0x1234...'; |
采用 go-ens 时:
name, err := ens.ReverseResolve(client, common.HexToAddress("0x1234...") |
采用 web3.py 时:
address = '0x1234...' |
采用 web3j 时:
String address = "0x1234..."; |
如果不使用库,实现反向解析的过程也是一样的:查询 1234....addr.reverse
(其中的 1234… 是需要进行反向解析的地址)的解析器并在该解析器上调用 name()
函数。然后,执行正向解析以验证记录是否准确。
如果您需要处理许多地址(例如:展示交易历史的反向记录),要为每个域名同时设置反向和正向解析是不实际的。我们有一个单独的智能合约叫做 ReverseRecords
,它可以让你通过一个函数来查询多个域名。
const namehash = require('eth-ens-namehash'); |
为防止同形词攻击,并避免人们仅仅使用大写字母,请确保将返回的域名与规范化域名进行比较。