Eräsiirrot

Solana-transaktio on säiliö, joka sisältää yhden tai useamman ohjeen. Jokainen ohje on operaatio – siirrä tokeneita, luo tili, kutsu ohjelmaa. Verkko suorittaa kaikki transaktion ohjeet peräkkäin ja atomisesti: joko jokainen ohje onnistuu, tai koko transaktio epäonnistuu ja palautuu.

Tämä tarkoittaa, että voit pakata useita siirtoja yhteen transaktioon. Sen sijaan, että lähettäisit kolme erillistä transaktiota maksaaksesi kolmelle vastaanottajalle, lähetät yhden transaktion, jossa on kolme siirto-ohjetta. Tämä on nopeampaa (yksi vahvistus kolmen sijaan) ja halvempaa (yksi perusmaksu kolmen sijaan). Tässä on havainnollistava esimerkki siitä, miten maksut (joihin viitataan tässä kuvassa nimellä "drops") eräännetään yhteen transaktioon ja useita transaktioita lähetetään käsittelemään suurempi erä.

Eräsiirtojen kaavioEräsiirtojen kaavio

Lähde: QuickNode - How to Send Bulk Transactions on Solana

Lisätietoja transaktioista ja ohjeista löydät Transaktiot- ja Ohjeet-oppaista.

Alla oleva läpikäynti näyttää, miten useita siirto-ohjeita ladataan yhteen transaktioon eräsiirtoja varten.

Ohjeiden eräännys yhteen transaktioon

Solana-transaktio voi sisältää useita siirtoja eri vastaanottajille. Allekirjoitat kerran, maksat yhden transaktiomaksun, ja kaikki siirrot toteutuvat yhdessä. Jos jokin siirto epäonnistuu, koko transaktio hylätään.

Katso How Payments Work on Solana maksun peruskäsitteistä.

Useiden siirtojen eräännys edellyttää jokaisen ohjeen rakentamista erikseen ja niiden yhdistämistä yhteen transaktioon.

Alla olevat vaiheet näyttävät peruskulun. Katso täydellinen ajettava koodi Demosta.

Johda token-tilit

Ensin johda lähettäjän ja kunkin vastaanottajan associated token account (ATA) -osoitteet. ATA:t ovat deterministisiä osoitteita, jotka perustuvat lompakkoon ja minttiin.

Luo siirto-ohjeet

Luo erillinen siirto-ohje jokaiselle vastaanottajalle. Jokainen ohje määrittää:

  • lähde-token accountin osoitteen
  • kohde-token accountin osoitteen
  • valtuutuksen (lähde-token accountin omistajan osoite)
  • määrän perusyksiköissä (mukautettuna mintin desimaaleihin)

Lähetä yhtenä transaktiona

Lisää kaikki siirto-ohjeet yhteen transaktioon. Tämä suorittaa kaikki siirrot atomaarisesti – joko kaikki siirrot onnistuvat tai koko transaktio epäonnistuu.

Tarkista saldot

Eräsiirron jälkeen tarkista kaikkien osapuolten token-saldot käyttämällä splToken -apufunktiota.

Johda token-tilit

Ensin johda lähettäjän ja kunkin vastaanottajan associated token account (ATA) -osoitteet. ATA:t ovat deterministisiä osoitteita, jotka perustuvat lompakkoon ja minttiin.

Luo siirto-ohjeet

Luo erillinen siirto-ohje jokaiselle vastaanottajalle. Jokainen ohje määrittää:

  • lähde-token accountin osoitteen
  • kohde-token accountin osoitteen
  • valtuutuksen (lähde-token accountin omistajan osoite)
  • määrän perusyksiköissä (mukautettuna mintin desimaaleihin)

Lähetä yhtenä transaktiona

Lisää kaikki siirto-ohjeet yhteen transaktioon. Tämä suorittaa kaikki siirrot atomaarisesti – joko kaikki siirrot onnistuvat tai koko transaktio epäonnistuu.

Tarkista saldot

Eräsiirron jälkeen tarkista kaikkien osapuolten token-saldot käyttämällä splToken -apufunktiota.

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.

Skaalaus transaktiosuunnittelulla

Yhdellä transaktiolla on kokorajoituksia – noin 1232 tavua. Suurissa eräoperaatioissa (palkanlaskenta sadoille työntekijöille, massiiviset airdropit) ylität tämän rajan ja sinun on jaettava työ useisiin transaktioihin.

Vaikka voit vapaasti luoda oman transaktioiden jakelun logiikkasi, @solana/instruction-plans-paketti (osa Solana Kitiä) käsittelee tämän kahdella tasolla:

Käskysuunnitelmat määrittelevät operaatiosi ja niiden järjestysrajoitteet:

  • Peräkkäiset — käskyt, jotka on suoritettava järjestyksessä
  • Rinnakkaiset — käskyt, jotka voidaan suorittaa missä tahansa järjestyksessä
  • Jakamattomat — käskyt, joiden on pysyttävä yhdessä samassa transaktiossa

Transaktiosuunnitelmat luodaan käskysuunnitelmista. Suunnittelija pakkaa älykkäästi käskyt optimaalisesti mitoitettuihin transaktioihin kunnioittaen järjestysrajoitteitasi. Tuloksena oleva transaktiosuunnitelma voidaan sitten:

  • Suorittaa — allekirjoittaa ja lähettää verkkoon, rinnakkaiset transaktiot lähetetään samanaikaisesti
  • Simuloida — testata verkkoa vasten ennen lähettämistä
  • Sarjallistaa — kääntää base64-muotoon ulkoisia allekirjoituspalveluita tai moniosapuolisia työnkulkuja varten

Tämä kaksitasoinen lähestymistapa antaa sinun ajatella operaatioiden kannalta ("siirrä Alicelle, sitten siirrä Bobille"), kun taas kirjasto käsittelee transaktioiden mitoituksen, pakkaamisen ja rinnakkaisen suorituksen mekaniikan.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä