什么是Solana SPL代币扩展,以及如何开始使用?

  • QuickNode
  • 发布于 2025-01-30 15:43
  • 阅读 14

Solana Labs推出了Token-2022扩展,这是对原有SPL代币程序的新标准,增加了Token扩展功能,旨在为开发者提供更灵活和具有高度可扩展性的代币标准。新标准引入了多种新功能,包括转移费用、关闭铸币、持有利息的代币等,支持更复杂的代币经济模型。同时,Token-2022程序与其前身兼容,并可通过更新方法和指令进行功能扩展。

概述

Solana Labs 发布了对本地 SPL 代币程序的扩展,Token-2022。Token-2022 是一种新的标准,扩展了 SPL 代币程序,并通过 Token Extensions 增加了额外的功能。Token-2022 程序旨在提供更灵活和可扩展的代币标准,使开发人员可以实现更复杂的代币经济学和控制。

什么是 Token Extensions?

Token Extensions(也称为 Token-2022)是在 Solana 区块链上一个高级代币程序,扩展了现有 Token Program 的能力。它旨在为开发人员提供增强的灵活性和额外的功能,而不会影响当前代币的安全性。

该程序涵盖了其前身的所有功能(与原始 Token 指令和账户布局保持兼容),同时提供新的指令和功能。这些扩展在铸造和账户中引入了新字段。

当前的铸造扩展包括:

特性 描述
转账费用 与转移代币相关的费用(或税收)。
关闭铸造 允许终止空铸造账户。
计息代币 随时间累积利息的代币。
非可转移代币 一旦发行就不能转移的代币(即,灵魂绑定代币)。
永久委托 该权限对该铸造的任何账户具有无限的委托权限,这意味着它可以销毁或转移任何数量的代币。
转账钩子 需要与代币指令交互的程序(例如,版权费的执行)。
元数据指针 指向包含铸造信息的元数据账户的指针。
元数据 存储有关铸造的信息,例如名称、符号和标志(或其他自定义字段)。
(尚未上线)保密转账 允许使用加密金额进行代币转移。

当前的账户扩展包括:

特性 描述
收到转账时需要备忘录 所有收到的转账必须附有说明(类似于银行账户)。
不可变所有权 一旦设定,账户所有权无法更改。
默认账户状态 适用于账户的预设条件。
CPI 保护 禁止某些跨程序调用内的操作。

需要注意的是,相关代币程序保持不变,这意味着它可以与原始 Token Program 和 Token-2022 Program 一起使用。然而,使用现有的方法、程序和指令时,你需要将 Token-2022 程序 ID 作为 programId 参数传递。例如,让我们看看来自 @solana/spl-token 库的 getAssociatedTokenAddressSync

/**
 * 获取给定铸造和所有者的关联代币账户的地址
 *
 * @param mint                     代币铸造账户
 * @param owner                    新账户的所有者
 * @param allowOwnerOffCurve       允许所有者账户成为 PDA(程序派生地址)
 * @param programId                SPL Token 程序账户
 * @param associatedTokenProgramId SPL 关联代币程序账户
 *
 * @return 关联代币账户的地址
 */
export function getAssociatedTokenAddressSync(
    mint: PublicKey,
    owner: PublicKey,
    allowOwnerOffCurve = false,
    programId = TOKEN_PROGRAM_ID,
    associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID
): PublicKey {
    if (!allowOwnerOffCurve && !PublicKey.isOnCurve(owner.toBuffer())) throw new TokenOwnerOffCurveError();

    const [address] = PublicKey.findProgramAddressSync(
        [owner.toBuffer(), programId.toBuffer(), mint.toBuffer()],
        associatedTokenProgramId
    );

    return address;
}

正如你看到的,getAssociatedTokenAddressSync 函数接受一个默认为原始 Token Program ID 的 programId 参数(对于许多 SPL 代币方法来说是典型的)。要使用 Token-2022 程序,你必须将 Token-2022 程序 ID 作为 programId 参数传递。下面的示例显示了原始 Token Program 和 Token-2022 程序的 ata 地址的派生:

import { TOKEN_2022_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token";
// ...
const mint: PublicKey = new PublicKey(SOME_TOKEN_MINT); // 使用原始标准创建的代币铸造
const mint2022: PublicKey = new PublicKey(SOME_TOKEN_MINT_2022); // 使用 Token-2022 标准创建的代币铸造
const ataOld = getAssociatedTokenAddressSync(mint, owner, false);
const ata2022 = getAssociatedTokenAddressSync(mint2022, owner, false, TOKEN_2022_PROGRAM_ID); // 👈 传入 Token-2022 程序 ID

请注意,对于 mint2022,我们必须将 TOKEN_2022_PROGRAM_ID(TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb)作为 programId 参数进行传递。

2022 程序仍在审核中,但可用于测试和开发。

如何开始使用 Token Extensions

查看我们的指南,了解如何开始使用 Token-2022 程序:

我们 ❤️ 反馈!

请告诉我们 如果你有任何反馈或对新主题的请求。我们期待你的回复。

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。