Chainlink VRF:无法获得随机数组

Chainlink VRF : can't get a Random array

我正在尝试编辑此演示:https://www.youtube.com/watch?v=JqZWariqh5s 得到一个随机数的数组。

pragma solidity 0.6.6;

import "https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/VRFConsumerBase.sol";

contract RandomNumberConsumer is VRFConsumerBase {
    
    bytes32 internal keyHash;
    uint256 internal fee;
    uint256 public randomResult;
    
    constructor() VRFConsumerBase(
            0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator
            0xa36085F69e2889c224210F603D836748e7dC0088  // LINK Token
        ) public
    {
        keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4;
        fee = 0.1 * 10 ** 18; // 0.1 LINK
    }
    

    function getRandomNumber(uint256 userProvidedSeed) public returns (bytes32 requestId) {
        return requestRandomness(keyHash, fee, userProvidedSeed);
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        randomResult = randomness.mod(50).add(1);
    }
    
    function getDraw(uint256 userProvidedSeed) public returns(uint256[] memory) {
         uint256[] memory draw = new uint256[](5);
         
         for(uint i = 0; i < 5; i++) {
             draw[i] = getRandomNumber(userProvidedSeed);
         }
         return draw;
    }
}

我收到此错误: contracts/RandomNumbers.sol:33:24: 类型错误:类型 bytes32 不能隐式转换为预期类型 uint256。绘制[i] = getRandomNumber(userProvidedSeed); ^--------------------------------^

我做错了什么?

您不能将 bytes32 转换为 uint256。

您的 draw 数组是 uint256 的数组。 getRandomNumber returns一个bytes32.

这一行:

draw[i] = getRandomNumber(userProvidedSeed);

您正在将 draw[i] 设置为 bytes32draw[i] 需要是一个 uint256getRandomNumber(userProvidedSeed) returns 一个 bytes32

参见:

function getRandomNumber(uint256 userProvidedSeed) public returns (bytes32 requestId)

您可能想要做的是在 fulfillrandomness 函数中进行绘制,因为看起来您想要做的是:

draw[i] = randomResult;

getRandomNumber() returns bytes32,但您正试图将此值分配给 uint256

您需要先将 bytes32 转换为 uint256

draw[i] = uint256(getRandomNumber(userProvidedSeed));

注意:requestRandomness()returns请求ID,不是实际的随机数。因此,如果您想从 oracle 中获取实际的 5 个随机数,您 不能同步进行 。您还需要更新 fulfillRandomness()randomResult 以存储多个值。