Ethernaut题库闯关连载第11篇题解。
今天这篇是Ethernaut 题库闯关连载的第11篇,难度等级:中等。
Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。
本挑战的目标是让电梯到达了顶层,即让 Elevator
的 top 置为 true
,
合约源代码如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
interface Building {
function isLastFloor(uint256) external returns (bool);
}
contract Elevator {
bool public top;
uint256 public floor;
function goTo(uint256 _floor) public {
Building building = Building(msg.sender);
if (!building.isLastFloor(_floor)) {
floor = _floor;
top = building.isLastFloor(floor);
}
}
}
top
变量在building.isLastFloor(_floor)
为false
时才会被赋值,因此在正常情况下,top 好像永远不会为 true
.
在查看解题思路之前,可以自己先想一想, 本次挑战主要是让我们不要相信外部合约。
挑战赛的关卡的Elevator
代码非常简单,它有两个状态变量。
bool public top
一个布尔变量,它将说明电梯是否已经到达了Building(大楼)的顶层。默认情况下,它被初始化为 false
。uint256 public floor
一个整数变量,将说明电梯到达了哪一层。默认情况下,它被初始化为0
。然后我们有一个goTo
函数,它接收一个uint256 _floor
。这个函数预计会被实现Building
接口的智能合约所调用。
在这个函数中,它检查Building.isLastFloor
的结果,该结果应该表示一个楼层是否是大楼的顶层。
如果该楼层不是大楼的顶层,该函数就会更新`flo...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!