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 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.
Demo
// Generate keypairs for sender and two recipientsconst 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 tokensconst { client, mint } = await demoSetup(sender, recipient1, recipient2);console.log("\nMint Address:", mint.address);// Derive the Associated Token Accounts addresses (ATAs) for sender and recipientsconst [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 eachconst 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/clientconst 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 helperconst 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// =============================================================================
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?