Ethernaut in Arabic — level 1 “ fallback”
سلسلة تشرح حلول ايثرناوت
بسم الله الرحمن الرحيم ،
نبدا فى المستوى التانى فى لعبة ايثرناوت( لو دى اول مره تقرا اللى بتكتبه ف السلسلة ، تقدر تشوف الجزء اﻻول هنا )
هنا ابتدي اللعب يحلو زى ما بنقول ،
لو بصينا على وصف اللعبة
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 واي ، بقيت انا المالك ، ويبقى اتحل اللغز
فكده الخطوات هتكون
- اضيف نفسى كمشارك عن طريق contribute
- ابعت لل receive function
- اسحب الفلوس withdraw
تعالو نجرب ، عندى عدة اشكال للحل “ هيكونوا معانا لحل كتير من التمارين”
- اكلم الفنكشن من الكونسول
- اجهز سكريبت
- افتح ريمكس واكلم الفنكشن على طول
- اعمل كونتراكت ينفذ كل الخطوات دى
اقل حاجه فيها خسارة عليا لو بحاول اسرق فعلا هو اختيار 4 ، ﻻنه فيه احتمال صغير انى لما ابعت اول خطوة ، ييجى المالك يسحب الفلوس ، فاحنا هنا هنجرب نعمل بالطريقه اﻻوالى واﻻخيرة علشان اللى حابب يجرب يشتغلها من بره
الطريقة اﻻولى
الطريقة التانيه
وهنسلم المستوى ونشوف نجحنا وﻻ ﻻ
اشوفكم فى المستوى الجاى :)