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]
设置为 bytes32
。 draw[i]
需要是一个 uint256
和 getRandomNumber(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
以存储多个值。
我正在尝试编辑此演示: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]
设置为 bytes32
。 draw[i]
需要是一个 uint256
和 getRandomNumber(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
以存储多个值。