Smart Contract-Fehler: Benötigtes Gas übersteigt 300000000

Ich habe den folgenden Code aus diesem Tutorial:

https://medium.com/@merunasgrincalaitis/the-ultimate-end-to-end-tutorial-to-create-and-deploy-a-fully-decentralized-dapp-in-ethereum-18f0cf6d7e0e

pragma solidity ^0.4.11;

contract Casino {


    uint minimumBet;
    uint totalBet;
    uint numberOfBets;
    uint maximumAmountsOfBets = 100;
    address[] players;

    struct Player {

        uint amountBet;
        uint numberSelected;
    }


    mapping(address => Player) playerInfo;


    address owner; // Long string from metamask


    function Casino(uint _minimumBet) public{  // Constructor : has the same name as the contract , used to set up
        //contract owner

        owner = msg.sender;
        if(_minimumBet !=0) minimumBet = _minimumBet;

        }

        //To be for a number btw 1 & 10 both inclusive


    function bet(uint number) payable public {

        require(checkPlayerExists(msg.sender) );
        require(number >= 1 && number <= 10);
        require(msg.value >= minimumBet);


        playerInfo[msg.sender].amountBet = msg.value;
        playerInfo[msg.sender].numberSelected = number;
        numberOfBets += 1;
        players.push(msg.sender);
        totalBet += msg.value;

        if(numberOfBets >= maximumAmountsOfBets) generateNumberWinner();


        }



    function checkPlayerExists(address player) public view returns(bool) {

        for( uint i = 0 ; i < players.length; i++){
            if(players[i] == player) return true;
        }
        return false;
    }


    /* 
    Generate Winner : Generates a number between 1 & 10 
    */

    function generateNumberWinner() public{

        uint numberGenerated = block.number % 10 + 1; // This isnt secure

        distributePrizes(numberGenerated);
    }


    /*

    Distribute Prizes : Sends the correspondng ether to each winner
    depending on the total bets 
    */

    function distributePrizes(uint numberWinner) public {

        address[100] memory winners ; // We have to create a temporary in memory array with fixed size

        uint count = 0; // This is the count for the array of winners

        for(uint i = 0; i < players.length ; i++) {
            address playerAddress = players[i];
            if(playerInfo[playerAddress].numberSelected == numberWinner){
                winners[count] = playerAddress;
                count ++;
            }
            delete playerInfo[playerAddress]; // Delete all the players array


        }

        players.length = 0; //Delete all the players array

        uint winnerEtherAmount = totalBet / winners.length; // How much each player gets 

        for(uint j = 0; j < count; j++) {

            if(winners[j] !=address(0)) // Check the address in the fixed array is not empty
            winners[j].transfer(winnerEtherAmount);
        }


    }

    /*
    Annonymous Fallback function: In case someone sends ether to the 
    contract so it doesnt get lost
    */
    function() payable private{}

/*
Kill function: Used to destroy contract whenever we want. Only owner
has the ability to kill the contract
*/

    function kill() private{ 

        if(msg.sender == owner)
            selfdestruct(owner);
    }
}

Es lässt sich gut kompilieren, aber wenn ich betes versuche, wirft REMIX den folgenden Fehler:

Transaktion zu Casino.bet fehlerhaft: Gas erforderlich hat Grenzen überschritten: 3000000. Eine wichtige Gasschätzung kann auch ein Zeichen für ein Problem im Vertragscode sein. Bitte überprüfen Sie die Schleifen und vergewissern Sie sich, dass Sie keinen Wert an eine nicht zahlbare Funktion gesendet haben (das ist auch ein Grund für eine starke Gasschätzung).

Ich würde mich freuen, wenn mich jemand in die richtige Richtung weisen könnte.

"aus einem Tutorial" <-- Wenn Sie auf das Tutorial verlinken könnten, könnte das helfen.

Antworten (1)

Ich glaube, dass diese Zeile:

require(checkPlayerExists(msg.sender));

sollte eigentlich das gegenteil sagen:

require(!checkPlayerExists(msg.sender));

Der Spieler kann unmöglich existieren, wenn er das erste Mal anruft bet, also bricht er requiredie Transaktion ab.

Angenommen, Sie folgen https://medium.com/@merunasgrincalaitis/the-ultimate-end-to-end-tutorial-to-create-and-deploy-a-fully-descentralized-dapp-in-ethereum-18f0cf6d7e0e , Beachten Sie, dass sie diese Zeile haben, die ungefähr dem entspricht, was ich vorgeschlagen habe. (Aber ich glaube, requiredas ist hier angemessener als assert.)

assert(checkPlayerExists(msg.sender) == false);
Danke dafür. Warum können wir nur verwendenrequire(checkPlayerExists(msg.sender) == false);
Das würde genau dasselbe bewirken.
Danke!! Schließlich sollte ich laut Tutorial in der Lage sein, mit dem Vertrag (dh konstanten miniumbet) zu interagieren, da sie nichts kosten. Wenn der Vertrag jedoch bereitgestellt wird, werden die Konstanten nicht im rechten Bereich angezeigt (d. h. wie eine private Funktion behandelt).
Stellen Sie sicher, dass Sie sie als "öffentlich" markieren.
Ist das ein Upgrade auf Solidity? Ich hatte angenommen, dass, wenn die Sichtbarkeit nicht markiert wäre, der Bereich standardmäßig als öffentlich definiert würde\?
Nicht sicher, ob es sich geändert hat, aber Zustandsvariablen sind gemäß der Dokumentation standardmäßig intern: solidity.readthedocs.io/en/develop/contracts.html