Ethernaut题库闯关连载的第20篇
今天这篇是Ethernaut 题库闯关连载的第20篇,难度等级: 有点难。
欢迎大家订阅专栏:Ethernaut 题库闯关,坚持挑战下去,你的 Solidity代码能力肯定大有提高。
这个挑战要求,我们能以低于要求的价格从商店购买物品吗?
合约源码如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
interface Buyer {
function price() external view returns (uint);
}
contract Shop {
uint public price = 100;
bool public isSold;
function buy() public {
Buyer _buyer = Buyer(msg.sender);
if (_buyer.price() >= price && !isSold) {
isSold = true;
price = _buyer.price();
}
}
}
完成这个挑战要求我们理解 view 函数的限制。
让我们回顾一下合约代码,我们可以看到,合约中的 price
代表了 Buyer
为购买物品必须支付的 wei
(以太币单位)的数量。
物品也只有在尚未售出时才能被购买。这个属性由状态变量 isSold
控制,初始化为 "false",然后在 "buy" 函数中改变为 "true"。
让我们详细了解一下buy
函数:
function buy() public {
Buyer _buyer = Buyer(msg.sender);
if (_buyer.price() >= price && !isSold) {
isSold = true;
price = _buyer.price();
}
}
这是合约的主要函数, 先将msg.sender
转换为Buyer
,它期望交易的发送者是一个合约,并实现Buyer
接口中定义的price
函数。
函数 function price() external view returns (uint256);
即使在挑战中没有明确说明,也应该了解,它应该返回买方愿意为购买商店的物品支付的价格。
合约检查买方的价格(买方愿意支付的价格)是否大于商店的价格,并检查该物品是否还没有被售出。如果这个要求通过,它将把isSold
更新为true
,并...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!