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 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.
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// =============================================================================
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?