无论您是查询代币帐户余额还是构建代币转移指令,了解如何获取用户的代币帐户地址都是任何 Solana 开发人员的基本技能。在本指南中,我们将介绍六种简单的方法来获取与 Solana SPL 关联的代币帐户的地址:
使用 Solana 的 SPL-Token 命令行界面 (SPL-Token CLI)
使用 Solana 的 JavaScript API(旧版 v.1x)
使用 Solana 的 SPL 代币计划 API
使用 cURL 脚本
使用 Rust
使用 Solana Web3.js v2.0
依赖 | 版本 |
---|---|
solana 命令行工具 | 1.16.14 |
spl-token-cli | 3.1.1 |
节点.js | 16.15 |
卷曲 | 8.1.12 |
@solana/web3.js | 2.0 |
@solana/spl-令牌 | 0.3.7 |
solana-sdk | 1.16.14 |
spl-关联代币账户 | 2.2.0 |
货物 | 1.69.0 |
@solana-program/token | 0.4.1 |
SPL 代币账户
在深入研究代码之前,让我们花点时间回顾一下什么是代币账户,以及它与 Solana 钱包地址有何不同。与 Solana 生态系统的大多数元素一样,代币账户建立在 Solana 的账户模型上。这意味着代币账户实际上是与特定代币铸币厂相关联的 Solana 账户。这些账户归 SPL 代币计划 ( TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
) 所有,并由用户的钱包地址控制。虽然可以将多个代币账户与一个钱包地址相关联,但每个代币账户对于特定的铸币厂都是唯一的。为了减少代币管理中的摩擦,Solana 引入了关联代币计划,这是一种将用户的钱包确定性地映射到关联铸币厂的代币账户的方法。本指南将重点介绍如何获取给定钱包和铸币厂的关联代币账户的地址。
方法 1-SPL-Token CLI
我们的第一种方法是使用 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 工具会验证我们的铸币地址实际上是该集群上的有效铸币地址)。
你应该看到类似这样的内容:
方法 2-SolanaWeb3.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 ,在第 1 行,需要@solana/web3.js。我们将从此包中解构PublicKey类。
const { PublicKey } = require('@solana/web3.js');
在第 3-6 行,定义您的钱包、铸币和相关程序(代币程序和相关代币程序):
const OWNER = new PublicKey('YOUR_WALLET_ADDRESS'); // e.g., E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk
const MINT = new PublicKey('YOUR_MINT_ADDRESS'); // e.g., 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('Using Solana-Web3.js: ', address.toBase58());
该findProgramAddressSync
方法根据给定的种子和程序 ID 确定性地找到程序地址。在本例中,我们将钱包地址、代币程序 ID 和铸币地址作为种子传递,将关联的代币程序 ID 作为程序 ID 传递(这些种子及其顺序由关联的代币程序定义)。
运行你的代码。在终端中输入:
node address
你应该看到类似这样的内容:
做得好!
注意:您也可以使用Connection类向 Solana 集群发送getAssociatedTokenAddressSync
请求。此方法需要网络请求,因此其性能不如该findProgramAddressSync
方法;但是,它还会找到在相关代币程序之外创建的任何代币账户。在某些情况下,这可能很有用。
方法 3 - Solana 代币计划
我们最后的指令有点混乱。 Solana SPL Token API 使这个过程变得更容易一些。 让我们看看如何使用 SPL Token API 获取关联代币帐户的地址。
继续在与上一种方法相同的项目目录中安装 SPL 令牌程序:
yarn add @solana/spl-token
或者
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
0
打开address.js,在第 1 行(在我们之前的导入之前)需要@solana/spl-token。我们将从getAssociatedTokenAddressSync
这个包中解构该方法。
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
1
现在,在脚本的底部,getAssociatedTokenAddressSync
通过传递钱包和铸币地址作为参数来调用该方法:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
2
更简洁,对吧?这是因为,在底层,SPL Token API 使用的findProgramAddressSync
方法与我们在上一个示例中使用的方法相同。您可以按住 ctrl/cmd 并单击该getAssociatedTokenAddressSync
方法来查看源代码。
运行你的代码。在终端中输入:
node address
您应该看到两种方法返回相同的地址:
做得好!
方法 4URL
cURL 是一个命令行工具和库,用于通过 URL 传输数据。大多数基于 *nix 的系统都具有现成的 cURL 支持。运行以下命令检查您是否具有该支持:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
4
如果您尚未安装,请前往curl.se进行设置。
准备就绪后,您需要做的就是将此 HTTP 请求放入终端中(确保替换您的端点、钱包地址和铸币地址)。在您的终端中输入:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
5
你应该看到类似这样的内容:
注意:如果愿意,您可以使用jq之类的包来返回格式化的 JSON 数据。
请注意,字段中返回了相同的地址result.value[0].pubkey
🙌。查看我们的文档以获取有关该方法的更多信息getTokenAccountsByOwner
。
方法 5Rust
如果你是 Rust 开发人员,你也可以使用Solana Rust SDK。在项目文件夹中,使用以下命令启动一个新项目:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
6
导航到新创建的目录:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
7
将必要的依赖项添加到您的Cargo.toml文件:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
8
打开src/main.rs,在第 1 行导入必要的包:
spl-token address --owner OWNER_WALLET_ADDRESS --token TOKEN_MINT_ADDRESS --verbose -um
9
在第 5-6 行,定义您的所有者和铸币地址:
mkdir token-address && cd token-address && echo > address.js
0
最后,main
通过将你的所有者和铸币者的公钥传递到get_associated_token_address
方法中来修改你的函数,该函数将获取你的地址:
mkdir token-address && cd token-address && echo > address.js
1
编译并运行代码。在终端中输入:
mkdir token-address && cd token-address && echo > address.js
2
你应该会看到返回相同的令牌地址:
做得好!
方法 6 - Solana-Web3.js 2.0
在终端中创建一个新的项目目录和文件balance.js ,并使用以下命令:
mkdir token-address && cd token-address && echo > address.js
3
安装 Solana Web3.js 2.0 依赖项:
mkdir token-address && cd token-address && echo > address.js
4
或者
mkdir token-address && cd token-address && echo > address.js
5
在所选的代码编辑器中打开address.tsaddress
,在第 1 行,从@solana/web3.js包和@solana-program/tokenfindAssociatedTokenPda
包导入:
mkdir token-address && cd token-address && echo > address.js
6
使用类型安全的方法定义您的所有者、铸币厂和代币程序address
:
mkdir token-address && cd token-address && echo > address.js
7
最后,通过调用findAssociatedTokenPda
方法并解构结果来获取您的地址:
mkdir token-address && cd token-address && echo > address.js
8
运行你的代码。在终端中输入:
mkdir token-address && cd token-address && echo > address.js
9
您应该会在终端中看到返回的 ATA 地址。