From b84671e703e318b161fff956d3adff106050007d Mon Sep 17 00:00:00 2001 From: suhail-256 Date: Sun, 1 Mar 2026 21:03:19 +0200 Subject: [PATCH 1/2] fix: correct Arabic translation in ar/strings.json --- client/src/gamedata/ar/strings.json | 50 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/client/src/gamedata/ar/strings.json b/client/src/gamedata/ar/strings.json index 3461e9cd7..d0887d434 100644 --- a/client/src/gamedata/ar/strings.json +++ b/client/src/gamedata/ar/strings.json @@ -2,9 +2,9 @@ "ethernaut": "ايثرناوت", "title": "الايثرناوت", "hiring": "نقوم بالتوظيف!", - "ctfRegister": "سجل الان!", + "ctfRegister": "سجل الآن!", "ctfInfo": "نحن نستضيف Ethernaut CTF: حدث التقاط العلم لمدة 48 ساعة مع جوائز وتحديات blockchain، بدءًا من 16/03.", - "info": "

لعبة ايثرناوت هي لعبة حرب تستند إلى ويب3 / سوليديتى مستوحاة من overthewire.org ، يتم لعبها في آلة إيثريوم اﻻفتراضية. كل مستوى هو عقد ذكي يحتاج إلى اختراق. اللعبة مفتوحة المصدر بنسبة 100٪ وجميع المستويات مساهمات من لاعبين آخرين. هل لديك فكرة شيقة؟ العلاقات العامة

", + "info": "

لعبة ايثرناوت هي لعبة حرب تستند إلى ويب3 / سوليديتى مستوحاة من overthewire.org ، يتم لعبها في آلة إيثريوم اﻻفتراضية. كل مستوى هو عقد ذكي يحتاج إلى اختراق. اللعبة مفتوحة المصدر بنسبة 100٪ وجميع المستويات مساهمات من لاعبين آخرين. هل لديك فكرة شيقة؟ العلاقات العامة

", "home": "الرئيسية", "help": "مساعدة", "stats": "احصائيات", @@ -22,20 +22,20 @@ "french": "Français", "russian": "Русский", "korean": "한국어", - "playNow": "العب الان!", + "playNow": "العب الآن!", "toggleNavigation": "تصفح", - "levelCompleted": "انتهي المستوى!", + "levelCompleted": "انتهى المستوى!", "sources": "مصادر", "submitInstance": "تسليم النسخة", "getNewInstance": "احصل على نسخة جديدة", "accountNotConnectedTitle": "حساب MetaMask غير متصل", "accountNotConnectedMessage": "لبدء مغامرتك، قم بتوصيل محفظة MetaMask الخاصة بك! تتفاعل لعبتنا بشكل مباشر مع عقود Ethernaut على السلسلة، مما يعني أن أفعالك في اللعبة مسجلة على blockchain. من خلال ربط حساب MetaMask الخاص بك، يمكنك التفاعل بأمان مع هذه العقود الذكية، مما يسمح لك بحل التحديات والتقدم في اللعبة.", - "connectAccount": "يتصل", + "connectAccount": "اتصل", "deployMessageTitle": "لم يتم نشر اللعبة", "deployMessage": "تدُعم اللُعبة حاليًا هذه الشبكات فقط:", "deprecatedNetwork": "شبكة عفا عليها الزمن", "networkBeingDeprecated": "يتم إهمال الشبكة", - "deployConfirmation": "هل تريد نشر العقود على هذه الشبكة أم التبديل إلى شبكة Sepolia", + "deployConfirmation": "هل تريد نشر العقود على هذه الشبكة أم التبديل إلى شبكة Sepolia؟", "deployNote": "ملاحظة: إذا قمت بنشر جميع المستويات ، فسنرشدك إلى إرسال اللعبة المنشورة بالكامل على هذه الشبكة.", "deployGame": "نشر اللعبة", "switchToSepolia": "قم بالتبديل إلى Sepolia", @@ -44,7 +44,7 @@ "helperDeployAllContracts": "نشر جميع العقود المتبقية على الشبكة الحالية.", "confirmMainnetDeploy": "أنت على الشبكة الرئيسية ، اللعبة ليس لها قيمة نقدية ، يجب ألا تنشر في هذه الشبكة.", "submitLevelFooter": "انشر جميع المستويات (publishAllContracts () في الكونسول) لإضافة الشبكة الحالية إلى مستودع Github كشبكة جديدة مدعومة.", - "submitGameFooter": "رائع! تم نشر اللُعبة بأكملها على هذه الشبكة. انقر هنا لاثارة القضية على جيت هاب وارسالها إلينا :)", + "submitGameFooter": "رائع! تم نشر اللُعبة بأكملها على هذه الشبكة. انقر هنا لإثارة القضية على جيت هاب وإرسالها إلينا :)", "nextLevel": "انتقل إلى المستوى التالي", "uLevels": "المستويات", "lLevels": "مستويات", @@ -56,8 +56,8 @@ "levelName": "اسم المستوى", "levelAddress": "عنوان المستوى", "blockNum": "رقم البلوك ", - "uCreated": "تم الانشاء", - "lCreated": "تم الانشاء", + "uCreated": "تم الإنشاء", + "lCreated": "تم الإنشاء", "instance": "النسخة", "numberOf": "رقم الـ", "warning": "تحذير", @@ -68,45 +68,45 @@ "openConsole": "افتح الكونسول للعب", "difficulty": "الصعوبة", "error": "خطأ", - "retrying": "اعادة المحاولة..", + "retrying": "إعادة المحاولة..", "typeHelpMessage": "للحصول على المساعدة help() اكتب", "slowNetworkMessage": "مزعج 'اتصال بطيء' رسالة؟ جرب إعدادات Devtools -> رسائل المستخدم فقط أو تعطيلها 'chrome://flags/#enable-webfonts-intervention-v2'", - "notContractSetMessage": "لا يوجد عقد, اذهب الى مستوي واحصل على نسخة جديدة طاحصل على نسخة جديدة' احصل على نسخة جديدة'", + "notContractSetMessage": "لا يوجد عقد، اذهب إلى مستوى واحصل على نسخة جديدة", "levelAddressMessage": "عنوان المستوى", "instanceAddressMessage": "عنوان النسخة", "playerAddressMessage": "عنوان اللاعب", "selectedNetworkMessage": "الشبكة الحالية:", "ethernautAddressMessage": "عنوان الايثرناوت", - "noLevelsDataMessage": "لم يعثر على معلومات المستوي", + "noLevelsDataMessage": "لم يعثر على معلومات المستوى", "ethernautNotFoundMessage": "لم يتم العثور على عقد ايثرناوت في الشبكة الحالية. يرجى التأكد من (1) أنك تستخدم ميتاماسك ، (2) وأنه متصل بشبكة مدعومة ، (3) وأنه غير مقفل ، (4 اختياري) من 2 نوفمبر يمكنك تشغيل وضع الخصوصية (مغلق بشكل افتراضي) في اعدادات ميتاماسك إذا كنت لا تريد كشف معلوماتك بشكل افتراضي. (5 اختياري) إذا كان وضع الخصوصية قيد التشغيل ، فيجب أن تأذن لميتاماسك ان يستخدم هذه الصفحة.. و (6) ثم التحديث.", "requestingNewInstanceMessage": "جاري طلب نسخة جديدة من المستوى...", "unableToRetrieveLevelMessage": "تعذر استرداد نسخة المستوى! يرجى التحقق من كمية الغاز والمحاولة مرة أخرى.", "transactionNoLogsMessage": "لا تحتوي المعاملة على أي سجلات", - "noPlayerAddressMessage": "لم يتم رصد عنوان اللاعب!تأكد من أنك 1) قمت بتثبيت امتداد متصفح ميتاماسك و 2) انه تم فتحه.3 اختياري) من 2 نوفمبر يمكنك تشغيل وضع الخصوصية (مغلق بشكل افتراضي) في اعدادات ميتاماسك إذا كنت لا تريد كشف معلوماتك بشكل افتراضي. (5 اختياري) إذا كان وضع الخصوصية قيد التشغيل ، فيجب أن تأذن لميتاماسك ان يستخدم هذه الصفحة.5) ثم تحديث.", + "noPlayerAddressMessage": "لم يتم رصد عنوان اللاعب! تأكد من أنك 1) قمت بتثبيت امتداد متصفح ميتاماسك و 2) انه تم فتحه. (3 اختياري) من 2 نوفمبر يمكنك تشغيل وضع الخصوصية (مغلق بشكل افتراضي) في اعدادات ميتاماسك إذا كنت لا تريد كشف معلوماتك بشكل افتراضي. (5 اختياري) إذا كان وضع الخصوصية قيد التشغيل ، فيجب أن تأذن لميتاماسك ان يستخدم هذه الصفحة.5) ثم تحديث.", "noEthersMessage": "عذرًا ، ليس لديك إيثر! احصل على البعض من السبيل الخاص بالشبكة التي تم اختيارها", "submitLevelMessage": "جارى تسليم نسخة المستوى...", "wellDoneMessage": "عمل رائع", "completedLevelMessage": "لقد انهيت المستوى بنجاح!!!", "uncompletedLevelMessage": "اووبس! يبدو انك لم تخترق هذا المستوى بعد", - "metamaskKnownIssue": " أخ ! يبدو أنك تواجه مشكلة ميتامسك المعروفة. حاول تعطيل وإعادة تمكين ميتاماسك ،وإذا لم يفلح ذلك ، فأخشى أنك ستضطر إلى إغلاق جميع عمليات متصفح كروم وإعادة تشغيله للتغلب عليه تلك المشكلة لحين إصدار إصلاح. لا تقلق ، بعد إعادة التشغيل ، لن ترى هذه الرسالة مرة أخرى.", - "eventsCompletionMessage": "خطأ في مشاهدة احداث اﻻكتمال:", + "metamaskKnownIssue": " أخ ! يبدو أنك تواجه مشكلة ميتامسك المعروفة. حاول تعطيل وإعادة تمكين ميتاماسك ،وإذا لم يفلح ذلك ، فأخشى أنك ستضطر إلى إغلاق جميع عمليات متصفح كروم وإعادة تشغيله للتغلب عليها تلك المشكلة لحين إصدار إصلاح. لا تقلق ، بعد إعادة التشغيل ، لن ترى هذه الرسالة مرة أخرى.", + "eventsCompletionMessage": "خطأ في مشاهدة أحداث الاكتمال:", "unexpectedAddressMessage": "عنوان غير متوقع في حدث LevelCompletedLog (تخطي):", "helperPlayer": "عنوان اللاعب الحالي", - "helperEthernaut": "عقد اللعبة الاساسي", - "helperLevel": "عنوان عقد المستوى الحالية", + "helperEthernaut": "عقد اللعبة الأساسي", + "helperLevel": "عنوان عقد المستوى الحالي", "helperContract": "نسخة المستوى الحالية إن وجد", - "helperInstance": "عنوان عقد نسخة المستوى الحالة إن وجد", - "helperVersion": "اصدار اللعبة الحالي", - "helperGetBalance": "احصل على رصيد لاى عنوان بالايثر", + "helperInstance": "عنوان عقد نسخة المستوى الحالية إن وجد", + "helperVersion": "إصدار اللعبة الحالي", + "helperGetBalance": "احصل على رصيد لأي عنوان بالايثر", "helperGetBlockNumber": "احصل على رقم البلوك الحالي", "helperSendTransaction": "ارسال المعاملة", "helperGetNetworkId": "احصل على الرمز التعريفي لشبكة الايثريوم", "helperToWei": "تحويل وحدات الايثر الى واي", "helperFromWei": "تحويل وحدات الواي الى ايثر", - "levelNotTranslated": "هذا المستوى غير مترجمة او لم تنتهى ترجمتها ", + "levelNotTranslated": "هذا المستوى غير مترجم أو لم تنتهِ ترجمته", "contributeTranslation": "اضغط هنا لتحسين الترجمة.", - "usingConsole": "معظم تفاعلات اللعبة يكون عبر كونسول المتصفح:`Dev Tools -> Console`. افتح الكونسول وأدخل الأمر \n\n`help()`\n\n لرؤية قائمة بالكائنات والوظائف التي تُضمِنها اللعبة في الكونسول. نظرًا لأن معظم التفاعلات غير متزامنة ، نوصي باستخدام كروم v62 الذي يمكّن الكلمات الرئيسية `async/await` في الكونسول ، لذلك بدلاً من كتابة: \n\n`getBalance(player)> PROMISE`\n\n and opening the promise. With await/async, you can write:\n\n`await getBalance(player) > '1.11002387' `\n\n", - "gameMechanics": "تستخدم اللعبة العقد الرئيسي `Ethernaut.sol` لإدارة تقدم اللاعب وتفويض التفاعل مع عمليات تنفيذ `Level.sol`. وما يصدر كل عقد نسخة مستوى للاعبين للتلاعب ، والكسر ، والتدمير ، والإصلاح ، وما إلى ذلك.يطلب اللاعب نسخة ، يتلاعب بها ثم يعديها للعبة للتحقق من اكتمال المستوي.\n\n كلا النسختين ، المطلوبة والمسلمه، يتم ارجاعهم للعبة عند اﻻنتهاء باستخدام الأزرار الموجودة في واجهة المستخدم في كل مستوى . عندما يسترد هذا التطبيق نسخة من `Ethernaut.sol` ، فإنه يلفه في كائن` TruffleContract` ويعرضه في كونسول المتصفح. اطلع على المستوى الأول للحصول على برنامج تعليمي كامل حول كيفية لعب اللعبة.", + "usingConsole": "معظم تفاعلات اللعبة يكون عبر كونسول المتصفح:`Dev Tools -> Console`. افتح الكونسول وأدخل الأمر \n\n`help()`\n\n لرؤية قائمة بالكائنات والوظائف التي تُضمِنها اللعبة في الكونسول. نظرًا لأن معظم التفاعلات غير متزامنة ، نوصي باستخدام كروم v62 الذي يمكّن الكلمات الرئيسية `async/await` في الكونسول ، لذلك بدلاً من كتابة: \n\n`getBalance(player)> PROMISE`\n\n وفتح الوعد. مع await/async، يمكنك كتابة:\n\n`await getBalance(player) > '1.11002387' `\n\n", + "gameMechanics": "تستخدم اللعبة العقد الرئيسي `Ethernaut.sol` لإدارة تقدم اللاعب وتفويض التفاعل مع عمليات تنفيذ `Level.sol`. وما يصدر كل عقد نسخة مستوى للاعبين للتلاعب ، والكسر ، والتدمير ، والإصلاح ، وما إلى ذلك.يطلب اللاعب نسخة ، يتلاعب بها ثم يُعيدها للعبة للتحقق من اكتمال المستوى.\n\n كلا النسختين ، المطلوبة والمسلمه، يتم ارجاعهم للعبة عند اﻻنتهاء باستخدام الأزرار الموجودة في واجهة المستخدم في كل مستوى . عندما يسترد هذا التطبيق نسخة من `Ethernaut.sol` ، فإنه يلفه في كائن` TruffleContract` ويعرضه في كونسول المتصفح. اطلع على المستوى الأول للحصول على برنامج تعليمي كامل حول كيفية لعب اللعبة.", "beyondConsole": "ستتطلب بعض المستويات العمل خارج وحدة تحكم المتصفح. أي كتابة كود سوليدتى ونشره في الشبكة لمهاجمة عقد نسخة المستوى بعقد آخر. يمكن القيام بذلك بعدة طرق ، على سبيل المثال: \n \n1) استخدم ريمكس لكتابة الكود ونشره في الشبكة المقابلة ، راجع [Remix Solidity IDE] (https://remix.ethereum.org/). \n \n2) قم بإعداد مشروع ترافل محلي لتطوير ونشر عقود الهجوم. راجع [إطار عمل ترافل] (https://trufflesuite.com/).", "troubleshooting": "في بعض الأحيان \n \n (أ) حالة التطبيق أو (ب) حالة البرنامج المساعد MetaMask \n \n يمكن أن تتعطل قليلاً ، خاصة بعد تبديل الشبكات ، وإلغاء القفل ، وما إلى ذلك. إذا لم يكن ما تراه منطقيًا ، حاول تحديث التطبيق ، وتحديثه بقوة ، وتعطيل البرنامج المساعد metamask وإعادة تمكينه أو حتى إعادة تشغيل المتصفح. \n \n إذا وجدت مشاكل ، فيرجى إخبارنا على ethernaut@zeppelin.solutions", "poweredBy": "مُشَغل بواسطة ", @@ -114,10 +114,10 @@ "FifthyPercentMessage": "عمل رائع! لقد وصلت إلى منتصف الطريق في ايثرناوت وتحصل على مستوى جيد في تحطيم الأشياء. قد يكون العمل كباحث أمن في البلوكتشين في OpenZeppelin ممتعًا ... https://grnh.se/fdbf1c043us", "SeventyFivePercentMessage": "75٪: عمل جيد يا هذا ... أنت في أعماق حفرة الأرانب الآن .... من يدري إلى أين سيأخذك ... https://grnh.se/d4a786e43us", "NinetyPercentMessage": "90٪: لقد أوشكت على الانتهاء! فقط عدد قليل من التحديات المتبقية حتى تكمل ايثرناوت! هل فكرت في الحصول على وظيفة في أمن البلوكتشين؟ https://grnh.se/cfcca8c83us", - "HundredPercentMessage": "100٪: مبارك! رحلتك في حفرة الأرنب في ويب 3 مبهرة ويجب الاحتفال بها! لديك الآن المهارات اللازمة لكسر العقود الذكية! ما التالي من هنا حالا؟ تقدم بطلب لتصبح باحث أمن البلوكتشين في OpenZeppelin ، وساهم في تأمين أفضل البروتوكولات في الويب3! https://grnh.se/26c05aac3us", + "HundredPercentMessage": "100٪: مبارك! رحلتك في حفرة الأرنب في ويب 3 مبهرة ويجب الاحتفال بها! لديك الآن المهارات اللازمة لكسر العقود الذكية! ما التالي من هنا حالاً؟ تقدم بطلب لتصبح باحث أمن البلوكتشين في OpenZeppelin ، وساهم في تأمين أفضل البروتوكولات في الويب3! https://grnh.se/26c05aac3us", "Menu": "قائمة", "Networks": "الشبكات", "Languages": "اللغات", "PageNotFoundTitle": "خطأ 404 - الصفحة غير موجودة", "PageNotFoundText": "عفوًا! لا يمكن العثور على الصفحة التي تبحث عنها." -} +} \ No newline at end of file From 2c7b3f017a028aa60c7d24ee404c8096241131e8 Mon Sep 17 00:00:00 2001 From: suhail-256 Date: Sun, 1 Mar 2026 21:05:11 +0200 Subject: [PATCH 2/2] add Arabic translation --- .../ar/descriptions/levels/aliencodex.md | 8 +++ .../levels/aliencodex_complete.md | 5 ++ .../ar/descriptions/levels/bet_house.md | 5 ++ .../levels/bet_house_completed.md | 4 ++ .../ar/descriptions/levels/cashback.md | 5 ++ .../descriptions/levels/cashback_complete.md | 1 + .../ar/descriptions/levels/coinflip.md | 6 ++ .../descriptions/levels/coinflip_complete.md | 5 ++ .../ar/descriptions/levels/delegate.md | 8 +++ .../descriptions/levels/delegate_complete.md | 3 + .../gamedata/ar/descriptions/levels/denial.md | 4 ++ .../ar/descriptions/levels/denial_complete.md | 6 ++ .../gamedata/ar/descriptions/levels/dex.md | 19 +++++ .../gamedata/ar/descriptions/levels/dex2.md | 10 +++ .../ar/descriptions/levels/dex2_complete.md | 9 +++ .../ar/descriptions/levels/dex_complete.md | 56 +++++++++++++++ .../descriptions/levels/doubleentrypoint.md | 12 ++++ .../levels/doubleentrypoint_complete.md | 13 ++++ .../ar/descriptions/levels/elevator.md | 5 ++ .../descriptions/levels/elevator_complete.md | 4 ++ .../ar/descriptions/levels/elliptic_token.md | 12 ++++ .../levels/elliptic_token_complete.md | 3 + .../ar/descriptions/levels/fallback.md | 13 ++++ .../descriptions/levels/fallback_complete.md | 5 ++ .../ar/descriptions/levels/fallout.md | 6 ++ .../descriptions/levels/fallout_complete.md | 16 +++++ .../gamedata/ar/descriptions/levels/force.md | 10 +++ .../ar/descriptions/levels/force_complete.md | 3 + .../gamedata/ar/descriptions/levels/forger.md | 12 ++++ .../ar/descriptions/levels/forger_complete.md | 7 ++ .../ar/descriptions/levels/gatekeeper1.md | 5 ++ .../levels/gatekeeper1_complete.md | 1 + .../ar/descriptions/levels/gatekeeper2.md | 7 ++ .../levels/gatekeeper2_complete.md | 2 + .../ar/descriptions/levels/gatekeeper3.md | 6 ++ .../levels/gatekeeper3_complete.md | 1 + .../ar/descriptions/levels/goodsamaritan.md | 9 +++ .../levels/goodsamaritan_complete.md | 5 ++ .../ar/descriptions/levels/higherorder.md | 7 ++ .../levels/higherorder_complete.md | 3 + .../ar/descriptions/levels/impersonator.md | 2 + .../levels/impersonator_complete.md | 5 ++ .../descriptions/levels/impersonator_two.md | 6 ++ .../levels/impersonator_two_complete.md | 3 + .../ar/descriptions/levels/instances.md | 72 +++++++++++++++++++ .../descriptions/levels/instances_complete.md | 6 ++ .../gamedata/ar/descriptions/levels/king.md | 5 ++ .../ar/descriptions/levels/king_complete.md | 5 ++ .../levels/magicanimalcarousel.md | 6 ++ .../levels/magicanimalcarousel_complete.md | 1 + .../ar/descriptions/levels/magicnum.md | 10 +++ .../descriptions/levels/magicnum_complete.md | 3 + .../ar/descriptions/levels/motorbike.md | 10 +++ .../descriptions/levels/motorbike_complete.md | 9 +++ .../ar/descriptions/levels/naughtcoin.md | 8 +++ .../levels/naughtcoin_complete.md | 1 + .../levels/not_optimistic_portal.md | 19 +++++ .../levels/not_optimistic_portal_complete.md | 1 + .../ar/descriptions/levels/preservation.md | 13 ++++ .../levels/preservation_complete.md | 1 + .../ar/descriptions/levels/privacy.md | 13 ++++ .../descriptions/levels/privacy_complete.md | 3 + .../ar/descriptions/levels/puzzle_wallet.md | 21 ++++++ .../levels/puzzle_wallet_complete.md | 8 +++ .../ar/descriptions/levels/recovery.md | 3 + .../descriptions/levels/recovery_complete.md | 7 ++ .../ar/descriptions/levels/reentrancy.md | 10 +++ .../levels/reentrancy_complete.md | 12 ++++ .../gamedata/ar/descriptions/levels/shop.md | 5 ++ .../ar/descriptions/levels/shop_complete.md | 3 + .../gamedata/ar/descriptions/levels/stake.md | 14 ++++ .../ar/descriptions/levels/stake_complete.md | 5 ++ .../gamedata/ar/descriptions/levels/switch.md | 4 ++ .../ar/descriptions/levels/switch_complete.md | 1 + .../ar/descriptions/levels/telephone.md | 6 ++ .../descriptions/levels/telephone_complete.md | 22 ++++++ .../gamedata/ar/descriptions/levels/token.md | 8 +++ .../ar/descriptions/levels/token_complete.md | 15 ++++ .../ar/descriptions/levels/uniquenft.md | 13 ++++ .../descriptions/levels/uniquenft_complete.md | 5 ++ .../gamedata/ar/descriptions/levels/vault.md | 1 + .../ar/descriptions/levels/vault_complete.md | 3 + 82 files changed, 689 insertions(+) create mode 100644 client/src/gamedata/ar/descriptions/levels/aliencodex.md create mode 100644 client/src/gamedata/ar/descriptions/levels/aliencodex_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/bet_house.md create mode 100644 client/src/gamedata/ar/descriptions/levels/bet_house_completed.md create mode 100644 client/src/gamedata/ar/descriptions/levels/cashback.md create mode 100644 client/src/gamedata/ar/descriptions/levels/cashback_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/coinflip.md create mode 100644 client/src/gamedata/ar/descriptions/levels/coinflip_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/delegate.md create mode 100644 client/src/gamedata/ar/descriptions/levels/delegate_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/denial.md create mode 100644 client/src/gamedata/ar/descriptions/levels/denial_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/dex.md create mode 100644 client/src/gamedata/ar/descriptions/levels/dex2.md create mode 100644 client/src/gamedata/ar/descriptions/levels/dex2_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/dex_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/doubleentrypoint.md create mode 100644 client/src/gamedata/ar/descriptions/levels/doubleentrypoint_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/elevator.md create mode 100644 client/src/gamedata/ar/descriptions/levels/elevator_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/elliptic_token.md create mode 100644 client/src/gamedata/ar/descriptions/levels/elliptic_token_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/fallback.md create mode 100644 client/src/gamedata/ar/descriptions/levels/fallback_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/fallout.md create mode 100644 client/src/gamedata/ar/descriptions/levels/fallout_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/force.md create mode 100644 client/src/gamedata/ar/descriptions/levels/force_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/forger.md create mode 100644 client/src/gamedata/ar/descriptions/levels/forger_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/gatekeeper1.md create mode 100644 client/src/gamedata/ar/descriptions/levels/gatekeeper1_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/gatekeeper2.md create mode 100644 client/src/gamedata/ar/descriptions/levels/gatekeeper2_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/gatekeeper3.md create mode 100644 client/src/gamedata/ar/descriptions/levels/gatekeeper3_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/goodsamaritan.md create mode 100644 client/src/gamedata/ar/descriptions/levels/goodsamaritan_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/higherorder.md create mode 100644 client/src/gamedata/ar/descriptions/levels/higherorder_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/impersonator.md create mode 100644 client/src/gamedata/ar/descriptions/levels/impersonator_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/impersonator_two.md create mode 100644 client/src/gamedata/ar/descriptions/levels/impersonator_two_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/instances.md create mode 100644 client/src/gamedata/ar/descriptions/levels/instances_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/king.md create mode 100644 client/src/gamedata/ar/descriptions/levels/king_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/magicanimalcarousel.md create mode 100644 client/src/gamedata/ar/descriptions/levels/magicanimalcarousel_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/magicnum.md create mode 100644 client/src/gamedata/ar/descriptions/levels/magicnum_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/motorbike.md create mode 100644 client/src/gamedata/ar/descriptions/levels/motorbike_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/naughtcoin.md create mode 100644 client/src/gamedata/ar/descriptions/levels/naughtcoin_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/not_optimistic_portal.md create mode 100644 client/src/gamedata/ar/descriptions/levels/not_optimistic_portal_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/preservation.md create mode 100644 client/src/gamedata/ar/descriptions/levels/preservation_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/privacy.md create mode 100644 client/src/gamedata/ar/descriptions/levels/privacy_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/puzzle_wallet.md create mode 100644 client/src/gamedata/ar/descriptions/levels/puzzle_wallet_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/recovery.md create mode 100644 client/src/gamedata/ar/descriptions/levels/recovery_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/reentrancy.md create mode 100644 client/src/gamedata/ar/descriptions/levels/reentrancy_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/shop.md create mode 100644 client/src/gamedata/ar/descriptions/levels/shop_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/stake.md create mode 100644 client/src/gamedata/ar/descriptions/levels/stake_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/switch.md create mode 100644 client/src/gamedata/ar/descriptions/levels/switch_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/telephone.md create mode 100644 client/src/gamedata/ar/descriptions/levels/telephone_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/token.md create mode 100644 client/src/gamedata/ar/descriptions/levels/token_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/uniquenft.md create mode 100644 client/src/gamedata/ar/descriptions/levels/uniquenft_complete.md create mode 100644 client/src/gamedata/ar/descriptions/levels/vault.md create mode 100644 client/src/gamedata/ar/descriptions/levels/vault_complete.md diff --git a/client/src/gamedata/ar/descriptions/levels/aliencodex.md b/client/src/gamedata/ar/descriptions/levels/aliencodex.md new file mode 100644 index 000000000..d343608e2 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/aliencodex.md @@ -0,0 +1,8 @@ +لقد اكتشفت عقداً فضائياً. اطلب الملكية لإكمال المستوى. + +  +أشياء قد تساعدك: + +* فهم آلية عمل تخزين المصفوفات +* فهم [مواصفات ABI](https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html) +* استخدام نهج `مخادع (underhanded)` للغاية diff --git a/client/src/gamedata/ar/descriptions/levels/aliencodex_complete.md b/client/src/gamedata/ar/descriptions/levels/aliencodex_complete.md new file mode 100644 index 000000000..18374bb5e --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/aliencodex_complete.md @@ -0,0 +1,5 @@ +يستغل هذا المستوى حقيقة أن آلة إيثيريوم الافتراضية (EVM) لا تتحقق من مطابقة طول المصفوفة المرمز بـ ABI مع بيانات الحمولة الفعلية. + +بالإضافة إلى ذلك، يستغل التجاوز السفلي الحسابي لطول المصفوفة، عن طريق توسيع حدود المصفوفة إلى منطقة التخزين الكاملة البالغة `2^256`. يكون المستخدم قادرًا بعد ذلك على تعديل كل خزائن العقد. + +كلا الثغرتين مستوحاة من [مسابقة Underhanded coding](https://medium.com/@weka/announcing-the-winners-of-the-first-underhanded-solidity-coding-contest-282563a87079) لعام 2017 diff --git a/client/src/gamedata/ar/descriptions/levels/bet_house.md b/client/src/gamedata/ar/descriptions/levels/bet_house.md new file mode 100644 index 000000000..46dbba623 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/bet_house.md @@ -0,0 +1,5 @@ +مرحبًا بك في بيت الرهان. + +تبدأ بـ 5 Pool Deposit Tokens (PDT). + +هل يمكنك إتقان فن المقامرة الاستراتيجية وأن تصبح مراهنًا؟ diff --git a/client/src/gamedata/ar/descriptions/levels/bet_house_completed.md b/client/src/gamedata/ar/descriptions/levels/bet_house_completed.md new file mode 100644 index 000000000..3a30f387f --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/bet_house_completed.md @@ -0,0 +1,4 @@ +تهانينا!!! لقد اكتسبت درسًا حاسمًا: لا تراهن أبدًا على الاستدعاءات الخارجية التي تبدو غير ضارة. +افترض دائمًا أن مُستقبل الأموال يمكن أن يكون عقدًا آخر، وترك العقود في حالة غير متسقة يمكن أن يفسد المنطق، حتى لو كانت الدالة محمية. + +إعادة الدخول لها العديد من الوجوه ويجب أن تكون دائمًا مستعدًا لها. لا تُهزم في الرهان! diff --git a/client/src/gamedata/ar/descriptions/levels/cashback.md b/client/src/gamedata/ar/descriptions/levels/cashback.md new file mode 100644 index 000000000..6c8cab0f6 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/cashback.md @@ -0,0 +1,5 @@ +لقد انضممت للتو إلى Cashback، أشهر بنك تشفير جديد في المدينة. عرضهم لا يقاوم: مقابل كل عملية دفع تجريها عبر الشبكة، تكسب نقاطًا. اجمع ما يكفي من النقاط لتصل إلى المرتبة الأسطورية، وتفتح وسام Super Cashback NFT المنشود. + +يستفيد النظام من EIP-7702 للسماح للحسابات المملوكة خارجيًا (EOAs) بتجميع استرداد نقدي. يجب على المستخدمين التفويض إلى عقد Cashback لاستخدام دالة `payWithCashback`. + +تقول الشائعات أن هناك باباً خلفياً للمستخدمين المحترفين. مهمتك بسيطة: كن كابوس برنامج الولاء؛ قم برفع رصيد الـ Cashback الخاص بك إلى الحد الأقصى في كل عملة مدعومة، وغادر وبحوزتك وسامين على الأقل من نوع Super Cashback NFT، على أن يكون أحدهما مرتبطاً بعنوان اللاعب الخاص بك. diff --git a/client/src/gamedata/ar/descriptions/levels/cashback_complete.md b/client/src/gamedata/ar/descriptions/levels/cashback_complete.md new file mode 100644 index 000000000..99c24c1de --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/cashback_complete.md @@ -0,0 +1 @@ +إن الافتراضات المتعلقة بالهوية، وسياق تنفيذ الحساب، ومحلية التخزين هي ثغرات قابلة للاستغلال تماماً مثل الأخطاء الحسابية عند التعامل مع تعقيدات أنظمة EIP-7702. لقد وجدت الثغرات وحققت الأرباح. عمل رائع! \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/coinflip.md b/client/src/gamedata/ar/descriptions/levels/coinflip.md new file mode 100644 index 000000000..a0b4f2c15 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/coinflip.md @@ -0,0 +1,6 @@ +هذه لعبة لقلب العملة حيث يتعين عليك بناء سلسلة فوز من خلال تخمين نتيجة قلب العملة. لإكمال هذا المستوى، ستحتاج إلى استخدام قدراتك النفسية لتخمين النتيجة الصحيحة 10 مرات متتالية. + +  +أشياء قد تساعدك: + +* راجع صفحة ["؟"](https://ethernaut.openzeppelin.com/help) أعلاه في قائمة الزاوية اليمنى العليا، قسم "Beyond the console" diff --git a/client/src/gamedata/ar/descriptions/levels/coinflip_complete.md b/client/src/gamedata/ar/descriptions/levels/coinflip_complete.md new file mode 100644 index 000000000..a9dd6c34c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/coinflip_complete.md @@ -0,0 +1,5 @@ +قد يكون إنشاء أرقام عشوائية في solidity أمرًا صعبًا. لا توجد حاليًا طريقة أصلية لإنشائها، وكل ما تستخدمه في العقود الذكية مرئي للعامة، بما في ذلك المتغيرات المحلية ومتغيرات الحالة المحددة على أنها private. يمتلك المعدّنون أيضًا السيطرة على أشياء مثل بصمات الكتل الرقمية (blockhashes) والطوابع الزمنية (timestamps) وما إذا كان سيتم تضمين معاملات معينة - مما يسمح لهم بتحيز هذه القيم لصالحهم. + +للحصول على أرقام عشوائية مُثبتة تشفيريًا، يمكنك استخدام [Chainlink VRF](https://docs.chain.link/docs/get-a-random-number)، والذي يستخدم أوراكل وعملة LINK وعقدًا على الشبكة للتحقق من أن الرقم عشوائي حقًا. + +تتضمن بعض الخيارات الأخرى استخدام رؤوس الكتل (block headers) من Bitcoin (تم التحقق منها من خلال [BTC Relay](http://btcrelay.org))، أو [RANDAO](https://github.com/randao/randao)، أو [Oraclize](http://www.oraclize.it/). diff --git a/client/src/gamedata/ar/descriptions/levels/delegate.md b/client/src/gamedata/ar/descriptions/levels/delegate.md new file mode 100644 index 000000000..fe9908d09 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/delegate.md @@ -0,0 +1,8 @@ +الهدف من هذا المستوى هو أن تطالب بملكية النسخة التي تم منحها لك. + +  +أشياء قد تساعدك: + +* انظر في وثائق Solidity حول الدالة منخفضة المستوى `delegatecall`، وكيف تعمل، وكيف يمكن استخدامها لتفويض العمليات إلى المكتبات الموجودة على الشبكة، وما هي تأثيراتها على نطاق التنفيذ. +* دوال الـ Fallback +* معرّفات الدوال (Method ids) diff --git a/client/src/gamedata/ar/descriptions/levels/delegate_complete.md b/client/src/gamedata/ar/descriptions/levels/delegate_complete.md new file mode 100644 index 000000000..ef7383e46 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/delegate_complete.md @@ -0,0 +1,3 @@ +إن استخدام `delegatecall` ينطوي على مخاطرة شديدة وقد استُخدم كمسار للهجوم في العديد من عمليات الاختراق التاريخية. من خلاله، يقول عقدك عملياً: "تفضل أيها العقد الآخر أو المكتبة الأخرى، افعل ما تشاء في حالتي". يمتلك المفوضون وصولاً كاملاً إلى حالة عقدك. إن وظيفة `delegatecall` هي ميزة قوية، لكنها خطيرة، ويجب استخدامها بحذر شديد. + +يرجى الرجوع إلى مقال [شرح عملية اختراق محفظة باريتي](https://blog.openzeppelin.com/on-the-parity-wallet-multisig-hack-405a8c12e8f7) للحصول على شرح دقيق لكيفية استخدام هذه الفكرة لسرقة 30 مليون دولار أمريكي. diff --git a/client/src/gamedata/ar/descriptions/levels/denial.md b/client/src/gamedata/ar/descriptions/levels/denial.md new file mode 100644 index 000000000..682d73ecf --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/denial.md @@ -0,0 +1,4 @@ +هذه محفظة بسيطة تقوم بتوزيع الأموال مع مرور الوقت. + يمكنك سحب الأموال ببطء عن طريق أن تصبح شريكاً في السحب. + +إذا تمكنت من منع المالك من سحب الأموال عندما يقوم باستدعاء دالة `withdraw()` (بينما لا يزال العقد يحتوي على أموال، وتكون المعاملة بمليون gas أو أقل)، فستفوز بهذا المستوى. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/denial_complete.md b/client/src/gamedata/ar/descriptions/levels/denial_complete.md new file mode 100644 index 000000000..cbbff7544 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/denial_complete.md @@ -0,0 +1,6 @@ +يوضح هذا المستوى أن الاستدعاءات الخارجية للعقود غير المعروفة لا تزال قادرة على إنشاء ثغرات حجب الخدمة إذا لم يتم تحديد كمية ثابتة من الـ gas. + +إذا كنت تستخدم استدعاءً منخفض المستوى `call` لمواصلة التنفيذ في حالة إرجاع استدعاء خارجي، تأكد من تحديد كمية gas ثابتة. على سبيل المثال `
.call{gas: }(data)`. +عادةً ما يجب على المرء اتباع نمط [الفحص-التأثير-التفاعل](http://solidity.readthedocs.io/en/latest/security-considerations.html#use-the-checks-effects-interactions-pattern) لتجنب هجمات إعادة الدخول، ويمكن أن تكون هناك ظروف أخرى (مثل استدعاءات خارجية متعددة في نهاية دالة) حيث يمكن أن تنشأ مشكلات مثل هذه. + +*ملاحظة*: يمكن للاستدعاء الخارجي `CALL` استخدام 63/64 على الأكثر من الـ gas المتاح حاليًا في وقت `CALL`. وبالتالي، اعتمادًا على مقدار الـ gas المطلوب لإكمال معاملة، يمكن استخدام معاملة بـ gas عالٍ بشكل كافٍ (أي معاملة بحيث أن 1/64 من الـ gas قادر على إكمال الـ opcodes المتبقية في الاستدعاء الأصلي) للتخفيف من هذا الهجوم تحديداً. diff --git a/client/src/gamedata/ar/descriptions/levels/dex.md b/client/src/gamedata/ar/descriptions/levels/dex.md new file mode 100644 index 000000000..522141b8d --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/dex.md @@ -0,0 +1,19 @@ +الهدف من هذا المستوى هو اختراق عقد [البورصة اللامركزية (DEX)](https://en.wikipedia.org/wiki/Decentralized_exchange) البسيط الموضح أدناه وسرقة الأموال عن طريق التلاعب بالسعر. + +ستبدأ بـ 10 توكنات من `token1` و 10 من `token2`. يبدأ عقد الـ DEX بـ 100 من كل توكن. + +ستنجح في هذا المستوى إذا تمكنت من استنزاف كل الرصيد لواحد على الأقل من التوكنين من العقد، وجعل العقد يبلغ عن سعر "سيئ" للأصول. + +  +### ملاحظة سريعة +عادةً، عندما تقوم بإجراء مقايضة باستخدام توكن ERC20، يجب عليك منح "الموافقة" `approve` للعقد لإنفاق التوكنات الخاصة بك نيابة عنك. وللتوافق مع أسلوب اللعبة، قمنا بإضافة وظيفة `approve` إلى العقد نفسه. لذا، لا تتردد في استخدام `contract.approve(contract.address, )` بدلاً من استدعاء التوكنات مباشرة، وسيقوم العقد تلقائياً بالموافقة على إنفاق التوكنين بالمبلغ المطلوب. وبخلاف ذلك، يمكنك تجاهل عقد `SwappableToken`. + +  +أشياء قد تساعدك: + +* كيف يتم حساب سعر التوكن؟ +* كيف تعمل طريقة `swap`؟ +* كيف تقوم بـ"موافقة" `approve` معاملة ERC20؟ +* هناك أكثر من طريقة للتفاعل مع عقد! +* قد يساعدك Remix +* ماذا يفعل "At Address"؟ diff --git a/client/src/gamedata/ar/descriptions/levels/dex2.md b/client/src/gamedata/ar/descriptions/levels/dex2.md new file mode 100644 index 000000000..9ce3a8bc0 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/dex2.md @@ -0,0 +1,10 @@ +سيطلب منك هذا المستوى كسر `DexTwo`، وهو عقد `Dex` معدل بشكل طفيف من المستوى السابق، بطريقة مختلفة. + +تحتاج إلى استنزاف جميع أرصدة token1 و token2 من عقد `DexTwo` للنجاح في هذا المستوى. + +ستبدأ لا تزال بـ 10 توكنات من `token1` و 10 من `token2`. لا يزال عقد DEX يبدأ بـ 100 من كل توكن. + +  +أشياء قد تساعدك: + +* كيف تم تعديل طريقة `swap`؟ diff --git a/client/src/gamedata/ar/descriptions/levels/dex2_complete.md b/client/src/gamedata/ar/descriptions/levels/dex2_complete.md new file mode 100644 index 000000000..1446a0b47 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/dex2_complete.md @@ -0,0 +1,9 @@ +كما رأينا بشكل متكرر، يمكن أن يكون التفاعل بين العقود مصدرًا لسلوك غير متوقع. + +مجرد أن يدعي العقد تنفيذ [مواصفات ERC20](https://eips.ethereum.org/EIPS/eip-20) لا يعني أنه جدير بالثقة. + +تتحرف بعض التوكنات عن معيار ERC20 بعدم إرجاع قيمة منطقية (boolean) من دوال الـ transfer الخاصة بها. [راجع خطأ فقدان قيمة الإرجاع - 130 توكن على الأقل تأثروا](https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca). + +يمكن أن تتصرف توكنات ERC20 الأخرى، خاصة تلك المصممة من قبل الخصوم، بشكل أكثر خبثًا. + +إذا قمت بتصميم DEX (بورصة لا مركزية) حيث يمكن لأي شخص إدراج التوكنات الخاصة به دون إذن من سلطة مركزية، فإن سلامة وصحة عمل الـ DEX قد تعتمد على التفاعل بين عقد الـ DEX وعقود التوكنات التي يتم تداولها. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/dex_complete.md b/client/src/gamedata/ar/descriptions/levels/dex_complete.md new file mode 100644 index 000000000..802658530 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/dex_complete.md @@ -0,0 +1,56 @@ +بغض النظر عن جزء الرياضيات الصحيحة، فإن الحصول على الأسعار أو أي نوع من البيانات من أي مصدر واحد يمثل ثغرة هجوم هائلة في العقود الذكية. + +يمكنك أن ترى بوضوح من خلال هذا المثال، أن شخصاً يمتلك رأساً مالياً كبيراً يمكنه التلاعب بالسعر بضربة واحدة، مما يؤدي إلى جعل أي تطبيقات تعتمد على هذا السعر تستخدم سعراً خاطئاً. + +البورصة نفسها لا مركزية، لكن سعر الأصل مركزي لأنه يأتي من منصة تداول لا مركزية واحدة. ومع ذلك، إذا نظرنا إلى الرموز التي تمثل أصولاً حقيقية بدلاً من الأصول الوهمية، فإن معظمها يمتلك أزواج تداول في منصات وشبكات متعددة. من شأن ذلك أن يقلل الأثر على سعر الأصل في حال تم استهداف منصة تداول معينة بهجوم كهذا. + +تُستخدم [الأوراكل (Oracle)](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72?source=friends_link&sk=d921a38466df8a9176ed8dd767d8c77d) لإدخال البيانات إلى العقود الذكية وإخراجها منها. + +تُعد [Chainlink Data Feeds](https://docs.chain.link/docs/get-the-latest-price) وسيلة آمنة وموثوقة لإدخال البيانات اللامركزية إلى عقودك الذكية. فهي تمتلك مكتبة ضخمة من مصادر مختلفة ومتنوعة، كما توفر أيضاً [العشوائية الآمنة](https://docs.chain.link/docs/chainlink-vrf)، والقدرة على إجراء [أي استدعاء لواجهة برمجة تطبيقات (API call)](https://docs.chain.link/docs/make-a-http-get-request)، و[إنشاء شبكة أوراكل نمطية](https://docs.chain.link/docs/architecture-decentralized-model)، و[الاستمرارية والإجراءات والصيانة](https://docs.chain.link/docs/kovan-keeper-network-beta)، وتخصيصاً غير محدود. + +تعتمد [Uniswap TWAP Oracles](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) على نموذج سعر مرجح زمنياً يُسمى [TWAP](https://en.wikipedia.org/wiki/Time-weighted_average_price#). ورغم أن التصميم قد يكون جذاباً، إلا أن هذا البروتوكول يعتمد بشكل كبير على السيولة في بروتوكول منصة التداول اللامركزية (DEX)، وإذا كانت هذه السيولة منخفضة للغاية، فيمكن التلاعب بالأسعار بسهولة. + +هنا مثال على الحصول على سعر البيتكوين بالدولار الأمريكي من Chainlink Data Feeds (على شبكة الاختبار "Sepolia"): + +``` +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; + +contract PriceConsumerV3 { + AggregatorV3Interface internal priceFeed; + + /** + * Network: Sepolia + * Aggregator: BTC/USD + * Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43 + */ + constructor() { + priceFeed = AggregatorV3Interface( + 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43 + ); + } + + /** + * Returns the latest price. + */ + function getLatestPrice() public view returns (int) { + // prettier-ignore + ( + /* uint80 roundID */, + int price, + /*uint256 startedAt*/, + /*uint256 timeStamp*/, + /*uint80 answeredInRound*/ + ) = priceFeed.latestRoundData(); + return price; + } +} +``` +[جربه على Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/PriceFeeds/PriceConsumerV3.sol) + +راجع [صفحة](https://data.chain.link/ethereum/mainnet/crypto-usd/btc-usd) Chainlink feed لمعرفة أن سعر البيتكوين يتم الاستعلام عنه من ما يصل إلى 31 مصدرًا مختلفًا. + +يمكنك التحقق أيضًا من [قائمة](https://docs.chain.link/data-feeds/price-feeds/addresses/) جميع عناوين خلاصات أسعار Chainlink. + diff --git a/client/src/gamedata/ar/descriptions/levels/doubleentrypoint.md b/client/src/gamedata/ar/descriptions/levels/doubleentrypoint.md new file mode 100644 index 000000000..76fba1b16 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/doubleentrypoint.md @@ -0,0 +1,12 @@ +يحتوي هذا المستوى على `CryptoVault` بوظيفة خاصة، وهي دالة `sweepToken`. هذه دالة شائعة تُستخدم لاسترداد التوكنات العالقة في عقد. يعمل `CryptoVault` مع توكن `underlying` لأنه يمثل جزءاً جوهرياً من المنطق البرمجي للخزنة، بينما يمكن سحب أي توكنات أخرى غيره. + +التوكن الأساسي هو نسخة من توكن DET المنفذ في تعريف عقد `DoubleEntryPoint` ويحتوي `CryptoVault` على 100 وحدة منه. بالإضافة إلى ذلك، يحتوي `CryptoVault` أيضًا على 100 من `LegacyToken LGT`. + +في هذا المستوى يجب أن تكتشف أين يوجد الخطأ في `CryptoVault` وتحميه من استنزاف التوكنات. + +يحتوي العقد على عقد `Forta` حيث يمكن لأي مستخدم تسجيل عقد `detection bot` (بوت الكشف) الخاص به. Forta هي شبكة مراقبة لامركزية قائمة على المجتمع للكشف عن التهديدات والشذوذات في DeFi و NFT والحوكمة والجسور وأنظمة Web3 الأخرى بأسرع ما يمكن. مهمتك هي تنفيذ `detection bot` وتسجيله في عقد `Forta`. سيحتاج تنفيذ البوت إلى رفع تنبيهات صحيحة لمنع الهجمات المحتملة أو استغلال الأخطاء. + +  +أشياء قد تساعدك: + +- كيف تعمل نقطة الدخول المزدوجة لعقد التوكن؟ diff --git a/client/src/gamedata/ar/descriptions/levels/doubleentrypoint_complete.md b/client/src/gamedata/ar/descriptions/levels/doubleentrypoint_complete.md new file mode 100644 index 000000000..e7bb83992 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/doubleentrypoint_complete.md @@ -0,0 +1,13 @@ +تهانينا! + +هذه هي التجربة الأولى لك مع [Forta bot](https://docs.forta.network/en/latest/). + +تتكون Forta من شبكة لامركزية من مشغلي العقد المستقلين الذين يفحصون جميع المعاملات وتغييرات الحالة (كتلة بكتلة) بحثاً عن المعاملات الشاذة والتهديدات. وعند اكتشاف مشكلة، يرسل مشغلو العقد تنبيهات للمشتركين بشأن المخاطر المحتملة، مما يمكنهم من اتخاذ الإجراءات اللازمة. + +المثال المعروض هو لأغراض تعليمية فقط، حيث إن بوت Forta ليس مصمماً داخل العقود الذكية. في Forta، البوت هو عبارة عن سكربت برمجِي للكشف عن شروط أو أحداث معينة، ولكن عند إرسال تنبيه، فإنه لا يتسبب في تنفيذ إجراءات تلقائية - ليس بعد على الأقل. في هذا المستوى، يؤدي تنبيه البوت فعلياً إلى عكس المعاملة (revert)، وهو ما يختلف عن التصميم الفعلي لبوتات Forta. + +تعتمد بوتات الكشف بشكل كبير على التنفيذ النهائي للعقود، وقد يكون بعضها قابلاً للترقية (Upgradeable) مما قد يؤدي إلى كسر تكاملات البوت. وللحد من ذلك، يمكنك إنشاء بوت متخصص لمراقبة ترقيات العقود والاستجابة لها. تعلم كيفية القيام بذلك [هنا](https://docs.forta.network/en/latest/quickstart/). + +لقد مررت أيضًا بمشكلة أمنية حديثة تم الكشف عنها خلال أحدث [تعاون لـ OpenZeppelin مع بروتوكول Compound](https://compound.finance/governance/proposals/76). + +وجود توكنات تقدم نقطة دخول مزدوجة هو نمط غير تافه قد يؤثر على العديد من البروتوكولات. هذا لأنه يُفترض عادةً أن يكون هناك عقد واحد لكل توكن. ولكن لم يكن الأمر كذلك هذه المرة :) يمكنك قراءة التفاصيل الكاملة لما حدث [هنا](https://blog.openzeppelin.com/compound-tusd-integration-issue-retrospective/). diff --git a/client/src/gamedata/ar/descriptions/levels/elevator.md b/client/src/gamedata/ar/descriptions/levels/elevator.md new file mode 100644 index 000000000..e7f2e3f38 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/elevator.md @@ -0,0 +1,5 @@ +لن يسمح لك هذا المصعد بالوصول إلى قمة مبناك. أليس كذلك؟ + +##### أشياء قد تساعدك: +* أحيانًا لا تكون solidity جيدة في الوفاء بالوعود. +* يتوقع هذا الـ `Elevator` (المصعد) أن يتم استخدامه من `Building` (مبنى). diff --git a/client/src/gamedata/ar/descriptions/levels/elevator_complete.md b/client/src/gamedata/ar/descriptions/levels/elevator_complete.md new file mode 100644 index 000000000..db24acee7 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/elevator_complete.md @@ -0,0 +1,4 @@ +يمكنك استخدام مٌعدل الدالة `view` في الواجهة لمنع تعديلات الحالة. يمنع المٌعدل `pure` أيضًا الدوال من تعديل الحالة. +تأكد من قراءة [وثائق Solidity](http://solidity.readthedocs.io/en/develop/contracts.html#view-functions) وتعلم تحذيراتها. + +طريقة بديلة لحل هذا المستوى هي بناء دالة view تُرجع نتائج مختلفة بناءً على بيانات الإدخال ولكن لا تعدل الحالة، على سبيل المثال `gasleft()`. diff --git a/client/src/gamedata/ar/descriptions/levels/elliptic_token.md b/client/src/gamedata/ar/descriptions/levels/elliptic_token.md new file mode 100644 index 000000000..cf77f2c48 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/elliptic_token.md @@ -0,0 +1,12 @@ +أصدر بوب وتملك توكناً جديداً بمعيار ERC20، يعتمد على نظام استرداد قسائم مُوقّعة بالمنحنيات الإهليلجية يُدعى EllipticToken ($ETK). يستطيع بوب إنشاء قسائم خارج الشبكة (off-chain) يمكن استبدالها على الشبكة (on-chain) مقابل توكنات $ETK. كما يتضمن العقد نظام تصاريح مبنياً على تواقيع المنحنيات الإهليلجية. + +بوب مطور كسول وقام بـ "تحسين" بعض خطوات خوارزمية ECDSA (التوقيع الرقمي باستخدام المنحنيات الإهليلجية). هل يمكنك العثور على الثغرة؟ + +هدفك هو سرقة توكنات $ETK التي استردتها آليس (`0xA11CE84AcB91Ac59B0A4E2945C9157eF3Ab17D4e`) للتو. + +  +أشياء قد تساعدك: + +* ابحث عن أي خطوة مفقودة في [خوارزمية التوقيع الرقمي للمنحنى الإهليلجي (ECDSA)](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm). + +حظاً موفقاً. الـ Elliptic Curves لا تسامح ارتباك النطاق. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/elliptic_token_complete.md b/client/src/gamedata/ar/descriptions/levels/elliptic_token_complete.md new file mode 100644 index 000000000..bc50c4ed0 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/elliptic_token_complete.md @@ -0,0 +1,3 @@ +تهانينا! لقد فتحت سرًا آخر من أسرار توقيعات المنحنى الإهليلجي (Elliptic Curve Signatures)! + +لكي يظل التحقق آمنًا، يجب إجراء تجزئة مشفرة للبيانات التي توقعها أولاً. وإلا، فمن الممكن صياغة توقيعات صالحة على رسائل عشوائية تستعيد عناوين محددة. diff --git a/client/src/gamedata/ar/descriptions/levels/fallback.md b/client/src/gamedata/ar/descriptions/levels/fallback.md new file mode 100644 index 000000000..979d8361c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/fallback.md @@ -0,0 +1,13 @@ +انظر بعناية إلى كود العقد أدناه. + +ستهزم هذا المستوى إذا: +1) استحوذت على ملكية العقد +2) خفضت رصيده إلى 0 + +  +أشياء قد تساعدك: + +* كيفية إرسال الإيثر عند التفاعل مع الـ ABI +* كيفية إرسال الإيثر خارج الـ ABI +* التحويل من وإلى وحدات wei/ether (انظر أمر `help()`) +* دوال الـ Fallback diff --git a/client/src/gamedata/ar/descriptions/levels/fallback_complete.md b/client/src/gamedata/ar/descriptions/levels/fallback_complete.md new file mode 100644 index 000000000..11fc4bd95 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/fallback_complete.md @@ -0,0 +1,5 @@ +أنت تعرف أساسيات كيفية دخول وخروج الإيثر من العقود، بما في ذلك استخدام دالة الـ fallback. + +لقد تعلمت أيضًا عن عقد Ownable من OpenZeppelin، وكيفية استخدامه لتقييد الوصول إلى بعض الدوال واقتصارها على عنوان يمتلك صلاحيات. + +انتقل إلى المستوى التالي عندما تكون جاهزاً! diff --git a/client/src/gamedata/ar/descriptions/levels/fallout.md b/client/src/gamedata/ar/descriptions/levels/fallout.md new file mode 100644 index 000000000..322d2ed10 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/fallout.md @@ -0,0 +1,6 @@ +استحوذ على ملكية العقد أدناه لإكمال هذا المستوى. + +  +أشياء قد تساعدك: + +* Solidity Remix IDE diff --git a/client/src/gamedata/ar/descriptions/levels/fallout_complete.md b/client/src/gamedata/ar/descriptions/levels/fallout_complete.md new file mode 100644 index 000000000..bac517777 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/fallout_complete.md @@ -0,0 +1,16 @@ +كان ذلك ساذجاً أليس كذلك؟ يجب أن تكون العقود في العالم الحقيقي أكثر أمانًا من هذا، وبالتالي يجب أن يكون اختراقها أصعب بكثير، أليس كذلك؟ + +حسنًا... ليس تمامًا. + +قصة Rubixi هي حالة معروفة جدًا في منظومة إيثيريوم. غيرت الشركة اسمها من 'Dynamic Pyramid' إلى 'Rubixi' ولكن بطريقة ما لم يقوموا بإعادة تسمية دالة المنشئ (constructor) الخاصة بعقدها: + +``` +contract Rubixi { + address private owner; + function DynamicPyramid() { owner = msg.sender; } + function collectAllFees() { owner.transfer(this.balance) } + ... +``` + +هذا سمح للمهاجم باستدعاء الـ constructor القديم والمطالبة بملكية العقد، وسرقة بعض الأموال. نعم. يمكن ارتكاب أخطاء كبيرة في عالم العقود الذكية. + diff --git a/client/src/gamedata/ar/descriptions/levels/force.md b/client/src/gamedata/ar/descriptions/levels/force.md new file mode 100644 index 000000000..009206b7d --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/force.md @@ -0,0 +1,10 @@ +بعض العقود ببساطة لن تأخذ أموالك `¯\_(ツ)_/¯` + +الهدف من هذا المستوى هو جعل رصيد العقد أكبر من الصفر. + +  +أشياء قد تساعدك: + +* دوال الـ Fallback +* أحيانًا تكون أفضل طريقة لمهاجمة عقد هي بعقد آخر. +* راجع صفحة ["؟"](https://ethernaut.openzeppelin.com/help) أعلاه، قسم "Beyond the console" diff --git a/client/src/gamedata/ar/descriptions/levels/force_complete.md b/client/src/gamedata/ar/descriptions/levels/force_complete.md new file mode 100644 index 000000000..280120407 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/force_complete.md @@ -0,0 +1,3 @@ +في solidity، لكي يتمكن العقد من استقبال الإيثر، يجب تحديد دالة الـ fallback على أنها `payable` (مُهيأة لاستقبال الأموال). + +ومع ذلك، لا توجد طريقة لإيقاف المهاجم من إرسال الإيثر إلى عقد عن طريق التدمير الذاتي. لذلك، من المهم عدم الاعتماد على الثابت `address(this).balance == 0` في أي منطق برمجي داخل العقد. diff --git a/client/src/gamedata/ar/descriptions/levels/forger.md b/client/src/gamedata/ar/descriptions/levels/forger.md new file mode 100644 index 000000000..6eb3b316c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/forger.md @@ -0,0 +1,12 @@ +هذا هو "المزوّر" (Forger)، مطبعة التوكنات التي حذرتك والدتك منها. + +يقدم هذا الـ ERC-20 تصاريح صك (mint passes) موقعة من قِبَل +المالك... أو هكذا يدعون. + +هناك توقيع ذهبي واحد موجود بالفعل، وهو صالح للحصول على 100 توكن لامع. + +يصر الفريق على أن التصريح صالح للاستخدام مرة واحدة فقط وآمن تماماً. + +هدفك؟ جعل إجمالي المعروض (Total Supply) أكبر من 100 توكن. + +كن مبدعاً، ابقَ يقظاً، ولتكن عمليات تزويرك أسطورية. diff --git a/client/src/gamedata/ar/descriptions/levels/forger_complete.md b/client/src/gamedata/ar/descriptions/levels/forger_complete.md new file mode 100644 index 000000000..b79c6c8f2 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/forger_complete.md @@ -0,0 +1,7 @@ +لقد أظهرتَ لماذا لا يكفي تخزين التواقيع الخام، حيث يمكن تمريرها عبر هجمات إعادة التشغيل (Replays) أو باستخدام ترميزات بديلة. + +المسار الأكثر أماناً هو استخدام نظام الرقم الفريد (Nonce) لربط كل عملية صك (Mint) بإجراء فريد. يضمن ذلك عدم إمكانية استخدام كل توقيع إلا مرة واحدة فقط، بغض النظر عن طريقة ترميزه. + +التواقيع القصيرة EIP-2098؟ تعامل معها بحذر، وقم بتوحيد معاييرها (Normalize) قبل الوثوق بها. + +تهانينا، لقد أتقنت فن حماية نفسك من التزوير. 🔐 diff --git a/client/src/gamedata/ar/descriptions/levels/gatekeeper1.md b/client/src/gamedata/ar/descriptions/levels/gatekeeper1.md new file mode 100644 index 000000000..2dae85512 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/gatekeeper1.md @@ -0,0 +1,5 @@ +تجاوز الحارس وسجل اسمك كمتسابق لاجتياز هذا المستوى. + +##### أشياء قد تساعدك: +* تذكر ما تعلمته من مستويي Telephone و Token. +* يمكنك معرفة المزيد عن الدالة الخاصة `gasleft()` في وثائق Solidity (راجع أقسام [الوحدات والمتغيرات العالمية (Units and Global Variables)](https://docs.soliditylang.org/en/v0.8.3/units-and-global-variables.html) و [استدعاءات الدوال الخارجية (External Function Calls)](https://docs.soliditylang.org/en/v0.8.3/control-structures.html#external-function-calls)). diff --git a/client/src/gamedata/ar/descriptions/levels/gatekeeper1_complete.md b/client/src/gamedata/ar/descriptions/levels/gatekeeper1_complete.md new file mode 100644 index 000000000..e16dbef6f --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/gatekeeper1_complete.md @@ -0,0 +1 @@ +أحسنت! بعد ذلك، جرب حظك مع الحارس الثاني... diff --git a/client/src/gamedata/ar/descriptions/levels/gatekeeper2.md b/client/src/gamedata/ar/descriptions/levels/gatekeeper2.md new file mode 100644 index 000000000..6f5b7f569 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/gatekeeper2.md @@ -0,0 +1,7 @@ +يقدم هذا الحارس بعض التحديات الجديدة. سجل اسمك كمتسابق لاجتياز هذا المستوى. + +##### أشياء قد تساعدك: +* تذكر ما تعلمته من تجاوز الحارس الأول - البوابة الأولى هي نفسها. +* تسمح الكلمة المفتاحية `assembly` في البوابة الثانية للعقد بالوصول إلى وظائف ليست أصلية في Solidity التقليدية. راجع [Solidity Assembly](http://solidity.readthedocs.io/en/v0.4.23/assembly.html) لمزيد من المعلومات. استدعاء `extcodesize` في هذه البوابة سيحصل على حجم كود العقد في عنوان معين - يمكنك معرفة المزيد حول كيفية ووقت تعيين هذا في القسم 7 من [الورقة الصفراء (Yellow paper)](https://ethereum.github.io/yellowpaper/paper.pdf). +* الحرف `^` في البوابة الثالثة هو عملية على مستوى البت (XOR)، ويُستخدم هنا لتطبيق عملية أخرى شائعة على مستوى البت (راجع [Solidity cheatsheet](http://solidity.readthedocs.io/en/v0.4.23/miscellaneous.html#cheatsheet)). مستوى Coin Flip هو أيضًا مكان جيد للبدء عند التعامل مع هذا التحدي. + diff --git a/client/src/gamedata/ar/descriptions/levels/gatekeeper2_complete.md b/client/src/gamedata/ar/descriptions/levels/gatekeeper2_complete.md new file mode 100644 index 000000000..17f034002 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/gatekeeper2_complete.md @@ -0,0 +1,2 @@ + +أحسنت! الآن وبعد أن أصبحت قادراً على تخطي الحارس، لديك ما يلزم للانضمام إلى [theCyber](https://etherscan.io/address/thecyber.eth#code)، وهو نادٍ لا مركزي على شبكة إيثيريوم الرئيسية. احصل على كلمة المرور عبر التواصل مع المنشئ على [reddit](https://www.reddit.com/user/0age) أو عبر [البريد الإلكتروني](mailto:0age@protonmail.com)، واستخدمها للتسجيل في العقد على العنوان [gatekeepertwo.thecyber.eth](https://etherscan.io/address/gatekeepertwo.thecyber.eth#code) (علماً بأن العقد سيقبل أول 128 مشتركاً فقط). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/gatekeeper3.md b/client/src/gamedata/ar/descriptions/levels/gatekeeper3.md new file mode 100644 index 000000000..549cbcae4 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/gatekeeper3.md @@ -0,0 +1,6 @@ +تعامل مع البوابات وكن مشاركًا. + +##### أشياء قد تساعدك: +* تذكر القيم المرجعة للدوال منخفضة المستوى. +* كن منتبهًا للدلالات. +* أعِد تنشيط معلوماتك حول كيفية عمل التخزين في إيثيريوم diff --git a/client/src/gamedata/ar/descriptions/levels/gatekeeper3_complete.md b/client/src/gamedata/ar/descriptions/levels/gatekeeper3_complete.md new file mode 100644 index 000000000..eaa27dedd --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/gatekeeper3_complete.md @@ -0,0 +1 @@ +عمل جيد! لمزيد من المعلومات اقرأ [هذا](https://web3js.readthedocs.io/en/v1.2.9/web3-eth.html?highlight=getStorageAt#getstorageat) و [هذا](https://medium.com/loom-network/ethereum-solidity-memory-vs-storage-how-to-initialize-an-array-inside-a-struct-184baf6aa2eb). diff --git a/client/src/gamedata/ar/descriptions/levels/goodsamaritan.md b/client/src/gamedata/ar/descriptions/levels/goodsamaritan.md new file mode 100644 index 000000000..698d2173c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/goodsamaritan.md @@ -0,0 +1,9 @@ +تمثل هذه النسخة فاعل خير ثري ومستعد للتبرع ببعض العملات لأي شخص يطلبها. + +هل ستتمكن من استنزاف كل الرصيد من محفظته؟ + +  +أشياء قد تساعدك: + +- [أخطاء Solidity المخصصة](https://blog.soliditylang.org/2021/04/21/custom-errors/) + diff --git a/client/src/gamedata/ar/descriptions/levels/goodsamaritan_complete.md b/client/src/gamedata/ar/descriptions/levels/goodsamaritan_complete.md new file mode 100644 index 000000000..73d1fce49 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/goodsamaritan_complete.md @@ -0,0 +1,5 @@ +تهانينا! + +تُحدد الأخطاء المخصصة (Custom errors) في Solidity عن طريق "مُحدد" (selector) مكون من 4 بايت، تماماً مثل استدعاء الدوال. وتنتقل هذه الأخطاء عبر سلسلة الاستدعاءات حتى يتم التقاطها بواسطة جملة catch في كتلة try-catch كما هو موضح في دالة `requestDonation()` في عقد GoodSamaritan. + +لهذه الأسباب، ليس من الآمن افتراض أن الخطأ قد تم إلقاؤه (thrown) من قِبل الهدف المباشر لاستدعاء العقد (أي عقد Wallet في هذه الحالة). إذ يمكن لأي عقد آخر في سلسلة الاستدعاءات أن يعلن عن نفس الخطأ ويلقيه في موقع غير متوقع، مثل دالة `notify(uint256 amount)` في عقد المهاجم الخاص بك. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/higherorder.md b/client/src/gamedata/ar/descriptions/levels/higherorder.md new file mode 100644 index 000000000..2599e791e --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/higherorder.md @@ -0,0 +1,7 @@ +تخيل عالمًا حيث القواعد مصممة لتُكسر، وفقط الماكر والجريء يمكنه الارتقاء إلى السلطة. مرحبًا بك في "الرتبة العليا" (Higher Order)، مجموعة محاطة بالغموض، حيث ينتظر كنز وقائد يحكم بشكل أعلى. + +هدفك هو أن تصبح قائد "الرتبة العليا"! حظاً موفقاً! + +##### أشياء قد تساعدك: +* أحيانًا، لا يمكن الوثوق بـ `calldata`. +* تتطور المترجمات (compilers) باستمرار إلى سفن فضائية أفضل. diff --git a/client/src/gamedata/ar/descriptions/levels/higherorder_complete.md b/client/src/gamedata/ar/descriptions/levels/higherorder_complete.md new file mode 100644 index 000000000..bf4bb4fd0 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/higherorder_complete.md @@ -0,0 +1,3 @@ +لقد اجتزت تحدي "الرتبة العليا" بنجاح، وأتقنت استغلال ثغرة " البتات عالية الرتبة المتسخة" (Dirty Higher Order Bits) للمطالبة بلقب القائد. في هذه المهمة، غصت في أعماق Solidity، وتعلمت كيفية التلاعب بالبايتات وتجاوز فحوصات أنواع الدوال (function type checks). + +انتصارك لا يعرض فقط براعتك التقنية ولكن أيضًا يسلط الضوء على قدرتك على التفكير بشكل إبداعي ونقدي. diff --git a/client/src/gamedata/ar/descriptions/levels/impersonator.md b/client/src/gamedata/ar/descriptions/levels/impersonator.md new file mode 100644 index 000000000..434771b8c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/impersonator.md @@ -0,0 +1,2 @@ +يدمج المنتج الجديد لشركة SlockDotIt، وهو ECLocker، أقفال البوابات التي تعمل بتقنية إنترنت الأشياء (IoT) مع عقود Solidity الذكية، مستخدماً خوارزمية إيثيريوم ECDSA للتفويض. عندما يتم إرسال توقيع صالح إلى القفل، يرسل النظام حدثاً (Event) باسم `Open` لإتاحة الدخول للمتحكم المصرح له. لقد قامت SlockDotIt بتوظيفك لتقييم أمان هذا المنتج قبل إطلاقه. هل يمكنك اختراق النظام بطريقة تسمح لأي شخص بفتح الباب؟ + diff --git a/client/src/gamedata/ar/descriptions/levels/impersonator_complete.md b/client/src/gamedata/ar/descriptions/levels/impersonator_complete.md new file mode 100644 index 000000000..a35f5d1a1 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/impersonator_complete.md @@ -0,0 +1,5 @@ +تهانينا! لقد فتحت بنجاح أسرار توقيعات المنحنى الإهليلجي (Elliptic Curve Signatures)! + +كما هو موضح في [EIP-2](https://eips.ethereum.org/EIPS/eip-2)، فإن السماح بقيم `0 < s < secp256k1n` في منطق التحقق الخاص بنا، كما هو الحال حالياً، يفتح الباب أمام مخاوف تتعلق بـ **قابلية تطويع التوقيع (signature malleability)**. حيث يمكن لأي شخص أن يأخذ أي توقيع، ويقوم بقلب قيمة `s` من `s` إلى `secp256k1n - s` مع تغيير قيمة `v` (من 27 إلى 28، أو من 28 إلى 27)، وسينتج عن ذلك توقيع جديد يظل قادراً على استرداد نفس عنوان الموقع. + +من الضروري استخدام تطبيقات آمنة ما لم تكن تعرف بالضبط ما تفعله. راجع [تطبيق OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/448efeea6640bbbc09373f03fbc9c88e280147ba/contracts/utils/cryptography/ECDSA.sol#L128-L154) لتعلم كيفية استخدام `ecrecover` بشكل آمن. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/impersonator_two.md b/client/src/gamedata/ar/descriptions/levels/impersonator_two.md new file mode 100644 index 000000000..7b582b800 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/impersonator_two.md @@ -0,0 +1,6 @@ +الهدف من هذا المستوى هو سرقة جميع الأموال من العقد. + +  +أشياء قد تساعدك: + +* انظر بعناية إلى التوقيعين اللذين استخدمهما مالك العقد لقفله وتعيين المسؤول. diff --git a/client/src/gamedata/ar/descriptions/levels/impersonator_two_complete.md b/client/src/gamedata/ar/descriptions/levels/impersonator_two_complete.md new file mode 100644 index 000000000..c5dfe15e0 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/impersonator_two_complete.md @@ -0,0 +1,3 @@ +تهانينا! لقد فتحت بنجاح سرًا آخر من أسرار توقيعات المنحنى الإهليلجي (Elliptic Curve Signatures)! + +من المهم جداً عدم إعادة استخدام نفس الرقم الفريد (nonce) لتوقيعين مختلفين. يحدد معيار [RFC6979](https://datatracker.ietf.org/doc/html/rfc6979) إجراءً محدداً لإنشاء التوقيعات الرقمية، مما يزيل مخاطر إعادة استخدام نفس الـ nonce مرتين. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/instances.md b/client/src/gamedata/ar/descriptions/levels/instances.md new file mode 100644 index 000000000..362fcd4b9 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/instances.md @@ -0,0 +1,72 @@ +يرشدك هذا المستوى عبر الأساسيات الأولية لكيفية لعب اللعبة. + +  +#### 1. إعداد MetaMask +إذا لم يكن لديك بالفعل، قم بتثبيت [إضافة متصفح MetaMask](https://metamask.io/) (على Chrome أو Firefox أو Brave أو Opera على جهاز الكمبيوتر الخاص بك). +قم بإعداد محفظة الإضافة واستخدم محدد الشبكة للإشارة إلى الشبكة المفضلة في الجزء العلوي الأيسر من واجهة الإضافة. بدلاً من ذلك، يمكنك استخدام زر الواجهة للتبديل بين الشبكات. إذا اخترت شبكة غير مدعومة، ستقوم اللعبة بإعلامك وإحضارك إلى شبكة الاختبار Sepolia الافتراضية. + +#### 2. افتح وحدة تحكم المتصفح +افتح وحدة تحكم المتصفح الخاص بك: `أدوات > أدوات المطور` (Tools > Developer Tools). + +سترى بعض الرسائل من اللعبة. إحداها عنوان اللاعب الخاص بك. سيكون هذا مهمًا أثناء اللعبة! يمكنك دائمًا رؤية عنوان اللاعب الخاص بك عن طريق إدخال الأمر التالي: + +`player` + +راقب التحذيرات والأخطاء، لأنها قد توفر معلومات مهمة أثناء اللعب. + +#### 3. استخدم مساعدات وحدة التحكم + +يمكنك أيضًا رؤية رصيد الإيثر الحالي الخاص بك عن طريق كتابة: + +`getBalance(player)` + +###### ملاحظة: قم بتوسيع الـ promise لرؤية القيمة الفعلية، حتى لو كانت تقرأ "معلق" (pending). إذا كنت تستخدم Chrome v62، يمكنك استخدام `await getBalance(player)` للحصول على تجربة وحدة تحكم أنظف. + +رائع! لمعرفة الدوال المساعدة الأخرى المتاحة لك في وحدة التحكم، اكتب: + +`help()` + +ستكون هذه مفيدة للغاية أثناء اللعب. + +#### 4. عقد ethernaut +أدخل الأمر التالي في وحدة التحكم: + +`ethernaut` + +هذا هو العقد الذكي الرئيسي للعبة. لا تحتاج إلى التفاعل معه مباشرة من خلال وحدة التحكم (حيث سيقوم هذا التطبيق بذلك نيابةً عنك) ولكن يمكنك ذلك إذا أردت. اللعب مع هذا الكائن (Object) الآن هو طريقة رائعة لتعلم كيفية التفاعل مع العقود الذكية الأخرى في اللعبة. + +تابع وقم بتوسيع الـ ethernaut object لترى ما بداخله. + +#### 5. التفاعل مع الـ ABI + +كائن `ethernaut` هو من نوع `TruffleContract` object يقوم بتغليف عقد `Ethernaut.sol` الذي تم نشره على البلوكشين. + + +من بين أمور أخرى، تكشف واجهة تطبيق العقد (ABI) عن جميع الدوال العامة (public methods) الخاصة بـ `Ethernaut.sol` مثل دالة `owner`. اكتب الأمر التالي على سبيل المثال: + + + +`ethernaut.owner()` أو `await ethernaut.owner()` إذا كنت تستخدم متصفح Chrome الإصدار 62 أو أحدث. + +يمكنك رؤية من هو مالك عقد ethernaut. + +#### 6. احصل على إيثر تجريبي +للعب هذه اللعبة، ستحتاج إلى إيثر تجريبي (test ether). أسهل طريقة للحصول على بعض عملات الشبكة الاختبارية هي عبر صنبور (faucet) صالح للشبكة التي اخترتها. +بمجرد أن ترى بعض العملات في رصيدك، انتقل إلى الخطوة التالية. + +#### 7. الحصول على نسخة من المستوى +عند لعب مستوى، لا تتفاعل مباشرة مع عقد ethernaut. بدلاً من ذلك، تطلب منه إنشاء **نسخة من المستوى** لك. للقيام بذلك، انقر فوق زر "احصل على نسخة جديدة" في أسفل الصفحة. افعل ذلك الآن وعد! + +يجب أن يطالبك MetaMask بالتصريح للمعاملة. افعل ذلك، ويجب أن ترى بعض الرسائل في وحدة التحكم. لاحظ أن هذا ينشر عقدًا جديدًا على البلوكشين وقد يستغرق بضع ثوانٍ، لذا يرجى التحلي بالصبر عند طلب نسخ جديدة من المستويات! + +#### 8. فحص العقد +تمامًا كما فعلت مع عقد ethernaut، يمكنك فحص الـ ABI الخاص بهذا العقد من خلال وحدة التحكم باستخدام المتغير `contract`. + +#### 9. تفاعل مع العقد لإكمال المستوى +انظر إلى دالة info الخاصة بالمستوى `contract.info()` أو `await contract.info()` إذا كنت تستخدم Chrome v62. +يجب أن يكون لديك كل ما تحتاجه لإكمال المستوى داخل العقد. +عندما تعرف أنك أكملت المستوى، قم بتسليم العقد باستخدام زر التسليم في أسفل الصفحة. +هذا يرسل نسختك مرة أخرى إلى ethernaut، والذي سيحدد ما إذا كنت قد أكملته. + + +##### نصيحة: لا تنسى أنه يمكنك دائمًا النظر في الـ ABI الخاص بالعقد! diff --git a/client/src/gamedata/ar/descriptions/levels/instances_complete.md b/client/src/gamedata/ar/descriptions/levels/instances_complete.md new file mode 100644 index 000000000..b4182b383 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/instances_complete.md @@ -0,0 +1,6 @@ +تهانينا! لقد أكملت البرنامج التعليمي. +ألقِ نظرة على كود Solidity للعقد الذي تفاعلت معه للتو أدناه. + +أنت الآن جاهز لإكمال جميع مستويات اللعبة، واعتبارًا من الآن، أنت بمفردك. + +حظاً موفقاً!! diff --git a/client/src/gamedata/ar/descriptions/levels/king.md b/client/src/gamedata/ar/descriptions/levels/king.md new file mode 100644 index 000000000..2614d6cd7 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/king.md @@ -0,0 +1,5 @@ +العقد أدناه يمثل لعبة بسيطة جدًا: من يرسل إليه كمية من الإيثر أكبر من الجائزة الحالية يصبح الملك الجديد. في مثل هذا الحدث، يحصل الملك المخلوع على الجائزة الجديدة، مما يكسبه القليل من الإيثر في العملية! إنه نظام "بونزي" (Ponzi) بحت xD + +إنها لعبة ممتعة. هدفك هو كسرها. + +عندما تسلم النسخة إلى المستوى، سيحاول المستوى استعادة الملكية. ستجتاز المستوى إذا تمكنت من منع هذا الإعلان الذاتي عن الملكية. diff --git a/client/src/gamedata/ar/descriptions/levels/king_complete.md b/client/src/gamedata/ar/descriptions/levels/king_complete.md new file mode 100644 index 000000000..291cf0772 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/king_complete.md @@ -0,0 +1,5 @@ +تحاول معظم مستويات Ethernaut الكشف (بشكل مبسط بالطبع) عن شيء حدث بالفعل - اختراق حقيقي أو خطأ حقيقي. + + +في هذه الحالة، راجع: [ملك الإيثر (King of the Ether)](https://www.kingoftheether.com/thrones/kingoftheether/index.html) و [تحليل ما بعد الوفاة لملك الإيثر (King of the Ether Postmortem)](http://www.kingoftheether.com/postmortem.html). + diff --git a/client/src/gamedata/ar/descriptions/levels/magicanimalcarousel.md b/client/src/gamedata/ar/descriptions/levels/magicanimalcarousel.md new file mode 100644 index 000000000..3c67b6b28 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/magicanimalcarousel.md @@ -0,0 +1,6 @@ +مرحبًا بك، عزيزي "أنون" في الدوامة السحرية (Magic Carousel)، حيث تدور المخلوقات وتلتف في تعويذة لا حدود لها. في هذه العجلة الرقمية السحرية اللانهائية، تدور وتلتف بحماس ساحر. + +أضف مخلوقًا للانضمام إلى المرح، ولكن انتبه للقاعدة، وإلا ستنتهي اللعبة. +إذا انضم حيوان إلى الركوب، احذر عندما تتحقق مرة أخرى، يجب أن يكون نفس الحيوان موجودًا! + +هل يمكنك كسر القاعدة السحرية للدوامة؟ diff --git a/client/src/gamedata/ar/descriptions/levels/magicanimalcarousel_complete.md b/client/src/gamedata/ar/descriptions/levels/magicanimalcarousel_complete.md new file mode 100644 index 000000000..d1e9038e3 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/magicanimalcarousel_complete.md @@ -0,0 +1 @@ +تهانينا، لقد كسرت القاعدة السحرية للدوامة (Carousel)! في مجال معالجة البيانات منخفضة المستوى (low-level)، من الضروري جداً تذكر التفاصيل، خاصة عند العمل على ضغط البيانات (compacting data) في فتحات التخزين. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/magicnum.md b/client/src/gamedata/ar/descriptions/levels/magicnum.md new file mode 100644 index 000000000..64badb6b4 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/magicnum.md @@ -0,0 +1,10 @@ +لحل هذا المستوى، تحتاج فقط إلى تزويد Ethernaut بـ `Solver` (الحلال)، وهو عقد يستجيب لـ `whatIsTheMeaningOfLife()` بالرقم الصحيح المكون من 32 بايت. + +سهل أليس كذلك؟ +حسنًا... هناك مشكلة. + +يجب أن يكون كود الحل صغيراً جداً. صغيراً للغاية بحق. صغيراً بشكل لا يُصدق: 10 بايتات كحد أقصى. + +تلميح: ربما حان الوقت لترك راحة مترجم (compiler) Solidity مؤقتاً، وبناء هذا الكود يدوياً O_o. نعم، هذا صحيح: كود بايت كود خام لجهاز إيثيريوم الافتراضي (Raw EVM bytecode). + +حظاً موفقاً! diff --git a/client/src/gamedata/ar/descriptions/levels/magicnum_complete.md b/client/src/gamedata/ar/descriptions/levels/magicnum_complete.md new file mode 100644 index 000000000..b118faeb3 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/magicnum_complete.md @@ -0,0 +1,3 @@ +تهانينا! إذا حللت هذا المستوى، فاعتبر نفسك خبيراً لا يُشق له غبار. + +انطلق الآن واخترق شيئاً عشوائياً في الغرفة بنظرتك الثاقبة. والآن، حاول تحريكه عن بُعد؛ فربما تكون قدراتك على تحريك الأشياء ذهنياً قد بدأت بالعمل للتو. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/motorbike.md b/client/src/gamedata/ar/descriptions/levels/motorbike.md new file mode 100644 index 000000000..a25404651 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/motorbike.md @@ -0,0 +1,10 @@ +تتمتع دراجة "Ethernaut" النارية بتصميم محرك جديد قابل للتطوير. + +هل ستكون قادراً على تدمير محركها ذاتياً (`selfdestruct`) وجعل الدراجة النارية غير قابلة للاستخدام؟ + +  +أشياء قد تساعدك: + +* **[EIP-1967](https://eips.ethereum.org/EIPS/eip-1967)** +* نمط التطوير **[UUPS](https://forum.openzeppelin.com/t/uups-proxies-tutorial-solidity-javascript/7786)** +* عقد **[Initializable](https://github.com/OpenZeppelin/openzeppelin-upgrades/blob/master/packages/core/contracts/Initializable.sol)** \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/motorbike_complete.md b/client/src/gamedata/ar/descriptions/levels/motorbike_complete.md new file mode 100644 index 000000000..30fe19782 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/motorbike_complete.md @@ -0,0 +1,9 @@ +ميزة اتباع نمط UUPS هي وجود وكيل (Proxy) بسيط للغاية ليتم نشره. يعمل الـ Proxy كطبقة تخزين، لذا فإن أي تعديل في الحالة داخل عقد التنفيذ لا ينتج عنه عادةً آثار جانبية للأنظمة التي تستخدمه، بما أن المنطق البرمجي فقط هو ما يُستخدم عبر نداءات التفويض (delegatecalls). + +هذا لا يعني أنه لا يجب عليك الحذر من الثغرات التي يمكن استغلالها إذا تركنا عقد التنفيذ دون تهيئة (uninitialized). + +كانت هذه نسخة مبسطة قليلاً مما تم اكتشافه بالفعل بعد أشهر من إصدار نمط UUPS. + +الخلاصة: لا تترك أبداً عقود التنفيذ دون تهيئة ;) + +إذا كنت مهتماً بما حدث، اقرأ المزيد [هنا](https://forum.openzeppelin.com/t/uupsupgradeable-vulnerability-post-mortem/15680). diff --git a/client/src/gamedata/ar/descriptions/levels/naughtcoin.md b/client/src/gamedata/ar/descriptions/levels/naughtcoin.md new file mode 100644 index 000000000..00901ed96 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/naughtcoin.md @@ -0,0 +1,8 @@ +NaughtCoin هى توكن ERC20 وأنت تمتلكها جميعًا بالفعل. المشكلة هي أنك ستتمكن من تحويلها فقط بعد فترة تأمين مدتها 10 سنوات. هل يمكنك معرفة كيفية إخراجها إلى عنوان آخر حتى تتمكن من تحويلها بحرية؟ أكمل هذا المستوى عن طريق جعل رصيد التوكنات الخاص بك 0. + +  +أشياء قد تساعدك: + +* مواصفات [ERC20](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) +* كود [OpenZeppelin](https://github.com/OpenZeppelin/zeppelin-solidity/tree/master/contracts) + diff --git a/client/src/gamedata/ar/descriptions/levels/naughtcoin_complete.md b/client/src/gamedata/ar/descriptions/levels/naughtcoin_complete.md new file mode 100644 index 000000000..607025952 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/naughtcoin_complete.md @@ -0,0 +1 @@ +عند استخدام كود ليس من تأليفك، من الجيد التعرف عليه للحصول على فهم جيد لكيفية تناسب كل شيء معًا. يمكن أن يكون هذا مهمًا بشكل خاص عندما تكون هناك مستويات متعددة من الاستيرادات (استيراداتك لديها استيرادات) أو عندما تقوم بتنفيذ ضوابط التصريح، على سبيل المثال عندما تسمح أو تمنع الأشخاص من فعل أشياء. في هذا المثال، قد يفحص المطور الكود ويعتقد أن `transfer` هي الطريقة الوحيدة لنقل التوكنات، لكن في الحقيقة هناك طرق أخرى لأداء نفس العملية بتنفيذ مختلف. diff --git a/client/src/gamedata/ar/descriptions/levels/not_optimistic_portal.md b/client/src/gamedata/ar/descriptions/levels/not_optimistic_portal.md new file mode 100644 index 000000000..1bdbbae60 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/not_optimistic_portal.md @@ -0,0 +1,19 @@ +تعتمد هذه البوابة على سلسلة معقدة من الإثباتات التشفيرية للتحقق من الرسائل عبر السلاسل (cross-chain messages). تدعي أنها آمنة ضد انتقالات الحالة غير الصالحة (invalid state transitions)، لكن الفجوة بين التحقق والتنفيذ قد تكون أوسع مما تبدو. + +هل يمكنك النجاح في صك (mint) بعض العملات لمحفظتك الخاصة؟ + +  +أشياء قد تساعدك: + +- فهم محددات الدوال. + +- نمط الفحص-التأثير-التفاعل Checks-Effects-Interactions (CEI). + +- أشجار ميركل باتريسيا (Merkle Patricia Tries) وتشفير RLP. + + +###### نصائح: + +- أحيانًا البيانات التي تتحقق منها ليست بالضبط نفس البيانات التي تنفذها. + +- إذا بدت دورة التجزئة (hash cycle) مستحيلة الحل، فابحث عن طريقة لكسر هذه الحلقة. diff --git a/client/src/gamedata/ar/descriptions/levels/not_optimistic_portal_complete.md b/client/src/gamedata/ar/descriptions/levels/not_optimistic_portal_complete.md new file mode 100644 index 000000000..3f5178ee0 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/not_optimistic_portal_complete.md @@ -0,0 +1 @@ +**غير مُنفذ لعدم تسريب الحل** \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/preservation.md b/client/src/gamedata/ar/descriptions/levels/preservation.md new file mode 100644 index 000000000..8de42c48c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/preservation.md @@ -0,0 +1,13 @@ +يستخدم هذا العقد مكتبة لتخزين وقتين مختلفين لمنطقتين زمنيتين مختلفتين. ينشئ الـ constructor (المنشئ) نسختين من المكتبة لكل وقت ليتم تخزينه. + +الهدف من هذا المستوى هو أن تحصل على ملكية النسخة التي تم منحها لك. + +  +أشياء قد تساعدك: + +* انظر في وثائق Solidity حول دالة `delegatecall` منخفضة المستوى، + وكيف تعمل، وكيف يمكن استخدامها لتفويض العمليات إلى + المكتبات على الشبكة (on-chain)، وما هي تأثيراتها على نطاق التنفيذ. +* فهم ما يعنيه أن تكون `delegatecall` محافظة على السياق (context-preserving). +* فهم كيفية تخزين متغيرات التخزين (Storage variables) والوصول إليها. +* فهم كيفية عمل التحويل بين أنواع البيانات المختلفة. diff --git a/client/src/gamedata/ar/descriptions/levels/preservation_complete.md b/client/src/gamedata/ar/descriptions/levels/preservation_complete.md new file mode 100644 index 000000000..3a2e4751b --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/preservation_complete.md @@ -0,0 +1 @@ +كما ذكر المستوى السابق `delegate`؛ فإن استخدام `delegatecall` لاستدعاء المكتبات (libraries) قد يكون محفوفاً بالمخاطر. وينطبق هذا بشكل خاص على مكتبات العقود التي تمتلك حالة خاصة بها. يوضح هذا المثال سبب وجوب استخدام الكلمة المفتاحية `library` عند بناء المكتبات، حيث إنها تمنع المكتبات من تخزين متغيرات الحالة (State Variables) أو الوصول إليها. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/privacy.md b/client/src/gamedata/ar/descriptions/levels/privacy.md new file mode 100644 index 000000000..7d979b123 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/privacy.md @@ -0,0 +1,13 @@ +كان منشئ هذا العقد حريصاً بما يكفي لحماية المناطق الحساسة في مساحة تخزينه. + +قم بفك قفل هذا العقد لتجاوز المستوى. + +  +أشياء قد تساعدك: + +- فهم آلية عمل تخزين البيانات (Storage). +- فهم كيفية تحليل المعاملات (Parameter parsing). +- فهم كيفية تحويل أنواع البيانات (Casting). + +###### نصائح: +- تذكر أن MetaMask مجرد أداة مساعدة. استخدم أداة أخرى إذا واجهتك مشاكل. اللعب المتقدم قد يتطلب استخدام "Remix" أو مزود Web3 الخاص بك. diff --git a/client/src/gamedata/ar/descriptions/levels/privacy_complete.md b/client/src/gamedata/ar/descriptions/levels/privacy_complete.md new file mode 100644 index 000000000..958809afb --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/privacy_complete.md @@ -0,0 +1,3 @@ +لا يوجد شيء خاص أو سري في بلوكشين إيثيريوم. الكلمة المفتاحية "خاص" `private` مجرد بناء اصطناعي في لغة Solidity. يمكن استخدام دالة `getStorageAt(...)` في Web3 لقراءة أي شيء من **مساحة التخزين**. ومع ذلك، قد يكون من الصعب قراءة ما تريده بالضبط، نظرًا لاستخدام العديد من قواعد وتقنيات التحسين لضغط **البيانات المخزنة** قدر الإمكان. + +لا يمكن للأمر أن يصبح أكثر تعقيداً مما تم كشفه في هذا المستوى. للمزيد، راجع هذا المقال الممتاز لـ "داريوس": [كيفية قراءة مساحة تخزين عقود إيثيريوم](https://medium.com/aigang-network/how-to-read-ethereum-contract-storage-44252c8af925). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/puzzle_wallet.md b/client/src/gamedata/ar/descriptions/levels/puzzle_wallet.md new file mode 100644 index 000000000..5c6f7d91d --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/puzzle_wallet.md @@ -0,0 +1,21 @@ +في هذه الأيام، دفع تكاليف عمليات التمويل اللامركزي (DeFi) أصبح أمراً مستحيلاً، حقيقة لا غبار عليها. + +اكتشفت مجموعة من الأصدقاء طريقة لتقليل تكلفة تنفيذ معاملات متعددة بشكل طفيف عن طريق تجميعها في معاملة واحدة (**Batching**)، لذا قاموا بتطوير عقد ذكي للقيام بذلك. + +كانوا بحاجة لأن يكون هذا العقد قابلاً للتطوير في حال احتوى الكود على خطأ برمجي، وأرادوا أيضاً منع الأشخاص من خارج المجموعة من استخدامه. وللقيام بذلك، صوتوا وعينوا شخصين بأدوار خاصة في النظام: + +* **المسؤول (Admin):** الذي يملك صلاحية تحديث المنطق البرمجي للعقد الذكي. +* **المالك (Owner):** الذي يتحكم في القائمة البيضاء للعناوين المسموح لها باستخدام العقد. + +تم نشر العقود، وإضافة المجموعة إلى القائمة البيضاء. احتفل الجميع بإنجازاتهم ضد المنقبين الأشرار. + +لكنهم لم يدركوا أن أموال غدائهم كانت في خطر... + +  +ستحتاج إلى اختطاف هذه المحفظة لتصبح أنت المسؤول عن الوكيل (Proxy). + +  +أشياء قد تساعدك: + +* فهم آلية عمل `delegatecall` وكيف يتصرف `msg.sender` و `msg.value` عند تنفيذها. +* الإلمام بأنماط الـ Proxy والطريقة التي تتعامل بها مع **بيانات التخزين (Storage variables)**. diff --git a/client/src/gamedata/ar/descriptions/levels/puzzle_wallet_complete.md b/client/src/gamedata/ar/descriptions/levels/puzzle_wallet_complete.md new file mode 100644 index 000000000..affb485a2 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/puzzle_wallet_complete.md @@ -0,0 +1,8 @@ +في المرة القادمة، سيطلب هؤلاء الأصدقاء إجراء فحص أمني (Audit) قبل إيداع أي أموال في العقد. تهانينا! + +غالباً ما يُنصح بشدة باستخدام عقود الوكيل (Proxy Contracts) لتوفير ميزات القابلية للتطوير وتقليل تكلفة الـ gas عند النشر. ومع ذلك، يجب على المطورين الحذر من حدوث تداخل في التخزين (Storage Collisions)، كما رأينا في هذا المستوى. + +علاوة على ذلك، فإن تكرار العمليات التي تستهلك ETH قد يؤدي إلى مشاكل إذا لم يتم التعامل معها بشكل صحيح. فحتى لو تم إنفاق العملة، ستظل قيمة `msg.value` ثابتة كما هي، لذا يجب على المطور تتبع المبلغ المتبقي الفعلي يدوياً في كل دورة تكرار. يمكن أن يؤدي هذا أيضاً إلى ثغرات عند استخدام نمط النداءات المتعددة (**Multi-call**)، حيث إن إجراء عدة نداءات تفويض (`delegatecall`) لدالة تبدو آمنة في حد ذاتها قد يؤدي إلى تحويلات غير مرغوب فيها للعملة، لأن نداءات التفويض تحتفظ بنفس قيمة `msg.value` الأصلية المرسلة إلى العقد. + +انتقل إلى المستوى التالي عندما تكون مستعداً! + diff --git a/client/src/gamedata/ar/descriptions/levels/recovery.md b/client/src/gamedata/ar/descriptions/levels/recovery.md new file mode 100644 index 000000000..232567b1e --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/recovery.md @@ -0,0 +1,3 @@ +قام منشئ العقد ببناء عقد مصنع توكنات بسيط للغاية. يمكن لأي شخص إنشاء توكنات جديدة بسهولة. بعد نشر عقد التوكن الأول، أرسل المنشئ `0.001` إيثر للحصول على المزيد من التوكنات. لقد فقدوا عنوان العقد منذ ذلك الحين. + +سيكتمل هذا المستوى إذا تمكنت من استرداد (أو إزالة) `0.001` إيثر من عنوان العقد المفقود. diff --git a/client/src/gamedata/ar/descriptions/levels/recovery_complete.md b/client/src/gamedata/ar/descriptions/levels/recovery_complete.md new file mode 100644 index 000000000..9c964ccee --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/recovery_complete.md @@ -0,0 +1,7 @@ +عناوين العقود حتمية ويتم حسابها بواسطة `keccak256(address, nonce)` حيث `address` هو عنوان العقد (أو عنوان إيثريوم الذي أنشأ المعاملة) و `nonce` هو عدد العقود التي أنشأها العقد المولد (أو nonce المعاملة، للمعاملات العادية). + +بسبب هذا، يمكن للمرء إرسال إيثر إلى عنوان محدد مسبقًا (والذي لا يحتوي على مفتاح خاص) ولاحقًا إنشاء عقد في ذلك العنوان يسترد الإيثر. هذه طريقة غير بديهية وسرية إلى حد ما لتخزين الإيثر (بشكل خطير) دون حيازة مفتاح خاص. + +هناك [مقال ممتع](https://swende.se/blog/Ethereum_quirks_and_vulns.html) كتبه "مارتن سويندي" يفصل حالات الاستخدام المحتملة لهذه التقنية. + +إذا كنت تنوي تنفيذ هذه التقنية، فتأكد من عدم الخطأ في الـ `nonce`؛ وإلا ستضيع أموالك للأبد. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/reentrancy.md b/client/src/gamedata/ar/descriptions/levels/reentrancy.md new file mode 100644 index 000000000..d73af017e --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/reentrancy.md @@ -0,0 +1,10 @@ +الهدف من هذا المستوى هو سرقة جميع الأموال من العقد. + +  +أشياء قد تساعدك: + +* العقود غير الموثوقة يمكنها تنفيذ **أكواد برمجية** في أماكن لا تتوقعها. +* دوال الـ Fallback methods. +* تسلسل الأخطاء Throw/revert bubbling. +* أحياناً تكون أفضل طريقة لمهاجمة عقد هي باستخدام عقد آخر. +* راجع صفحة ["؟"](https://ethernaut.openzeppelin.com/help) أعلاه، قسم "ما وراء وحدة التحكم" (Beyond the console). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/reentrancy_complete.md b/client/src/gamedata/ar/descriptions/levels/reentrancy_complete.md new file mode 100644 index 000000000..55e5212b2 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/reentrancy_complete.md @@ -0,0 +1,12 @@ +لمنع هجمات إعادة الدخول (re-entrancy) عند نقل الأموال من عقدك، استخدم نمط [الفحص-التأثير-التفاعل](https://solidity.readthedocs.io/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern) مع العلم أن `call` سيُرجع false فقط دون مقاطعة تدفق التنفيذ. يمكن أيضًا استخدام حلول مثل [ReentrancyGuard](https://docs.openzeppelin.com/contracts/2.x/api/utils#ReentrancyGuard) أو [PullPayment](https://docs.openzeppelin.com/contracts/2.x/api/payment#PullPayment). + +لا يُنصح باستخدام `transfer` و `send` كحلول بعد الآن، حيث يمكن أن تتسببا في تعطل العقود بعد تحديث "إسطنبول" (Istanbul hard fork). [المصدر 1](https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/)، [المصدر 2](https://forum.openzeppelin.com/t/reentrancy-after-istanbul/1742). + +افترض دائماً أن مستلم الأموال التي ترسلها قد يكون عقداً آخر، وليس مجرد عنوان عادي. وبالتالي، يمكنه تنفيذ كود برمجي في دالة الـ `fallback` الخاصة به، وإعادة الدخول إلى عقدك، مما قد يؤدي إلى إفساد بياناتك المسجلة (State) أو منطق العقد. + +إعادة الدخول (**Re-entrancy**) هي هجمة شائعة، ويجب عليك دائماً أن تكون مستعداً لها! + +  +#### اختراق DAO + +استخدم اختراق منظمة DAO الشهير تقنية Re-entrancy لسحب كمية ضخمة من الإيثير من العقد الضحية. راجع مقال: [15 سطراً من الكود كانت كفيلة بمنع اختراق TheDAO](https://blog.openzeppelin.com/15-lines-of-code-that-could-have-prevented-thedao-hack-782499e00942). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/shop.md b/client/src/gamedata/ar/descriptions/levels/shop.md new file mode 100644 index 000000000..11c7f8ab6 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/shop.md @@ -0,0 +1,5 @@ +هل يمكنك الحصول على العنصر من المتجر بأقل من السعر المطلوب؟ + +##### أشياء قد تساعدك: +* يتوقع `Shop` أن يتم استخدامه من `Buyer` +* فهم قيود دوال `view` diff --git a/client/src/gamedata/ar/descriptions/levels/shop_complete.md b/client/src/gamedata/ar/descriptions/levels/shop_complete.md new file mode 100644 index 000000000..bdd0cf722 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/shop_complete.md @@ -0,0 +1,3 @@ +يمكن للعقود التلاعب بالبيانات التي تشاهدها العقود الأخرى بأي طريقة تريدها. + +من غير الآمن تغيير الحالة (State) بناءً على منطق عقود خارجية وغير موثوقة. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/stake.md b/client/src/gamedata/ar/descriptions/levels/stake.md new file mode 100644 index 000000000..ca1b05244 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/stake.md @@ -0,0 +1,14 @@ +عقد `Stake` آمن للمراهنة على عملة ETH الأصلية ورمز ERC20 WETH، مع مراعاة تساوي قيمة الرمزين بنسبة 1:1. هل يمكنك استنزاف العقد؟ + + +لإكمال هذا المستوى، يجب أن تفي حالة العقد بالشروط التالية: + +- يجب أن يكون رصيد ETH في عقد `Stake` أكبر من 0. +- يجب أن يكون `totalStaked` أكبر من رصيد ETH في عقد `Stake`. +- يجب أن تكون مراهنًا. +- يجب أن يكون رصيد المراهنة الخاص بك 0. + +###### أشياء قد تكون مفيدة: + +* مواصفات [ERC-20](https://github.com/ethereum/ercs/blob/master/ERCS/erc-20.md). +* [OpenZeppelin contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/stake_complete.md b/client/src/gamedata/ar/descriptions/levels/stake_complete.md new file mode 100644 index 000000000..e8e4367ed --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/stake_complete.md @@ -0,0 +1,5 @@ +تهانينا، لقد قمت باختراق آلة `Stake`! + +عند إجراء نداءات منخفضة المستوى (low-level calls) لعقود خارجية، من المهم التحقق من صحة نتائج النداء الخارجي بشكل صحيح لتحديد ما إذا كان النداء قد تراجع (reverted). + +لمزيد من المعلومات، راجع متطلب [EEA EthTrust [S] Check External Calls Return](https://entethalliance.github.io/eta-registry/security-levels-spec.html#req-1-check-return)، واستخدم دائماً [SafeERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol) عند التعامل مع رموز ERC-20 الخارجية. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/switch.md b/client/src/gamedata/ar/descriptions/levels/switch.md new file mode 100644 index 000000000..7bd303723 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/switch.md @@ -0,0 +1,4 @@ +فقط عليك قلب المفتاح. لا يمكن أن يكون هذا صعبًا، أليس كذلك؟ + +##### أشياء قد تساعدك: +فهم كيفية ترميز (encoding) الـ CALLDATA. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/switch_complete.md b/client/src/gamedata/ar/descriptions/levels/switch_complete.md new file mode 100644 index 000000000..b1eee833a --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/switch_complete.md @@ -0,0 +1 @@ +افتراض مواقع البيانات في `CALLDATA` مع الأنواع الديناميكية (dynamic types) يمكن أن يكون خاطئاً، خاصة عند استخدام مواقع `CALLDATA` الثابتة (hard-coded). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/telephone.md b/client/src/gamedata/ar/descriptions/levels/telephone.md new file mode 100644 index 000000000..bc0b51bf3 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/telephone.md @@ -0,0 +1,6 @@ +قم بالمطالبة بملكية العقد أدناه لإكمال هذا المستوى. + +  +أشياء قد تساعدك: + +* راجع صفحة ["؟"](https://ethernaut.openzeppelin.com/help) أعلاه، قسم "ما وراء وحدة التحكم" (Beyond the console). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/telephone_complete.md b/client/src/gamedata/ar/descriptions/levels/telephone_complete.md new file mode 100644 index 000000000..aef751965 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/telephone_complete.md @@ -0,0 +1,22 @@ +على الرغم من أن هذا المثال قد يكون بسيطاً، إلا أن الخلط بين `tx.origin` و `msg.sender` قد يؤدي إلى هجمات بنمط التصيد (phishing)، مثل [هذا الهجوم](https://blog.ethereum.org/2016/06/24/security-alert-smart-contract-wallets-created-in-frontier-are-vulnerable-to-phishing-attacks/). + +يتم توضيح مثال لهجوم محتمل أدناه. + +1. استخدام `tx.origin` لتحديد من سيتم تحويل رموزه، على سبيل المثال: + +``` +function transfer(address _to, uint _value) { + tokens[tx.origin] -= _value; + tokens[_to] += _value; +} +``` + +2. يقوم المهاجم بجعل الضحية ترسل أموالاً إلى عقد خبيث يستدعي دالة التحويل (transfer) في عقد الرموز، على سبيل المثال: + +``` +function() payable { + token.transfer(attackerAddress, 10000); +} +``` + +3. في هذا السيناريو، سيكون `tx.origin` هو عنوان الضحية (بينما سيكون `msg.sender` هو عنوان العقد الخبيث)، مما يؤدي إلى تحويل الأموال من الضحية إلى المهاجم. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/token.md b/client/src/gamedata/ar/descriptions/levels/token.md new file mode 100644 index 000000000..777b7242c --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/token.md @@ -0,0 +1,8 @@ +الهدف من هذا المستوى هو أن تخترق عقد التوكن الأساسي أدناه. + +يتم منحك 20 توكن للبدء، وستهزم المستوى إذا تمكنت بطريقة ما من الحصول على أي توكنات إضافية. ويُفضل كمية كبيرة جدًا من التوكنات. + +  +أشياء قد تساعدك: + +* ما هو عداد المسافات (odometer)؟ diff --git a/client/src/gamedata/ar/descriptions/levels/token_complete.md b/client/src/gamedata/ar/descriptions/levels/token_complete.md new file mode 100644 index 000000000..0c8c7a127 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/token_complete.md @@ -0,0 +1,15 @@ +تعد حالات التجاوز (Overflows) شائعة جداً في لغة Solidity، ويجب التحقق منها باستخدام عبارات التحكم مثل: + +``` +if(a + c > a) { + a = a + c; +} +``` + +البديل الأسهل هو استخدام مكتبة SafeMath من OpenZeppelin التي تتحقق تلقائياً من حالات التجاوز في جميع العمليات الحسابية. الكود الناتج يبدو كما يلي: + +``` +a = a.add(c); +``` + +إذا حدث overflow، فسيتم التراجع عن تنفيذ الكود (revert). \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/uniquenft.md b/client/src/gamedata/ar/descriptions/levels/uniquenft.md new file mode 100644 index 000000000..edd1fe0e2 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/uniquenft.md @@ -0,0 +1,13 @@ +أهلاً بك في UniqueNFT، حيث يمكن لأي مستخدم الحصول على شارته الرقمية اللامعة الخاصة. + +البشر الذين يمتلكون حسابات مملوكة خارجياً (EOAs)؟ يمكنك الصك (mint) مجاناً، دون طرح أي أسئلة. إثبات الإنسانية (Proof of Humanity) هو الفائز! + +العقود الذكية؟ عذراً أيتها الروبوتات، ادفعي الرسوم –> واحد إيثير كامل! + +لكن إليك المفاجأة: شارة واحدة فقط لكل عنوان، ولا يُسمح بالاحتفاظ الطماع. + +وانسَ أمر التداول، فهذه الأشياء تلتصق كالغراء. + +إنها مثل أوشام البلوكشين، بمجرد أن تصبح ملكك، فهي ملكك للأبد. + +هل تعتقد أنك تستطيع خداع القواعد وامتلاك أكثر من NFT واحد؟ أثبت ذلك. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/uniquenft_complete.md b/client/src/gamedata/ar/descriptions/levels/uniquenft_complete.md new file mode 100644 index 000000000..4725467ed --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/uniquenft_complete.md @@ -0,0 +1,5 @@ +هل كنت تعتقد أن `tx.origin == msg.sender` ستحميك من المستدعين عبر العقود الذكية؟ ليس بعد الآن. + +مع EIP-7702، يمكن للحسابات المملوكة خارجياً (EOA) أن تتقمص سلوك العقود، وتفوض النداءات (delegate calls)، وتتسلل عبر ذلك الفحص القديم. إن الافتراض بأن الـ EOAs لا يمكنها إعادة دخول دالة (reenter) أصبح الآن أكثر خطورة من أي وقت مضى. + +من خلال إعادة دخول `mintNFTEOA` عبر نداء الرد (callback) الخاص بـ `onERC721Received` ، يمكنك صك (mint) أي عدد تريده من الـ NFTs. فجأة، لن تكون الشارة الواحدة هي الحد الأقصى، بل هي مجرد البداية. \ No newline at end of file diff --git a/client/src/gamedata/ar/descriptions/levels/vault.md b/client/src/gamedata/ar/descriptions/levels/vault.md new file mode 100644 index 000000000..5ed7eea28 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/vault.md @@ -0,0 +1 @@ +افتح القبو لاجتياز المستوى! diff --git a/client/src/gamedata/ar/descriptions/levels/vault_complete.md b/client/src/gamedata/ar/descriptions/levels/vault_complete.md new file mode 100644 index 000000000..1de260016 --- /dev/null +++ b/client/src/gamedata/ar/descriptions/levels/vault_complete.md @@ -0,0 +1,3 @@ +من المهم أن تتذكر أن وضع الكلمة المفتاحية "خاص" (private) على متغير ما يمنع العقود الأخرى فقط من الوصول إليه. فمتغيرات الحالة (State variables) المحددة كخاصة، وكذلك المتغيرات المحلية، لا تزال قابلة للوصول إليها علنًا. + +لضمان خصوصية البيانات، يجب تشفيرها قبل وضعها على البلوكشين. وفي هذا السيناريو، لا ينبغي أبداً إرسال مفتاح فك التشفير على الشبكة (on-chain)، لأنه سيكون مرئياً لأي شخص يبحث عنه. توفر تقنية [zk-SNARKs](https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/) وسيلة لتحديد ما إذا كان شخص ما يمتلك معاملاً سرياً (secret parameter)، دون الحاجة أبداً إلى الكشف عن هذا العامل. \ No newline at end of file