Solidity Playground
اكتب الأكواد البرمجية، شغّلها وشاركها — بدون أي إعداد.
انقر على تشغيل لمشاهدة الإخراج هنا.
جرّب Solidity في المتصفح
Solidity هي لغة عقود Ethereum الذكية. تعمل على EVM — الجهاز الافتراضي نفسه الذي يحمي مئات المليارات من الدولارات على mainnet ويُشغّل معظم سلاسل L2. يقدّم لك هذا الـ playground محرّر Monaco موصولًا بـ solc + geth EVM داخل sandbox، فتكتب عقدًا وتضغط Run وترى تمامًا ما الذي سيحدث on-chain: مخرجات console.log، الـ events المُصدَرة، والحالة النهائية لمتغيّرات storage — دون أي نشر، دون دفع gas، ودون لمس wallet.
تتسم Solidity ببعض الخصائص التي تستحق الانتباه عند البداية. الـ storage دائم بشكل افتراضي — كل ما تُسنده إلى متغيّر state يبقى محفوظًا، وكل ما هو داخل دالة يختفي عند عودة الاستدعاء. أما الـ events فهي الطريقة التي تتحدّث بها العقود مع العالم الخارجي (واجهتك الأمامية، الـ indexer، The Graph) — تستهلك gas، وتُكتب في سجلات (logs) المعاملة، ويمكن تصفيتها وفق المعاملات الموسومة بـ indexed. وكل دالة external تستقبل مدخلاتها عبر ABI encoding وليس عبر stdin — لهذا يوفّر الـ playground لوحة Args مُعرَّفة الأنواع، تتّصل مباشرة بمعاملات main(...) لديك.
ما يُتقنه هذا الـ Solidity playground
- تنفيذ حقيقي عبر solc + EVM، وليس محاكاة عبر transpiler. يستخدم console.log مكتبة forge-std، وتمرّ مسارات emit / storage عبر دلالات EVM الفعلية — opcodes وgas وكل شيء.
- تعرض علامة التبويب Events كل
emitمن تشغيلك مع تمييز واضح للمعاملات الموسومة بـindexed، فترى تمامًا ما الذي ستستقبله واجهة أمامية أو subgraph. - تعرض علامة التبويب Storage القيمة النهائية لكل متغيّر state لمسه العقد — بما في ذلك مدخلات الـ mapping (مثال:
balances[0xabc...]). أمّا المتغيّرات التي لم تكتب فيها فلا تظهر. - لوحة Args مُعرَّفة الأنواع تُمرّر القيم إلى
main(uint256 n, string memory name, ...)معامليّ. يقوم الـ runner بترميزها عبر ABI استنادًا إلى توقيع دالتك، فيتحوّل42إلىuint256و"hello"إلىstring.
ما يمكنك بناؤه في Solidity playground
- عقود عدّاد / increment-decrement لفهم كيفية بقاء متغيّرات الـ state بين الاستدعاءات — اكتب في
count، شغّل، وراقب القيمة وهي تظهر في علامة التبويب Storage. - أنماط تدفّق الـ tokens — أصدِر
Transfer(from indexed, to indexed, value)وستلاحظ كيف تُعرض الحقول indexed وغير الـ indexed بطريقة مختلفة في علامة التبويب Events، تمامًا كما تظهر في log topics الحقيقية لـ EVM. - حالات الفشل عبر
require/revert— اكتب guard يفشل عند إدخال غير صالح، وستجد رسالة الـ revert تظهر في stdout، بدلًا من حرق gas على معاملة فاشلة على mainnet.
أسئلة شائعة حول Solidity
ما هي Solidity؟
هل أحتاج إلى wallet أو ETH على testnet لاستخدام هذا؟
main(...) بالـ args التي قدّمتها، ويعرض لك stdout والـ events والـ storage من هذا الاستدعاء الواحد. بعد الـ Run يُتخلَّص من كل شيء.كيف أمرّر مدخلات إلى العقد؟
main(...) بالمعاملات المُعرَّفة الأنواع التي تريدها — مثل function main(uint256 n) external أو function main(string memory name, uint256 age, bool active) external view. ثم أضِف القيم في لوحة Args تحت المحرّر. يقرأ الـ runner توقيع الدالة ويُرمّز نصوصك بـ ABI إلى الأنواع المناسبة، تمامًا كما يفعل cast call على سطر الأوامر. للمعامل من نوع address اكتب 0x...؛ ولـ bool اكتب true أو false؛ ولـ uint اكتب القيمة العشرية.ما الفرق بين علامات التبويب Output وEvents وStorage؟
console.log(...) من forge-std/console.sol، إضافة إلى أي رسالة خطأ من revert / require. تعرض Events كل event أصدره عقدك أثناء التشغيل، بالترتيب، مع قيمة كل معامل (مع شارة صغيرة "indexed" للمعاملات الموسومة بـ indexed — هذه هي التي تنتقل إلى log topics في EVM ويمكن تصفيتها بأدوات مثل The Graph). تعرض Storage القيمة بعد التشغيل لكل متغيّر state تمّت الكتابة فيه، بما في ذلك مدخلات الـ mapping الفردية — أمّا المتغيّرات التي لم تلمسها فلا تظهر في القائمة.لماذا لا يوجد main() في بعض دروس Solidity؟
main() بوصفها عُرفًا حتى يكون هناك شيء واضح للتشغيل ومكان لوضع الوسائط. خارج الـ playground يكشف عقدك عادةً عدّة دوال (mint وtransfer وwithdraw وغيرها)، وتختار واجهتك الأمامية أو أداة مثل cast / ethers / viem أيًّا منها تستدعي.