本教程介绍了如何使用Solana Kit(原Solana Web3.js 2.0)在Solana区块链上创建同质化代币。内容涵盖:环境搭建、建立RPC连接、生成密钥对、向付费账户空投SOL、创建并初始化铸币账户、创建关联代币账户(ATA)并铸造代币。文章提供了完整的TypeScript代码示例,并解释了关键组件如铸币账户、代币账户和ATA。通过本教程,读者可以学习到Solana Kit的模块化、可组合性特点,以及如何使用@solana-program/token库进行代币操作。
🛠️ 更新通知
本指南已更新,以反映 Solana Web3.js 2.0 的新名称——Solana Kit。我们遵循最新的最佳实践,帮助你保持与时俱进。在此了解 Solana Kit 的更多信息。
Solana Kit 库引入了一种与 Solana 区块链交互的新方式,强调可组合性和模块化。在本指南中,我们将探讨如何使用这个更新的库来创建同质化代币。
让我们开始吧!
编写一个脚本,使用 Solana Kit 库在 Solana 区块链上创建一个同质化代币:
| 依赖 | 版本 |
|---|---|
| @solana/kit | ^2.0.0 |
| @solana-program/system | ^0.5.0 |
| @solana-program/token | ^0.4.1 |
| solana cli | 1.18.8 |
让我们开始吧!
Solana 上的同质化代币是一种数字资产,其中每个单元与同一种代币的其他单元可以互换。这些代币使用 Solana 的代币程序创建和管理,该程序提供铸造、转移和销毁代币的功能。同质化代币可用于存储和交换价值(例如 USDC 或其他资产),作为实用工具(例如用于即将到来的 NFT 铸造的白名单代币),代表协议中的权益(例如治理代币),或者任何你能想到的其他用途。
Solana 上同质化代币的关键组件包括:
现在,让我们探索如何使用 Solana Kit 创建这些组件。
首先,设置项目:
mkdir solana-fungible-token && cd solana-fungible-token
将项目初始化为 Node.js 项目:
npm init -y
安装依赖:
npm install @solana/kit @solana-program/system @solana-program/token && npm install --save-dev @types/node typescript ts-node
注意:你可能需要使用
--legacy-peer-deps标志来安装@solana-program/system和@solana-program/token包。
在项目中添加 tsconfig.json 文件:
tsc --init --resolveJsonModule true
在项目目录中创建一个名为 create-token.ts 的新文件:
echo > create-token.ts
太好了!现在,我们准备开始编写代码。
在 create-token.ts 文件中,首先导入必要的依赖项:
import { getCreateAccountInstruction } from "@solana-program/system";
import {
findAssociatedTokenPda,
getCreateAssociatedTokenIdempotentInstructionAsync,
getInitializeMintInstruction,
getMintSize,
getMintToInstruction,
TOKEN_PROGRAM_ADDRESS
} from "@solana-program/token";
import {
airdropFactory,
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports,
sendAndConfirmTransactionFactory,
pipe,
createTransactionMessage,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners,
getSignatureFromTransaction,
setTransactionMessageFeePayerSigner,
appendTransactionMessageInstructions,
CompilableTransactionMessage,
TransactionMessageWithBlockhashLifetime,
Commitment,
} from "@solana/kit";
const LAMPORTS_PER_SOL = BigInt(1_000_000_000);
const DECIMALS = 9;
const DROP_AMOUNT = 100;
这里,我们从 Solana Kit 库和 Solana 程序库中导入了各种函数。
接下来,创建容纳脚本逻辑的 main 函数:
async function main() {
// 1 - 建立与 Solana 集群的连接
// 2 - 生成密钥对
// 3 - 向支付账户空投 SOL
// 4 - 创建铸币账户并初始化铸币
// 5 - 创建关联代币账户并铸造代币
}
main();
在 main 函数内部,建立与本地 Solana 集群的连接:
// 1 - 建立与 Solana 集群的连接
const httpEndpoint = 'http://127.0.0.1:8899';
const wsEndpoint = 'ws://127.0.0.1:8900';
const rpc = createSolanaRpc(httpEndpoint);
const rpcSubscriptions = createSolanaRpcSubscriptions(wsEndpoint);
console.log(`✅ - 已建立与 ${httpEndpoint} 的连接`);
我们使用 createSolanaRpc 和 createSolanaRpcSubscriptions 函数来创建 RPC 连接。本指南使用 localhost,但如果你准备连接远程 Solana 集群,可以使用来自 Quicknode 面板 的 Quicknode HTTP 提供者和 WSS 提供者端点。
生成代币创建过程所需的密钥对。在 main 函数的步骤 2 中添加以下代码:
// 2 - 生成密钥对
const mintAuthority = await generateKeyPairSigner();
const payer = await generateKeyPairSigner();
const owner = await generateKeyPairSigner();
const mint = await generateKeyPairSigner();
const [ata] = await findAssociatedTokenPda({
mint: mint.address,
owner: owner.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
});
console.log(`✅ - 已生成密钥对`);
console.log(` 铸币授权: ${mintAuthority.address}`);
console.log(` 支付账户: ${payer.address}`);
console.log(` 所有者: ${owner.address}`);
console.log(` 铸币: ${mint.address}`);
console.log(` 关联代币账户: ${ata}`);
这里,我们为铸币授权、支付账户、所有者和铸币账户本身生成了密钥对。我们还使用 findAssociatedTokenPda 函数派生了关联代币账户(ATA)地址。在示例中,我们将地址打印到控制台以供参考。
在创建代币之前,我们需要向支付账户存入 SOL。使用 airdropFactory 函数完成此操作。在 main 函数的步骤 3 中添加以下代码:
// 3 - 向支付账户空投 SOL
const airdrop = airdropFactory({ rpc, rpcSubscriptions });
const airdropTx = await airdrop({
commitment: 'processed',
lamports: lamports(LAMPORTS_PER_SOL),
recipientAddress: payer.address
});
console.log(`✅ - 已向支付账户空投 1 SOL: ${airdropTx}`);
这里,我们使用 airdropFactory 函数创建了一个 airdrop 函数,然后使用它将 1 SOL 空投到支付账户。
现在支付账户已有 SOL,让我们创建并初始化铸币账户。在 main 函数的步骤 4 中添加以下代码:
// 4 - 创建铸币账户并初始化铸币
const mintSpace = BigInt(getMintSize());
const mintRent = await rpc.getMinimumBalanceForRentExemption(mintSpace).send();
const instructions = [\
// 创建铸币账户\
getCreateAccountInstruction({\
payer,\
newAccount: mint,\
lamports: mintRent,\
space: mintSpace,\
programAddress: TOKEN_PROGRAM_ADDRESS,\
}),\
// 初始化铸币\
getInitializeMintInstruction({\
mint: mint.address,\
decimals: DECIMALS,\
mintAuthority: mintAuthority.address\
}),\
];
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
const signAndSendTransaction = createSignAndSendTransaction(sendAndConfirmTransaction);
const createMintTxid = await pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayerSigner(payer, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstructions(instructions, tx),
(tx) => signAndSendTransaction(tx)
);
console.log(`✅ - 铸币账户已创建并初始化: ${createMintTxid}`);
此部分展示了 Kit 的几个关键特性:
getCreateAccountInstruction 和 getInitializeMintInstruction 来创建用于创建和初始化铸币账户的指令。pipe 函数来链式组合多个操作。createSignAndSendTransaction(稍后将定义的自定义辅助函数)来签名和发送交易。最后,让我们创建另一个交易,为所有者创建关联代币账户并向其铸造一些代币。在 main 函数的步骤 5 中添加以下代码:
// 5 - 创建关联代币账户并铸造代币
const mintInstructions = [\
// 创建目标关联代币账户\
await getCreateAssociatedTokenIdempotentInstructionAsync({\
mint: mint.address,\
payer,\
owner: owner.address,\
}),\
// 向目标关联代币账户铸造代币\
getMintToInstruction({\
mint: mint.address,\
token: ata,\
amount: BigInt(DROP_AMOUNT * 10 ** DECIMALS),\
mintAuthority, // 通过包含签名者而非公钥来签名\
})\
];
const mintTxid = await pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayerSigner(payer, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstructions(mintInstructions, tx),
(tx) => signAndSendTransaction(tx)
);
console.log(`✅ - 已向 ATA 铸造代币: ${mintTxid}`);
这里,我们为所有者创建了一个 ATA 并向其铸造代币。我们使用 getCreateAssociatedTokenIdempotentInstructionAsync 函数创建 ATA,使用 getMintToInstruction 向其铸造代币。我们使用了与步骤 4 类似的 pipe 函数来创建和发送交易。
让我们在文件末尾添加一个辅助函数,用于处理签名和发送交易。将以下代码添加到 create-token.ts 文件的末尾:
const createSignAndSendTransaction = (sendAndConfirmTransaction: ReturnType<typeof sendAndConfirmTransactionFactory>) => {
return async (
transactionMessage: CompilableTransactionMessage & TransactionMessageWithBlockhashLifetime,
commitment: Commitment = 'processed',
skipPreflight: boolean = true
) => {
const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);
try {
await sendAndConfirmTransaction(signedTransaction, { commitment, skipPreflight });
return getSignatureFromTransaction(signedTransaction);
} catch (e) {
console.error('交易失败:', e);
throw e;
}
};
};
这个辅助函数封装了签名和发送交易的过程,使我们的主代码更简洁、更易读。
本指南将使用本地 Solana 验证器。打开一个新的终端窗口并启动验证器:
solana-test-validator -r
当你准备好将代币部署到生产环境时,你需要将其部署到 Solana 集群。无论是部署到主网还是开发网,你都可以通过注册 Quicknode 账户 获得免费的 Quicknode 端点。
要运行脚本,使用以下命令:
ts-node create-token.ts
你应该会看到输出,指示连接成功、密钥对生成、空投、铸币创建和代币铸造成功:
✅ - 已建立与 http://127.0.0.1:8899 的连接
✅ - 已生成密钥对
铸币授权: 7JBobKzJt8BgGwbPwGGGD2HyLMf6nGW1FXvHvd2xUKZ8
支付账户: 3eVn4tAFGGP5tW3Rc1Lqq7hEDUFJz8uxFpNa3SJsDtba
所有者: 8nM1gKXDygKUWDCy8PJvAJvQUd11m5coQWUo7v5Zitm1
铸币: 9vgOWh6vhd9s33S1JTzS3Hk1mPEp2kPMPNK1sY6lEYvZ
关联代币账户: 6Z9Q5KyFbUZ2hYU2HfxUVPD6XpQUy1rHgLGLwR6sPGNj
✅ - 已向支付账户空投 1 SOL: 2gkQL7h7hHRWNfNwf2WyuPRmbhVd8oP7Ehfs54Pspqxx7KkYGF3wxjeoiVwLUHMgr9UYKY4PiMymmsGsQqKVWYoC
✅ - 铸币账户已创建并初始化: 5JcnmFrYhPcZnmfUPecuBUJw9RVAoHwUQ2xGtcJ8XkHNwZHMWLR13eJcuqfkdbBnfRm1ajFTaF3E7WzQFyCpgCc3
✅ - 已向 ATA 铸造代币: 3nLePg18vjuVDM5m3z1jFSTPBYNWUHx4eaUprWXKqCu6ZNCYSBUgezp3xKnPeKQAjBRJmtVqc4ij3KvZUakqPa8y
干得好!你已经使用 Solana Kit 成功创建了一个同质化代币。你应该可以在 本地 Solana 浏览器 中看到你的交易和铸币。
本指南通过创建一个脚本,使用 SPL 代币程序和新的 @solana-program/token 库执行一些基本操作,探索了新的 Solana Kit 库。希望在本指南之后,你已经开始看到新库的强大之处,以及它如何帮助你构建更复杂的应用程序。随着你继续探索 Kit,你将发现更多强大的功能和改进。继续保持!
如果你想继续练习,可以尝试扩展脚本以执行一些新操作:
getTransferCheckedInstruction 将 SPL 代币转账到另一个账户getBurnCheckedInstruction 销毁 SPL 代币getFreezeAccountInstruction 和 getThawAccountInstruction 冻结和解冻 SPL 代币如果你有任何反馈或对新主题的请求,请告诉我们。我们很乐意听取你的意见。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码