Toplu ödemeler

Bir Solana işlemi, bir veya daha fazla talimat içeren bir kapsayıcıdır. Her talimat bir operasyondur—token transferi, hesap oluşturma, program çağırma. Ağ, bir işlemdeki tüm talimatları sıralı ve atomik olarak yürütür: ya her talimat başarılı olur ya da tüm işlem başarısız olur ve geri alınır.

Bu, birden fazla transferi tek bir işleme paketleyebileceğiniz anlamına gelir. Üç alıcıya ödeme yapmak için üç ayrı işlem göndermek yerine, üç transfer talimatı içeren tek bir işlem gönderirsiniz. Bu daha hızlıdır (üç yerine bir onay) ve daha ucuzdur (üç yerine bir temel ücret). İşte ödemelerin (bu görselde "drops" olarak adlandırılır) tek bir işlemde nasıl toplandığını ve daha büyük toplu işi yönetmek için birden fazla işlemin nasıl gönderildiğini gösteren açıklayıcı bir örnek.

Toplu ödemeler diyagramıToplu ödemeler diyagramı

Kaynak: QuickNode - How to Send Bulk Transactions on Solana

İşlemler ve talimatlar hakkında daha fazla bilgi için İşlemler ve Talimatlar kılavuzlarına bakın.

Aşağıdaki adım adım anlatım, toplu ödemeler için tek bir işleme birden fazla transfer talimatının nasıl yükleneceğini gösterir.

Talimatları tek bir işlemde toplu hale getirme

Bir Solana işlemi, farklı alıcılara birden fazla transfer içerebilir. Bir kez imzalarsınız, bir işlem ücreti ödersiniz ve tüm transferler birlikte gerçekleşir. Herhangi bir transfer başarısız olursa, tüm işlem reddedilir.

Temel ödeme kavramları için Solana'da ödemeler nasıl çalışır bölümüne bakın.

Birden fazla transferi toplu hale getirmek, her talimatı ayrı ayrı oluşturmayı ve ardından bunları tek bir işlemde birleştirmeyi gerektirir.

Aşağıdaki adımlar temel akışı gösterir. Tam çalıştırılabilir kod için Demo bölümüne bakın.

Token hesaplarını türet

İlk olarak, gönderen ve her alıcı için associated token account (ATA) adreslerini türetin. ATA'lar, cüzdan ve mint'e dayalı deterministik adreslerdir.

Transfer talimatları oluştur

Her alıcı için ayrı bir transfer talimatı oluşturun. Her talimat şunları belirtir:

  • kaynak token hesabı adresi
  • hedef token hesabı adresi
  • yetki (kaynak token hesabı sahibi adresi)
  • temel birimlerdeki miktar (mint'in ondalık basamaklarına göre ayarlanmış)

Tek işlem olarak gönder

Tüm transfer talimatlarını tek bir işleme ekleyin. Bu, tüm transferleri atomik olarak yürütür; ya tüm transferler başarılı olur ya da tüm işlem başarısız olur.

Bakiyeleri doğrula

Toplu transferden sonra, splToken yardımcısını kullanarak tüm tarafların token bakiyelerini doğrulayın.

Token hesaplarını türet

İlk olarak, gönderen ve her alıcı için associated token account (ATA) adreslerini türetin. ATA'lar, cüzdan ve mint'e dayalı deterministik adreslerdir.

Transfer talimatları oluştur

Her alıcı için ayrı bir transfer talimatı oluşturun. Her talimat şunları belirtir:

  • kaynak token hesabı adresi
  • hedef token hesabı adresi
  • yetki (kaynak token hesabı sahibi adresi)
  • temel birimlerdeki miktar (mint'in ondalık basamaklarına göre ayarlanmış)

Tek işlem olarak gönder

Tüm transfer talimatlarını tek bir işleme ekleyin. Bu, tüm transferleri atomik olarak yürütür; ya tüm transferler başarılı olur ya da tüm işlem başarısız olur.

Bakiyeleri doğrula

Toplu transferden sonra, splToken yardımcısını kullanarak tüm tarafların token bakiyelerini doğrulayın.

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.

İşlem planlaması ile ölçeklendirme

Tek bir işlemin boyut sınırları vardır—yaklaşık 1232 bayt. Büyük toplu işlemler için (yüzlerce çalışan için bordro, toplu airdrop'lar), bu sınırı aşacaksınız ve işi birden fazla işleme bölmeniz gerekecektir.

Kendi işlem dağıtım mantığınızı oluşturmakta özgür olsanız da, @solana/instruction-plans paketi (Solana Kit'in bir parçası) bunu iki seviyede yönetir:

Talimat planları işlemlerinizi ve bunların sıralama kısıtlamalarını tanımlar:

  • Sıralı — sırayla yürütülmesi gereken talimatlar
  • Paralel — herhangi bir sırada yürütülebilen talimatlar
  • Bölünemez — aynı işlemde birlikte kalması gereken talimatlar

İşlem planları talimat planlarından oluşturulur. Planlayıcı, sıralama kısıtlamalarınıza uyarak talimatları optimal boyutlu işlemlere akıllıca paketler. Ortaya çıkan işlem planı daha sonra:

  • Yürütülebilir — imzalanır ve ağa gönderilir, paralel işlemler eşzamanlı olarak gönderilir
  • Simüle edilebilir — göndermeden önce doğrulamak için ağa karşı test çalıştırması yapılır
  • Serileştirilebilir — harici imzalama servisleri veya çok taraflı iş akışları için base64'e derlenir

Bu iki seviyeli yaklaşım, kütüphane işlem boyutlandırma, paketleme ve paralel yürütme mekaniklerini hallederken, sizin işlemler açısından düşünmenizi ("Alice'e transfer et, sonra Bob'a transfer et") sağlar.

Is this page helpful?

İçindekiler

Sayfayı Düzenle

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın