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.

Generando varios números aleatorios en una transacción (Solidity)

¿Existe una forma de generar varios números aleatorios en una sola transacción? Supongamos que tengo este código:

function example(uint _prop) public{
    while(random(100) < _prob){
      // Do something  
    }
}

La condición del bucle while depende del número aleatorio elegido en cada iteración. ¿Es posible hacer esto con VRF (Chainlink)? ¿O solo se puede generar un número aleatorio por cada transacción?

Por ahora estoy usando esta solución:

function random(uint _interval) internal returns (uint) {
    nonce++;
    return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, nonce))) % _interval;
}

Pero sé que esto no es un número aleatorio… Esto sirve para mi propósito, pero no es formal. Quiero mejorarlo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible generar varios números aleatorios en una sola transacción utilizando VRF (Chainlink). VRF genera un número aleatorio verificable que depende de una semilla aleatoria, la cual puede ser solicitada varias veces en una sola transacción.

    Aquí hay un ejemplo de cómo puede modificar el código para usar VRF:

    import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
    
    contract Example is VRFConsumerBase {
        bytes32 internal keyHash;
        uint256 internal fee;
        uint256 private nonce;
        uint256[] public randomNumbers;
    
        constructor() VRFConsumerBase(<vrf coordinator="" address="">, <link token="" address="">) {
            keyHash = <vrf randomness="" keyhash="">;
            fee = <vrf fee="">; // en LINK (10^18)
        }
    
        function example(uint _prob, uint _numRandoms) public {
            for(uint i = 0; i < _numRandoms; i++){
                requestRandomness(keyHash, fee, nonce);
                nonce++;
            }
    
            uint256[] memory randoms = randomNumbers;
            uint256 index = 0;
            while(randoms.length > 0 && randoms[index] < _prob){
                // Hacer algo
                index++;
                randoms = randoms[index:];
                index = 0;
            }
        }
    
        function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
            randomNumbers.push(randomness);
        }
    }
    

    En este código, la función requestRandomness se llama _numRandoms veces para generar tantos números aleatorios. La función fulfillRandomness es donde se almacena el número aleatorio generado. La función example recorre los números aleatorios almacenados y ejecuta el bucle while hasta que se cumple la condición.

    Tenga en cuenta que el uso de VRF conlleva tarifas adicionales y requiere un oráculo confiable para generar números aleatorios. Se recomienda utilizar VRF para aplicaciones de alto riesgo o aplicaciones en las que se requiere una verdadera aleatoriedad.

Comments are closed.