Solidity
沒有明顯原因的簡單合約拋出
問題是我有一個非常簡單的契約程式碼,我把它寫成一種“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。該語言發展迅速,新版本通常更好。