Solana Labs推出了Token-2022扩展,这是对原有SPL代币程序的新标准,增加了Token扩展功能,旨在为开发者提供更灵活和具有高度可扩展性的代币标准。新标准引入了多种新功能,包括转移费用、关闭铸币、持有利息的代币等,支持更复杂的代币经济模型。同时,Token-2022程序与其前身兼容,并可通过更新方法和指令进行功能扩展。
Solana Labs 发布了对本地 SPL 代币程序的扩展,Token-2022。Token-2022 是一种新的标准,扩展了 SPL 代币程序,并通过 Token Extensions 增加了额外的功能。Token-2022 程序旨在提供更灵活和可扩展的代币标准,使开发人员可以实现更复杂的代币经济学和控制。
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-2022 程序:
请告诉我们 如果你有任何反馈或对新主题的请求。我们期待你的回复。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!