十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

wagmi 中 getEnsResolver Action 完全指南:获取 ENS 域名解析器地址

wagmi 中 getEnsResolver Action 完全指南:获取 ENS 域名解析器地址 wagmi 中 getEnsResolver Action 完全指南获取 ENS 域名解析器地址【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi导读getEnsResolver是wagmi/core提供的核心 Action用于根据 ENS 域名ENS name获取其对应的解析器合约地址resolver address。本文以官方 API 文档为主线结合仓库源码packages/core/src/actions/getEnsResolver.ts与测试用例完整讲解该 Action 的导入方式、全部参数、返回值、错误处理以及其在 TanStack Query 与 React Hook 层的延伸用法帮助你在 dApp 中可靠地完成 ENS 解析器查询。功能概述getEnsResolver用于「按名字获取 ENS 解析器resolver」。在 ENS 体系中解析器Resolver是一份负责将 ENS 名称映射到各类数据地址、文本记录、头像等的合约查询解析器地址是getEnsAddress、getEnsText等链上解析操作的前置步骤。该 Action 返回解析器合约的Address底层委托给 viem 的同名 action 实现。导入方式从wagmi/core直接导入import { getEnsResolver } from wagmi/core同时可导入配套的类型import { type GetEnsResolverParameters, type GetEnsResolverReturnType, type GetEnsResolverErrorType, } from wagmi/core在仓库源码中getEnsResolver通过 packages/core/src/exports/actions.ts 从 packages/core/src/actions/getEnsResolver.ts 统一导出。基本用法getEnsResolver是一个异步函数第一个参数是 wagmi 的config第二个参数是GetEnsResolverParameters对象import { getEnsResolver } from wagmi/core import { normalize } from viem/ens import { config } from ./config const ensResolver await getEnsResolver(config, { name: normalize(wevm.eth), })其中config为项目内通过createConfig创建的配置实例仓库示例可参考 site/snippets/core/config.tsimport { createConfig, http } from wagmi/core import { mainnet, sepolia } from wagmi/core/chains export const config createConfig({ chains: [mainnet, sepolia], transports: { [mainnet.id]: http(), [sepolia.id]: http(), }, })::: warning ENS 名称禁止某些特定字符如下划线_并存在其他校验规则因此在传给getEnsResolver之前建议先用 UTS-46 规范化UTS-46 normalization对 ENS 名称做归一化处理。可直接使用 Viem 内置的normalize从viem/ens导入完成该步骤。 :::底层实现原理从源码看该 Action 的封装非常轻量核心逻辑位于 packages/core/src/actions/getEnsResolver.tsexport function getEnsResolverconfig extends Config( config: config, parameters: GetEnsResolverParametersconfig, ): PromiseGetEnsResolverReturnType { const { chainId, ...rest } parameters const client config.getClient({ chainId }) const action getAction(client, viem_getEnsResolver, getEnsResolver) return action(rest) }其工作流程为从参数中解构出chainId其余参数name、blockNumber、blockTag、universalResolverAddress等透传给 viem通过config.getClient({ chainId })获取对应链的 viem client使用getAction工具将 viem 的getEnsResolveraction 绑定到该 client 上并执行返回 viem 的GetEnsResolverReturnType即Address。类型定义方面GetEnsResolverParameters是 viem 参数类型与ChainIdParameterconfig的组合GetEnsResolverReturnType与GetEnsResolverErrorType均直接复用 viem 类型export type GetEnsResolverParametersconfig extends Config Config Compute viem_GetEnsResolverParameters ChainIdParameterconfig export type GetEnsResolverReturnType viem_GetEnsResolverReturnType export type GetEnsResolverErrorType viem_GetEnsResolverErrorType参数详解所有参数均通过GetEnsResolverParameters传入各参数说明如下。namestring必填要查询解析器的 ENS 名称。建议传入normalize归一化后的名称import { getEnsResolver } from wagmi/core import { normalize } from viem/ens import { config } from ./config const ensResolver await getEnsResolver(config, { name: normalize(wevm.eth), // [!code focus] })chainIdconfig[chains][number][id] | undefined查询数据时使用的链 ID。由于 ENS 主解析服务部署在以太坊主网实际使用时通常显式指定主网链 IDimport { getEnsResolver } from wagmi/core import { mainnet } from wagmi/core/chains import { normalize } from viem/ens import { config } from ./config const ensResolver await getEnsResolver(config, { chainId: mainnet.id, // [!code focus] name: normalize(wevm.eth), })从源码可以看出chainId只用于config.getClient({ chainId })选择客户端并不会透传给 viem因此它决定的是「在哪条链上执行查询」。默认情况下使用配置中的当前链。blockNumberbigint | undefined指定在某个区块高度block number处获取解析器适用于需要查询历史状态的场景import { getEnsResolver } from wagmi/core import { normalize } from viem/ens import { config } from ./config const ensResolver await getEnsResolver(config, { blockNumber: 17829139n, // [!code focus] name: normalize(wevm.eth), })blockTaglatest | earliest | pending | safe | finalized | undefined指定在某个区块标签block tag处获取解析器默认不传时由 viem 按latest处理import { getEnsResolver } from wagmi/core import { normalize } from viem/ens import { config } from ./config const ensResolver await getEnsResolver(config, { blockTag: latest, // [!code focus] name: normalize(wevm.eth), })blockNumber与blockTag是互斥的查询定位方式二者只需指定其一。universalResolverAddressAddress | undefinedENS Universal Resolver 合约的地址默认为当前链上 Universal Resolver 合约的地址一般无需显式指定。仅在链配置异常或需要自定义解析路由时覆盖import { getEnsResolver } from wagmi/core import { normalize } from viem/ens import { config } from ./config const ensResolver await getEnsResolver(config, { name: normalize(wevm.eth), universalResolverAddress: 0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376, // [!code focus] })返回值返回类型为GetEnsResolverReturnType实际值为Address即该 ENS 名称对应解析器合约的地址import { type GetEnsResolverReturnType } from wagmi/core在仓库的测试用例packages/core/src/actions/getEnsResolver.test.ts中对wevm.eth的查询结果被快照验证为0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41这证实了在默认配置下调用getEnsResolver(config, { name: wevm.eth })会返回该解析器地址可用于后续的getEnsText、getEnsAvatar等解析操作的地址定位。错误处理错误类型为GetEnsResolverErrorType从wagmi/core导入import { type GetEnsResolverErrorType } from wagmi/core当查询失败如名称格式非法、链上查询出错、RPC 调用失败时该 Action 会以 Promise rejection 形式抛出错误。在实际应用中建议使用try/catch或配合 TanStack Query 的error状态进行统一处理。与 TanStack Query 的集成wagmi/core/query为该 Action 提供了可组合的 query 层实现在 packages/core/src/query/getEnsResolver.ts包含以下导出import { type GetEnsResolverData, type GetEnsResolverOptions, type GetEnsResolverQueryFnData, type GetEnsResolverQueryKey, getEnsResolverQueryKey, getEnsResolverQueryOptions, } from wagmi/core/query关键实现细节queryKeygetEnsResolverQueryKey生成的 key 以[ensResolver, options]为前缀chainId等参数会进入 key因此不同链上的查询会被自动缓存隔离见测试 packages/core/src/query/getEnsResolver.test.ts。enabled 控制getEnsResolverQueryOptions只有在提供name时才启用查询enabled: Boolean(options.name (options.query?.enabled ?? true))避免空名称触发无效请求。queryFn执行时若缺少name会抛出name is required错误否则内部调用getEnsResolver。import { getEnsResolverQueryOptions } from wagmi/core/query const options getEnsResolverQueryOptions(config, { name: normalize(wevm.eth), chainId: mainnet.id, })React HookuseEnsResolver在 React 项目中可以直接使用封装好的useEnsResolverHook实现在 packages/react/src/hooks/useEnsResolver.tsimport { useEnsResolver } from wagmi import { normalize } from viem/ens function EnsResolver() { const { data, error, isLoading } useEnsResolver({ name: normalize(wevm.eth), }) if (isLoading) return div加载中…/div if (error) return div查询失败{error.message}/div return div解析器地址{data}/div }该 Hook 内部通过useConfig获取配置、useChainId获取当前链 ID未显式传chainId时兜底使用再基于getEnsResolverQueryOptions构建 TanStack Query 选项const config useConfig(parameters) const chainId useChainId({ config }) const options getEnsResolverQueryOptions(config, { ...parameters, chainId: parameters.chainId ?? chainId, }) return useQuery(options)因此它天然具备查询缓存、自动重试、loading/error 状态等能力返回值UseEnsResolverReturnType即 TanStack Query 的UseQueryReturnTypeAddress, GetEnsResolverErrorType。对应测试可参考 packages/react/src/hooks/useEnsResolver.test.ts。与其他 ENS Action 的配合getEnsResolver是 ENS 读取链路的入口之一仓库中同属wagmi/core的 ENS 系列 Action 还包括getEnsAddress、getEnsAvatar、getEnsText、getEnsName等见 packages/core/src/exports/actions.ts。典型用法是先通过getEnsResolver拿到解析器地址再基于该地址执行更细粒度的名称解析请求从而形成完整的 ENS 数据读取流程。总结getEnsResolver(config, parameters)是wagmi/core中获取 ENS 解析器地址的官方 Action返回Address五个参数中name必填chainId决定查询链blockNumber/blockTag用于定位历史区块universalResolverAddress可覆盖默认 Universal Resolver源码层通过config.getClient({ chainId })与 viem 的getEnsResolver无缝衔接无额外业务逻辑生产环境推荐配合wagmi/core/query的getEnsResolverQueryOptions或 React 的useEnsResolver使用以获得缓存、状态管理与错误处理能力。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表