Skip to content

代币基础

作者 崔棉大师 X:@MasterCui Youtube: 崔棉大师

知识点

  • 本章节讲述通过 spl-token 客户端在命令行中创建同质化 Token,铸造 Token,查询余额,转移代币,以及创建代币的元数据

课程

在课程开始之前,请确认 solana 客户端配置到了 devnet 开发网,同时牧人账户也已经领取到了空投的测试币

查询余额:

sh
$ solana balance
10.34331731 SOL

1.创建同质化 Token

参考 1

参考 2

要创建新代币(mint 帐户),请在终端中运行以下命令。

sh
$ spl-token create-token
Creating token BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Address:  BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
Decimals:  9

Signature: 5DPHNBYAMXVgqDJWhbJDCki4JABFhC3x6GyTUaviTTgyLBHGPUeJUiqKwbfjzKVttBQmhwW97eDttTCnMmz7PZqy
  • BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ是代币的唯一标识符也是代币地址,同时也是一个数据地址,存储着代币的数据。
  • TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA是代币的程序,代币地址存储数据,代币程序为可执行程序,不存储数据。
  • 5DPHNBYAMXVgqDJWhbJDCki4JABFhC3x6GyTUaviTTgyLBHGPUeJUiqKwbfjzKVttBQmhwW97eDttTCnMmz7PZqy是交易的签名,你可以通过交易签名在区块链浏览器中查询到这笔交易的详情
  • 在创建 Token 过程中,系统做了以下操作
    • 调用系统程序创建一个具有足够空间容纳 mint 帐户数据的新帐户, 然后将所有权转移到代币程序。
    • 调用代币程序将新账户的数据初始化为铸币账户

通过 spl-token 最初创建的代币供应量为 0,我们通过命令查询一下这个 Token 的总供应量:

sh
spl-token supply <TOKEN_ADDRESS>

例如:

sh
$ spl-token supply BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
0

2.创建代币账户

要持有特定代币的单位,您必须首先创建一个代币账户。 若要创建新的代币帐户,请使用以下命令:

sh
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

例如:

sh
$ spl-token create-account BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
Creating account 5j2DQUJbSd6qd1bRBE2ygoAAFTaDHkovxYgubrQbUVwn
Signature: 5vqjC8tZRES8FoucefdNvJMtpRM9WerWvMMy29QTJ6Uf6nE1zCZErWB34eBJaPrXE4iaWvBDuYJX7Mdjzb7fUyNM
  • 5j2DQUJbSd6qd1bRBE2ygoAAFTaDHkovxYgubrQbUVwn是为保存create-account命令中指定的代币单位而创建代币帐户的地址。
  • 调用系统程序创建一个具有足够空间用于代币帐户数据的新帐户,然后将所有权转移给代币程序。
  • 调用代币程序,将新账户的数据初始化为代币账户
  • 默认情况下,该create-account命令会创建一个关联代币帐户, 并将你的钱包地址作为代币帐户所有者。

您可以使用以下命令创建具有不同所有者的代币帐户:

sh
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS> --fee-payer ${HOME}/.config/solana/id.json

例如:

sh
$ spl-token create-account --owner CrHB76Q9ckYJic4kt4ZqHV5wDJ9meDK8cMbDJhzfw1x9 BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ --fee-payer ~/.config/solana/id.json
Creating account B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb

Signature: PmT3TeL2LDhEHw4e1YE8KRfNqCdvp8aRCoN3C5JLw8th1TsHEpcvhki8Hjbpgmy2up8xVbB7R24hqEwvMDtPy7f

3.铸造代币

若要创建一定数量的代币,请使用以下命令:

sh
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

例如,运行以下命令:

sh
spl-token mint BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ 100
Minting 100 tokens
  Token: BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
  Recipient: 5j2DQUJbSd6qd1bRBE2ygoAAFTaDHkovxYgubrQbUVwn
Signature: 4iadCo13ktewsPUi92LpSCubkemYydQafufAZS5EVeATY3cuUDGEZbYbr8B4tpsiHuFNkcUTc5y2axthADthHcWq
  • BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ是铸造代币的铸币账户的地址(增加总供应量)
  • 5j2DQUJbSd6qd1bRBE2ygoAAFTaDHkovxYgubrQbUVwn是你的钱包代币账户的地址,代币单位正在被铸造到(增加金额)

要将代币铸造到其他代币账户,请指定预期收件人代币账户的地址。例如,运行以下命令:

sh
$ spl-token mint BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ 100 -- B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb
Minting 100 tokens
  Token: BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
  Recipient: B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb

Signature: NpwYm5aNJUgBehCtxunLFtLxqzvDmv7YosBzMing6XLXsmWdtfbtbWsCgx16emLiD3Up2rpS4u9wAZy9MQ67XPn
  • 注意这里的Recipient参数地址B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb是刚才我们为接收者地址CrHB76Q9ckYJic4kt4ZqHV5wDJ9meDK8cMbDJhzfw1x9创建的代币账户

查询余额,我们通过以下命令可以查询当前默认账户在这个 Token 中的余额:

sh
spl-token balance <TOKEN_ADDRESS>

例如:

sh
spl-token balance BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
100

查询总供应量:

sh
$ spl-token supply BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ
200

4.转移代币

若要在两个代币账户之间转移代币数量,请使用以下命令:

sh
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS
or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

例如:

sh
$ spl-token transfer BHaF2s4nowWz29w5T4XKrEqiULfay7SxP1YvjrfZzsnQ 10 B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb
Transfer 10 tokens
  Sender: 5j2DQUJbSd6qd1bRBE2ygoAAFTaDHkovxYgubrQbUVwn
  Recipient: B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb

Signature: 3sAEb7fRPjEUmJfuzH6zdy4y5skM4QELHFig8WN6G9VeUBXyC1qQXdc7ngo1nszLb2nnrufjCJvNYrfWuUNwj5Cd
  • 5j2DQUJbSd6qd1bRBE2ygoAAFTaDHkovxYgubrQbUVwn是发送者的代币账户
  • B3oQUkgdqNSX1UsY1jTXnAx6NVPpLQwbRFRQ7gaTnVkb是接收者的代币账户
  • 请务必了解,发送方和接收方都必须具有要传输的特定类型的代币的现有代币帐户。 发送方可以在交易中包含其他说明,以创建接收方的代币账户,该账户通常是关联代币账户。

5.创建代币元数据

代币扩展计划允许将其他可自定义的元数据(例如名称、符号、图像链接)直接存储在 Mint 帐户上。

若要创建启用了元数据扩展的新代币,请使用以下命令:

sh
$ spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Creating token GevvgkWZt79S7z1k6Qo8qKDmZaktVNjDMzVFZooTt3dc under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To initialize metadata inside the mint, please run `spl-token initialize-metadata GevvgkWZt79S7z1k6Qo8qKDmZaktVNjDMzVFZooTt3dc <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.

Address:  GevvgkWZt79S7z1k6Qo8qKDmZaktVNjDMzVFZooTt3dc
Decimals:  9

Signature: 3htk67A87D9YEevDvs6JZggQzABfJHTjBzgYM6NKRWLbtLJSriFhzYq2HCgA4GLVJNuVkeZ19kzKrizF8QiGzguF
  • GevvgkWZt79S7z1k6Qo8qKDmZaktVNjDMzVFZooTt3dc是在启用元数据扩展的情况下创建的新代币的地址。

一旦创建启用了元数据扩展的新代币后,请使用以下命令初始化元数据。

sh
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>

代币 URI 通常是指向要与代币关联的链下元数据的链接。你可以在 此处 找到 JSON 格式的示例。

例如,运行以下命令会将额外的元数据直接存储在指定的铸币帐户上:

sh
$ spl-token \
initialize-metadata GevvgkWZt79S7z1k6Qo8qKDmZaktVNjDMzVFZooTt3dc \
"TokenName" \
"TokenSymbol" \
"https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"

Signature: 5cB6G5SsosPdnnEVL6V5kkUzR41H1P12eiAzG5Xsa8X5hhFg4By421V27Me2YqfH5eBUf45ostMUsiw2rqSuddJZ

然后,您可以在资源管理器中查找铸币帐户的地址以检查元数据。例如,这是在 SolanaFm 资源管理器上启用元数据扩展时创建的代币。

挑战

通过 spl-token 命令行客户端完成以下挑战,具体方法可以通过运行spl-token -h获取帮助信息

  • 查询当前账户所持有的所有Token
  • 销毁 Token
  • 关闭铸造
  • 更新 metadata