Ich habe den folgenden Code aus diesem Tutorial:
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 bet
es 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.
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 require
die 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, require
das ist hier angemessener als assert
.)
assert(checkPlayerExists(msg.sender) == false);
require(checkPlayerExists(msg.sender) == false);
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).
Benutzer19510