本文详细介绍了五种获取Solana用户关联代币账户地址的方法,包括使用SPL-Token CLI、Solana-Web3.js、SPL Token Program API、cURL脚本和Rust语言。
无论你是在查询一个代币账户余额,还是构建一个代币转账指令,了解如何推导出用户的代币账户地址是任何 Solana 开发者的基本技能。在本指南中,我们将介绍五种简单的方法来获取 Solana SPL 关联的代币账户地址:
E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk
和 USDC 代币铸币地址,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
)依赖项 | 版本 |
---|---|
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 |
在深入代码之前,让我们花一点时间回顾一下什么是代币账户,以及它与 Solana 钱包地址的区别。与 Solana 生态系统中的大多数元素一样,代币账户是基于 Solana 的账户模型构建的。这意味着代币账户实际上是与特定代币铸币相关联的 Solana 账户。这些账户由 SPL Token 程序( TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
)拥有,并由用户的钱包地址控制。虽然可以有多个代币账户与单个钱包地址关联,但每个代币账户都是特定铸币的唯一账户。为减少代币管理时的摩擦,Solana 引入了 关联代币程序,这是一个确定性地将用户的钱包映射到关联铸币的代币账户的方法。本指南将重点讨论如何获取给定钱包和铸币的关联代币账户地址。
我们首个方法是使用 Solana SPL-Token CLI 检查钱包的余额。如果你尚未安装,请根据你的操作环境访问 spl.solana.com/token 的说明进行安装。请通过打开新终端并输入以下命令来确保你的安装成功:
spl-token --version
你应该会看到类似以下的内容:
你已经准备好了!只需获取你的钱包地址,你可以直接从 Phantom 或其他钱包复制它:
你还需要查询代币的铸币地址。你可以通过在任何基于 Solana 的区块链浏览器中搜索代币名称找到它,例如 Solana Explorer:
在你的终端中,输入以下命令来获取你的代币账户:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
我们仅需通过 --owner
标志传递我们要查询的钱包地址,使用 --token
标志传递我们要查询的代币铸币地址,以及使用 --verbose
标志获得更详细的响应(这是本查询所必需的)。-um
标志告诉 CLI 使用 Solana 主网集群(尽管我们的搜索是确定性的并且不需要指定集群,CLI 工具会验证我们的铸币地址确实是该集群上的有效铸币地址)。
你应该会看到类似以下的内容:
干得好!
在你的终端中创建一个新的项目目录和文件 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');
最后,通过调用 PublicKey 的 findProgramAddressSync()
方法获取你的地址:
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
你应该会看到类似以下的内容:
干得好!
注意:你也可以使用 Connection 类向 Solana 集群发送 getAssociatedTokenAddressSync
请求。此方法需要网络请求,因此性能不如 findProgramAddressSync
方法;但是,它也可以找到在关联代币程序之外创建的任何代币账户。在特定情况下,这可能会很有用。
我们上一条指令有点杂乱。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
你应该会看到两个方法返回相同的地址:
干得好!
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"\
}\
]
}
'
你应该会看到类似以下的内容:
注意:如果你愿意,可以使用像 jq 这样的包来返回格式化的 JSON 数据。
注意 result.value[0].pubkey
字段中返回了相同的地址 🙌。有关 getTokenAccountsByOwner
方法的更多信息,请查看我们的 文档。
如果你是 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 关联代币账户的地址。如果你刚刚开始你的 Solana 之旅,这里有一些可能对你有所帮助的资源:
我们很想听听你在构建什么。请在 Discord 给我们留言,或者在 Twitter 上关注我们,以获取最新信息!
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!