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

لغات العقد الذكي

آخر تحديث للصفحة: 26 فبراير 2026

أحد الجوانب الرائعة في إيثريوم هو أنه يمكن برمجة العقود الذكية باستخدام لغات صديقة للمطورين نسبيًا. إذا كنت من ذوي الخبرة في لغة بايثون أو أي لغة تستخدم الأقواس المتعرجة (opens in a new tab)، يمكنك إيجاد لغة ذات صياغة مألوفة.

اللغتان الأكثر نشاطًا والحفاظ عليهما هما:

  • لغة برمجة سوليديتي
  • لغة برمجة فايبر

يوفر ريميكس IDE بيئة تطوير شاملة لإنشاء واختبار العقود في كل من سوليديتي وفايبر. جرب بيئة التطوير المتكاملة ريميكس IDE في المتصفح (opens in a new tab) لبدء البرمجة.

قد يرغب المطورون الأكثر خبرة أيضًا في استخدام لغة يول، وهي لغة وسيطة لـ آلة إيثريوم الافتراضية، أو يول+، وهو امتداد للغة يول.

إذا كنت فضوليًا وترغب في المساعدة في اختبار اللغات الجديدة التي لا تزال قيد التطوير المكثف، فيمكنك تجربة Fe، وهي لغة عقود ذكية ناشئة لا تزال حاليًا في مهدها.

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

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

سوليديتي

  • لغة كائنية عالية المستوى لتنفيذ العقود الذكية.
  • لغة القوس المتعرج التي تأثرت بشدة بـ سي بلس بلس.
  • مكتوب بشكل ثابت (نوع المتغير معروف في وقت الترجمة).
  • يدعم:
    • الميراث (يمكنك تمديد عقود أخرى).
    • المكتبات (يمكنك إنشاء تعليمات برمجية قابلة لإعادة الاستخدام يمكنك استدعاؤها من عقود مختلفة - مثل الوظائف الثابتة في فئة ثابتة في لغات البرمجة الموجهة للكائنات الأخرى).
    • أنواع معقدة محددة من قبل المستخدم.

عقد مثال

1// SPDX-License-Identifier: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // الكلمة الرئيسية "public" تجعل المتغيرات
6 // قابلة للوصول من العقود الأخرى
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // تسمح الأحداث للعملاء بالتفاعل مع
11 // تغييرات معينة في العقد تعلن عنها
12 event Sent(address from, address to, uint amount);
13
14 // يتم تشغيل كود المنشئ فقط عند إنشاء
15 // العقد
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // يرسل كمية من العملات التي تم إنشاؤها حديثًا إلى عنوان
21 // لا يمكن استدعاؤه إلا من قبل منشئ العقد
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // يرسل كمية من العملات الموجودة
29 // من أي مستدعٍ إلى عنوان
30 function send(address receiver, uint amount) public {
31 require(amount <= balances[msg.sender], "رصيد غير كافٍ.");
32 balances[msg.sender] -= amount;
33 balances[receiver] += amount;
34 emit Sent(msg.sender, receiver, amount);
35 }
36}
إظهار الكل

يجب أن يمنحك هذا المثال فكرة عن صيغة عقد سوليديتي. للحصول على وصف أكثر تفصيلاً للوظائف والمتغيرات، انظر التوثيق (opens in a new tab).

فايبر

  • لغة البرمجة Pythonic
  • صياغة قوية
  • رمز مترجم صغير ومفهوم
  • توليد رمز بايت فعال
  • تحتوي عمدًا على ميزات أقل من سوليديتي بهدف جعل العقود أكثر أمانًا وأسهل للتدقيق. فايبر لا يدعم:
    • المعدلون
    • الميراث
    • التجميع المضمن
    • التحميل الزائد للوظيفة
    • التحميل الزائد على المشغل
    • الدعوة العودية
    • حلقات لا نهائية الطول
    • النقاط الثابتة الثنائية

لمزيد من المعلومات، اقرأ منطق فايبر (opens in a new tab).

مثال

1# مزاد مفتوح
2
3# معلمات المزاد
4
5# يتلقى المستفيد الأموال من صاحب أعلى عرض
6
7beneficiary: public(address)
8auctionStart: public(uint256)
9auctionEnd: public(uint256)
10
11# الحالة الحالية للمزاد
12
13highestBidder: public(address)
14highestBid: public(uint256)
15
16# يتم تعيينه إلى "true" في النهاية، ويمنع أي تغيير
17
18ended: public(bool)
19
20# تتبع العروض المستردة حتى نتمكن من اتباع نمط السحب
21
22pendingReturns: public(HashMap[address, uint256])
23
24# إنشاء مزاد بسيط مع وقت مزايدة `_bidding_time` بالثواني
25
26# نيابة عن عنوان المستفيد `_beneficiary`.
27
28@external
29def __init__(_beneficiary: address, _bidding_time: uint256):
30 self.beneficiary = _beneficiary
31 self.auctionStart = block.timestamp
32 self.auctionEnd = self.auctionStart + _bidding_time
33
34# المزايدة على المزاد بالقيمة المرسلة
35
36# مع هذه المعاملة.
37
38# سيتم استرداد القيمة فقط في حالة
39
40# عدم الفوز بالمزاد.
41
42@external
43@payable
44def bid():
45 # تحقق مما إذا كانت فترة المزايدة قد انتهت.
46 assert block.timestamp < self.auctionEnd
47 # تحقق مما إذا كان العرض مرتفعًا بما فيه الكفاية
48 assert msg.value > self.highestBid
49 # تتبع المبلغ المسترد لمقدم العطاء الأعلى السابق
50 self.pendingReturns[self.highestBidder] += self.highestBid
51 # تتبع العرض الأعلى الجديد
52 self.highestBidder = msg.sender
53 self.highestBid = msg.value
54
55# سحب عرض تم استرداده مسبقًا. يتم استخدام نمط السحب
56
57# هنا لتجنب مشكلة أمنية. إذا تم إرسال المبالغ المستردة مباشرة
58
59# كجزء من bid()، يمكن لعقد مزايدة ضار أن يمنع
60
61# تلك المبالغ المستردة وبالتالي يمنع وصول عروض أعلى جديدة.
62
63@external
64def withdraw():
65 pending_amount: uint256 = self.pendingReturns[msg.sender]
66 self.pendingReturns[msg.sender] = 0
67 send(msg.sender, pending_amount)
68
69# إنهاء المزاد وإرسال أعلى عرض
70
71# إلى المستفيد.
72
73@external
74def endAuction():
75 # من الإرشادات الجيدة تنظيم الوظائف التي تتفاعل
76 # مع العقود الأخرى (أي، تستدعي وظائف أو ترسل الإيثر)
77 # في ثلاث مراحل:
78 # 1. التحقق من الشروط
79 # 2. تنفيذ الإجراءات (من المحتمل تغيير الشروط)
80 # 3. التفاعل مع العقود الأخرى
81 # إذا تم خلط هذه المراحل، يمكن للعقد الآخر
82 # أن يستدعي مرة أخرى العقد الحالي ويعدل الحالة أو يتسبب
83 # في تنفيذ التأثيرات (دفع الإيثر) عدة مرات.
84 # إذا كانت الوظائف التي يتم استدعاؤها داخليًا تتضمن تفاعلاً مع عقود
85 # خارجية، فيجب أيضًا اعتبارها تفاعلاً مع
86 # عقود خارجية.
87
88 # 1. الشروط
89 # تحقق مما إذا كان وقت انتهاء المزاد قد حان
90 assert block.timestamp >= self.auctionEnd
91 # تحقق مما إذا كانت هذه الوظيفة قد تم استدعاؤها بالفعل
92 assert not self.ended
93
94 # 2. التأثيرات
95 self.ended = True
96
97 # 3. التفاعل
98 send(self.beneficiary, self.highestBid)
إظهار الكل

يجب أن يمنحك هذا المثال فكرة عن صيغة عقد فايبر. للحصول على وصف أكثر تفصيلاً للوظائف والمتغيرات، انظر التوثيق (opens in a new tab).

يول و يول+

إذا كنت جديدًا على إيثريوم ولم تقم بأي تشفير باستخدام لغات العقود الذكية حتى الآن، فنوصيك بالبدء في استخدام سوليديتي أو فايبر. لا تنظر إلى يول أو يول+ إلا بعد أن تتعرف على أفضل ممارسات أمان العقود الذكية وتفاصيل العمل مع EVM.

يول

  • لغة وسيطة للإيثيريوم.
  • تدعم EVM وEwasm (opens in a new tab)، وهي مجموعة ويب بنكهة الإيثريوم، ومصممة لتكون قاسمًا مشتركًا قابلاً للاستخدام لكلا المنصتين.
  • هدف جيد لمراحل التحسين عالية المستوى التي يمكن أن تفيد منصات EVM وEwasm على حد سواء.

يول+

  • امتداد منخفض المستوى وعالي الكفاءة لـ يول.
  • صُممت في البداية لعقد الرول أب التفائلي.
  • يمكن النظر إلى يول+ على أنه اقتراح ترقية تجريبي لـ يول، مما يضيف ميزات جديدة إليه.

عقد مثال

المثال البسيط التالي يطبق دالة الطاقة. يمكن تجميعه باستخدام solc --strict-assembly --bin input.yul. يجب أن يتم تخزين المثال في ملف input.yul.

1{
2 function power(base, exponent) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
9 result := power(mul(base, base), div(exponent, 2))
10 if mod(exponent, 2) { result := mul(base, result) }
11 }
12 }
13 let res := power(calldataload(0), calldataload(32))
14 mstore(0, res)
15 return(0, 32)
16}
إظهار الكل

إذا كنت من ذوي الخبرة الجيدة في العقود الذكية، فيمكن العثور على تنفيذ ERC20 الكامل في لغة يول هنا (opens in a new tab).

Fe

  • اللغة المكتوبة بشكل ثابت لجهاز إيثريوم الظاهري (EVM).
  • مستوحاة من بايثون والصدأ.
  • تهدف إلى أن تكون سهلة التعلم - حتى للمطورين الجدد في نظام إيثريوم البيئي.
  • لا يزال تطوير Fe في مراحله الأولى، وقد صدرت اللغة ألفا في يناير 2021.

عقد مثال

فيما يلي عقد بسيط تم تنفيذه في Fe.

1type BookMsg = bytes[100]
2
3contract GuestBook:
4 pub guest_book: map<address, BookMsg>
5
6 event Signed:
7 book_msg: BookMsg
8
9 pub def sign(book_msg: BookMsg):
10 self.guest_book[msg.sender] = book_msg
11
12 emit Signed(book_msg=book_msg)
13
14 pub def get_msg(addr: address) -> BookMsg:
15 return self.guest_book[addr].to_mem()
16
إظهار الكل

كيف تختار

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

إليك بعض الأشياء التي يجب مراعاتها إذا لم تجرب أيًا من اللغات بعد:

ما هو المفضل عن سوليديتي؟

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

ما هو المفضل عن فايبر؟

  • طريقة رائعة لبدء مطوري بايثون الذين يرغبون في كتابة عقود ذكية.
  • يحتوي فايبر على عدد أقل من الميزات مما يجعله رائعًا للنماذج الأولية السريعة للأفكار.
  • يهدف فايبر إلى أن يكون سهل التدقيق ويمكن قراءته إلى أقصى حد من قبل الإنسان.

ما هو المفضل عب يول و يول+ ؟

  • لغة مبسطة وعملية ذات مستوى منخفض.
  • يسمح بالاقتراب كثيرًا من EVM الخام، مما يمكن أن يساعد في تحسين استخدام الغاز في العقود الخاصة بك.

مقارنات اللغات

لإجراء مقارنات بين الصيغة الأساسية ودورة حياة العقد والواجهات والمشغلات وهياكل البيانات والوظائف وتدفق التحكم والمزيد، راجع ورقة الغش هذه من Auditless (opens in a new tab)

قراءة إضافية

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