تخطي إلى المحتوى الرئيسي
Change page

تشريح العقود الذكية

آخر تحديث للصفحة: 15 أبريل 2026

العقد الذكي هو برنامج يتم تشغيله على عنوان على إيثريوم. إنها تتكون من البيانات والوظائف التي يمكن تنفيذها عند تلقي المعاملة. فيما يلي نظرة عامة على العناصر التي يشكلها العقد الذكي.

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

تأكد من أنك قرأت عن العقود الذكية أولاً. يفترض هذا المستند أنك على دراية بلغات البرمجة مثل جافا سكريبت أو بايثون.

البيانات

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

التخزين

يشار إلى البيانات الدائمة بالتخزين ويتم تمثيلها بمتغيرات الحالة. يتم تخزين هذه القيم بشكل دائم على blockchain. يتعين عليك الإعلان عن النوع حتى يتمكن العقد من تتبع مقدار التخزين الذي تحتاجه على blockchain عند تجميعه.

// مثال سوليديتي
contract SimpleStorage {
    uint storedData; // متغير الحالة
    // ...
}
# مثال Vyper
storedData: int128

إذا كنت قد قمت بالفعل ببرمجة لغات موجهة للكائنات، فمن المحتمل أن تكون على دراية بمعظم الأنواع. ومع ذلك، يجب أن يكون address جديدًا عليك إذا كنت جديدًا في تطوير إيثريوم.

يمكن لنوع address أن يحمل عنوان إيثريوم الذي يعادل 20 بايت أو 160 بت. يتم إرجاعه بالتدوين الست عشري مع 0x بادئة.

تشمل الأنواع الأخرى ما يلي:

  • منطقية
  • عدد صحيح
  • أرقام النقطة الثابتة
  • صفائف بايت ذات حجم ثابت
  • مصفوفات البايت ذات الحجم الديناميكي
  • القيم الحرفية النسبية والصحيحة
  • القيم الحرفية النصية
  • القيم الحرفية الست عشرية
  • التعدادات

لمزيد من التوضيح، نلقي نظرة على المستندات:

الذاكرة

تسمى القيم التي يتم تخزينها فقط طوال مدة تنفيذ وظيفة العقد بمتغيرات الذاكرة. وبما أنه لا يتم تخزينها بشكل دائم على blockchain، فهي أرخص بكثير في الاستخدام.

تعرف على المزيد حول كيفية تخزين EVM للبيانات (التخزين، والذاكرة، والمكدس) في وثائق سوليديتي (opens in a new tab).

متغيرات البيئة

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

أمثلة:

الخاصيةمتغيرات الحالةالوصف
block.timestampالوحدة 256الطابع الزمني لعصر الكتلة الحالي
msg.senderالعنوانمرسل الرسالة (المكالمة الحالية)

الدوال

بعبارات أبسط، يمكن للوظائف الحصول على معلومات أو تعيين معلومات استجابةً للمعاملات الواردة.

هناك نوعان من استدعاءات الوظائف:

  • internal – هذه لا تنشئ استدعاءً لـ EVM
    • لا يمكن الوصول إلى الدوال الداخلية ومتغيرات الحالة إلا داخليًا (أي من داخل العقد الحالي أو العقود المشتقة منه)
  • external – هذه تنشئ استدعاءً لـ EVM
    • تعد الوظائف الخارجية جزءًا من واجهة العقد، مما يعني أنه يمكن استدعاؤها من عقود أخرى وعبر المعاملات. لا يمكن استدعاء دالة خارجية f داخليًا (أي أن f() لا تعمل، لكن this.f() تعمل).

يمكن أيضًا أن تكون public أو private

  • يمكن استدعاء دوال public داخليًا من داخل العقد أو خارجيًا عبر الرسائل
  • دوال private مرئية فقط للعقد الذي عُرِّفت فيه وليس في العقود المشتقة

يمكن جعل كل من الوظائف ومتغيرات الحالة عامة أو خاصة

فيما يلي وظيفة لتحديث متغير الحالة في العقد:

// مثال سوليديتي
function update_name(string value) public {
    dapp_name = value;
}
  • المعلمة value من النوع string تُمرر إلى الدالة: update_name
  • تم إعلانها public، مما يعني أن أي شخص يمكنه الوصول إليها
  • لم يتم إعلانها view، لذا يمكنها تعديل حالة العقد

دوال العرض

تعد هذه الوظائف بعدم تعديل حالة بيانات العقد. الأمثلة الشائعة هي وظائف "الحصول على" - يمكنك استخدام هذا لتلقي رصيد المستخدم على سبيل المثال.

// مثال سوليديتي
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

ما يعتبر تعديل الحالة:

  1. الكتابة لمتغيرات الحالة
  2. إصدار الأحداث (opens in a new tab).
  3. إنشاء عقود أخرى (opens in a new tab).
  4. استخدام selfdestruct.
  5. إرسال الأثير عن طريق المكالمات.
  6. استدعاء أي دالة غير معلمة كـ view أو pure.
  7. استخدام المكالمات ذات المستوى المنخفض.
  8. استخدام التجميع المضمن الذي يحتوي على رمز تشغيل معينة.

دوال المُنشِئ

دوال constructor تُنفذ مرة واحدة فقط عند نشر العقد لأول مرة. مثل constructor في العديد من لغات البرمجة القائمة على الأصناف، غالبًا ما تُهيئ هذه الدوال متغيرات الحالة إلى قيمها المحددة.

# مثال Vyper

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

الدوال المدمجة

بالإضافة إلى المتغيرات والوظائف التي تحددها في عقدك، هناك بعض الوظائف الخاصة المضمنة. الأمثلة الأكثر وضوحا هي :

  • address.send() – سوليديتي
  • send(address) – فايبر

تسمح هذه العقود بإرسال ETH إلى حسابات أخرى.

كتابة الدوال

تحتاج وظيفتك إلى:

  • متغير المعلمة ونوعها (إذا كان يقبل المعلمات)
  • إعلان داخلي/خارجي
  • إعلان نقي / عرض / مستحق الدفع
  • نوع الإرجاع (إذا كان يُرجع قيمة)

قد يبدو العقد الكامل شيئًا كهذا. هنا، توفر دالة constructor قيمة أولية للمتغير dapp_name.

الأحداث والسجلات

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

أمثلة مشروحة

هذه بعض الأمثلة الصلبة المكتوبة . إذا كنت ترغب في تجربة النص البرمجي، يمكنك التفاعل معه في ريميكس (opens in a new tab).

Hello world

الرمز

أصل رقمي فريد

قراءة إضافية

تحقق من وثائق سوليديتي وفايبر للحصول على نظرة عامة أكثر شمولاً حول العقود الذكية:

هل كان هذا المقال مفيداً؟