Solidez - Dirección aleatoria[] Índice

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


EDITAR con ejemplo:

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 mejor hacerlo en el lado frontal (js)
Espero eliminar la centralización y no quiero elegir el camino fácil...
¿Cuál es exactamente tu pregunta? ¿Quieres una lista única de jugadores? ¿O quieres una lista aleatoria de jugadores?

Respuestas (1)

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 0xDDDquiere 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.