Solana - 如何查询Solana命名服务域名(.sol) - Quicknode

  • QuickNode
  • 发布于 2025-01-30 23:26
  • 阅读 23

本文介绍了如何使用 Bonfida 的 SPL Name Service SDK 和 Typescript 查询 Solana 的域名信息,包括查找域名的拥有者和通过钱包地址查找所有已持有的域名。文章提供了详细的环境设置步骤、代码示例和使用指南,适合对 Solana 开发感兴趣的开发者。

开始之前

我们与 Bonfida 合作,以显著简化处理 SNS 数据的过程。请在 QuickNode 市场上查看新的 Bonfida API! 这个由 Bonfida 支持的 API 利用 QuickNode 端点查询 Solana Name Service:

  • 无缝的 .sol 解析
  • 获取注册交易
  • 列出子域名
  • 检索钱包拥有的域名

免费供所有 QuickNode 用户在 QuickNode Marketplace 使用。

概述

在最近的指南中,我们介绍了 如何创建 Solana 命名服务域名。Solana 命名服务("SNS")是一个方便的 Solana 程序,允许用户创建可读的域名以替代公钥。

你将做什么

在本指南中,你将学习如何使用 Typescript 和 Bonfida 的 SPL Name Service SDK 查询 Solana 域名。这将使你能够:

  • 通过域名查找用户的钱包和

  • 通过钱包查找用户的域名(s)

你将需要什么

设置你的环境

要运行我们的链上查询,我们将使用 Nodejs。打开你选择的代码编辑器,并在终端中创建一个新的项目目录:

mkdir sns-example
cd sns-example

创建 name-search.ts。我们将把这个文件作为运行脚本的主要应用程序。

echo > name-search.ts

使用 "yes" 标志初始化你的项目,以使用默认值创建新包:

yarn init --yes
#或
npm init --y

安装 Solana Web3 依赖:

yarn add @solana/web3.js@1 @bonfida/spl-name-service
#或
npm install @solana/web3.js@1 @bonfida/spl-name-service

你的环境应该看起来像这样:

SNS 查询 Node 环境

让我们为你的应用设置所有需要的依赖。打开 name-search.ts,在第 1-2 行导入以下依赖:

import { Connection, PublicKey } from "@solana/web3.js";
import { getDomainKey, NameRegistryState, getAllDomains, performReverseLookup } from "@bonfida/spl-name-service";

@solana/web3.js 的依赖将使我们能够创建与 Solana 网络的连接,并获取钱包地址的公钥。

@bonfida/spl-name-service 的导入将帮助我们查询 .sol 域名(我们会在后面的部分中解释这些)。

好了,你准备好了。

设置你的 QuickNode 端点

要在 Solana 上构建,你需要一个 API 端点来连接网络。你可以使用公共节点或部署和管理自己的基础设施。然而,如果你想要 8 倍更快的响应时间,可以将繁重的工作交给我们。

看看为什么超过 50% 的 Solana 项目选择 QuickNode,并在 此处 注册一个免费帐户。你将需要使用 Mainnet 端点来查询用户的 Solana 域名。复制 HTTP Provider 链接:

连接到 Solana 端点

name-search.ts 的第 4 行,添加以下代码,用你的 HTTP Provider 链接替换 QUICKNODE_RPC

const QUICKNODE_RPC = 'https://example.solana-mainnet.quiknode.pro/000000/';//将其替换为你在 https://www.quicknode.com/endpoints 获取的 HTTP Provider 
const SOLANA_CONNECTION = new Connection(QUICKNODE_RPC);

查找 .SOL 域名拥有者

让我们开始创建一个新的 async 函数,getPublicKeyFromSolDomain,我们将使用这个函数来查找给定 .sol 域名的 Wallet 拥有者。在 name-search.ts 的第 7 行,添加:

async function getPublicKeyFromSolDomain(domain: string):Promise<string>{
    const { pubkey } = await getDomainKey(domain);
    const owner = (await NameRegistryState.retrieve(SOLANA_CONNECTION, pubkey)).registry.owner.toBase58();
    console.log(`SNS 域名 ${domain} 的拥有者是: `,owner);
    return owner;
}

我们的函数接受一个字符串作为参数,domain,它将是我们想要查找的域名(带或不带 ".sol" 扩展名)。查找域名拥有者的过程分为两部分:

  1. 确定与域名关联的公钥(这有点像 NFT 的铸币地址)。我们通过使用 getDomainKey 函数并传入我们的 domain 参数来完成这一点。我们正在寻找具体返回对象中的 pubkey 键。

  2. 从名称注册中检索所有者的地址。我们通过调用 NameRegistryState 类的 retrieve 方法来完成这一点。名称注册 在链上存储有关域名的信息。retrieve 方法将返回一个包含注册信息的对象,该对象持有所有者的公钥(通过调用 .registry.owner.toBase58() 获取)。

在获取所有者的地址后,我们记录并返回结果。

反向查找:查找钱包拥有的所有域名

getPublicKeyFromSolDomain 的下面创建一个新的函数(在我们的例子中是第 14 行),该函数接受一个钱包地址字符串并返回一个字符串数组(以便支持拥有多个 Solana 域的用户)。

async function getSolDomainsFromPublicKey(wallet: string):Promise<string[]>{
    const ownerWallet = new PublicKey(wallet);
    const allDomainKeys = await getAllDomains(SOLANA_CONNECTION, ownerWallet);
    const allDomainNames = await Promise.all(allDomainKeys.map(key=>{return performReverseLookup(SOLANA_CONNECTION,key)}));
    console.log(`${wallet} 拥有以下 SNS 域名:`)
    allDomainNames.forEach((domain,i) => console.log(` ${i+1}.`,domain));
    return allDomainNames;
}

首先,我们获取传递作为参数的钱包的 PublicKey,然后我们使用 Bonfida 的 getAllDomains 函数获取由该钱包拥有的所有域的公钥,并将值存储在 allDomainKeys 中。接下来,我们使用 Promise.all 为存储在 allDomainKeys 中的每个 key 运行 performReverseLookupperformReverseLookup 函数将解析我们传入的相关公钥的 .sol 域名。由于我们使用了 Promise.all,我们的公式将返回一个由钱包所拥有的每个域名构成的数组。

获取钱包的域名后,我们遍历数组并记录每个域名。

快完成了。干得好!

运行你的代码

让我们声明我们的搜索查询并调用我们的函数。在 name-search.ts 的第 23 行,粘贴:

//搜索的示例。你可以用自己的钱包或 Solana 命名服务查询替换这些。
const DOMAIN_TO_SEARCH = 'bonfida';
const WALLET_TO_SEARCH = 'E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk';

getPublicKeyFromSolDomain(DOMAIN_TO_SEARCH);
getSolDomainsFromPublicKey(WALLET_TO_SEARCH);

我们在 DOMAIN_TO_SEARCHWALLET_TO_SEARCH 变量中包含了一些示例查询,但随意替换为你希望搜索的任何钱包或域名。

最后,我们调用我们创建的两个函数,并将搜索变量作为参数传递。我们在 GitHub 上包含了我们整个代码示例 这里

现在,让我们运行它!返回终端并输入:

ts-node name-search.ts

你看到什么吗?

SNS 查询结果

干得好!

应用你的技能

你现在有工具进行链上查询以查找域名拥有者或钱包持有的域名。你可以将这些相同的概念应用到你自己的 Solana dApp 中,以改善用户体验。还没构建 dApp 吗?查看我们的 指南:如何通过 Solana 钱包适配器和 Scaffold 将用户连接到你的 dApp

如果你还没有 .sol 域名并希望获取一个,请查看我们的 指南:如何创建 Solana 命名服务域名

想要对此指南有帮助?在 Discord 上找到我们或通过 Twitter 联系我们。

我们 ❤️ 反馈!如果你对此指南有任何反馈或问题,请 告诉我们。我们很想听到你的声音!

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。