Solidity

Ethernaut 挑戰商店

  • October 13, 2022

我不明白為什麼 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()is view,那麼裡面的所有表達式都不能修改狀態。編譯器認為它isSold可以修改狀態,因為它沒有被標記view,所以我們需要修復它。

基本上,view在界面中添加功能

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

引用自:https://ethereum.stackexchange.com/questions/137398