Solana 上的资产

代币是代表不同类别资产所有权的数字资产。代币化使财产权利的数字化成为可能。Solana 上的代币被称为 SPL(Solana Program Library)代币。

The Token Program updates a mint and its token accounts while owners authorize balance changes

本节介绍了代币在 Solana 上的基本表示方式。代码示例请参考 SPL 代币基础 部分。

关键要点

  • Token Programs 包含与网络上代币(包括同质化和非同质化代币)进行交互的所有指令逻辑。

  • Mint Account 代表某一特定代币,并存储该代币的全局元数据,如总发行量和铸造权限(有权创建新代币单位的地址)。

  • Token Account 用于跟踪特定所有者在特定 mint account 下的代币持有情况。

  • Associated Token Account 是通过所有者和 mint account 地址派生出的 Token Account。

Token Program

Solana 生态系统有两个主要的 Token Program。以下是这两个程序的源代码。

Token Programs 包含与网络上代币(包括同质化和非同质化代币)进行交互的所有指令逻辑。Solana 上的所有代币本质上都是由 Token Program 拥有的数据账户

Token ProgramToken Program

Mint Account

Solana 上的代币由 Token Program 拥有的 Mint Account 地址唯一标识。该账户作为某一特定代币的全局计数器,并存储如下数据:

  • Supply:该代币的总发行量
  • Decimals:代币的小数精度
  • Mint authority:有权铸造新代币、增加总供应量的账户
  • Freeze authority:有权冻结 Token Account 中代币、阻止其转账或销毁的账户

铸币权限在 mint account 初始化时进行配置。它授权未来的铸币操作,但不要求必须是创建或支付 mint account 的账户。

Mint AccountMint Account

每个 mint account 存储的完整信息包括:

Mint Account State
pub struct Mint {
/// Optional authority used to mint new tokens. The mint authority may only
/// be provided during mint creation. If no mint authority is present
/// then the mint has a fixed supply and no further tokens may be
/// minted.
pub mint_authority: COption<Pubkey>,
/// Total supply of tokens.
pub supply: u64,
/// Number of base 10 digits to the right of the decimal place.
pub decimals: u8,
/// Is `true` if this structure has been initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

供参考,这里有一个 Solana Explorer 上的 USDC mint account 链接。

Token Account

Token Program 会创建 token account,用于追踪每个代币单位的个人持有情况。token account 会存储如下数据:

  • Mint:该 token account 持有的代币
  • Owner:有权从该 token account 转移代币的账户
  • Amount:该 token account 当前持有的代币数量

Token AccountToken Account

每个 token account 存储的完整信息包括:

Token Account State
pub struct Account {
/// The mint associated with this account
pub mint: Pubkey,
/// The owner of this account.
pub owner: Pubkey,
/// The amount of tokens this account holds.
pub amount: u64,
/// If `delegate` is `Some` then `delegated_amount` represents
/// the amount authorized by the delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub state: AccountState,
/// If is_native.is_some, this is a native token, and the value logs the
/// rent-exempt reserve. An Account is required to be rent-exempt, so
/// the value is used by the Processor to ensure that wrapped SOL
/// accounts do not drop below this threshold.
pub is_native: COption<u64>,
/// The amount delegated
pub delegated_amount: u64,
/// Optional authority to close the account.
pub close_authority: COption<Pubkey>,
}

每个钱包想要持有某个代币(mint)时,都需要一个对应的 token account,并将钱包地址设置为 token account 的 owner。每个钱包可以拥有多个相同代币(mint)的 token account,但每个 token account 只能有一个 owner,并且只能持有一种代币(mint)。

账户关系账户关系

请注意,每个 Token Account 的数据中都包含一个 owner 字段,用于标识谁对该 Token Account 拥有权限。这与基础 Account 类型中指定的程序所有者不同,后者对所有 Token Accounts 而言均为 Token Program。

关联代币账户

Associated Token Account 简化了查找特定 mint 和所有者的 token account 地址的流程。你可以将 Associated Token Account 理解为某个 mint 和所有者的“默认” token account。

Associated Token Account 是通过从所有者地址和 mint account 地址派生出的地址创建的。需要注意的是,Associated Token Account 其实就是一个具有特定地址的 token account。

这引入了 Solana 开发中的一个关键概念:Program Derived Address (PDA)。PDA 通过预定义的输入确定性地派生出一个地址,使得查找账户地址变得简单。

Associated Token AccountAssociated Token Account

请注意,每个钱包都需要自己的 token account 来持有同一个 mint 的代币。

账户关系扩展账户关系扩展

Is this page helpful?

Table of Contents

Edit Page
©️ 2026 Solana 基金会版权所有