MỚI: Helius mua lại Light Protocol
cách chuyển token Solana bằng TypeScript
Blog/Phát triển

Solana Dev 101 — Cách chuyển token Solana bằng TypeScript

Trưởng bộ phận Quan hệ Nhà phát triểnHunter Davis trên LinkedIn
Đọc trong 4 phút

Trên Solana, tài khoản token được dùng để lưu giữ và quản lý token, bao gồm cả token không thể thay thế (NFT). Điều này có thể khiến việc chuyển token bằng mã trở nên khá khó khăn với các nhà phát triển mới làm quen với Solana. Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách chuyển NFT từ ví này sang ví khác trên blockchain Solana. Để thực hiện, chúng ta sẽ tạo một Associated Token Account (ATA) mới cho người nhận và chuyển NFT vào tài khoản đó.

Sự khác biệt giữa chuyển NFT và SOL

Trong một giao dịch chuyển token, cần tạo một Associated Token Account (ATA) mới để bắt đầu chuyển từ chủ sở hữu trước sang chủ sở hữu mới. Quá trình này không diễn ra bằng cách chuyển trực tiếp từ ví → ví.

Điều này khác với giao dịch chuyển SOL thông thường, vì system program sẽ xử lý việc chuyển và không cần tạo ATA mới để lưu giữ SOL trong giao dịch.

Để xem hình minh họa ngắn gọn về quy trình, hãy tham khảo nội dung sau:

Tóm lại, trong giao dịch chuyển NFT/token, tài sản được gửi từ ATA hiện tại đến một ATA mới tạo thuộc sở hữu của người nhận, thay vì được chuyển trực tiếp vào ví.

Điều kiện tiên quyết

Trước khi tiếp tục hướng dẫn này, hãy đảm bảo bạn đáp ứng các điều kiện tiên quyết sau:

  1. Có kiến thức cơ bản về TypeScript.
  2. Đã cài đặt Node.js trên máy.
  3. Đã cài đặt trình quản lý gói npm hoặc yarn.

Các bước xây dựng

Bây giờ, hãy làm theo các bước dưới đây để xây dựng mã:

1. Thiết lập dự án

  • Tạo một thư mục mới có tên “Transfer” cho dự án.
  • Mở terminal và chuyển đến thư mục dự án.
  • Khởi tạo một dự án Node.js mới bằng lệnh: npm init -y hoặc yarn init -y.
  • Cài đặt các phần phụ thuộc cần thiết bằng cách chạy lệnh:
Mã
npm install @solana/web3.js @solana/spl-token bs58
  • Tạo một tệp TypeScript mới, ví dụ: transferNFT.ts, rồi mở tệp đó trong trình chỉnh sửa mã.

2. Import các thư viện

Import các thư viện cần thiết và định nghĩa hàm chuyển trong tệp transferNFT.ts mới:

Mã
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();

Trong đoạn mã trên, chúng ta đang import các gói cần thiết và tạo hàm chuyển.

3. Thiết lập kết nối với mạng Solana

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

Trong đoạn mã trên, chúng ta sử dụng Helius RPC để thiết lập kết nối với blockchain Solana.

4. Định nghĩa các cặp khóa của người trả phí và chủ sở hữu trước

Mã
const feePayer = Keypair.fromSecretKey(bs58.decode("privateKey"));
const prevOwner = Keypair.fromSecretKey(bs58.decode("privateKey"));

5. Chỉ định khóa công khai mint và địa chỉ ví của người nhận

Khóa công khai mint sẽ là địa chỉ token của NFT mà bạn muốn chuyển:

Mã
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
const receiveAddress = new PublicKey("2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX");

6. Tạo địa chỉ token liên kết (ATA) cho người nhận

Mã
const ata = await getAssociatedTokenAddress(mintPubkey, receiveAddress);

Trong đoạn mã này, chúng ta đặt chủ sở hữu ATA mới là khóa công khai của một địa chỉ khác. Địa chỉ này không nhất thiết phải là người trả phí cho giao dịch.

Hãy nhớ đặt receiveAddress thành địa chỉ cần nhận tài sản được chuyển.

7. Chỉ định khóa công khai cho tài khoản token nguồn và tài khoản đích

Mã
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
const tokenAccount2Pubkey = new PublicKey(ata);

8. Tạo giao dịch mới và thêm chỉ thị chuyển

Mã
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.
  )
);

Trong đoạn mã trên, chúng ta đang:

  • Định nghĩa tài khoản token trước và hiện tại.
  • Đặt số lượng cần chuyển là 1 (vì địa chỉ mint chỉ có tổng cung là 1).
  • Đặt số chữ số thập phân là 0 vì giao dịch này tuân theo tiêu chuẩn token không thể thay thế. Với token có thể thay thế, bạn có thể đặt số chữ số thập phân phù hợp để chuyển.

9. Gửi giao dịch đến mạng Solana

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

Bây giờ, chúng ta sử dụng phương thức sendTransaction để hoàn tất giao dịch, đồng thời chỉ định người trả phí và chủ sở hữu trước của tài sản ký giao dịch.

Mã đầy đủ

Mã
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()

Hãy nhớ thay các giá trị giữ chỗ trong mã bằng giá trị thực tế của bạn, chẳng hạn như URL RPC, khóa bí mật và khóa công khai cho giao dịch chuyển.

Kết luận

Xin chúc mừng! Bạn đã xây dựng thành công mã để chuyển NFT trên Solana bằng cách tạo một Associated Token Account (ATA) mới và chuyển NFT vào tài khoản của người nhận. Qua hướng dẫn này, bạn đã học cách thiết lập kết nối, tạo ATA và gửi giao dịch trên blockchain Solana. Giờ đây, bạn có thể áp dụng kiến thức đã học vào bất kỳ ví dụ dApp nào đang xây dựng.

‍

Đăng ký nhận tin từ Helius

Luôn cập nhật những thông tin mới nhất về phát triển Solana và nhận thông báo khi chúng tôi đăng bài

Hình ảnh phóng to