Solidity: UnmplementedFeatureError: solo se puede almacenar el tipo de referencia en memoria

Recibo el error de seguimiento con el contrato a continuación cuando compilo en remix y javascript. También como lo arreglo.

UnimplementedFeatureError: solo se puede almacenar el tipo de referencia en memoria.

pragma solidity ^0.4.0;

contract TwoupFactory {
    address[] public deployedTwoUpGames;

    function createTwoUpGame(uint minimum) public {
        address newTwoup = new Twoup(minimum, msg.sender);
        deployedTwoUpGames.push(newTwoup);
    }

    function getDeployedCampaigns() public view returns (address[]) {
        return deployedTwoUpGames;
    }
}

contract Twoup {
    struct Player {
        uint BetAmount;
        address Address;
        bool PickedHeads;
    }

    struct TossResult {
        bool HeadsCoinOne;
        bool HeadsCoinTwo;
    }

    TossResult[] public tosses; 
    Player[] public players;
    address public spinner;    
    uint public kitty; 
    uint public totalBet;
    bool isGameCompleted;

    function Twoup(uint housekitty, address newSpinner) public payable
    {
        require(msg.value > 10 ether);
        spinner = newSpinner;
        kitty = housekitty;
        isGameCompleted = false; 
        totalBet = 0;
    }    

    function tossCoin() private view returns (bool) {
        return ((uint(keccak256(block.difficulty, now, players)) % 2) == 0);
    }

    function pickWinner() public 
    {
        require(msg.sender == spinner);
        require(isGameCompleted == false);

        tosses.push(TossResult({ HeadsCoinOne: tossCoin(), HeadsCoinTwo: tossCoin() }));
    }   
}

Respuestas (2)

keccak256no será compatible con el tipo de datos de estructura. La estructura es un tipo de datos complejo. Reemplace su tossCoin con la longitud de una matriz. O necesita calcular el hash para la estructura y pasar ese hash al método keccak256().

Aquí hay dos ejemplos.

  1. Reemplace jugadores con jugadores.longitud. Supongo que no quieres obtener la longitud y reemplazarla. Si ese no es el caso, reemplace con el segundo método.
function tossCoin() private view returns (bool) {
    return ((uint(keccak256(block.difficulty, now, players.length)) % 2) == 0);
}
  1. Calcular hash para estructura, podría ser útil para usted.
pragma solidity ^0.4.0;

contract TwoupFactory {
    address[] public deployedTwoUpGames;

    function createTwoUpGame(uint minimum) payable public {
        Twoup  newTwoup = new Twoup(minimum, msg.sender);
        deployedTwoUpGames.push(newTwoup);
    }

    function getDeployedCampaigns() public view returns (address[]) {
        return deployedTwoUpGames;
    }
}

contract Twoup {
    struct Player {
        uint BetAmount;
        address Address;
        bool PickedHeads;
    }

    struct TossResult {
        bool HeadsCoinOne;
        bool HeadsCoinTwo;
    }

    TossResult[] public tosses; 
    Player[] public players;
    address public spinner;    
    uint public kitty; 
    uint public totalBet;
    bool isGameCompleted;

    function Twoup(uint housekitty, address newSpinner) public payable
    {
        require(msg.value > 10 ether);
        spinner = newSpinner;
        kitty = housekitty;
        isGameCompleted = false; 
        totalBet = 0;
    }    

    function tossCoin() private view returns (bool) {
        return ((uint(keccak256(block.difficulty, now, getStructHash())) % 2) == 0);
    }

    function getStructHash() public view returns(bytes32){
        bytes32 hash;
        for(uint index=0;index<players.length;index++){
            hash = keccak256(players[index].BetAmount, players[index].Address, players[index].PickedHeads, hash);
        }
        return hash;
    }

    function pickWinner() public 
    {
        require(msg.sender == spinner);
        require(isGameCompleted == false);
        TossResult memory result= TossResult({ HeadsCoinOne: tossCoin(), HeadsCoinTwo: tossCoin() });
        tosses.push(result);
    }   
}

El paso de matriz de estructuras no es compatible con Solidity. El error está en línea:

return ((uint(keccak256(block.difficulty, now, players)) % 2) == 0);

playerses una matriz de estructura. Puede usar una matriz de bytes32, uint, etc. para pasar esto a su función. Como el siguiente código funcionará bien.

return ((uint(keccak256(block.difficulty, now, players.length)) % 2) == 0);
Dios al escuchar esto ayudó. Marque la respuesta aceptada si esto resolvió su problema.