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