全面掌握以太坊域名服务(ENS)与 web3.py 集成指南

·

以太坊域名服务(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 官方文档中找到,这些字段为用户提供了丰富的域名关联信息能力。