El cumplimiento de Chainlink VRFRandomness no usa suficiente gas para realizar la función: ¿cómo hacer que use más?

Chainlink VRF permite a los usuarios obtener un número aleatorio llamando a requestRandomness y luego esperando que el contrato de Chainlink llame a la devolución de llamada de cumplimientoRandomness.

Tengo una función testWorstMint que acuña algunos NFT, dada una cantidad. Quiero que mi distribución de NFT sea aleatoria, por lo que estoy simulando lo que sucedería si el ciclo tuviera que iterar sobre miles de NFT ya asignados.

Estoy usando 5000 para MAX_NFT_SUPPLY y acuñé 1 token, que en este caso sería el token con ID 4999. Esto cuesta aproximadamente 600k en gasolina.

function testWorstMint(uint256 amount) public
{
    
    testWorstMint(msg.sender, amount);
}

function testWorstMint(address owner, uint256 amount) public
{
    
    uint256 total = totalSupply();
    for (uint256 x = 0; x < (MAX_NFT_SUPPLY - total); x++)
    {
        if (x >= MAX_NFT_SUPPLY - total - amount)
        {
            _mint(owner, x);
        }
    }
}

El problema que tengo es que el cumplimiento de la aleatoriedad no estima el gas correctamente (al menos, eso es lo que creo que está sucediendo).

function request(uint256 amount) public {
    require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - contract will be funded soon");
    
    bytes32 requestId = requestRandomness(keyHash, fee, 0);
    owners[requestId] = msg.sender;
    amountToMint[requestId] = amount;
}

function fulfillRandomness(bytes32 requestId, uint256 randomness) internal  override {
    
    testWorstMint(owners[requestId], amountToMint[requestId]);
}

La solicitud de llamada () hace exactamente lo mismo que describí anteriormente, pero lo hace a través de una devolución de llamada. Cuesta aproximadamente 60k en gasolina para la llamada de solicitud, y aumentarlo es inútil ya que simplemente se devolverá (y de todos modos no es como si cumpliera con la aleatoriedad).

cumplirRandomness hace exactamente lo mismo que la función anterior, pero falla, presumiblemente debido al gas. Según el contrato, parece que el límite de gas para todos los cumplimientos de VRF tiene un tope de 500k, muy por debajo de lo que necesito para acuñar un token al azar en el peor de los casos.

Respuestas (1)

Según la documentación VRF de Chainlink :

Si su función de cumplimiento aleatorio usa más de 200k de gas, la transacción fallará.

El gas máximo para una función de devolución de llamada solo puede ser de 200k, por lo que la función de devolución de llamada no se activa debido a esto.