Pembayaran batch

Transaksi Solana adalah wadah yang menampung satu atau lebih instruksi. Setiap instruksi adalah operasi—transfer token, buat akun, panggil program. Jaringan mengeksekusi semua instruksi dalam transaksi secara berurutan dan atomik: baik setiap instruksi berhasil, atau seluruh transaksi gagal dan dibatalkan.

Ini berarti Anda dapat mengemas beberapa transfer ke dalam satu transaksi. Alih-alih mengirim tiga transaksi terpisah untuk membayar tiga penerima, Anda mengirim satu transaksi dengan tiga instruksi transfer. Ini lebih cepat (satu konfirmasi alih-alih tiga) dan lebih murah (satu biaya dasar alih-alih tiga). Berikut adalah contoh ilustrasi bagaimana pembayaran (disebut sebagai "drops" dalam gambar ini) di-batch ke dalam satu transaksi dan beberapa transaksi dikirim untuk menangani batch yang lebih besar.

Diagram pembayaran batchDiagram pembayaran batch

Sumber: QuickNode - How to Send Bulk Transactions on Solana

Untuk informasi lebih lanjut tentang transaksi dan instruksi, lihat panduan Transactions dan Instructions.

Panduan di bawah ini menunjukkan cara memuat beberapa instruksi transfer ke dalam satu transaksi untuk pembayaran batch.

Batching instruksi ke dalam satu transaksi

Transaksi Solana dapat berisi beberapa transfer ke penerima yang berbeda. Anda menandatangani sekali, membayar satu biaya transaksi, dan semua transfer diselesaikan bersama. Jika ada transfer yang gagal, seluruh transaksi ditolak.

Lihat How Payments Work on Solana untuk konsep pembayaran inti.

Batching beberapa transfer memerlukan pembuatan setiap instruksi secara terpisah, kemudian menggabungkannya ke dalam satu transaksi.

Langkah-langkah di bawah ini menunjukkan alur inti. Lihat Demo untuk kode lengkap yang dapat dijalankan.

Turunkan akun token

Pertama, turunkan alamat Associated Token Account (ATA) untuk pengirim dan setiap penerima. ATA adalah alamat deterministik berdasarkan dompet dan mint.

Buat instruksi transfer

Buat instruksi transfer terpisah untuk setiap penerima. Setiap instruksi menentukan:

  • alamat akun token sumber
  • alamat akun token tujuan
  • otoritas (alamat pemilik akun token sumber)
  • jumlah dalam unit dasar (disesuaikan dengan desimal mint)

Kirim sebagai transaksi tunggal

Tambahkan semua instruksi transfer ke dalam satu transaksi. Ini mengeksekusi semua transfer secara atomik, baik semua transfer berhasil atau seluruh transaksi gagal.

Verifikasi saldo

Setelah transfer batch, verifikasi saldo token untuk semua pihak menggunakan helper splToken.

Turunkan akun token

Pertama, turunkan alamat Associated Token Account (ATA) untuk pengirim dan setiap penerima. ATA adalah alamat deterministik berdasarkan dompet dan mint.

Buat instruksi transfer

Buat instruksi transfer terpisah untuk setiap penerima. Setiap instruksi menentukan:

  • alamat akun token sumber
  • alamat akun token tujuan
  • otoritas (alamat pemilik akun token sumber)
  • jumlah dalam unit dasar (disesuaikan dengan desimal mint)

Kirim sebagai transaksi tunggal

Tambahkan semua instruksi transfer ke dalam satu transaksi. Ini mengeksekusi semua transfer secara atomik, baik semua transfer berhasil atau seluruh transaksi gagal.

Verifikasi saldo

Setelah transfer batch, verifikasi saldo token untuk semua pihak menggunakan helper splToken.

Batch Payments
const [senderAta] = await findAssociatedTokenPda({
mint: mint.address,
owner: sender.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const [recipient1Ata] = await findAssociatedTokenPda({
mint: mint.address,
owner: recipient1.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const [recipient2Ata] = await findAssociatedTokenPda({
mint: mint.address,
owner: recipient2.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});

Demo

Demo
// Generate keypairs for sender and two recipients
const sender = (await generateKeypair()).signer;
const recipient1 = (await generateKeypair()).signer;
const recipient2 = (await generateKeypair()).signer;
console.log("Sender Address:", sender.address);
console.log("Recipient 1 Address:", recipient1.address);
console.log("Recipient 2 Address:", recipient2.address);
// Demo Setup: Create client, mint account, token accounts, and fund with initial tokens
const { client, mint } = await demoSetup(sender, recipient1, recipient2);
console.log("\nMint Address:", mint.address);
// Derive the Associated Token Accounts addresses (ATAs) for sender and recipients
const [senderAta] = await findAssociatedTokenPda({
mint: mint.address,
owner: sender.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const [recipient1Ata] = await findAssociatedTokenPda({
mint: mint.address,
owner: recipient1.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const [recipient2Ata] = await findAssociatedTokenPda({
mint: mint.address,
owner: recipient2.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
console.log("Sender Token Account:", senderAta.toString());
console.log("Recipient 1 Token Account:", recipient1Ata.toString());
console.log("Recipient 2 Token Account:", recipient2Ata.toString());
// =============================================================================
// Batch Token Payment Demo
// =============================================================================
// Create instructions to transfer tokens from sender to both recipients
// Transferring 250,000 base units = 0.25 tokens (with 6 decimals) to each
const transfer1Instruction = getTransferInstruction({
source: senderAta,
destination: recipient1Ata,
authority: sender.address,
amount: 250_000n // 0.25 tokens
});
const transfer2Instruction = getTransferInstruction({
source: senderAta,
destination: recipient2Ata,
authority: sender.address,
amount: 250_000n // 0.25 tokens
});
// Prepare and send both transfers in a single transaction using @solana/client
const signature = await client.transaction.prepareAndSend({
authority: sender,
instructions: [transfer1Instruction, transfer2Instruction],
version: 0
});
console.log("\n=== Batch Token Payment Complete ===");
console.log("Transaction Signature:", signature.toString());
// Fetch final token account balances using @solana/client SPL token helper
const splToken = client.splToken({
mint: mint.address,
tokenProgram: "auto"
});
const senderBalance = await splToken.fetchBalance(sender.address);
const recipient1Balance = await splToken.fetchBalance(recipient1.address);
const recipient2Balance = await splToken.fetchBalance(recipient2.address);
console.log("\nSender Token Account Balance:", senderBalance);
console.log("Recipient 1 Token Account Balance:", recipient1Balance);
console.log("Recipient 2 Token Account Balance:", recipient2Balance);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

Penskalaan dengan perencanaan transaksi

Satu transaksi memiliki batasan ukuran—sekitar 1232 byte. Untuk operasi batch besar (penggajian untuk ratusan karyawan, airdrop massal), Anda akan melebihi batas ini dan perlu membagi pekerjaan ke beberapa transaksi.

Meskipun Anda bebas membuat logika distribusi transaksi sendiri, paket @solana/instruction-plans (bagian dari Solana Kit) menangani ini di dua tingkat:

Rencana instruksi mendefinisikan operasi Anda dan batasan urutannya:

  • Berurutan — instruksi yang harus dieksekusi secara berurutan
  • Paralel — instruksi yang dapat dieksekusi dalam urutan apa pun
  • Tidak dapat dibagi — instruksi yang harus tetap bersama dalam transaksi yang sama

Rencana transaksi dihasilkan dari rencana instruksi. Perencana secara cerdas mengemas instruksi ke dalam transaksi dengan ukuran optimal, dengan menghormati batasan urutan Anda. Rencana transaksi yang dihasilkan kemudian dapat:

  • Dieksekusi — ditandatangani dan dikirim ke jaringan, dengan transaksi paralel dikirim secara bersamaan
  • Disimulasikan — uji coba terhadap jaringan untuk memverifikasi sebelum mengirim
  • Diserialisasi — dikompilasi ke base64 untuk layanan penandatanganan eksternal atau alur kerja multi-pihak

Pendekatan dua tingkat ini memungkinkan Anda berpikir dalam hal operasi ("transfer ke Alice, lalu transfer ke Bob") sementara library menangani mekanik pengukuran transaksi, pengemasan, dan eksekusi paralel.

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.
Terhubung