Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Solidity Playground

اكتب الأكواد البرمجية، شغّلها وشاركها — بدون أي إعداد.

Contract.sol
انقر على تشغيل لمشاهدة الإخراج هنا.
ArgsValues passed to your contract’s main(...) function. The runner ABI-encodes them based on the parameter types.
No arguments. Click "Add arg" to pass one.

جرّب 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؟
Solidity هي الأكثر استخدامًا بين لغات العقود الذكية لـ Ethereum والسلاسل المتوافقة مع EVM (Polygon وArbitrum وOptimism وBase وغيرها). تُترجَم إلى bytecode الخاص بـ EVM — مجموعة تعليمات لجهاز ذي مكدّس (stack machine) تُنفّذها كل عقدة في الشبكة. مأخوذة نحويًا من JavaScript وC++، لكن دلالاتها مختلفة جدًا: الـ storage مكلف ودائم، وكل استدعاء يُقاس بـ gas، ولا يوجد async. يمنحك الـ playground بيئة EVM داخل sandbox للتدرّب على اللغة دون لمس سلسلة حقيقية.
هل أحتاج إلى wallet أو ETH على testnet لاستخدام هذا؟
لا. يُشغّل الـ playground عقدك داخل EVM على الخادم (المحرّك نفسه الذي يأتي مع geth) في حاوية معزولة لكل طلب. لا توجد معاملة on-chain، ولا دفع gas بـ ETH حقيقية، ولا توقيع wallet. عند الضغط على Run، يقوم الـ runner بنشر عقدك على سلسلة جديدة في الذاكرة، ثم يستدعي دالة 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؟
تعرض Output ما كتبته إلى stdout عبر console.log(...) من forge-std/console.sol، إضافة إلى أي رسالة خطأ من revert / require. تعرض Events كل event أصدره عقدك أثناء التشغيل، بالترتيب، مع قيمة كل معامل (مع شارة صغيرة "indexed" للمعاملات الموسومة بـ indexed — هذه هي التي تنتقل إلى log topics في EVM ويمكن تصفيتها بأدوات مثل The Graph). تعرض Storage القيمة بعد التشغيل لكل متغيّر state تمّت الكتابة فيه، بما في ذلك مدخلات الـ mapping الفردية — أمّا المتغيّرات التي لم تلمسها فلا تظهر في القائمة.
لماذا لا يوجد main() في بعض دروس Solidity؟
على سلسلة حقيقية لا تملك عقود Solidity نقطة دخول واحدة — يستدعي العملاء أي دالة public يريدونها، تُعرَّف عبر selector من 4 بايتات. يستخدم الـ playground main() بوصفها عُرفًا حتى يكون هناك شيء واضح للتشغيل ومكان لوضع الوسائط. خارج الـ playground يكشف عقدك عادةً عدّة دوال (mint وtransfer وwithdraw وغيرها)، وتختار واجهتك الأمامية أو أداة مثل cast / ethers / viem أيًّا منها تستدعي.