GTokenTool全网最好的代币发行工具平台
当前位置:首页 >> solana教程 >> 查找 Solana 钱包和 Mint 关联代币地址的六种方法

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

admin solana教程 97

无论您是查询代币帐户余额还是构建代币转移指令,了解如何获取用户的代币帐户地址都是任何 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-cli3.1.1
节点.js16.15
卷曲8.1.12
@solana/web3.js2.0
@solana/spl-令牌0.3.7
solana-sdk1.16.14
spl-关联代币账户2.2.0
货物1.69.0
@solana-program/token0.4.1

SPL 代币账户

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

我们的第一种方法是使用 Solana SPL-Token CLI 检查钱包余额。如果您尚未安装它,请按照spl.solana.com/token上针对您的操作环境的说明进行操作。为确保安装成功,请打开一个新终端并输入:

spl-token --version

你应该看到类似这样的内容:

'Solana CLI 版本检查'

您已准备就绪!您需要做的就是准备好您的钱包地址 - 您可以直接从 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 结果'

在终端中创建一个新的项目目录和文件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');
用于简化调试的日志

您现在可以访问 RPC 端点的日志,从而帮助您更有效地解决问题。如果您在 RPC 调用中遇到问题,只需检查 QuickNode 仪表板中的日志即可快速识别和解决问题。在我们的定价页面上了解有关日志历史记录限制的更多信息。

在第 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

你应该看到类似这样的内容:

“Solana-Web3.js 结果”

做得好!

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

我们最后的指令有点混乱。 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

您应该看到两种方法返回相同的地址:

“Solana 代币计划结果”

做得好!

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

你应该看到类似这样的内容:

'Solana cURL 结果'注意:如果愿意,您可以使用jq之类的包来返回格式化的 JSON 数据。

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

如果你是 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

你应该会看到返回相同的令牌地址:

“Solana Rust 结果”

做得好!

在终端中创建一个新的项目目录和文件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 地址。

作者:GTokenTool一键发币平台

交流群:https://t.me/+Kz4u3xoDpFo3ZWY1

同类推荐