在 Solana 中,代币账户用于持有和管理代币,包括非同质化代币 (NFT)。这可能会让 Solana 的初级开发人员在用代码转移代币时遇到一些困难。在本教程中,我们将学习如何在 Solana 区块链上将 NFT 从一个钱包转移到另一个钱包。我们将通过为接收者创建一个新的关联代币账户 (ATA) 并将 NFT 转移到该账户来实现这一点。
新的 Solana TypeScript 框架:
简单地使用Kite进行 Solana 程序开发。
NFT 和 SOL 转移的区别
在代币转移中,需要创建一个新的关联代币账户 (ATA) 来启动从前所有者到新所有者的转移。这不会通过钱包 → 钱包转移进行。
这与涉及 SOL 的常规转移不同,因为系统程序将处理转移,并且不需要创建新的 ATA 来容纳交易中涉及的 SOL。
有关该过程的简要视觉表示,请参阅以下内容:
总而言之,在 NFT/Token 转移中,资产从当前 ATA 发送到接收者拥有的新创建的 ATA,而不是直接转移到钱包。
先决条件
在继续本教程之前,请确保您满足以下先决条件:
TypeScript 的基本知识。
您的机器上安装了Node.js。
已安装 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.指定铸币公钥和收件人的钱包地址
铸币公钥将是您要转移的 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(因为铸币地址仅有 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 转移到接收者的帐户。通过学习本教程,您学习了如何在 Solana 区块链上建立连接、生成 ATA 和发送交易。您现在可以将此处学到的信息应用于您正在创建的任何 dApp 示例。