Транзакція Solana — це контейнер, який містить одну або більше інструкцій. Кожна інструкція є операцією — переказ токенів, створення облікового запису, виклик програми. Мережа виконує всі інструкції в транзакції послідовно та атомарно: або кожна інструкція виконується успішно, або вся транзакція не виконується і відкочується назад.
Це означає, що ви можете упакувати кілька переказів в одну транзакцію. Замість надсилання трьох окремих транзакцій для оплати трьом одержувачам, ви надсилаєте одну транзакцію з трьома інструкціями переказу. Це швидше (одне підтвердження замість трьох) і дешевше (одна базова комісія замість трьох). Ось ілюстративний приклад того, як платежі (які називаються "drops" на цьому зображенні) групуються в одну транзакцію, а кілька транзакцій надсилаються для обробки більшого пакета.
Діаграма пакетних платежів
Джерело: QuickNode - How to Send Bulk Transactions on Solana
Для отримання додаткової інформації про транзакції та інструкції дивіться посібники Транзакції та Інструкції.
Нижче наведено покрокову інструкцію, яка показує, як завантажити кілька інструкцій переказу в одну транзакцію для пакетних платежів.
Групування інструкцій в одну транзакцію
Транзакція Solana може містити кілька переказів різним одержувачам. Ви підписуєте один раз, сплачуєте одну комісію за транзакцію, і всі перекази виконуються разом. Якщо будь-який переказ не вдається, вся транзакція відхиляється.
Дивіться Як працюють платежі на Solana для ознайомлення з основними концепціями платежів.
Групування кількох переказів вимагає окремого створення кожної інструкції, а потім об'єднання їх в одну транзакцію.
Нижче наведені кроки показують основний процес. Дивіться Демо для повного робочого коду.
Отримання токен-акаунтів
Спочатку отримайте адреси асоційованих токен-акаунтів (ATA) для відправника та кожного одержувача. ATA — це детерміновані адреси, що базуються на гаманці та mint.
Створення інструкцій переказу
Створіть окрему інструкцію переказу для кожного одержувача. Кожна інструкція визначає:
- адресу вихідного токен-акаунта
- адресу цільового токен-акаунта
- authority (адреса власника вихідного токен-акаунта)
- суму в базових одиницях (скориговану відповідно до decimals mint)
Відправлення як єдиної транзакції
Додайте всі інструкції переказу в одну транзакцію. Це виконує всі перекази атомарно — або всі перекази успішні, або вся транзакція не виконується.
Перевірка балансів
Після пакетного переказу перевірте баланси токенів для всіх сторін за допомогою
помічника splToken.
Демонстрація
// 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// =============================================================================
Масштабування за допомогою планування транзакцій
Одна транзакція має обмеження за розміром — приблизно 1232 байти. Для великих пакетних операцій (виплата зарплати сотням працівників, масові airdrop) ви перевищите це обмеження і вам потрібно буде розподілити роботу між кількома транзакціями.
Хоча ви можете створити власну логіку розподілу транзакцій, пакет
@solana/instruction-plans
(частина Solana Kit) обробляє це на двох рівнях:
Плани інструкцій визначають ваші операції та обмеження їх порядку:
- Послідовні — інструкції, які мають виконуватися по черзі
- Паралельні — інструкції, які можуть виконуватися в будь-якому порядку
- Неподільні — інструкції, які мають залишатися разом в одній транзакції
Плани транзакцій генеруються з планів інструкцій. Планувальник інтелектуально упаковує інструкції в транзакції оптимального розміру, дотримуючись ваших обмежень порядку. Отриманий план транзакцій потім може бути:
- Виконаний — підписаний і відправлений в мережу, з паралельними транзакціями, що надсилаються одночасно
- Симульований — тестовий запуск у мережі для перевірки перед відправленням
- Серіалізований — скомпільований у base64 для зовнішніх сервісів підпису або багатосторонніх робочих процесів
Цей дворівневий підхід дозволяє вам мислити категоріями операцій ("переказати Алісі, потім переказати Бобу"), тоді як бібліотека обробляє механіку розміру транзакцій, упаковки та паралельного виконання.
Is this page helpful?