Ethernaut 题库闯关 #20 — Shop

  • 时间:
  • 浏览:96
  • 来源:区块链技术网

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%的内容订阅专栏后可查看

  • 发表于 2022-09-14 20:46
  • 阅读 ( 208 )
  • 学分 ( 0 )
  • 分类:安全
  • 专栏:Ethernaut 题库闯关

猜你喜欢

SharkTeam:十大智能合约安全威胁之权限漏洞

到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第四课【详解权限漏洞】。SharkTe

2022-11-06

SharkTeam:十大智能合约安全威胁之合约升级漏洞

第五课【详解合约升级漏洞】。SharkTeam:十大智能合约安全威胁之合约升级漏洞问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?答:完全不是那样。例

2022-11-06

SharkTeam:十大智能合约安全威胁之函数恶意初始化

第六课【详解函数恶意初始化】。SharkTeam:十大智能合约安全威胁之函数恶意初始化问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?答:完全不是那样

2022-11-06

智能合约安全审计入门篇 —— 拒绝服务

了解一个既存在于传统网络安全又存在于智能合约安全中的问题——拒绝服务。By:小白##背景概述在上次的文章中我们学习了智能合约中获取随机数常用的几种方式,以及他们的优缺点,还介绍

2022-11-06

SharkTeam:Move合约开发与合约安全

Move合约开发近期,围绕Aptos和Sui,新兴的高性能L1链以及这些新链背后的Move智能合约编程语言引起了很多关注,社区也非常活跃,很多开发者和项目已经开始积极转向Mov

2022-11-06