Typescript
SPL Token di Web3.js

SPL Token di Web3.js

Program Token

SPL Token dengan Web3JS

Di Solana, semua hal yang berkaitan dengan token ditangani oleh Program SPL Token dan Program Token2022: kerangka token asli Solana yang mendefinisikan bagaimana semua token dibuat, dikelola, dan ditransfer.

Ini adalah program tunggal dan terpadu yang menangani semua operasi token di seluruh jaringan, memastikan konsistensi dan interoperabilitas.

Keputusan untuk memiliki antarmuka tunggal dan terpadu untuk semua token di Solana menciptakan implementasi yang mudah yang dapat direplikasi di semua dApps (aplikasi terdesentralisasi) dan integrasi (seperti dompet, ...)

Mari kita mulai dengan menginstal paket yang diperlukan untuk bekerja dengan program SPL Token menggunakan Web3.js:

bash
npm i @solana/spl-token

Akun Mint dan Token

Di balik layar, membuat akun Mint dan Token cukup "rumit". Ada berbagai instruksi yang memerlukan input dan akun yang berbeda; akun perlu dibuat bebas sewa sebelum kita benar-benar dapat menginisialisasinya, ...

Akun Mint

Tanpa abstraksi apa pun, membuat akun Mint akan terlihat seperti ini:

ts
import {
    Keypair,
    sendAndConfirmTransaction,
    SystemProgram,
    Transaction,
} from "@solana/web3.js";
 
import {
    createInitializeMint2Instruction,
    MINT_SIZE,
    getMinimumBalanceForRentExemptMint,
    TOKEN_PROGRAM_ID,
} from "@solana/spl-token";
 
const mint = Keypair.generate();
 
const mintRent = await getMinimumBalanceForRentExemptMint(connection);
 
const createAccountInstruction = SystemProgram.createAccount({
    fromPubkey: feePayer.publicKey,
    newAccountPubkey: mint.publicKey,
    space: MINT_SIZE,
    lamports: mintRent,
    programId: TOKEN_PROGRAM_ID
});
 
const initializeMintInstruction = createInitializeMint2Instruction(
    mint.publicKey, // mint pubkey
    6, // decimals
    feePayer.publicKey, // mint authority
    null, // freeze authority
    TOKEN_PROGRAM_ID
);
 
const transaction = new Transaction().add(
    createAccountInstruction,
    initializeMintInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, mint]);
 
console.log(`Mint created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Untungnya, paket @solana/spl-token memiliki beberapa abstraksi. Jadi kita dapat membuat akun Mint dengan satu fungsi createMint() seperti ini:

ts
const mint = await createMint(
    connection, // connection
    keypair, // payer
    keypair.publicKey, // mint authority
    null, // freeze authority
    6 // decimals
);

Akun Token

Hal yang sama berlaku untuk akun Token. Jika kita membuatnya tanpa abstraksi apa pun, itu akan terlihat seperti ini:

ts
import {
    Keypair,
    sendAndConfirmTransaction,
    SystemProgram,
    Transaction,
} from "@solana/web3.js";
 
import {
    createInitializeAccount3Instruction,
    ACCOUNT_SIZE,
    getMinimumBalanceForRentExemptAccount,
    TOKEN_PROGRAM_ID,
} from "@solana/spl-token";
 
const token = Keypair.generate();
 
const tokenRent = await getMinimumBalanceForRentExemptAccount(connection);
 
const createAccountInstruction = SystemProgram.createAccount({
    fromPubkey: feePayer.publicKey,
    newAccountPubkey: token.publicKey,
    space: ACCOUNT_SIZE,
    lamports: tokenRent,
    programId: TOKEN_PROGRAM_ID
});
 
const initializeTokenInstruction = createInitializeAccount3Instruction(
    token.publicKey, // token pubkey
    mint.publicKey, // mint pubkey
    feePayer.publicKey, // owner pubkey
    TOKEN_PROGRAM_ID
);
 
const transaction = new Transaction().add(
    createAccountInstruction,
    initializeTokenInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, token]);
 
console.log(`Token created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Tetapi sama seperti akun Mint, paket @solana/spl-token memiliki beberapa abstraksi untuk membuat akun Token. Kita dapat menggunakan fungsi createAccount() seperti ini:

ts
const token = await createAccount(
    connection, // connection
    keypair, // payer
    mint.publicKey, // mint pubkey
    keypair.publicKey, // owner pubkey
);

Akun Token Terkait

Hal yang sama berlaku untuk akun Associated Token, tetapi abstraksinya tidak terkait dengan pembuatan akun seperti untuk akun Mint dan Token, melainkan terutama terkait dengan derivasi alamat.

Jadi beginilah cara kita membuat akun Associated Token tanpa abstraksi apapun:

ts
import {
    sendAndConfirmTransaction,
    Transaction,
} from "@solana/web3.js";
 
import {
    TOKEN_PROGRAM_ID,
    createAssociatedTokenAccountIdempotentInstruction,
    getAssociatedTokenAddress,
} from "@solana/spl-token";
 
const associatedTokenAccount = await getAssociatedTokenAddress(
    mint.publicKey, // mint pubkey
    keypair.publicKey, // owner pubkey
    false, // allow owner off-curve
    TOKEN_PROGRAM_ID
);
 
// Create ATA creation instructions for all accounts
const createAtaInstruction = createAssociatedTokenAccountIdempotentInstruction(
    keypair.publicKey, // payer
    associatedTokenAccount, // associated token account address
    keypair.publicKey, // owner
    mint.publicKey, // mint
    TOKEN_PROGRAM_ID
);
 
const transaction = new Transaction().add(
    createAtaInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);
 
console.log(`Associated Token created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Dan beginilah tampilannya dengan abstraksi:

ts
const ata = await getOrCreateAssociatedTokenAccount(
    connection, // connection
    keypair, // payer
    mint, // mint pubkey
    keypair.publicKey // owner pubkey
);

Seperti yang Anda lihat, fungsi tersebut disebut getOrCreateAssociatedTokenAccount(). Ini karena mungkin saja akun Associated Token sudah dibuat sebelumnya dan kita tidak ingin transaksi kita gagal karenanya. Jadi yang dilakukannya adalah membuat atau hanya mengembalikan alamat ATA.

Daftar Isi
Lihat Sumber
Blueshift © 2025Commit: 96f50c6