新消息:Helius 收购 Light Protocol
如何使用 TypeScript 转移 Solana 代币
博客/开发

Solana 开发 101 — 如何使用 TypeScript 转移 Solana 代币

开发者关系负责人LinkedIn 上的 Hunter Davis
阅读需 4 分钟

在 Solana 中,代币账户用于持有和管理代币,包括非同质化代币(NFT)。对于 Solana 初学者开发者来说,这可能会让通过代码转移代币变得有些困难。在本教程中,我们将学习如何在 Solana 区块链上将 NFT 从一个钱包转移到另一个钱包。我们将为接收者创建一个新的关联代币账户(ATA),并将 NFT 转移到该账户。

NFT 转移与 SOL 转移的区别

在代币转移中,需要创建一个新的关联代币账户(ATA),才能将代币从原所有者转移给新所有者。该过程并非通过钱包 → 钱包转移完成。

这与常规的 SOL 转移不同,因为系统程序会处理转移,无需创建新的 ATA 来存放交易涉及的 SOL。

以下是该流程的简要图示:

总而言之,在 NFT/代币转移中,资产会从当前 ATA 发送到接收者拥有的新建 ATA,而不是直接转移到钱包。

前提条件

继续本教程之前,请确保满足以下前提条件:

  1. 具备 TypeScript 基础知识。
  2. 你的计算机上已安装 Node.js。
  3. 已安装 npm 或 yarn 包管理器。

构建步骤

现在,让我们按照以下步骤构建代码:

1. 设置项目

  • 为项目创建一个名为“Transfer”的新目录。
  • 打开终端并进入项目文件夹。
  • 使用以下命令初始化新的 Node.js 项目:npm init -y 或 yarn init -y。
  • 运行以下命令安装所需依赖项:
代码
npm install @solana/web3.js @solana/spl-token bs58
  • 创建一个新的 TypeScript 文件,例如 transferNFT.ts,并在代码编辑器中打开它。

2. 导入库

在新的 transferNFT.ts 文件中导入必要的库,并定义转移函数:

代码
import { Keypair, Transaction, Connection, PublicKey } from "@solana/web3.js";
import { createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token";
import * as bs58 from "bs58";

async function transfer() {
  // Code for transferring NFTs goes here
}

transfer();

在以上代码中,我们导入了所需的软件包,并创建了转移函数。

3. 建立与 Solana 网络的连接

代码
const connection = new Connection("https://rpc.helius.xyz/?api-key=");

在以上代码中,我们使用 Helius RPC 建立与 Solana 区块链的连接。

4. 定义手续费支付者和原所有者的密钥对

代码
const feePayer = Keypair.fromSecretKey(bs58.decode("privateKey"));
const prevOwner = Keypair.fromSecretKey(bs58.decode("privateKey"));

5. 指定 mint 公钥和接收者的钱包地址

mint 公钥是你要转移的 NFT 的代币地址:

代码
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
const receiveAddress = new PublicKey("2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX");

6. 为接收者生成关联代币地址(ATA)

代码
const ata = await getAssociatedTokenAddress(mintPubkey, receiveAddress);

在这段代码中,我们将新 ATA 的所有者设置为另一个地址的公钥。该所有者不必是交易的支付者。

请务必将 receiveAddress 设置为需要接收资产的地址。

7. 指定源代币账户和目标账户的公钥

代码
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
const tokenAccount2Pubkey = new PublicKey(ata);

8. 创建新交易并添加转移指令

代码
const tx = new Transaction();
tx.add(
  createTransferCheckedInstruction(
    tokenAccount1Pubkey,
    mintPubkey,
    tokenAccount2Pubkey,
    prevOwner.publicKey,
    1, // Amount you are transferring.
    0 // Decimals, since this is an NFT you can leave 0.
  )
);

在以上代码中,我们执行了以下操作:

  • 定义原代币账户和当前代币账户。
  • 将转移数量设置为 1(因为该 mint 地址的供应量只有 1)。
  • 将小数位数设置为 0,因为这符合非同质化代币标准。对于同质化代币,你可以根据转移需求正确设置小数位数。

9. 将交易发送到 Solana 网络

代码
const txhash = await connection.sendTransaction(tx, [feePayer, prevOwner]);
console.log(`Transaction hash: ${txhash}`);

现在,我们使用 sendTransaction 方法完成交易,并指定由手续费支付者和资产的原所有者签名。

完整代码

代码
import { Keypair, Transaction, Connection, PublicKey } from "@solana/web3.js";
import { createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token";
import * as bs58 from "bs58";

async function transfer() {
  // connection to Solana.
const connection = new Connection("https://rpc.helius.xyz/?api-key=");

// Payer of new ATA.
const feePayer = Keypair.fromSecretKey(
  bs58.decode("privateKey")
);

// Previous owner of Token or NFT
const prevOwner = Keypair.fromSecretKey(
  bs58.decode("privateKey")
);
// Mint address of the NFT.
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
// Recipient of the NFT.
const receiveAdress = new PublicKey('2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX')
// Original Token Account
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
let ata = await getAssociatedTokenAddress(
    mintPubkey, // mint
    receiveAdress // owner
  );
// Create transfer instruction to from the previous ATA owned by old wallet, to new ATA.
const tokenAccount2Pubkey = new PublicKey(ata);
let tx = new Transaction();
  tx.add(
    createTransferCheckedInstruction(
      tokenAccount1Pubkey, // from
      mintPubkey, // mint
      tokenAccount2Pubkey, // to
      prevOwner.publicKey, // from's owner
      1, // amount
      0 // decimals
    )
  );
  // Send Transaction here.
  console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer, prevOwner])}`);
}

transfer()

请记得将代码中的占位值替换为你的实际值,例如 RPC URL、私钥以及转移所需的公钥。

总结

恭喜!你已成功构建用于在 Solana 上转移 NFT 的代码:创建新的关联代币账户(ATA),并将 NFT 转移到接收者的账户。通过本教程,你学习了如何建立连接、生成 ATA,以及在 Solana 区块链上发送交易。现在,你可以将这里学到的知识应用到自己创建的任何 dApp 示例中。

‍

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新

放大图片