Chainlink VRF FulfillRandomness verbraucht nicht genug Gas, um die Funktion auszuführen – wie kann man es dazu bringen, mehr zu verbrauchen?

Chainlink VRF ermöglicht es Benutzern, eine Zufallszahl zu erhalten, indem sie requestRandomness aufrufen und dann darauf warten, dass der FulfillRandomness-Rückruf vom Chainlink-Vertrag aufgerufen wird.

Ich habe eine Funktion testWorstMint, die einige NFTs prägt, wenn ein Betrag angegeben ist. Ich möchte, dass meine NFT-Verteilung zufällig ist, also simuliere ich, was passieren würde, wenn die Schleife über Tausende von bereits zugewiesenen NFTs iterieren müsste.

Ich verwende 5000 für MAX_NFT_SUPPLY und ich habe 1 Token geprägt, was in diesem Fall der Token mit der ID 4999 wäre. Dies kostet ungefähr 600.000 Gas.

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);
        }
    }
}

Das Problem, das ich habe, ist, dass FulfillRandomness das Gas nicht richtig schätzt (zumindest denke ich, dass das passiert).

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]);
}

Das Aufrufen von request() macht genau dasselbe wie das, was ich oben beschrieben habe, aber es tut es über einen Rückruf. Es kostet ungefähr 60.000 Benzin für den Anfrageanruf, und es ist sinnlos, es zu erhöhen, da es nur zurückgegeben wird (und es ist sowieso nicht so, als würde es zur Erfüllung von Randomness führen).

FulfillRandomness macht genau dasselbe wie die obige Funktion, aber es schlägt fehl, vermutlich wegen Gas. Aus dem Vertrag geht hervor, dass das Gaslimit für alle VRF-Erfüllungen auf 500.000 begrenzt ist, weit unter dem, was ich brauche, um im schlimmsten Fall einen zufälligen Token zu prägen.

Antworten (1)

Laut der Chainlink VRF-Dokumentation :

Wenn Ihre FulfillRandomness-Funktion mehr als 200.000 Gas verbraucht, schlägt die Transaktion fehl.

Das maximale Gas für eine Callback-Funktion kann nur 200k betragen, daher wird die Callback-Funktion dadurch nicht ausgelöst.