Remix

創建契約氣體問題

  • February 22, 2018

當我使用 metamask(注入 web3)在 remix 上創建我的​​契約時,它要求我降低我的 gas 費。一旦我降低它(如果我不這樣做,我就無法創建它),合約就會被創建,但是我在合約中的變數沒有被初始化。例如 var a = 10; 返回 0。當我註釋掉一些 oraclize 函式並降低 gas 需求時,我的合約部署良好。我不知道是怎麼回事。

我添加了程式碼和螢幕截圖。就像我說的。一旦我開始在某個時候註釋掉“oraclize”功能,它就開始工作得很好……

pragma solidity ^0.4.20;
import "./oraclize.sol";

contract Casino is usingOraclize {
  address owner;
  uint public betAmount = 30 finney; //Equal to 0.01 Ether
  uint public totalBet; //Amount of Ether bet for current game
  uint public numberOfBets; //Total number of current bets
  //uint public maxAmountOfBets = 1 //Maximum amount of bets can be made for each game by each user
  uint public limitAmountOfBets = 3; //Maximum amount of bets for each game
  uint public numberWinner; //Number that won last game
  address[] public players; //Players
  mapping(uint => address[]) numberBetPlayers; //Who bet for which number
  mapping(address => uint) playerBetsNumber; //Number bet by each player

  modifier onEndGame() {
      if(numberOfBets >= limitAmountOfBets) _;
  }

  //constructor - set bet amount and max bets in each game
  function Casino(uint _betAmount, uint _limitAmountOfBets) {
      owner = msg.sender; //set creator of contract to owner

      if(_betAmount > 0) betAmount = _betAmount;
      if(_limitAmountOfBets > 0) limitAmountOfBets = _limitAmountOfBets;

      oraclize_setProof(proofType_Ledger); //arge
  }

  //check if player exists in current game
  function checkPlayerExists(address player) public returns(bool) {
      if(playerBetsNumber[player] > 0) return true;
      else return false;
  }

  //bet function
  function bet(uint numberToBet) payable {
      require(numberOfBets <= limitAmountOfBets); //check if limit has been reached
      require(!checkPlayerExists(msg.sender)); //check that player hasn't bet before
      require(numberToBet >=1 && numberToBet <= 10); //check that the bet is between 1 and 10
      require(msg.value == betAmount); //check that ether send by sender is equal to bet amount

      playerBetsNumber[msg.sender] = numberToBet;
      numberBetPlayers[numberToBet].push(msg.sender);

      numberOfBets += 1;
      totalBet += msg.value;

      if(numberOfBets >= limitAmountOfBets) generateNumberWinner();
  }

  //generate random numbers using oraclize_newRandomDSQuery function
  function generateNumberWinner() payable onEndGame {
      uint numberRandomBytes = 4;
      uint delay = 0;
      uint callbackGas = 200000;

      bytes32 queryId = oraclize_newRandomDSQuery(delay, numberRandomBytes, callbackGas);
  }

  function __calback(bytes32 _queryId, string _result, bytes _proof) oraclize_randomDS_proofVerify(_queryId, _result, _proof) onEndGame {
      assert(msg.sender == oraclize_cbAddress());

      numberWinner = (uint(sha3(_result))%10+1);
      distributePrizes();
  }

  function distributePrizes() onEndGame {
      uint winnerEtherAmount = totalBet / numberBetPlayers[numberWinner].length; //how much each winner will get

      for(uint i = 0; i < numberBetPlayers[numberWinner].length; i++) { //sent ether to addresses
          numberBetPlayers[numberWinner][i].transfer(winnerEtherAmount);
      }

      for(uint j = 1; j <= 10; j++) {
          numberBetPlayers[j].length = 0;
      }

      totalBet = 0;
      numberOfBets = 0;
  }
}

氣體限制問題?

有什麼幫助嗎??謝謝。

可能是您的合約需要的 gas 比預設 gas 多。嘗試增加混音中的氣體值。

關於 Gas 和 gasPrice 的簡介:

Gas 是每個步驟的固定單位,這在 EVM 級別中定義。

gasPrice 由我的礦工決定,為執行每一步願意花費多少乙太幣。

在混音中優化選項設置為 true 解決了這個問題。至少現在。

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