Ethernaut in Arabic — level 1 “ fallback”

Eman Herawy
3 min readJan 9, 2023

--

سلسلة تشرح حلول ايثرناوت

بسم الله الرحمن الرحيم ،

نبدا فى المستوى التانى فى لعبة ايثرناوت( لو دى اول مره تقرا اللى بتكتبه ف السلسلة ، تقدر تشوف الجزء اﻻول هنا )

هنا ابتدي اللعب يحلو زى ما بنقول ،

لو بصينا على وصف اللعبة

Look carefully at the contract’s code below.

You will beat this level if

- you claim ownership of the contract

- you reduce its balance to 0

Things that might help

- How to send ether when interacting with an ABI

- How to send ether outside of the ABI

- Converting to and from wei/ether units (see help() command)

- Fallback methods

تقريبا كل مستوى هيتشارك فى نقطتين ،

اﻻول فى الوصف انه بيقولك علشان تنجح محتاج تحقق ايه

والتانى انه بيديلك بعض رؤس اقلام للحاجات اللى تساعدك للحل ، انه بيشاور لك على الحاجات اللى الحل فيها

العقد اللى هنخترقه هنا

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Fallback {

mapping(address => uint) public contributions;
address public owner;

constructor() {
owner = msg.sender;
contributions[msg.sender] = 1000 * (1 ether);
}

modifier onlyOwner {
require(
msg.sender == owner,
"caller is not the owner"
);
_;
}

function contribute() public payable {
require(msg.value < 0.001 ether);
contributions[msg.sender] += msg.value;
if(contributions[msg.sender] > contributions[owner]) {
owner = msg.sender;
}
}

function getContribution() public view returns (uint) {
return contributions[msg.sender];
}

function withdraw() public onlyOwner {
payable(owner).transfer(address(this).balance);
}

receive() external payable {
require(msg.value > 0 && contributions[msg.sender] > 0);
owner = msg.sender;
}
}

علشان ننجح ف المستوى دى عاوزين ، نسرق الفلوس اللى موجوده فيه ، ونسرق ملكيته

معلش انا بحب اسمى الحاجات باسمائها .. خليك فاكر

لو بصينا ع الكود ، هتلاقى انك علشان تاخد الفلو سﻻزم تكون المالك للعقد

وفى الكود ، هتلاقى ان الفنكشن اللى بيحصل فيها نقل الملكية هى ال

receive() external payable {
require(msg.value > 0 && contributions[msg.sender] > 0);
owner = msg.sender;
}

ودى دالة خاصه ، وليها مواصفت فى كتباتها ، وكل كونتراكت مينفعش يكون فيه اكتر من واحده ، تقدر تقرا عنها هنا

& contribute

function contribute() public payable {
require(msg.value < 0.001 ether);
contributions[msg.sender] += msg.value;
if(contributions[msg.sender] > contributions[owner]) {
owner = msg.sender;
}
}

ودى فيها شرط انك تكون دفعت اكتر من المالك القديم .

طب هو ينفع بردو ندفع اكتر من المالك القديم وقبل ما نيجى نسرق الفلوس ييجى هو ويسرقنا ؟

لو بصينا على
receive function

هتلاقي انها بس محتاجه شرط بسيط

msg.value > 0 && contributions[msg.sender]

وده معناه انى لو بعت مره واحده بس ل contribute

وبعدها بعت معامله لل

receive function

ب 1 واي ، بقيت انا المالك ، ويبقى اتحل اللغز

فكده الخطوات هتكون

  1. اضيف نفسى كمشارك عن طريق contribute
  2. ابعت لل receive function
  3. اسحب الفلوس withdraw

تعالو نجرب ، عندى عدة اشكال للحل “ هيكونوا معانا لحل كتير من التمارين”

  1. اكلم الفنكشن من الكونسول
  2. اجهز سكريبت
  3. افتح ريمكس واكلم الفنكشن على طول
  4. اعمل كونتراكت ينفذ كل الخطوات دى

اقل حاجه فيها خسارة عليا لو بحاول اسرق فعلا هو اختيار 4 ، ﻻنه فيه احتمال صغير انى لما ابعت اول خطوة ، ييجى المالك يسحب الفلوس ، فاحنا هنا هنجرب نعمل بالطريقه اﻻوالى واﻻخيرة علشان اللى حابب يجرب يشتغلها من بره

الطريقة اﻻولى

الطريقة التانيه

وهنسلم المستوى ونشوف نجحنا وﻻ ﻻ

اشوفكم فى المستوى الجاى :)

--

--

Eman Herawy

Blockchain developer | @KERNEL fellow | @Chainlink developer expert | Devcon V Scholar Alumni @Ethereum