我正在以太坊 Sepolia 网络上使用 Chainlink VRF(可验证随机函数)开发智能合约。根据文档和示例,订阅 ID 应该是 uint64。然而,我收到的订阅ID比uint64能容纳的要大得多。
详情: 网络:以太坊Sepolia, 提供的订阅 ID:55908212076489414356763290517690794428993368234670108884296656046224328470330, Chainlink VRF合约版本:2.5 代码示例: 这是我的 Solidity 合约的相关部分:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol";
import "@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract Lottery is VRFConsumerBaseV2, ReentrancyGuard {
VRFCoordinatorV2Interface COORDINATOR;
LinkTokenInterface LINKTOKEN;
uint64 s_subscriptionId;
address vrfCoordinator;
bytes32 keyHash;
uint32 callbackGasLimit = 100000;
uint16 requestConfirmations = 3;
uint32 numWords = 1;
uint256[] public s_randomWords;
uint256 public s_requestId;
constructor(
address _vrfCoordinator,
address _linkToken,
bytes32 _keyHash,
uint64 _subscriptionId
) VRFConsumerBaseV2(_vrfCoordinator) {
vrfCoordinator = _vrfCoordinator;
LINKTOKEN = LinkTokenInterface(_linkToken);
COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinator);
keyHash = _keyHash;
s_subscriptionId = _subscriptionId;
}
function requestRandomWinner() public onlyManager onlyAfterLotteryEnd {
require(LINKTOKEN.balanceOf(address(this)) >= 0.1 * 10**18, "Not enough LINK - fill contract with faucet");
s_requestId = COORDINATOR.requestRandomWords(
keyHash,
s_subscriptionId,
requestConfirmations,
callbackGasLimit,
numWords
);
}
function fulfillRandomWords(uint256, uint256[] memory randomWords) internal override nonReentrant {
randomResult = randomWords[0];
// Additional logic
}
}
我尝试部署一个集成 Chainlink VRF 的彩票智能合约来随机挑选获胜者。我希望 Chainlink 提供的订阅 ID 能够符合合约中 requestRandomWords 函数的要求,在 uint64 范围内。相反,提供的订阅 ID 更大,导致部署期间出现“错误编码参数:值越界”。
采取的步骤: 生成的订阅 ID:在以太坊 Sepolia 网络上创建了新的 Chainlink VRF 订阅。 更新合约:使用新的订阅 ID 和其他必要参数更新智能合约。 部署尝试:尝试使用 Remix IDE 在以太坊 Sepolia 测试网上部署合约。 预期结果: 合约应该已成功部署,允许我使用 Chainlink VRF 生成随机数。
实际结果: 收到错误,指示订阅 ID 值超出 uint64 的范围。
Error encoding arguments: Error: value out-of-bounds (argument=null, value="55908212076489414356763290517690794428993368234670108884296656046224328470330", code=INVALID_ARGUMENT, version=abi/5.7.0) ```
This discrepancy prevents me from deploying the contract and utilizing Chainlink VRF as intended