[英]Getting a random number with Chainlink VRF
我正在尝试使用 Chainlink VRF 为抽奖系统生成一个随机数。 此数字的最大值应为ticketOwners.length
,最小值为 0,因为我将获取数组的索引以选择获胜者。
我目前有这段代码,它在调用 getRandomNumber() 时返回uint256: 0
。 除了此代码的漏洞外,我只是在寻求有关生成此数字的帮助。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/VRFConsumerBase.sol";
contract Random is VRFConsumerBase {
bytes32 internal immutable keyHash;
uint256 internal immutable fee;
uint256 public immutable ticketPrice;
uint256 public result;
address payable[] public ticketOwners;
constructor (
address _ChainlinkVRFCoordinator,
address _ChainlinkLINKToken,
bytes32 _ChainlinkKeyHash,
uint256 _ticketPrice
) VRFConsumerBase (
_ChainlinkVRFCoordinator,
_ChainlinkLINKToken
) {
keyHash = _ChainlinkKeyHash;
fee = 0.1 * 10 ** 18;
ticketPrice = _ticketPrice;
}
function enterRaffle() public payable {
require(msg.value >= ticketPrice, "Invalid ticket price");
ticketOwners.push(payable(msg.sender));
}
function getRandomNumber() public returns (bytes32 requestId) {
require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
return requestRandomness(keyHash, fee);
}
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
result = randomness;
}
}
您可能为参数使用了不正确的地址。 Chainlink 有两个主要变体。 由于您使用的是VRFConsumerBase
,这是 VRf V1,您可以从此处获取地址。 我把那些用于 goerli:
link address = 0x326C977E6efc84E512bB9C30f76E30c160eD06FB
key hash = 0x0476f9a745b61ea5c0ab224d3a6e4c99f0b02fce4da01143a4f70aa80ae76e8a
ChainlinkVRFCoordinator= 0x2bce784e69d2Ff36c71edcB9F88358dB0DfB55b4
部署合约后,您必须向合约发送链接令牌,因为您需要支付您设置的fee
参数。 链接令牌水龙头
您按下getRandomNumber
按钮,您需要等待一分钟。 然后你的result
值被设置
这是证明工作:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.