لغات العقد الذكي
آخر تحديث للصفحة: 26 فبراير 2026
أحد الجوانب الرائعة في إيثريوم هو أنه يمكن برمجة العقود الذكية باستخدام لغات صديقة للمطورين نسبيًا. إذا كنت من ذوي الخبرة في لغة بايثون أو أي لغة تستخدم الأقواس المتعرجة (opens in a new tab)، يمكنك إيجاد لغة ذات صياغة مألوفة.
اللغتان الأكثر نشاطًا والحفاظ عليهما هما:
- لغة برمجة سوليديتي
- لغة برمجة فايبر
يوفر ريميكس IDE بيئة تطوير شاملة لإنشاء واختبار العقود في كل من سوليديتي وفايبر. جرب بيئة التطوير المتكاملة ريميكس IDE في المتصفح (opens in a new tab) لبدء البرمجة.
قد يرغب المطورون الأكثر خبرة أيضًا في استخدام لغة يول، وهي لغة وسيطة لـ آلة إيثريوم الافتراضية، أو يول+، وهو امتداد للغة يول.
إذا كنت فضوليًا وترغب في المساعدة في اختبار اللغات الجديدة التي لا تزال قيد التطوير المكثف، فيمكنك تجربة Fe، وهي لغة عقود ذكية ناشئة لا تزال حاليًا في مهدها.
المتطلبات الأساسية
يمكن أن تساعدك المعرفة السابقة بلغات البرمجة، وخاصة جافا سكريبت أو بايثون، على فهم الاختلافات في لغات العقود الذكية. نوصيك أيضًا بفهم العقود الذكية كمفهوم قبل التعمق في المقارنات اللغوية. مقدمة إلى العقود الذكية.
سوليديتي
- لغة كائنية عالية المستوى لتنفيذ العقود الذكية.
- لغة القوس المتعرج التي تأثرت بشدة بـ سي بلس بلس.
- مكتوب بشكل ثابت (نوع المتغير معروف في وقت الترجمة).
- يدعم:
- الميراث (يمكنك تمديد عقود أخرى).
- المكتبات (يمكنك إنشاء تعليمات برمجية قابلة لإعادة الاستخدام يمكنك استدعاؤها من عقود مختلفة - مثل الوظائف الثابتة في فئة ثابتة في لغات البرمجة الموجهة للكائنات الأخرى).
- أنواع معقدة محددة من قبل المستخدم.
روابط مهمة
- التوثيق (opens in a new tab)
- بوابة لغة سوليديتي (opens in a new tab)
- سوليديتي by Example (opens in a new tab)
- غيت هاب (opens in a new tab)
- غرفة محادثة سوليديتي على جيتر (opens in a new tab) مرتبطة بـ غرفة محادثة سوليديتي على Matrix (opens in a new tab)
- ورقة الغش (opens in a new tab)
- مدونة سوليديتي (opens in a new tab)
- حساب سوليديتي على تويتر (opens in a new tab)
عقد مثال
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // الكلمة الرئيسية "public" تجعل المتغيرات6 // قابلة للوصول من العقود الأخرى7 address public minter;8 mapping (address => uint) public balances;910 // تسمح الأحداث للعملاء بالتفاعل مع11 // تغييرات معينة في العقد تعلن عنها12 event Sent(address from, address to, uint amount);1314 // يتم تشغيل كود المنشئ فقط عند إنشاء15 // العقد16 constructor() {17 minter = msg.sender;18 }1920 // يرسل كمية من العملات التي تم إنشاؤها حديثًا إلى عنوان21 // لا يمكن استدعاؤه إلا من قبل منشئ العقد22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // يرسل كمية من العملات الموجودة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).
روابط مهمة
- التوثيق (opens in a new tab)
- فايبر by Example (opens in a new tab)
- More فايبر by Example (opens in a new tab)
- غيت هاب (opens in a new tab)
- محادثة مجتمع فايبر على ديسكورد (opens in a new tab)
- ورقة الغش (opens in a new tab)
- أطر وأدوات تطوير العقود الذكية للغة فايبر
- VyperPunk - تعلم كيفية تأمين واختراق عقود فايبر الذكية (opens in a new tab)
- مركز فايبر للتطوير (opens in a new tab)
- أفضل أمثلة عقود فايبر الذكية (opens in a new tab)
- موارد منسقة رائعة للغة فايبر (opens in a new tab)
مثال
1# مزاد مفتوح23# معلمات المزاد45# يتلقى المستفيد الأموال من صاحب أعلى عرض67beneficiary: public(address)8auctionStart: public(uint256)9auctionEnd: public(uint256)1011# الحالة الحالية للمزاد1213highestBidder: public(address)14highestBid: public(uint256)1516# يتم تعيينه إلى "true" في النهاية، ويمنع أي تغيير1718ended: public(bool)1920# تتبع العروض المستردة حتى نتمكن من اتباع نمط السحب2122pendingReturns: public(HashMap[address, uint256])2324# إنشاء مزاد بسيط مع وقت مزايدة `_bidding_time` بالثواني2526# نيابة عن عنوان المستفيد `_beneficiary`.2728@external29def __init__(_beneficiary: address, _bidding_time: uint256):30 self.beneficiary = _beneficiary31 self.auctionStart = block.timestamp32 self.auctionEnd = self.auctionStart + _bidding_time3334# المزايدة على المزاد بالقيمة المرسلة3536# مع هذه المعاملة.3738# سيتم استرداد القيمة فقط في حالة3940# عدم الفوز بالمزاد.4142@external43@payable44def bid():45 # تحقق مما إذا كانت فترة المزايدة قد انتهت.46 assert block.timestamp < self.auctionEnd47 # تحقق مما إذا كان العرض مرتفعًا بما فيه الكفاية48 assert msg.value > self.highestBid49 # تتبع المبلغ المسترد لمقدم العطاء الأعلى السابق50 self.pendingReturns[self.highestBidder] += self.highestBid51 # تتبع العرض الأعلى الجديد52 self.highestBidder = msg.sender53 self.highestBid = msg.value5455# سحب عرض تم استرداده مسبقًا. يتم استخدام نمط السحب5657# هنا لتجنب مشكلة أمنية. إذا تم إرسال المبالغ المستردة مباشرة5859# كجزء من bid()، يمكن لعقد مزايدة ضار أن يمنع6061# تلك المبالغ المستردة وبالتالي يمنع وصول عروض أعلى جديدة.6263@external64def withdraw():65 pending_amount: uint256 = self.pendingReturns[msg.sender]66 self.pendingReturns[msg.sender] = 067 send(msg.sender, pending_amount)6869# إنهاء المزاد وإرسال أعلى عرض7071# إلى المستفيد.7273@external74def endAuction():75 # من الإرشادات الجيدة تنظيم الوظائف التي تتفاعل76 # مع العقود الأخرى (أي، تستدعي وظائف أو ترسل الإيثر)77 # في ثلاث مراحل:78 # 1. التحقق من الشروط79 # 2. تنفيذ الإجراءات (من المحتمل تغيير الشروط)80 # 3. التفاعل مع العقود الأخرى81 # إذا تم خلط هذه المراحل، يمكن للعقد الآخر82 # أن يستدعي مرة أخرى العقد الحالي ويعدل الحالة أو يتسبب83 # في تنفيذ التأثيرات (دفع الإيثر) عدة مرات.84 # إذا كانت الوظائف التي يتم استدعاؤها داخليًا تتضمن تفاعلاً مع عقود85 # خارجية، فيجب أيضًا اعتبارها تفاعلاً مع86 # عقود خارجية.8788 # 1. الشروط89 # تحقق مما إذا كان وقت انتهاء المزاد قد حان90 assert block.timestamp >= self.auctionEnd91 # تحقق مما إذا كانت هذه الوظيفة قد تم استدعاؤها بالفعل92 assert not self.ended9394 # 2. التأثيرات95 self.ended = True9697 # 3. التفاعل98 send(self.beneficiary, self.highestBid)إظهار الكليجب أن يمنحك هذا المثال فكرة عن صيغة عقد فايبر. للحصول على وصف أكثر تفصيلاً للوظائف والمتغيرات، انظر التوثيق (opens in a new tab).
يول و يول+
إذا كنت جديدًا على إيثريوم ولم تقم بأي تشفير باستخدام لغات العقود الذكية حتى الآن، فنوصيك بالبدء في استخدام سوليديتي أو فايبر. لا تنظر إلى يول أو يول+ إلا بعد أن تتعرف على أفضل ممارسات أمان العقود الذكية وتفاصيل العمل مع EVM.
يول
- لغة وسيطة للإيثيريوم.
- تدعم EVM وEwasm (opens in a new tab)، وهي مجموعة ويب بنكهة الإيثريوم، ومصممة لتكون قاسمًا مشتركًا قابلاً للاستخدام لكلا المنصتين.
- هدف جيد لمراحل التحسين عالية المستوى التي يمكن أن تفيد منصات EVM وEwasm على حد سواء.
يول+
- امتداد منخفض المستوى وعالي الكفاءة لـ يول.
- صُممت في البداية لعقد الرول أب التفائلي.
- يمكن النظر إلى يول+ على أنه اقتراح ترقية تجريبي لـ يول، مما يضيف ميزات جديدة إليه.
روابط مهمة
- توثيق يول (opens in a new tab)
- توثيق يول+ (opens in a new tab)
- منشور مقدمة عن يول+ (opens in a new tab)
عقد مثال
المثال البسيط التالي يطبق دالة الطاقة. يمكن تجميعه باستخدام solc --strict-assembly --bin input.yul. يجب أن يتم تخزين المثال في ملف input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {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.
روابط مهمة
- غيت هاب (opens in a new tab)
- إعلان لغة Fe (opens in a new tab)
- خارطة طريق Fe لعام 2021 (opens in a new tab)
- محادثة Fe على ديسكورد (opens in a new tab)
- حساب Fe على تويتر (opens in a new tab)
عقد مثال
فيما يلي عقد بسيط تم تنفيذه في Fe.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16إظهار الكلكيف تختار
كما هو الحال مع أي لغة برمجة أخرى، يتعلق الأمر في الغالب باختيار الأداة المناسبة للوظيفة المناسبة بالإضافة إلى التفضيلات الشخصية.
إليك بعض الأشياء التي يجب مراعاتها إذا لم تجرب أيًا من اللغات بعد:
ما هو المفضل عن سوليديتي؟
- إذا كنت مبتدئًا، فهناك العديد من البرامج التعليمية وأدوات التعلم المتاحة. انظر المزيد عن ذلك في قسم التعلم عن طريق البرمجة.
- أدوات المطور الجيدة المتاحة.
- تمتلك سوليديتي مجتمعًا كبيرًا من المطورين، مما يعني أنك ستجد على الأرجح إجابات لأسئلتك بسرعة كبيرة.
ما هو المفضل عن فايبر؟
- طريقة رائعة لبدء مطوري بايثون الذين يرغبون في كتابة عقود ذكية.
- يحتوي فايبر على عدد أقل من الميزات مما يجعله رائعًا للنماذج الأولية السريعة للأفكار.
- يهدف فايبر إلى أن يكون سهل التدقيق ويمكن قراءته إلى أقصى حد من قبل الإنسان.
ما هو المفضل عب يول و يول+ ؟
- لغة مبسطة وعملية ذات مستوى منخفض.
- يسمح بالاقتراب كثيرًا من EVM الخام، مما يمكن أن يساعد في تحسين استخدام الغاز في العقود الخاصة بك.
مقارنات اللغات
لإجراء مقارنات بين الصيغة الأساسية ودورة حياة العقد والواجهات والمشغلات وهياكل البيانات والوظائف وتدفق التحكم والمزيد، راجع ورقة الغش هذه من Auditless (opens in a new tab)