Vertragsgasproblem erstellen

Wenn ich meinen Remix-Vertrag mit Metamask (injiziertes Web3) erstelle, werde ich aufgefordert, meine Gasgebühr zu senken. Sobald ich es senke (wenn ich es nicht tue, kann ich es nicht erstellen), wird der Vertrag erstellt, ABER meine Variablen im Vertrag werden nicht initialisiert. Zum Beispiel a var a = 10; gibt 0 zurück. Wenn ich einige Oraclize-Funktionen auskommentiere und den Gasbedarf senke, wird mein Vertrag gut bereitgestellt. Ich habe keine Ahnung, was los ist.

Ich habe den Code und einen Screenshot hinzugefügt. Wie ich sagte. Sobald ich anfing, die 'oraclize'-Funktion irgendwann zu kommentieren, fängt es an, gut zu funktionieren ...

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;
   }
}

Probleme mit der Gasgrenze?

Irgendeine Hilfe?? Danke.

Hi. Könnten Sie Ihren Vertragscode angeben?
Ich habe den Code hinzugefügt

Antworten (2)

Möglicherweise erfordert Ihr Vertrag mehr Gas als das Standardgas. Versuchen Sie, den Gaswert im Remix zu erhöhen.

Ein kurzer Überblick über Gas und Gaspreis.:

Gas ist eine feste Einheit für jeden Schritt, dies wird in der EVM-Ebene definiert.

gasPrice wird von meinen Bergleuten entschieden, wie viele Ether bereit sind, für die Ausführung jedes Schrittes auszugeben.

Ich habe den Gaswert erhöht, aber das ändert nichts am Ergebnis.
Fügen Sie 4469391 als Gas hinzu
Ja, es hat funktioniert, ABER wie sind Sie auf diese Zahl gekommen und warum muss es GENAU diese Zahl sein und keine größere Zahl wie 4700000. Können Sie das bitte erklären, damit ich es klarer verstehe? Danke!
Freust du dich wirklich auf deine Lösung? Ich versuche das gleiche Gas mit dem gleichen Code, aber jetzt bekomme ich wieder den gleichen Fehler ... :(

Die Optimieren-Option, die im Remix auf „true“ gesetzt wurde, löste das Problem. Zumindest für den Moment.