Solidity

沒有明顯原因的簡單合約拋出

  • April 8, 2019

問題是我有一個非常簡單的契約程式碼,我把它寫成一種“Hello World!”,但它似乎不能正常工作,而且我看不出它不能工作的任何原因。

我正在談論的程式碼是這個:

pragma solidity >0.4.18;

contract TimedSafe {

   address creator;
   address bank = 0xB599C8008E505ed9bd34C4761EBAae53a89207Af;

   uint256 safe;

   uint256 startTime;
   uint256 endTime;

   uint8 state; 

   /* Constructor */
   constructor() public {
       creator = msg.sender;
       state = 0;
   }

   function storeSafe(uint8 m) public payable {
       assert(msg.sender == creator);
       assert(state == 0);
       safe = msg.value;
       startTime = now;
       endTime = startTime + (m * 1 minutes);
       state = 1;
   }

   function retrieveSafe() public {
       assert(msg.sender == creator);
       assert(state == 1);
       if(now < endTime) {
           state = 2;
           creator.transfer(safe);
       } else {
           state = 3;
           bank.transfer(safe);
       }
   }

   function timeLeft() public view returns (uint256 t) {
       assert(state == 1);
       return endTime - now;
   }

   function getState() public view returns (uint8 st) {
       return state;
   }
}

不能正常工作的功能是“retrieveSafe”。我在 Ropsten 測試網上部署了這個合約,以防萬一它很重要。

有問題的交易有 的輸入數據0x,因此它不是safeRetrieve對合約中實現的任何其他函式的呼叫。

當交易進入與現有函式不匹配的合約時,將呼叫回退函式。在缺少回退功能的情況下,就像這裡的情況一樣,事務被還原。

根據對原始問題的評論,這似乎是 Mist 中的某種問題。通過 Etherscan 和 MetaMask 呼叫該函式有效。

無法確定哪個部分有問題。由於您的函式呼叫引發了原因,因此很可能是該函式的前兩行中的任何一個,它們正在使用require. 所以這些require語句中的任何一個都會拋出。

找出哪個導致問題的一種方法是逐一註釋掉這些require語句,看看它何時停止拋出錯誤。

您還應該使用更新版本的 Solidity - 最新版本是 0.5.7 ( https://github.com/ethereum/solidity/releases ),您可能使用的舊版本可能是 0.4.18。該語言發展迅速,新版本通常更好。

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