Chainlink VRF: невозможно получить случайный массив

Я пытаюсь отредактировать эту демонстрацию: https://www.youtube.com/watch?v=JqZWariqh5s, чтобы получить массив с номером ramdom.

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

Я получаю эту ошибку: контракты / RandomNumbers.sol: 33: 24: TypeError: Тип bytes32 не может быть неявно преобразован в ожидаемый тип uint256. draw [i] = getRandomNumber(userProvidedSeed); ^ ------------------------------- ^

Что я делаю неправильно ?

2 ответа

Решение

Вы не можете преобразовать bytes32 в uint256.

Ваш draw array - это массив s. getRandomNumber возвращает.

В этой строке:

      draw[i] = getRandomNumber(userProvidedSeed);

Вы устанавливаете на. draw[i] должен быть uint256 а также getRandomNumber(userProvidedSeed) возвращает bytes32

Видеть:

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

Вместо этого вы можете захотеть сделать так, чтобы ваш рисунок происходил в fulfillrandomness функция, поскольку похоже, что вы хотите сделать:

      draw[i] = randomResult;

getRandomNumber() возвращается, но вы пытаетесь присвоить это значение.

Вам нужно бросить bytes32 к uint256 первый:

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

Примечание: requestRandomness()возвращает идентификатор запроса, а не фактическое случайное число. Поэтому, если вы хотите получить от оракула 5 случайных чисел, вы не можете сделать это синхронно . Вам также необходимо обновить fulfillRandomness() а также randomResult хранить более одного значения.

Другие вопросы по тегам