Chainlink VRF:订阅 ID 超出 uint64 限制

问题描述 投票:0回答:1

我正在以太坊 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
ethereum solidity smartcontracts chainlink remix-ide
1个回答
0
投票

您正在使用旧代码。现在在 Chainlink VRF 2.5 版本中,订阅 ID 的类型为

uint256

您可以在这里查看最新的代码示例。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.