五种方法查找 Solana 钱包和铸币的关联代币地址

  • QuickNode
  • 发布于 2024-07-31 20:55
  • 阅读 12

本文详细介绍了五种获取Solana用户关联代币账户地址的方法,包括使用SPL-Token CLI、Solana-Web3.js、SPL Token Program API、cURL脚本和Rust语言。

概述

无论你是在查询一个代币账户余额,还是构建一个代币转账指令,了解如何推导出用户的代币账户地址是任何 Solana 开发者的基本技能。在本指南中,我们将介绍五种简单的方法来获取 Solana SPL 关联的代币账户地址:

你需要准备的事项

  • Solana 基础知识 的基本理解
  • 安装最新版本的 Solana CLI
  • 安装最新版本的 SPL Token 程序 CLI
  • 已安装 Nodejs(版本 16.15 或更高)
  • 有基本的 JavaScript 经验
  • 已安装稳定版本的 cURL
  • 一些要查询的钱包地址和铸币地址(我们将使用钱包:E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk 和 USDC 代币铸币地址,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
  • (可选)已安装 Rust(适用于 Rust 方法)
依赖项 版本
solana-cli 1.16.14
spl-token-cli 3.1.1
node.js 16.15
curl 8.1.12
@solana/web3.js 1.78.5
@solana/spl-token 0.3.7
solana-sdk 1.16.14
spl-associated-token-account 2.2.0
cargo 1.69.0

SPL 代币账户

在深入代码之前,让我们花一点时间回顾一下什么是代币账户,以及它与 Solana 钱包地址的区别。与 Solana 生态系统中的大多数元素一样,代币账户是基于 Solana 的账户模型构建的。这意味着代币账户实际上是与特定代币铸币相关联的 Solana 账户。这些账户由 SPL Token 程序( TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)拥有,并由用户的钱包地址控制。虽然可以有多个代币账户与单个钱包地址关联,但每个代币账户都是特定铸币的唯一账户。为减少代币管理时的摩擦,Solana 引入了 关联代币程序,这是一个确定性地将用户的钱包映射到关联铸币的代币账户的方法。本指南将重点讨论如何获取给定钱包和铸币的关联代币账户地址。

方法 1 - SPL-Token CLI

我们首个方法是使用 Solana SPL-Token CLI 检查钱包的余额。如果你尚未安装,请根据你的操作环境访问 spl.solana.com/token 的说明进行安装。请通过打开新终端并输入以下命令来确保你的安装成功:

spl-token --version

你应该会看到类似以下的内容:

‘Solana CLI 版本检查’

你已经准备好了!只需获取你的钱包地址,你可以直接从 Phantom 或其他钱包复制它:

‘Phantom 钱包复制按钮’

你还需要查询代币的铸币地址。你可以通过在任何基于 Solana 的区块链浏览器中搜索代币名称找到它,例如 Solana Explorer

‘Solana 浏览器’

在你的终端中,输入以下命令来获取你的代币账户:

spl-token address --owner OWNER_WALLET_ADDRESS  --token TOKEN_MINT_ADDRESS --verbose -um

我们仅需通过 --owner 标志传递我们要查询的钱包地址,使用 --token 标志传递我们要查询的代币铸币地址,以及使用 --verbose 标志获得更详细的响应(这是本查询所必需的)。-um 标志告诉 CLI 使用 Solana 主网集群(尽管我们的搜索是确定性的并且不需要指定集群,CLI 工具会验证我们的铸币地址确实是该集群上的有效铸币地址)。

你应该会看到类似以下的内容:

‘Solana CLI 结果’

干得好!

方法 2 - Solana-Web3.js

在你的终端中创建一个新的项目目录和文件 balance.js,执行以下命令:

mkdir token-address && cd token-address && echo > address.js

安装 Solana Web3 依赖项:

yarn init -y
yarn add @solana/web3.js@1

或者

npm init -y
npm install --save @solana/web3.js@1

打开 address.js 文件,在第一行引入 @solana/web3.js。我们将从此包中解构 PublicKey 类。

const { PublicKey } = require('@solana/web3.js');

在第 3-6 行,定义你的钱包、铸币和相关程序(代币程序和关联代币程序):

const OWNER = new PublicKey('YOUR_WALLET_ADDRESS'); // 例如:E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk
const MINT = new PublicKey('YOUR_MINT_ADDRESS');    // 例如:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');
const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL');

最后,通过调用 PublicKeyfindProgramAddressSync() 方法获取你的地址:

const [address] = PublicKey.findProgramAddressSync(
    [OWNER.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), MINT.toBuffer()],
    ASSOCIATED_TOKEN_PROGRAM_ID
);

console.log('使用 Solana-Web3.js: ', address.toBase58());

findProgramAddressSync 方法根据种子和程序 ID 确定性地查找程序地址。在本例中,我们传递钱包地址、代币程序 ID 和铸币地址作为种子,并将关联代币程序 ID 作为程序 ID(这些种子及其顺序由 关联代币程序定义)。

运行你的代码。在终端中输入:

node address

你应该会看到类似以下的内容:

‘Solana-Web3.js 结果’

干得好!

注意:你也可以使用 Connection 类向 Solana 集群发送 getAssociatedTokenAddressSync 请求。此方法需要网络请求,因此性能不如 findProgramAddressSync 方法;但是,它也可以找到在关联代币程序之外创建的任何代币账户。在特定情况下,这可能会很有用。

方法 3 - Solana 代币程序

我们上一条指令有点杂乱。Solana SPL 代币 API 使得这个过程简单多了。让我们看看如何使用 SPL 代币 API 获取关联代币账户的地址。

继续在与前一个方法相同的项目目录中,安装 SPL 代币程序:

yarn add @solana/spl-token

或者

npm install --save @solana/spl-token

打开 address.js 文件,在第一行(我们之前的 import 之前)引入 @solana/spl-token。我们将解构该包中的 getAssociatedTokenAddressSync 方法。

const { getAssociatedTokenAddressSync } = require('@solana/spl-token');

现在,在脚本底部,通过传递钱包和铸币地址作为参数调用 getAssociatedTokenAddressSync 方法:

const address2 = getAssociatedTokenAddressSync(MINT, OWNER);

console.log('使用 SPL-Token: ', address2.toBase58());

更简洁,对吧?这是因为在后台,SPL 代币 API 使用了我们在上一个示例中使用的相同 findProgramAddressSync 方法。你可以点击 getAssociatedTokenAddressSync 方法查看源代码。

运行你的代码。在终端中输入:

node address

你应该会看到两个方法返回相同的地址:

‘Solana 代币程序结果’

干得好!

方法 4 - cURL

cURL 是一个用于通过 URL 传输数据的命令行工具和库。大多数基于 *nix 的系统开箱即用地支持 cURL。通过运行以下命令检查你是否拥有它:

curl -h

如果你尚未安装,请前往 curl.se 设置。

一旦准备就绪,你只需在终端中输入此 HTTP 请求(确保替换你的端点、钱包地址和铸币地址)。在终端中输入:

curl https://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getTokenAccountsByOwner",
    "params": [\
      "YOUR_WALLET_ADDRESS",\
      {\
        "mint": "YOUR_MINT_ADDRESS"\
      },\
      {\
        "encoding": "jsonParsed"\
      }\
    ]
  }
'

你应该会看到类似以下的内容:

‘Solana cURL 结果’ 注意:如果你愿意,可以使用像 jq 这样的包来返回格式化的 JSON 数据。

注意 result.value[0].pubkey 字段中返回了相同的地址 🙌。有关 getTokenAccountsByOwner 方法的更多信息,请查看我们的 文档

方法 5 - Rust

如果你是 Rust 开发者,你还可以使用 Solana Rust SDK。在你的项目文件夹内,使用以下命令启动一个新项目:

cargo new token-address

导航到新创建的目录:

cd token-address

在你的 Cargo.toml 文件中添加必要的依赖:

[dependencies]
solana-sdk = "1.16.14"
spl-associated-token-account = "2.2.0"

打开 src/main.rs 文件,在第一行导入必要的包:

use solana_sdk::pubkey::Pubkey;
use spl_associated_token_account::get_associated_token_address;
use std::str::FromStr;

在第 5-6 行,定义你的所有者和铸币地址:

const OWNER: &str = "YOUR_WALLET_ADDRESS";
const MINT: &str = "YOUR_MINT_ADDRESS";

最后,修改你的 main 函数,通过将所有者和铸币的公钥传递给 get_associated_token_address 方法来获取你的地址:

fn main() {
    let owner_pubkey = Pubkey::from_str(OWNER).unwrap();
    let mint_pubkey = Pubkey::from_str(MINT).unwrap();
    let associated_token_address = get_associated_token_address(&owner_pubkey, &mint_pubkey);

    println!("关联代币地址: {}", associated_token_address);
}

编译并运行你的代码。在终端中输入:

cargo build
cargo run

你应该看到你的相同代币地址被返回:

‘Solana Rust 结果’

干得好!

总结

干得不错!你现在有五个方便的工具来获取 Solana 关联代币账户的地址。如果你刚刚开始你的 Solana 之旅,这里有一些可能对你有所帮助的资源:

我们很想听听你在构建什么。请在 Discord 给我们留言,或者在 Twitter 上关注我们,以获取最新信息!

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

0 条评论

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