Chainlink VRF:无法获得随机数组

问题描述

我正在尝试编辑此演示: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: TypeError: 类型 bytes32 不能隐式转换为预期类型 uint256。 draw[i] = getRandomNumber(userProvidedSeed); ^-------------------------------^

我做错了什么?

解决方法

您不能将 bytes32 转换为 uint256。

您的 draw 数组是一个 uint256 数组。 getRandomNumber 返回 bytes32

在这一行:

draw[i] = getRandomNumber(userProvidedSeed);

您将 draw[i] 设置为 bytes32draw[i] 需要是一个 uint256 并且 getRandomNumber(userProvidedSeed) 返回一个 bytes32

见:

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

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

draw[i] = randomResult;
,

getRandomNumber() 返回 bytes32,但您正在尝试将此值分配给 uint256

您需要先将 bytes32 转换为 uint256

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

注意:requestRandomness() 返回请求 ID,而不是实际的随机数。因此,如果您想从预言机中获取实际的 5 个随机数,您无法同步。您还需要更新 fulfillRandomness()randomResult 以存储多个值。