本文介绍了如何使用 Bonfida 的 SPL Name Service SDK 和 Typescript 查询 Solana 的域名信息,包括查找域名的拥有者和通过钱包地址查找所有已持有的域名。文章提供了详细的环境设置步骤、代码示例和使用指南,适合对 Solana 开发感兴趣的开发者。
我们与 Bonfida 合作,以显著简化处理 SNS 数据的过程。请在 QuickNode 市场上查看新的 Bonfida API! 这个由 Bonfida 支持的 API 利用 QuickNode 端点查询 Solana Name Service:
免费供所有 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
yarn add @solana/web3.js@1 @bonfida/spl-name-service
#或
npm install @solana/web3.js@1 @bonfida/spl-name-service
你的环境应该看起来像这样:
让我们为你的应用设置所有需要的依赖。打开 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 域名(我们会在后面的部分中解释这些)。
好了,你准备好了。
要在 Solana 上构建,你需要一个 API 端点来连接网络。你可以使用公共节点或部署和管理自己的基础设施。然而,如果你想要 8 倍更快的响应时间,可以将繁重的工作交给我们。
看看为什么超过 50% 的 Solana 项目选择 QuickNode,并在 此处 注册一个免费帐户。你将需要使用 Mainnet 端点来查询用户的 Solana 域名。复制 HTTP Provider 链接:
在 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);
让我们开始创建一个新的 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" 扩展名)。查找域名拥有者的过程分为两部分:
确定与域名关联的公钥(这有点像 NFT 的铸币地址)。我们通过使用 getDomainKey 函数并传入我们的 domain 参数来完成这一点。我们正在寻找具体返回对象中的 pubkey 键。
从名称注册中检索所有者的地址。我们通过调用 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 运行 performReverseLookup。performReverseLookup 函数将解析我们传入的相关公钥的 .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_SEARCH 和 WALLET_TO_SEARCH 变量中包含了一些示例查询,但随意替换为你希望搜索的任何钱包或域名。
最后,我们调用我们创建的两个函数,并将搜索变量作为参数传递。我们在 GitHub 上包含了我们整个代码示例 这里。
现在,让我们运行它!返回终端并输入:
ts-node name-search.ts
你看到什么吗?
干得好!
你现在有工具进行链上查询以查找域名拥有者或钱包持有的域名。你可以将这些相同的概念应用到你自己的 Solana dApp 中,以改善用户体验。还没构建 dApp 吗?查看我们的 指南:如何通过 Solana 钱包适配器和 Scaffold 将用户连接到你的 dApp。
如果你还没有 .sol 域名并希望获取一个,请查看我们的 指南:如何创建 Solana 命名服务域名。
想要对此指南有帮助?在 Discord 上找到我们或通过 Twitter 联系我们。
我们 ❤️ 反馈!如果你对此指南有任何反馈或问题,请 告诉我们。我们很想听到你的声音!
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!