Batchbetalingen

Een Solana-transactie is een container die één of meer instructies bevat. Elke instructie is een operatie—tokens overmaken, een account aanmaken, een programma aanroepen. Het netwerk voert alle instructies in een transactie sequentieel en atomisch uit: ofwel slaagt elke instructie, of de hele transactie mislukt en wordt teruggedraaid.

Dit betekent dat je meerdere overboekingen in één transactie kunt verpakken. In plaats van drie afzonderlijke transacties te sturen om drie ontvangers te betalen, stuur je één transactie met drie overboekingsinstructies. Dit is sneller (één bevestiging in plaats van drie) en goedkoper (één basisvergoeding in plaats van drie). Hier is een illustratie van hoe betalingen (in deze afbeelding aangeduid als "drops") worden gebundeld in één transactie en hoe meerdere transacties worden verzonden om de grotere batch te verwerken.

Batchbetalingen diagramBatchbetalingen diagram

Bron: QuickNode - How to Send Bulk Transactions on Solana

Voor meer informatie over transacties en instructies, zie de Transactions en Instructions handleidingen.

De onderstaande walkthrough laat zien hoe je meerdere overboekingsinstructies in één transactie kunt laden voor batchbetalingen.

Instructies bundelen in één transactie

Een Solana-transactie kan meerdere overboekingen naar verschillende ontvangers bevatten. Je ondertekent één keer, betaalt één transactievergoeding, en alle overboekingen worden samen afgewikkeld. Als een overboeking mislukt, wordt de hele transactie afgewezen.

Zie How Payments Work on Solana voor fundamentele betalingsconcepten.

Het bundelen van meerdere overboekingen vereist dat je elke instructie afzonderlijk opbouwt en ze vervolgens combineert in één transactie.

De onderstaande stappen tonen de kernflow. Zie de Demo voor volledige uitvoerbare code.

Token accounts afleiden

Leid eerst de Associated Token Account (ATA) adressen af voor de verzender en elke ontvanger. ATA's zijn deterministische adressen gebaseerd op de wallet en mint.

Overboekingsinstructies aanmaken

Maak een aparte overboekingsinstructie voor elke ontvanger. Elke instructie specificeert de:

  • bron token account adres
  • bestemming token account adres
  • authority (eigenaar adres van bron token account)
  • bedrag in basiseenheden (aangepast voor de decimalen van de mint)

Verzenden als enkele transactie

Voeg alle overboekingsinstructies toe aan één enkele transactie. Dit voert alle overboekingen atomair uit, ofwel alle overboekingen slagen of de gehele transactie mislukt.

Saldi verifiëren

Verifieer na de batchoverboeking de tokensaldi voor alle partijen met behulp van de splToken helper.

Token accounts afleiden

Leid eerst de Associated Token Account (ATA) adressen af voor de verzender en elke ontvanger. ATA's zijn deterministische adressen gebaseerd op de wallet en mint.

Overboekingsinstructies aanmaken

Maak een aparte overboekingsinstructie voor elke ontvanger. Elke instructie specificeert de:

  • bron token account adres
  • bestemming token account adres
  • authority (eigenaar adres van bron token account)
  • bedrag in basiseenheden (aangepast voor de decimalen van de mint)

Verzenden als enkele transactie

Voeg alle overboekingsinstructies toe aan één enkele transactie. Dit voert alle overboekingen atomair uit, ofwel alle overboekingen slagen of de gehele transactie mislukt.

Saldi verifiëren

Verifieer na de batchoverboeking de tokensaldi voor alle partijen met behulp van de splToken helper.

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.

Opschalen met transactieplanning

Een enkele transactie heeft groottelimieten—ongeveer 1232 bytes. Voor grote batchoperaties (salarisadministratie voor honderden werknemers, massa-airdrops) overschrijd je deze limiet en moet je het werk verdelen over meerdere transacties.

Hoewel je vrij bent om je eigen transactiedistributielogica te creëren, handelt het @solana/instruction-plans pakket (onderdeel van Solana Kit) dit op twee niveaus af:

Instructieplannen definiëren je operaties en hun volgordebepalingen:

  • Sequentieel — instructies die in volgorde moeten worden uitgevoerd
  • Parallel — instructies die in willekeurige volgorde kunnen worden uitgevoerd
  • Ondeelbaar — instructies die samen moeten blijven in dezelfde transactie

Transactieplannen worden gegenereerd uit instructieplannen. De planner pakt instructies intelligent in optimaal formaat transacties, met respect voor jouw volgordebepalingen. Het resulterende transactieplan kan vervolgens:

  • Uitgevoerd worden — ondertekend en naar het netwerk verzonden, waarbij parallelle transacties gelijktijdig worden verzonden
  • Gesimuleerd worden — proefdraaien tegen het netwerk om te verifiëren voordat het wordt verzonden
  • Geserialiseerd worden — gecompileerd naar base64 voor externe ondertekeningsservices of workflows met meerdere partijen

Deze tweeniveaubenadering laat je denken in termen van operaties ("overmaken naar Alice, daarna overmaken naar Bob") terwijl de bibliotheek de mechanica van transactiegrootte, inpakken en parallelle uitvoering afhandelt.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken

Beheerd door

© 2026 Solana Foundation.
Alle rechten voorbehouden.
Blijf Verbonden