Ethernaut 题库闯关 #20 — Shop

Ethernaut题库闯关连载的第20篇

今天这篇是Ethernaut 题库闯关连载的第20篇,难度等级: 有点难。

欢迎大家订阅专栏:Ethernaut 题库闯关,坚持挑战下去,你的 Solidity代码能力肯定大有提高。

挑战#20:Shop(商店)

这个挑战要求,我们能以低于要求的价格从商店购买物品吗?

合约源码如下:

// 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,并...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Ethernaut CTF
Ethernaut CTF
信奉 CODE IS LAW.