1

我正在尝试编辑此演示: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: Type bytes32 is not implicitly convertible to expected type uint256. draw[i] = getRandomNumber(userProvidedSeed); ^-------------------^

我究竟做错了什么 ?

4

2 回答 2

1

您不能将 bytes32 转换为 uint256。

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

在这条线上:

draw[i] = getRandomNumber(userProvidedSeed);

您正在设置draw[i]bytes32. draw[i]必须是 auint256getRandomNumber(userProvidedSeed)返回 abytes32

看:

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

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

draw[i] = randomResult;
于 2021-04-19T15:07:33.103 回答
1

getRandomNumber()返回bytes32,但您试图将此值分配给uint256.

您需要先转换bytes32uint256

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

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

于 2021-04-19T15:07:49.160 回答