Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/aliencodex.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
لقد اكتشفت عقداً فضائياً. اطلب الملكية لإكمال المستوى.

 
أشياء قد تساعدك:

* فهم آلية عمل تخزين المصفوفات
* فهم [مواصفات ABI](https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html)
* استخدام نهج `مخادع (underhanded)` للغاية
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/bet_house.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
مرحبًا بك في بيت الرهان.

تبدأ بـ 5 Pool Deposit Tokens (PDT).

هل يمكنك إتقان فن المقامرة الاستراتيجية وأن تصبح مراهنًا؟
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
تهانينا!!! لقد اكتسبت درسًا حاسمًا: لا تراهن أبدًا على الاستدعاءات الخارجية التي تبدو غير ضارة.
افترض دائمًا أن مُستقبل الأموال يمكن أن يكون عقدًا آخر، وترك العقود في حالة غير متسقة يمكن أن يفسد المنطق، حتى لو كانت الدالة محمية.

إعادة الدخول لها العديد من الوجوه ويجب أن تكون دائمًا مستعدًا لها. لا تُهزم في الرهان!
5 changes: 5 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/cashback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
لقد انضممت للتو إلى Cashback، أشهر بنك تشفير جديد في المدينة. عرضهم لا يقاوم: مقابل كل عملية دفع تجريها عبر الشبكة، تكسب نقاطًا. اجمع ما يكفي من النقاط لتصل إلى المرتبة الأسطورية، وتفتح وسام Super Cashback NFT المنشود.

يستفيد النظام من EIP-7702 للسماح للحسابات المملوكة خارجيًا (EOAs) بتجميع استرداد نقدي. يجب على المستخدمين التفويض إلى عقد Cashback لاستخدام دالة `payWithCashback`.

تقول الشائعات أن هناك باباً خلفياً للمستخدمين المحترفين. مهمتك بسيطة: كن كابوس برنامج الولاء؛ قم برفع رصيد الـ Cashback الخاص بك إلى الحد الأقصى في كل عملة مدعومة، وغادر وبحوزتك وسامين على الأقل من نوع Super Cashback NFT، على أن يكون أحدهما مرتبطاً بعنوان اللاعب الخاص بك.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
إن الافتراضات المتعلقة بالهوية، وسياق تنفيذ الحساب، ومحلية التخزين هي ثغرات قابلة للاستغلال تماماً مثل الأخطاء الحسابية عند التعامل مع تعقيدات أنظمة EIP-7702. لقد وجدت الثغرات وحققت الأرباح. عمل رائع!
6 changes: 6 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/coinflip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
هذه لعبة لقلب العملة حيث يتعين عليك بناء سلسلة فوز من خلال تخمين نتيجة قلب العملة. لإكمال هذا المستوى، ستحتاج إلى استخدام قدراتك النفسية لتخمين النتيجة الصحيحة 10 مرات متتالية.

 
أشياء قد تساعدك:

* راجع صفحة ["؟"](https://ethernaut.openzeppelin.com/help) أعلاه في قائمة الزاوية اليمنى العليا، قسم "Beyond the console"
Original file line number Diff line number Diff line change
@@ -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/).
8 changes: 8 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/delegate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
الهدف من هذا المستوى هو أن تطالب بملكية النسخة التي تم منحها لك.

 
أشياء قد تساعدك:

* انظر في وثائق Solidity حول الدالة منخفضة المستوى `delegatecall`، وكيف تعمل، وكيف يمكن استخدامها لتفويض العمليات إلى المكتبات الموجودة على الشبكة، وما هي تأثيراتها على نطاق التنفيذ.
* دوال الـ Fallback
* معرّفات الدوال (Method ids)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
إن استخدام `delegatecall` ينطوي على مخاطرة شديدة وقد استُخدم كمسار للهجوم في العديد من عمليات الاختراق التاريخية. من خلاله، يقول عقدك عملياً: "تفضل أيها العقد الآخر أو المكتبة الأخرى، افعل ما تشاء في حالتي". يمتلك المفوضون وصولاً كاملاً إلى حالة عقدك. إن وظيفة `delegatecall` هي ميزة قوية، لكنها خطيرة، ويجب استخدامها بحذر شديد.

يرجى الرجوع إلى مقال [شرح عملية اختراق محفظة باريتي](https://blog.openzeppelin.com/on-the-parity-wallet-multisig-hack-405a8c12e8f7) للحصول على شرح دقيق لكيفية استخدام هذه الفكرة لسرقة 30 مليون دولار أمريكي.
4 changes: 4 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/denial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
هذه محفظة بسيطة تقوم بتوزيع الأموال مع مرور الوقت.
يمكنك سحب الأموال ببطء عن طريق أن تصبح شريكاً في السحب.

إذا تمكنت من منع المالك من سحب الأموال عندما يقوم باستدعاء دالة `withdraw()` (بينما لا يزال العقد يحتوي على أموال، وتكون المعاملة بمليون gas أو أقل)، فستفوز بهذا المستوى.
6 changes: 6 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/denial_complete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
يوضح هذا المستوى أن الاستدعاءات الخارجية للعقود غير المعروفة لا تزال قادرة على إنشاء ثغرات حجب الخدمة إذا لم يتم تحديد كمية ثابتة من الـ gas.

إذا كنت تستخدم استدعاءً منخفض المستوى `call` لمواصلة التنفيذ في حالة إرجاع استدعاء خارجي، تأكد من تحديد كمية gas ثابتة. على سبيل المثال `<Address>.call{gas: <gasAmount>}(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 المتبقية في الاستدعاء الأصلي) للتخفيف من هذا الهجوم تحديداً.
19 changes: 19 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/dex.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
الهدف من هذا المستوى هو اختراق عقد [البورصة اللامركزية (DEX)](https://en.wikipedia.org/wiki/Decentralized_exchange) البسيط الموضح أدناه وسرقة الأموال عن طريق التلاعب بالسعر.

ستبدأ بـ 10 توكنات من `token1` و 10 من `token2`. يبدأ عقد الـ DEX بـ 100 من كل توكن.

ستنجح في هذا المستوى إذا تمكنت من استنزاف كل الرصيد لواحد على الأقل من التوكنين من العقد، وجعل العقد يبلغ عن سعر "سيئ" للأصول.

&nbsp;
### ملاحظة سريعة
عادةً، عندما تقوم بإجراء مقايضة باستخدام توكن ERC20، يجب عليك منح "الموافقة" `approve` للعقد لإنفاق التوكنات الخاصة بك نيابة عنك. وللتوافق مع أسلوب اللعبة، قمنا بإضافة وظيفة `approve` إلى العقد نفسه. لذا، لا تتردد في استخدام `contract.approve(contract.address, <uint amount>)` بدلاً من استدعاء التوكنات مباشرة، وسيقوم العقد تلقائياً بالموافقة على إنفاق التوكنين بالمبلغ المطلوب. وبخلاف ذلك، يمكنك تجاهل عقد `SwappableToken`.

&nbsp;
أشياء قد تساعدك:

* كيف يتم حساب سعر التوكن؟
* كيف تعمل طريقة `swap`؟
* كيف تقوم بـ"موافقة" `approve` معاملة ERC20؟
* هناك أكثر من طريقة للتفاعل مع عقد!
* قد يساعدك Remix
* ماذا يفعل "At Address"؟
10 changes: 10 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/dex2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
سيطلب منك هذا المستوى كسر `DexTwo`، وهو عقد `Dex` معدل بشكل طفيف من المستوى السابق، بطريقة مختلفة.

تحتاج إلى استنزاف جميع أرصدة token1 و token2 من عقد `DexTwo` للنجاح في هذا المستوى.

ستبدأ لا تزال بـ 10 توكنات من `token1` و 10 من `token2`. لا يزال عقد DEX يبدأ بـ 100 من كل توكن.

&nbsp;
أشياء قد تساعدك:

* كيف تم تعديل طريقة `swap`؟
9 changes: 9 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/dex2_complete.md
Original file line number Diff line number Diff line change
@@ -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 وعقود التوكنات التي يتم تداولها.
56 changes: 56 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/dex_complete.md
Original file line number Diff line number Diff line change
@@ -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.

12 changes: 12 additions & 0 deletions client/src/gamedata/ar/descriptions/levels/doubleentrypoint.md
Original file line number Diff line number Diff line change
@@ -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`. سيحتاج تنفيذ البوت إلى رفع تنبيهات صحيحة لمنع الهجمات المحتملة أو استغلال الأخطاء.

&nbsp;
أشياء قد تساعدك:

- كيف تعمل نقطة الدخول المزدوجة لعقد التوكن؟
Loading