الدفعات المجمعة

معاملة سولانا هي حاوية تحتوي على تعليمة واحدة أو أكثر. كل تعليمة هي عملية—تحويل الرموز، إنشاء حساب، استدعاء برنامج. تنفذ الشبكة جميع التعليمات في المعاملة بشكل تسلسلي وذري: إما أن تنجح كل تعليمة، أو تفشل المعاملة بأكملها وتتراجع.

هذا يعني أنه يمكنك تجميع عدة تحويلات في معاملة واحدة. بدلاً من إرسال ثلاث معاملات منفصلة للدفع لثلاثة مستلمين، ترسل معاملة واحدة تحتوي على ثلاث تعليمات تحويل. هذا أسرع (تأكيد واحد بدلاً من ثلاثة) وأرخص (رسوم أساسية واحدة بدلاً من ثلاثة). إليك مثال توضيحي لكيفية تجميع المدفوعات (المشار إليها باسم "drops" في هذه الصورة) في معاملة واحدة وإرسال معاملات متعددة للتعامل مع الدفعة الأكبر.

مخطط الدفعات المجمعةمخطط الدفعات المجمعة

المصدر: QuickNode - كيفية إرسال معاملات مجمعة على سولانا

لمزيد من المعلومات حول المعاملات والتعليمات، راجع دليل المعاملات ودليل التعليمات.

يوضح الشرح أدناه كيفية تحميل تعليمات تحويل متعددة في معاملة واحدة للدفعات المجمعة.

تجميع التعليمات في معاملة واحدة

يمكن أن تحتوي معاملة سولانا على تحويلات متعددة لمستلمين مختلفين. توقع مرة واحدة، وتدفع رسوم معاملة واحدة، وتتم تسوية جميع التحويلات معاً. إذا فشل أي تحويل، يتم رفض المعاملة بأكملها.

راجع كيفية عمل المدفوعات على سولانا لمفاهيم الدفع الأساسية.

يتطلب تجميع تحويلات متعددة بناء كل تعليمة بشكل منفصل، ثم دمجها في معاملة واحدة.

توضح الخطوات أدناه التدفق الأساسي. راجع العرض التوضيحي للحصول على كود كامل قابل للتشغيل.

اشتقاق حسابات الرموز

أولاً، اشتق عناوين حساب الرموز المرتبط (ATA) للمرسل ولكل مستلم. حسابات ATA هي عناوين حتمية تعتمد على المحفظة والنعناع.

إنشاء تعليمات التحويل

أنشئ تعليمة تحويل منفصلة لكل مستلم. تحدد كل تعليمة:

  • عنوان حساب الرموز المصدر
  • عنوان حساب الرموز الوجهة
  • السلطة (عنوان مالك حساب الرموز المصدر)
  • المبلغ بالوحدات الأساسية (معدل حسب الكسور العشرية للنعناع)

الإرسال كمعاملة واحدة

أضف جميع تعليمات التحويل في معاملة واحدة. ينفذ هذا جميع التحويلات بشكل ذري، إما تنجح جميع التحويلات أو تفشل المعاملة بأكملها.

التحقق من الأرصدة

بعد التحويل المجمع، تحقق من أرصدة الرموز لجميع الأطراف باستخدام مساعد splToken.

اشتقاق حسابات الرموز

أولاً، اشتق عناوين حساب الرموز المرتبط (ATA) للمرسل ولكل مستلم. حسابات ATA هي عناوين حتمية تعتمد على المحفظة والنعناع.

إنشاء تعليمات التحويل

أنشئ تعليمة تحويل منفصلة لكل مستلم. تحدد كل تعليمة:

  • عنوان حساب الرموز المصدر
  • عنوان حساب الرموز الوجهة
  • السلطة (عنوان مالك حساب الرموز المصدر)
  • المبلغ بالوحدات الأساسية (معدل حسب الكسور العشرية للنعناع)

الإرسال كمعاملة واحدة

أضف جميع تعليمات التحويل في معاملة واحدة. ينفذ هذا جميع التحويلات بشكل ذري، إما تنجح جميع التحويلات أو تفشل المعاملة بأكملها.

التحقق من الأرصدة

بعد التحويل المجمع، تحقق من أرصدة الرموز لجميع الأطراف باستخدام مساعد splToken.

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

التوسع مع تخطيط المعاملات

تحتوي المعاملة الواحدة على حدود حجم—حوالي 1232 بايت. بالنسبة للعمليات المجمعة الكبيرة (كشوف المرتبات لمئات الموظفين، الإسقاطات الجوية الجماعية)، ستتجاوز هذا الحد وستحتاج إلى تقسيم العمل عبر معاملات متعددة.

على الرغم من أنك مرحب بك لإنشاء منطق توزيع المعاملات الخاص بك، فإن حزمة @solana/instruction-plans (جزء من Solana Kit) تتعامل مع هذا على مستويين:

خطط التعليمات تحدد عملياتك وقيود الترتيب الخاصة بها:

  • تسلسلية — تعليمات يجب تنفيذها بالترتيب
  • متوازية — تعليمات يمكن تنفيذها بأي ترتيب
  • غير قابلة للتقسيم — تعليمات يجب أن تبقى معاً في نفس المعاملة

خطط المعاملات يتم إنشاؤها من خطط التعليمات. يقوم المخطط بتعبئة التعليمات بذكاء في معاملات ذات حجم أمثل، مع احترام قيود الترتيب الخاصة بك. يمكن بعد ذلك لخطة المعاملة الناتجة أن:

  • تُنفذ — يتم توقيعها وإرسالها إلى الشبكة، مع إرسال المعاملات المتوازية بشكل متزامن
  • تُحاكى — تُختبر مقابل الشبكة للتحقق قبل الإرسال
  • تُسلسل — تُجمع إلى base64 لخدمات التوقيع الخارجية أو سير العمل متعدد الأطراف

يتيح لك هذا النهج ذو المستويين التفكير من حيث العمليات ("تحويل إلى Alice، ثم تحويل إلى Bob") بينما تتعامل المكتبة مع آليات حجم المعاملة والتعبئة والتنفيذ المتوازي.

Is this page helpful?

جدول المحتويات

تعديل الصفحة

تدار بواسطة

© 2026 مؤسسة سولانا.
جميع الحقوق محفوظة.
تواصل معنا