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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

بعد النقل الجماعي، تحقق من أرصدة التوكن لجميع الأطراف عن طريق جلب كل token account باستخدام اتصال RPC الخاص بالعميل.

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

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

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

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

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

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

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

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

بعد النقل الجماعي، تحقق من أرصدة التوكن لجميع الأطراف عن طريق جلب كل token account باستخدام اتصال RPC الخاص بالعميل.

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 generateKeyPairSigner();
const recipient1 = await generateKeyPairSigner();
const recipient2 = await generateKeyPairSigner();
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
});
// Send both transfers in a single transaction using @solana/kit
const result = await client.sendTransaction([
transfer1Instruction,
transfer2Instruction
]);
console.log("\n=== Batch Token Payment Complete ===");
console.log("Transaction Signature:", result.context.signature);
// Fetch final token account balances using the client's RPC connection
const senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();
const recipient1Balance = await client.rpc
.getTokenAccountBalance(recipient1Ata)
.send();
const recipient2Balance = await client.rpc
.getTokenAccountBalance(recipient2Ata)
.send();
console.log(
"\nSender Token Account Balance:",
senderBalance.value.uiAmountString
);
console.log(
"Recipient 1 Token Account Balance:",
recipient1Balance.value.uiAmountString
);
console.log(
"Recipient 2 Token Account Balance:",
recipient2Balance.value.uiAmountString
);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

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

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

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

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

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

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

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

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

Is this page helpful?

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

تعديل الصفحة