استخدام عملية الكتابة لإرسال معاملة
الجمهور: المطورون المستعدون لإجراء أول عملية تغيير للحالة على السلسلة.
المتطلبات الأساسية: محفظة مموّلة على شبكة Sui devnet وبيئة Node.js أساسية.
الهدف: كتابة برنامج نصي لتحويل رموز Sui إلى عنوان آخر، مع فهم دور الغاز والتوقيعات.
مقدمة
في البرامج التعليمية السابقة، قمت بإجراء عمليات قراءة عبر الاستعلام من SuiClient للحصول على البيانات دون تكبد رسوم شبكة.
الآن، ستقوم بإجراء عملية كتابة لتحويل رموز Sui من محفظتك إلى عنوان آخر. نظرًا لأن هذا يعدل الحالة على السلسلة، ينطبق شرطان أساسيان:
- التوقيع: يجب عليك توقيع الطلب مشفرًا لإثبات ملكيتك للأموال.
- الغاز (رسوم الإرسال): يجب عليك دفع رسوم برموز Sui لتعويض الشبكة عن معالجة المعاملة.
المتطلبات الأساسية
لتشغيل هذا البرنامج التعليمي، تحتاج إلى:
- محفظة مموّلة: عبارة استرداد مكونة من 12 كلمة لمحفظة تحتوي على رموز Sui
devnet. يمكنك طلب رموز اختبار مجانية عبر صنبور Sui على ديسكورد أو مباشرةً داخل محفظة Sui متوافقة. - حزمة أزواج المفاتيح Ed25519:
@mysten/suiلتوقيع المعاملة.
قم بتثبيت الحزمة المطلوبة (إذا لم تكن قد قمت بذلك بالفعل):
npm install @mysten/sui
في التطبيقات الإنتاجية، لا تقم أبدًا بتضمين مفتاحك الخاص أو عبارة الاسترداد في التعليمات البرمجية بشكل مباشر. استخدم دائمًا متغيرات البيئة (مثل .env). يستخدم هذا البرنامج التعليمي متغيرًا في الذاكرة لأغراض العرض التوضيحي، ولكن لا تقم أبدًا بإرسال عبارات الاسترداد الخاصة إلى GitHub.
1. استيراد التبعيات وتهيئة العميل
أنشئ ملفاً باسم transfer.js. استورد SuiClient للاتصال بالشبكة و Ed25519Keypair لتوقيع المعاملة.
import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';
import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
import { Transaction } from '@mysten/sui/transactions';
// 1. الاتصال بشبكة Devnet
const client = new SuiClient({ url: getFullnodeUrl('devnet') });
// 2. تحميل محفظتك (المرسل)
// استبدل هذا بعبارة الاسترداد الفعلية المكونة من 12 كلمة
const MNEMONIC = "word1 word2 word3 ... word12";
const keypair = Ed25519Keypair.deriveKeypair(MNEMONIC);
const senderAddress = keypair.getPublicKey().toSuiAddress();
console.log(`📦 عنوان المرسل: ${senderAddress}`);
قبل إرسال معاملة، يحتاج عنوان المرسل الخاص بك إلى رموز اختبار لدفع رسوم الغاز. انسخ عنوان المرسل المطبوع في الطرفية واطلب الرموز عبر قناة #devnet-faucet في ديسكورد Sui.
2. إنشاء المعاملة
في Sui، تقوم بإنشاء Transaction بدلاً من إرسال أوامر أولية. فكر في هذا كملء ملصق شحن وتعبئة العناصر في صندوق قبل إغلاقه بإحكام.
استخدم الأمر tx.splitCoins لاقتطاع مبلغ محدد من عملة الغاز الأساسية الخاصة بك:
// 3. تحديد المستلم
const RECIPIENT = '0x9999...'; // استبدله بعنوان صديق أو عنوان حرق
// 4. إنشاء حاوية المعاملة
const tx = new Transaction();
// اقتطاع 1000 MIST (أصغر وحدة من SUI) من عملة الغاز
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);
// تحويل العملة المقتطعة إلى المستلم
tx.transferObjects([coinToSend], RECIPIENT);
3. توقيع المعاملة وإرسالها
تحسب هذه الخطوة رسوم الغاز وتدفعها قبل تنفيذ المعاملة على السلسلة.
┌─────────────────────────┐ ┌─────────────────────────┐ ┌───────────────────────────┐
│ 1. إنشاء المعاملة │ ──► │ 2. التوقيع بزوج المفاتيح │ ──► │ 3. الإرسال عبر SuiClient │
│ (splitCoins, transfer) │ │ (إثبات تشفيري) │ │ (البث إلى Devnet) │
└─────────────────────────┘ └─────────────────────────┘ └───────────────────────────┘
عند استدعاء signAndExecuteTransaction، يقوم SuiClient بما يلي:
- تقدير الغاز: يحسب التعقيد الحسابي ويحدد ميزانية الغاز المطلوبة.
- التوقيع: يطبق توقيع
keypairللموافقة على تغيير الحالة. - الإرسال: ينقل المعاملة الموقعة عبر عقدة RPC الكاملة إلى الشبكة.
async function sendTransaction() {
try {
console.log("📝 جاري توقيع المعاملة وإرسالها...");
const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});
console.log("✅ تم إرسال المعاملة!");
console.log(`Digest (معرف التتبع): ${result.digest}`);
} catch (error) {
console.error("❌ فشلت المعاملة:", error);
}
}
sendTransaction();
فهم الغاز في هذه المعاملة
لست بحاجة إلى حساب تكاليف الغاز يدوياً.
- الميزانية التلقائية: بشكل افتراضي، تقدر الحزمة SDK تكلفة الغاز نيابة عنك. وتحدد ميزانية كافية للتنفيذ دون مبالغة في الدفع.
- مصدر الدفع: تختار الحزمة SDK تلقائياً كائن عملة SUI من محفظتك لدفع هذه الرسوم. لذلك، احرص دائماً على الاحتفاظ بكمية صغيرة من SUI في محفظتك لتغطية الغاز.
المخرجات المتوقعة
عند النجاح، يطبع البرنامج النصي Transaction Digest (معرّف تتبع معاملتك):
📦 عنوان المرسل: 0x123...
📝 جاري توقيع المعاملة وإرسالها...
✅ تم إرسال المعاملة!
Digest (معرف التتبع): 5T7x...9B2a
انسخ هذا الملخص وابحث عنه على Suiscan. يعرض المستكشف السجل الدائم على السلسلة، بما في ذلك استهلاك الغاز وحالة التنفيذ.
الخطوات التالية
الآن بعد أن قمت بتنفيذ أول معاملة كتابة على السلسلة:
- اقرأ كيفية جلب بيانات الكائنات لفحص الكائن الذي استلمه المستلم حديثاً.
- راجع بنية SuiClient للتعرف على النموذج المفاهيمي لعقد Sui والموظفين.
- استكشف مرجع واجهة برمجة التطبيقات لـ
getObjectللاستعلام عن تأثيرات المعاملات التفصيلية ومخططات الكائنات.