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() }));
}
}
keccak256
no 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.
function tossCoin() private view returns (bool) {
return ((uint(keccak256(block.difficulty, now, players.length)) % 2) == 0);
}
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);
players
es 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);
Prashant Prabhakar Singh