Solana 上的关联代币账户是什么?

Solana 账户模型组织和存储所有链上数据,关联代币账户 (ATA) 是该模型的关键部分之一。本文将解释什么是 ATA、它如何工作以及如何为自己创建关联代币账户。

什么是关联代币账户?

关联代币账户是通过 Solana 关联代币账户程序创建的,其中包含有关特定代币、其余额及其所有者的信息。它是程序派生地址的变体。

每个术语的含义如下:

  • 关联 代币 账户——与代币关联的账户(类似 Solana 代币计划)
  • 程序 派生 地址- 从 Solana 程序(即关联代币账户程序)“派生”(创建)的地址

关联代币账户以及它们之间的转账如何运作? 

关联代币账户之间的转账直接在账户之间进行,或通过其钱包地址间接进行。

代币账户相当于以太坊上的 ERC-20 代币,但有一个根本的区别:以太坊智能合约拥有其状态和代码,而 Solana 上的代币账户仅包含其代码并将其状态(例如代币余额)“导出”到关联代币账户中,该账户是为该代币的每个所有者创建的。

让我们快速检查一下 USDC,以了解迄今为止我们学到的内容:

  • Solana 上的 USDC 是一个代币账户
  • 代币账户由系统程序创建,但由 SPL 代币程序初始化为代币铸币
  • 一旦 USDC 代币启动,用户就可以开始转账
  • 拥有 USDC 代币的用户拥有通过关联代币账户计划 (ATP) 创建的关联代币账户
  • 两个人之间的 USDC 交换发生在用户的 ATA 之间
Solana 上的关联代币账户
Solana 上的关联代币账户

USDC 转账直接发生在用户的 ATA 之间,并间接发生在Solana 节点上的钱包地址之间。这些转账必须在使用相同代币铸币种子创建 ATA 的用户之间进行。

关联代币账户计划是什么?

作为Solana 程序库的一部分,关联代币帐户程序是每个 ATA 的父程序,它将用户的钱包映射到他有权限的 ATA。 此外,ATA 程序确保如果用户想要将代币发送给另一个用户,即使收件人没有相应代币的 ATA,收件人也会收到它。在这种情况下,当智能合约在RPC 节点上执行时,程序将自动创建一个 ATA 帐户。

关联代币账户程序的源代码是用 Rust 编写的,可以在GitHub上查看。

以下是 TypeScript 内部创建 ATA 的方法:

在 Solana 上创建关联账户程序的源代码
在 Solana 上创建关联账户程序的源代码

关联代币账户计划如何运作?

以下是 ATA 计划中的进展情况:

1. 获取常量的 ID

首先,我们获取 `TOKEN_PROGRAM_ID` 和 `SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID` 常量。程序 ID 是程序地址的更花哨的名称。

2. 获取 findAssociatedTokenAddress 函数

然后,我们继续执行“findAssociatedTokenAddress”函数,该函数返回publicKey,它将是新创建的ATA的地址。

3. 调用 findProgramAddress 方法

在函数主体中,调用`findProgramAddress`方法并向其传递两个参数:

  • 种子阵列
  • SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID

由于 ATA 是程序派生地址 (PDA) 的一种形式,因此可以通过向程序传递参数来创建帐户。创建 PDA 涉及传递种子作为参数,在本例中,它们是:

  1. wallet_address - 账户地址,将拥有 ATA(授权机构
  2. token_program_id - SPL 代币计划的计划 ID
  3. token_mint_address - 将存储在 ATA 中的代币账户的地址

关联Token账户程序的ID为SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID。

如何创建关联代币账户

创建关联代币账户非常简单,只需使用 Solana 上的 spl-token-cli 调用 create-token 即可。创建 ATA 还假定与其“关联”的代币已经存在。

在 Solana 上创建关联代币账户
在 Solana 上创建关联代币账户

代码调用“create-account”命令,该命令接受“<TOKEN_MINT_ADDRESS>”作为参数。

要创建关联代币账户,您必须遵循以下四个步骤:

  1. 转移 SOL - 系统程序初始化 ATA 并使其免租
  2. 创建可用空间 — 系统程序为 ATA 分配可用空间。
  3. 转移所有权 - 系统程序将账户所有权转移给 SPL 关联代币账户程序
  4. 初始化帐户 - 该过程总结帐户初始化并设置代币地址、新创建的 ATA 地址及其所有者

业主和当局有什么区别?

所有者是控制 ATA 的 Solana 程序类型,而授权者是账户(钱包),它向所有者程序发送交易,然后所有者程序代表授权者更改 ATA 中的数据。

关联代币账户的费用是多少?

默认情况下,关联代币账户在创建时必须标记为免租金,因此账户必须持有的最低金额至少为 0.00203928 SOL。系统程序将此 SOL 转移到 ATA,从发起交易的账户中扣除。 

除了初始费用外,任何进一步互动的费用都不会超过 Solana 上的普通交易费用。

如何查看关联代币账户

您可以通过 Phantom 等客户端检查关联代币账户,这些客户端会自动导出用户钱包拥有权限的所有 ATA。此外,由于区块链是公开的,您还可以借助 Solscan.io 等浏览器访问此信息。

粘贴您想要检查的钱包地址,其 ATA 将在代币账户下显示:

Solscan.io 界面用于检查钱包的 ATA
Solscan.io 界面用于检查钱包的 ATA

您能将关联代币账户链接到现有账户吗?

将关联代币账户链接到现有账户是默认在后台完成的。由于 ATA 的创建方式, 程序或客户端可以轻松查看每个账户的种子。它们可以被视为以下“链接”:

  • 对 ATA 具有权限的钱包。
  • Token账户的地址(即ATA持有的Token类型)。

本文由 SlerfTools 翻译自 What is an Solana Associated Token Account on Solana?