Hola Mundo !
¡Estoy tratando de encontrar una manera de barajar una serie de direcciones en Solidity!
Mirar el código fuente de Underscore / Lodash_.shuffle()
señala algunas cosas.
_.shuffle([1, 2, 3, 4]);
* // => [4, 1, 3, 2]
Algo como:
address[] public players;
// Players addresses -> 0x00001, 0x00001, 0x00002
// _.shuffle(players[]); -> 0x00002, 0x00001, 0x00001
// _.shuffle(players[]); -> 0x00001, 0x00002, 0x00001
address[] public players;
function enter() public payable {
require( msg.value >= .01 ether && msg.value % .01 ether == 0 );
uint ticketCount = msg.value / .01 ether;
for(uint i = 0; i < ticketCount; i++){
players.push(msg.sender);
}
}
function getPlayers() public view returns (address[]) {
return players;
}
// Take this scenario, each ticket is worth 0.01 ether.
// Two players decide to play. One buys 3 tickets and the other 2 tickets.
// We push the first player address 3 times and 2 times into our players array.
// Player 1 address is duplicated 3 times, players 2 address is duplicated twice.
// In our players array there are a total of 5 addresses stored.
Cuando llamamos a la función getPlayers() después de que los jugadores hayan depositado su éter, obtenemos:
0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,
0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,
0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,
0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB,
0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB,
Estoy bastante seguro de que esta es una mala manera de hacerlo y podría requerir gastar más gasolina. Al final del juego, la matriz de nuestros jugadores se restablecerá, pero estoy seguro de que mantener registros sobre cuánto ha depositado un jugador podría ser una mejor manera de abordar este asunto. Todavía espero encontrar una mejor manera que simplemente mover la mayor parte de la lógica aleatoria fuera de la cadena y perder confianza y seguridad...
¡Espero que alguien ya tenga una mejor manera!
Es importante estar cansado de hacer cosas en la cadena que no necesita, y mezclar una matriz es probablemente algo en lo que debe pensar, ya que podría ser costoso y es difícil obtener una verdadera aleatoriedad en la cadena.
Si desea una matriz aleatoria, pero no le importa ser realmente aleatorio (y suponiendo, según su código, que las direcciones de los jugadores se agregan mediante alguna acción del jugador), probablemente tenga más sentido que la inserción sea aleatoria en lugar de barajar una matriz completa.
Básicamente, si tienes una matriz
address[] public players;
// 0xAAA, 0xCCC, 0xBBB
Y el jugador 0xDDD
quiere jugar, entonces tendrías
uint newPos = somePsuedoRandomFunction();
//newPos returns a number between 0 and players.length
Si newPos == 4
, entonces solo
players.push(`0xDDD`);
Pero si, por ejemplo newPos == 1
, fueras
players.push(players[1]);
players[1] = 0xDDD;
De esa manera, terminarías con una matriz mezclada y los costos de gasolina se distribuirían por igual entre cada jugador.
Badr Bellaj
Liberalite
oxidado