es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear una función de aleatoriedad simple en Solidity.

Tengo un bucle for, desde el rango 1 hasta 4951, como este en Solidity:

for (uint256 i = 1; i <= _mintAmount; i++) {
  _safeMint(_to, supply + i);
}

Necesito implementar aleatoriedad en este bucle para que el número se elija entre 1 y 4951, no se repita y el suministro se incremente por el total de números seleccionados.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la aleatoriedad en el bucle dado, podemos utilizar una fuente externa para generar un número aleatorio dentro del rango de 1 a 4951. Esto se puede hacer utilizando un oráculo o una fuente fuera de la cadena que sea confiable y segura.

    Una vez que tenemos el número aleatorio, podemos verificar si ya ha sido elegido anteriormente mediante el mantenimiento de una lista de números previamente elegidos en un mapeo o una matriz. Si el número ya ha sido elegido, podemos generar otro número aleatorio. Este proceso puede continuar hasta que se genere un número único.

    Luego, podemos incrementar el suministro con el total de números únicos generados y llamar a la función _safeMint para cada uno de estos números.

    Aquí hay un ejemplo de implementación:

    mapeo (uint256 => bool) public númerosElegidos;
    uint256 público suministro = 0;
    
    function mintRandomNumbers(address _para, uint256 _cantidadMint) public {
        require(_cantidadMint <= 4951, "No se pueden emitir más de 4951 tokens");
        require(suministro + _cantidadMint <= 4951, "No se pueden emitir más que el suministro total");
    
        uint256 númerosÚnicos = 0;
        uint256 númeroAleatorio;
    
        for (uint256 i = 0; i < _cantidadMint; i++) {
            bool encontradoNúmeroÚnico = false;
    
            while (!encontradoNúmeroÚnico) {
                númeroAleatorio = uint256(keccak256(abi.encodePacked(block.number, block.timestamp, i))) % 4951 + 1;
    
                if (!númerosElegidos[númeroAleatorio]) {
                    númerosElegidos[númeroAleatorio] = true;
                    encontradoNúmeroÚnico = true;
                    númerosÚnicos++;
                }
            }
        }
    
        suministro += númerosÚnicos;
    
        for (uint256 i = 1; i <= 4951; i++) {
            if (númerosElegidos[i]) {
                _safeMint(_para, i);
            }
        }
    }
    

    En esta implementación, mantenemos un mapeo númerosElegidos para almacenar los números elegidos anteriormente. También tenemos una variable suministro para realizar un seguimiento del número total de tokens acuñados.

    La función mintRandomNumbers toma la dirección para acuñar los tokens y la cantidad de tokens para acuñar. Primero verifica si el número de tokens a acuñar está dentro del rango permitido y si quedan suficientes tokens para acuñar.

    Luego ingresamos a un bucle que genera un número único para cada token a acuñar. Utilizamos la función hash keccak256 para generar un número pseudorandom basado en el número de bloque actual, la marca de tiempo y la iteración del bucle. Luego tomamos el módulo de este número con 4951 y sumamos 1 para obtener un número entre 1 y 4951.

    Luego verificamos si este número ya ha sido elegido antes. Si no lo ha hecho, establecemos el valor de asignación en true e incrementamos la variable númerosÚnicos. Si lo ha hecho, generamos otro número aleatorio hasta que obtenemos un número único.

    Una vez que hemos generado todos los números únicos, incrementamos la variable suministro y llamamos a la función _safeMint para cada uno de estos números.

    Esta implementación garantiza que los números generados sean verdaderamente aleatorios y únicos, y que el suministro se incremente en el número total de números únicos generados.

Comments are closed.