检查 Solana SPL 代币账户余额的五种方法
2025-03-11 18:00
登链社区
2025-03-11 18:00
订阅此专栏
收藏此文章

登链社区


概述

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

如果你想更加系统的学习 Solana 开发,可以订阅我们的“Solana 60 天课程”专栏,本专栏旨在帮助具有以太坊或 EVM 开发的初学者或中级背景的工程师快速掌握 Solana 程序开发。订阅链接:https://learnblockchain.cn/column/119/intro (或扫码文末二维码订阅)
  • 使用 Solana 的 SPL-Token 命令行接口 (SPL-Token CLI) ( 跳转到 SPL-Token CLI)
  • 使用 Solana 的 JavaScript API ( 跳转到 Solana-Web3.js)
  • 使用 Solana 的 SPL Token Program API ( 跳转到 SPL Token Program)
  • 使用 cURL 脚本 ( 跳转到 cURL)
  • 使用 Rust ( 跳转到 Rust)
你需要的条件
  • 已安装最新版本的 Solana CLI
  • 已安装最新版本的 SPL Token Program CLI
  • 已安装 Nodejs(版本 16.15 或更高)
  • 基本的 JavaScript 经验
  • 已安装稳定版本的 cURL
  • 要查询的代币账户(例如,2gS6PA4z17TuboiWyowsHDzdMbhhb4v5GBGSXBQqLG2U)。如果你不知道你的代币账户地址,请查看我们的 指南:查找 Solana 钱包和铸币的关联代币地址的五种方法
依赖项版本
solana-cli1.16.14
spl-token-cli3.1.1
node.js16.15
curl8.1.12
@solana/web3.js1.78.5
@solana/spl-token0.3.7
solana-sdk1.16.14
solana-client1.6.14
cargo1.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

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

image-20240930222847819.png

你准备好了!你只需要将你的代币账户地址准备好——如果你不知道你的代币账户地址,请查看我们的 指南:查找 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 并在 这里 注册一个 免费的 账户。你将需要一个主网节点以查询钱包的真实余额:

image-20240930222847819.png

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

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

干得不错!

方法 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

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

image-20240930222847819.png

干得不错!

方法 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

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

image-20240930222847819.png

干得不错!

方法 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"]}'

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

image-20240930222847819.png
注意:如果你偏好格式化的 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

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

image-20240930222847819.png

干得不错!

总结

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

  • Solana 基础知识
  • Solana 文档
image-20240930222847819.png
  • 原文链接:quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

登链社区是一个 Web3 开发者社区,通过构建高质量技术内容平台和线下空间,助力开发者成为更好的 Web3 Builder。

登链社区

  • 登链社区网站 : learnblockchain.cn

  • 开发者技能认证 : decert.me

  • B 站 : space.bilibili.com/581611011

  • YouTube : www.youtube.com/@upchain

登链社区

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

登链社区
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开