以太坊域名服务(ENS)类似于传统的域名系统(DNS),它允许用户和开发者使用易于记忆的人类可读名称,替代容易出错的长 hexadecimal 地址、内容哈希和其他加密数据。通过 web3.py 库内置的 ens 模块,开发者可以轻松查询域名和地址、添加解析器记录或管理元数据。
ENS 核心概念与价值
ENS 的核心价值在于简化区块链交互体验。它通过将复杂的地址映射为易读的域名,降低了用户的操作门槛和出错概率。这种机制不仅适用于以太坊地址,还支持多链地址解析和丰富的文本记录功能。
环境配置与初始化
创建 ENS 对象(以下示例中命名为 ns)有以下三种方式:
自动检测初始化
from ens.auto import ns通过指定提供者初始化
from web3 import IPCProvider
from ens import ENS
provider = IPCProvider(...)
ns = ENS(provider)通过现有 Web3 对象初始化
from ens import ENS
w3 = Web3(...)
ns = ENS.from_web3(w3)异步支持
通过 AsyncENS 模块可实现异步操作支持:
from ens import AsyncENS
ns = AsyncENS(provider)值得注意的是,ens 模块实例也可通过 w3 实例访问。首次使用时,web3.py 会自动创建相应的 ens 实例。
字节类型严格检查配置
ENS 实例包含 strict_bytes_type_checking 标志位,用于控制附加到 ENS 实例的 Web3 实例中同名标志的状态。您可以使用此标志禁用默认加载的更严格的字节类型检查。
核心功能使用详解
域名信息查询
通过 ENS 名称获取地址
from ens.auto import ns
eth_address = ns.address('ens.eth')
assert eth_address == '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7'多链地址解析
ENSIP-9 引入了多链地址解析功能,允许用户解析来自不同链的地址,通过 SLIP44 中的币种类型索引指定。ENS 类的 address() 方法支持通过 coin_type 关键字参数进行多链地址解析。
from ens.auto import ns
eth_address = ns.address('ens.eth', coin_type=60) # ETH 的 coin_type 为 60通过地址获取 ENS 名称
domain = ns.name('0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7')为确保准确性,ENS 模块会在每次获取地址的 name() 时验证前向解析是否匹配地址。这是确定反向解析正确性的唯一可靠方法。
获取名称所有者
eth_address = ns.owner('exchange.eth')名称与地址设置
将名称链接到地址
您可以设置名称,使得 address() 显示其指向的地址。要做到这一点,您必须是该域名的所有者。
ns.setup_address('ens.eth', '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7')在常见情况下,如果您希望将名称指向拥有地址,可以省略地址参数。
ns.setup_address('ens.eth')您还可以声明任意深度的子域名,但请注意 Gas 成本会随着子域名数量的增加而上升。
多链地址支持
setup_address() 方法通过 coin_type 关键字参数支持多链地址设置。
将地址链接到名称
您可以设置地址,使得 name() 显示指向它的名称。这类似于来电显示功能,使您和其他人能够通过账户确定指向它的名称。
ns.setup_name('ens.eth', '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7')如果不提供地址,setup_name() 将假定您需要 address() 返回的地址。如果名称尚未指向地址,setup_name() 将自动调用 setup_address()。
文本记录管理
设置 ENS 记录的文本元数据
作为 ENS 记录的所有者,您可以添加文本元数据。支持的字段列表可在 ENS 文档中找到。
ns.setup_address('ens.eth', '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7')
ns.set_text('ens.eth', 'url', 'https://example.com')如果需要,可以将交易字典作为最后一个参数传递。
读取 ENS 记录的文本元数据
任何人都可以读取 ENS 记录中的数据:
url = ns.get_text('ens.eth', 'url')解析器操作
获取 ENS 记录的解析器
您可以通过 resolver() 方法获取 ENS 名称的解析器。
resolver = ns.resolver('ens.eth')
resolver.address通配符解析支持
ENS 模块支持通配符解析,适用于实现 ENSIP-10 中描述的 ExtendedResolver 接口的解析器。实现扩展解析器接口的解析器在调用 supportsInterface() 函数时应返回 True,并将子域名解析为唯一地址。
👉 探索更多解析策略
常见问题
ENS 与传统 DNS 有何区别?
ENS 基于区块链技术构建,具有去中心化、抗审查和不可篡改的特性。它使用加密货币进行支付和智能合约来管理域名,而传统 DNS 依赖于中心化的注册机构和权威服务器。
多链地址解析如何工作?
多链地址解析通过 ENSIP-9 标准实现,使用 SLIP44 中的币种类型索引来指定不同区块链网络。这使得一个 ENS 域名可以解析到多个链上的不同地址。
设置 ENS 记录需要多少成本?
成本主要包括 Gas 费用,这会随网络拥堵情况和操作复杂度而变化。设置简单地址解析的成本较低,而包含多个子域名和文本记录的复杂操作成本会相应增加。
如何确保反向解析的准确性?
ENS 模块通过验证前向解析是否匹配地址来确保反向解析的准确性。这种机制防止了任何人声明任意名称的情况,只有前向解析才意味着名称所有者给予了正式批准。
通配符解析有什么实际用途?
通配符解析允许解析器为未明确配置的子域名提供默认解析结果,这大大简化了子域名管理的工作量,特别是对于需要大量子域名的应用场景。
文本记录支持哪些类型的元数据?
文本记录支持多种标准字段,包括网址、电子邮件地址、描述信息、社交媒体账号等。完整的标准字段列表可以在 ENS 官方文档中找到,这些字段为用户提供了丰富的域名关联信息能力。