Gas
Ropsten 上的 MetaMask 氣體限制問題
當我嘗試使用 metamask(注入的 web3/Ropsten)在 remix 上創建我的契約時,我在 remix 中將氣體限制設置為 4700000,然後按 Create。當 MetaMask 打開時,它要求我將我的汽油費降低到一定數額以下。一旦我降低它(如果我不這樣做,我就無法創建它),合約就會被創建,但是我在合約中的變數沒有被初始化。例如 var a = 10; 正在返回 0。
我該如何克服這個問題?
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; } }
在我啟用“啟用優化”後,MetaMask 的氣體限制減少了,我現在可以部署合約了。但仍然不能 %100 確定 MetaMask 和優化模式發生了什麼。