检查 Solana SPL 代币账户余额的五种方法

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

这篇文章详细介绍了在Solana上检查SPL代币账户余额的五种方法,包括使用SPL-Token命令行接口、JavaScript API、SPL Token程序API、cURL脚本和Rust语言,文中提供了具体的代码示例和使用步骤,非常适合开发者了解和应用。

概述

如果你计划在 Solana 上构建 DeFi 协议、钱包、NFT 平台或任何类型的支付应用程序,你需要能够检查 Solana SPL 代币账户的余额。在本指南中,我们将介绍五种简单的方法来检查 SPL 代币账户的余额:

你需要的条件
依赖项 版本
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
solana-client 1.6.14
cargo 1.69.0

Solana 基础知识:集群

在查询我们的代币账户之前,让我们快速回顾一下 Solana 的集群,因为在检查钱包余额时,我们需要指定一个特定的集群。“Solana 集群是一组验证者共同工作,以服务客户交易并维护账本的完整性。许多集群可能共存。” (来源:docs.solana.com/cluster/overview)。实际上,Solana 维护三个各自服务于不同目的的集群:

  • Mainnet Beta:生产、无许可的环境,使用真实代币
  • Devnet:应用开发者测试 Solana 应用程序的游乐场(Devnet 上的代币不真实,没有财务价值)。Devnet 通常与 Mainnet Beta 运行相同的软件版本
  • Testnet:Solana 核心贡献者和验证者进行新更新和功能压力测试的环境,重点是测试网络性能(Testnet 上的代币不真实,没有财务价值)

来源:docs.solana.com/clusters

在本指南中,我们将使用 Mainnet-Beta,但你应该知道一个钱包可以同时在每个集群上有余额。

方法 1 - SPL-Token CLI

我们首先的方法是使用 Solana SPL-Token CLI 检查钱包的余额。如果尚未安装,请按照你操作环境的说明访问 spl.solana.com/token。为了确保你的安装成功,请打开一个新的终端并输入:

spl-token --version

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

‘Solana CLI 版本检查’

你准备好了!你只需要将你的代币账户地址准备好——如果你不知道你的代币账户地址,请查看我们的 指南:查找 Solana 钱包和铸币的关联代币地址的五种方法

在你的终端中,通过输入以下命令获取你的钱包余额:

spl-token balance --address YOUR_TOKEN_ACCOUNT_ADDRESS -um

Solana 基础知识:集群

你可以通过修改 -u(Solana 的 JSON RPC 的 URL)选项来修改搜索,以获取该钱包在不同集群上的余额。我们使用 -um 确保我们正在 Solana 的主网上进行搜索。要获取 devnet 或 testnet 的余额,请尝试:

spl-token balance --address YOUR_TOKEN_ACCOUNT_ADDRESS -u devnet # 用于 Devnet
## 或
spl-token balance --address YOUR_TOKEN_ACCOUNT_ADDRESS -u testnet # 用于 Testnet

这些默认集群(mainnet-beta、testnet、devnet)是公共 JSON RPC 端点。如果你计划进行大量查询或在 Solana 上构建,你可能希望拥有自己的端点。

看看为什么超过 50% 的 Solana 项目选择 QuickNode 并在 这里 注册一个 免费的 账户。你将需要一个主网节点以查询钱包的真实余额:

‘Solana 主网端点’

你现在可以修改查询以使用你的端点:

spl-token balance --address YOUR_TOKEN_ACCOUNT_ADDRESS -u https://example.solana.quiknode.pro/000000/

‘Solana CLI 结果’

干得不错!

方法 2 - Solana-Web3.js

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

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

安装 Solana Web3 依赖项:

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

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

在你选择的代码编辑器中打开 balance.js,并在第一行引用 @solana/web3.js。我们将从此包中解构 ConnectionPublicKey 类。

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

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

const QUICKNODE_RPC = 'https://example.solana.quiknode.pro/000000/'; // 👈 替换为你的 QuickNode 端点或 clusterApiUrl('mainnet-beta')
const SOLANA_CONNECTION = new Connection(QUICKNODE_RPC);
const TOKEN_ADDRESS = new PublicKey('YOUR_TOKEN_ACCOUNT_ADDRESS'); //👈 替换为你的钱包地址

最后,通过创建并调用一个新函数 getTokenBalanceWeb3() 来获取你的地址,该函数调用 Connection 类上的 getTokenAccountBalance 方法:

async function getTokenBalanceWeb3(connection, tokenAccount) {
    const info = await connection.getTokenAccountBalance(tokenAccount);
    if (info.value.uiAmount == null) throw new Error('未找到余额');
    console.log('余额 (使用 Solana-Web3.js): ', info.value.uiAmount);
    return info.value.uiAmount;
}

getTokenBalanceWeb3(SOLANA_CONNECTION, TOKEN_ADDRESS).catch(err => console.log(err));

返回的值包括 amountuiAmountamount 响应包含基于代币铸币的额外小数。这是因为 Solana 在链上将小数存储为整数以避免浮点数学。uiAmount 响应是 amount 除以铸币小数。例如,如果 amount 是 1000000000,而铸币小数值为 9,则 uiAmount 将为 1。如果 amount 是 1000000000,而铸币小数值为 6,则 uiAmount 将为 1000。

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

node balance

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

‘Solana-Web3.js 结果’

干得不错!

方法 3 - Solana Token Program

Solana SPL Token API 使这个过程变得更加简单。让我们看看如何使用 SPL Token API 获取关联代币账户的地址。

首先,安装 SPL Token Program:

yarn add @solana/spl-token

npm install --save @solana/spl-token

打开 balance.js,在第一行(在之前的导入之前)引用 @solana/spl-token。我们将从此包中解构 getAccountgetMint 方法。

const { getAccount, getMint } = require('@solana/spl-token');

现在,在脚本的底部创建并调用一个新函数 getTokenBalanceSpl,该函数将获取你的代币账户,然后获取与该代币账户关联的铸币(以处理小数):

async function getTokenBalanceSpl(connection, tokenAccount) {
    const info = await getAccount(connection, tokenAccount);
    const amount = Number(info.amount);
    const mint = await getMint(connection, info.mint);
    const balance = amount / (10 ** mint.decimals);
    console.log('余额 (使用 Solana-Tokene Program): ', balance);
    return balance;
}

getTokenBalanceSpl(SOLANA_CONNECTION, TOKEN_ADDRESS).catch(err => console.log(err));

尽管这种方法稍微冗长,但它是获取代币账户余额和处理小数的好方法。请注意,我们必须将 getAccount 调用返回的 amount 转换为数字(因为返回的值是 bigint),并且我们必须获取代币铸币的详细信息以获取小数(然后我们将其用于将 amount 除以以得到余额)。

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

node balance

你应该会看到这两种方法返回相同的余额:

‘Solana Token Program 结果’

干得不错!

方法 4 - cURL

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

curl -h

如果你没有安装,请前往 curl.se 进行设置。

准备好后,你只需在终端中放入以下 HTTP 请求(确保替换你的端点和代币账户地址)。在你的终端中输入:

curl https://docs-demo.solana-mainnet.quiknode.pro/ \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0", "id":1, "method":"getTokenAccountBalance", "params": ["YOUR_TOKEN_ACCOUNT_ADDRESS"]}'

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

‘Solana cURL 结果’ 注意:如果你偏好格式化的 JSON 数据,可以使用像 jq 的包。

注意到在 result.value.uiAmount 字段中返回了相同的余额 🙌。请查看我们的 文档 以获取有关 getTokenAccountBalance 方法的更多信息。

方法 5 - Rust

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

cargo new token-balance

导航到新创建的目录:

cd token-balance

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

[dependencies]
solana-sdk = "1.16.14"
solana-client = "1.6.14"

打开 src/main.rs,在第 1 行中导入必要的包:

use solana_sdk::pubkey::Pubkey;
use solana_client::rpc_client::RpcClient;
use std::str::FromStr;

在第 5-6 行中,定义你的代币账户地址:

const TOKEN_ADDRESS: &str = "YOUR_TOKEN_ADDRESS";

最后,创建你的 main 函数,通过将你所有者和铸币的公钥传入 get_token_account_balance 方法来获取你的地址:

fn main() {
    let associated_token_address = Pubkey::from_str(TOKEN_ADDRESS).unwrap();
    let connection = RpcClient::new("https://example.solana.quiknode.pro/000000/".to_string()); // 👈 替换为你的 QuickNode 端点
    let account_data = connection.get_token_account_balance(&associated_token_address).unwrap();
    println!("代币余额 (使用 Rust): {}", account_data.ui_amount_string);
}

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

cargo build
cargo run

你应该会看到返回你的相同代币地址的结果:

‘Solana Rust 结果’

干得不错!

总结

做得很好!你现在拥有了五个有用的工具,用于获取 Solana SPL 代币账户的余额。如果你刚刚开始你的 Solana 之旅,以下是一些可能有用的资源:

我们希望听到更多关于你正在构建的内容。在 Discord 上给我们留言,或者在 Twitter 上关注我们,及时了解所有最新信息!

我们 ❤️ 反馈!

告诉我们 如果你有任何反馈或对新主题的请求。我们期待你的来信。

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

0 条评论

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