使用Solana Kit创建同质化代币

  • QuickNode
  • 发布于 2026-05-11 14:44
  • 阅读 30

本教程介绍了如何使用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 集群的连接
  • 生成必要的密钥对
  • 创建铸币账户
  • 初始化铸币
  • 创建关联代币账户(ATA)
  • 向 ATA 铸造代币

你需要准备

本指南使用的依赖

依赖 版本
@solana/kit ^2.0.0
@solana-program/system ^0.5.0
@solana-program/token ^0.4.1
solana cli 1.18.8

让我们开始吧!

什么是 Solana 上的同质化代币?

Solana 上的同质化代币是一种数字资产,其中每个单元与同一种代币的其他单元可以互换。这些代币使用 Solana 的代币程序创建和管理,该程序提供铸造、转移和销毁代币的功能。同质化代币可用于存储和交换价值(例如 USDC 或其他资产),作为实用工具(例如用于即将到来的 NFT 铸造的白名单代币),代表协议中的权益(例如治理代币),或者任何你能想到的其他用途。

Solana 上同质化代币的关键组件包括:

  1. 铸币账户:存储代币信息,如总供应量和小数位数。
  2. 代币账户:持有特定所有者的代币余额。
  3. 关联代币账户(ATA):从所有者地址和铸币地址派生出的确定性代币账户。

现在,让我们探索如何使用 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();

建立与 Solana 集群的连接

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} 的连接`);

我们使用 createSolanaRpccreateSolanaRpcSubscriptions 函数来创建 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

在创建代币之前,我们需要向支付账户存入 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 的几个关键特性:

  1. 我们使用 getCreateAccountInstructiongetInitializeMintInstruction 来创建用于创建和初始化铸币账户的指令。
  2. 我们在创建和发送交易时使用 pipe 函数来链式组合多个操作。
  3. 我们使用 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 代币
  • 使用 getFreezeAccountInstructiongetThawAccountInstruction 冻结和解冻 SPL 代币

我们 ❤️ 反馈!

如果你有任何反馈或对新主题的请求,请告诉我们。我们很乐意听取你的意见。

资源

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

0 条评论

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