إنتقل إلى المحتوى الرئيسي

استخدام عملية الكتابة لإرسال معاملة

الجمهور: المطورون المستعدون لإجراء أول عملية تغيير حالة. المتطلبات الأساسية: محفظة Sui Devnet ممولة وإعداد Node.js أساسي. الهدف: كتابة نص برمجي لنقل رموز Sui إلى عنوان آخر، وفهم دور الغاز والتوقيعات.


مقدمة

في دروسنا التعليمية السابقة، قمنا بإجراء عمليات القراءة. لقد طلبنا من SuiClient (الكاتب) الحصول على معلومات، والتي كانت مجانية ومجهولة المصدر.

والآن، سنقوم بإجراء عملية كتابة. سنقوم بنقل رموز Sui من محفظتك إلى عنوان آخر. نظرًا لأن هذا يغير حالة سلسلة الكتل، فسيتم تطبيق متطلبين جديدين:

  1. التوقيع: يجب عليك توقيع الطلب بشكل مشفر لإثبات امتلاكك للأموال.
  2. الرسوم (أجرة البريد): يجب عليك دفع رسوم بتوكنات Sui لتعويض الشبكة عن معالجة المعاملة.

المتطلبات الأساسية

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

  1. محفظة ممولة: عبارة استرداد مكونة من 12 كلمة لمحفظة تحتوي على رموز Sui Devnet المميزة.
  2. مكتبة زوج المفاتيح Ed25519: لتوقيع المعاملة.

قم بتثبيت حزمة التشفير المطلوبة (إذا لم تكن قد قمت بذلك بالفعل):

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. تحميل محفظتك (المرسل)
// REPLACE THIS with your actual 12-word mnemonic phrase
const MNEMONIC = "word1 word2 word3 ... word12";
const keypair = Ed25519Keypair.deriveKeypair(MNEMONIC);
const senderAddress = keypair.getPublicKey().toSuiAddress();

console.log(`📦 Sender Address: ${senderAddress}`);

الخطوة 2: إنشاء "الحزمة" (المعاملة)

في Sui، أنت لا ترسل أوامر خام. أنت تبني معاملة. فكّر في هذا على أنه ملء ملصق الشحن ووضع العناصر في الصندوق قبل ختمه.

سنستخدم الأمر tx.splitCoins. هذا يخبر الشبكة: "خذ عملة SUI الأساسية الخاصة بي، وقم بتقسيم مبلغ محدد، وقم بتجهيزها للتحويل."

// 3. تحديد المستلم
const RECIPIENT = '0x9999...'; // استبدلها بعنوان صديق أو عنوان حرق

// 4. إنشاء حاوية المعاملة
const tx = new Transaction();

// تقسيم 1000 MIST (أصغر وحدة من SUI) من عملة الغاز
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);

// نقل العملة المقسومة إلى المستلم
tx.transferObjects([coinToSend], RECIPIENT);

الخطوة 3: التوقيع، ودفع رسوم البريد، والشحن

هذه هي الخطوة الحاسمة حيث يتم حساب الغاز.

عند تنفيذ التعليمات البرمجية أدناه، فإن SuiClient:

  1. يقدر الغاز: ينظر إلى صندوق tx الخاص بك، ويزنه (التعقيد الحسابي)، ويحدد أجرة البريد المطلوبة.
  2. يوقع: يستخدم keypair الخاص بك لتوقيع المعاملة بشكل مشفر.
  3. التشغيل: يرسل المعاملة الموقعة إلى الشبكة.
async function sendTransaction() {
try {
console.log("📝 توقيع المعاملة وإرسالها...");

const result = await client.signAndExecuteTransactionBlock({
signer: keypair,
transactionBlock: tx,
});

console.log("✅ تم تقديم المعاملة!");
console.log(`Digest (معرّف التتبع): ${result.digest}`);

} catch (error) {
console.error("❌ فشل المعاملة:", error);
}
}

sendTransaction();

فهم الغاز في هذه المعاملة

قد تلاحظ أننا لم نحدد صراحةً مبلغ الرسوم.

  • الميزنة التلقائية: بشكل افتراضي، تقوم SDK تلقائيًا بتقدير تكلفة الغاز لك. ويضمن لك ذلك عدم دفع مبالغ زائدة بشكل كبير مع توفير ما يكفي لمعالجة المعاملة.
  • مصدر الدفع: تقوم SDK تلقائيًا باختيار كائن Sui coin من محفظتك لدفع هذه الرسوم. هذا هو السبب في أنه لا يمكنك إرسال كل عملة Sui الخاصة بك؛ يجب عليك دائمًا ترك جزء صغير لدفع ثمن غاز التحويل نفسه.

الإخراج المتوقع

عندما تنجح، ستتلقى ملخص المعاملة. هذا هو رقم التتبع الخاص بك.

📦 Sender Address: 0x123...
📝 توقيع المعاملة وإرسالها...
✅ تم إرسال المعاملة!
Digest (معرّف التتبع): 5T7x...9B2a

يمكنك نسخ هذه الخلاصة ولصقها في مستكشف Sui (مثل Suiscan) للاطلاع على السجل الدائم لعملية التحويل، بما في ذلك كمية الغاز التي استهلكتها بالضبط.