如何使用Chainlink VRF获取RandomNumber

huangapple go评论61阅读模式
英文:

How can I get RandomNumber by using Chainlink VRF

问题

这是RandomNumberConsumer.sol的代码。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";

contract RandomNumberConsumer is VRFConsumerBase {
    event RequestFulfilled(bytes32 requestId, uint256 randomness);

    bytes32 internal keyHash;
    uint256 internal fee;
    uint256 public randomResult;

    constructor()
        VRFConsumerBase(
            0x7a1BaC17Ccc5b313516C5E16fb24f7659aA5ebed, // VRF Coordinator
            0x326C977E6efc84E512bB9C30f76E30c160eD06FB // LINK Token
        )
    {
        keyHash = 0x4b09e658ed251bcafeebbc69400383d49f344ace09b9576fe248bb02c003fe9f;
        fee = 0.1 * 10 ** 18; // 0.1 LINK (根据网络不同而变化)
    }

    /**
     * 请求随机数
     */
    function getRandomNumber() public returns (bytes32 requestId) {
        require(
            LINK.balanceOf(address(this)) >= fee,
            "LINK不足 - 请使用faucet填充合约"
        );
        return requestRandomness(keyHash, fee);
    }

    /**
     * VRF Coordinator使用的回调函数
     */
    function fulfillRandomness(
        bytes32 requestId,
        uint256 randomness
    ) internal override {
        randomResult = randomness;
        emit RequestFulfilled(requestId, randomness);
    }
}

我在Mumbai测试网上部署并验证了我的合约,并向部署的合约发送了LINK代币。但是当我调用getRandomNumber时出现错误:"我们无法估算燃气。合约可能存在错误,此交易可能失败。" 你应该如何修复它?

如你所描述的错误信息指出,这可能是由于无法估算交易燃气而导致的问题。要解决这个问题,你可以尝试以下几个步骤:

  1. 检查链链接是否正确:确保你的合约部署在Mumbai测试网上,并且与Mumbai测试网的VRF Coordinator和LINK代币进行了正确的连接。检查这两个地址是否正确。

  2. 验证LINK代币余额:在调用getRandomNumber之前,确保合约地址拥有足够的LINK代币以支付交易费用(至少等于fee)。你可以使用链链接的faucet来获得测试LINK代币,并将其发送到合约地址。

  3. 检查合约代码:确保你的合约代码没有任何错误或异常,特别是在getRandomNumber函数中。确保在请求随机数之前,require语句中的条件为真,否则交易将失败。

  4. 使用较高的Gas限制:在调用getRandomNumber函数时,可以尝试增加交易的Gas限制,以确保有足够的燃气来执行交易。你可以在交易中设置更高的gasLimit

如果你仍然遇到问题,可以提供更多关于错误的详细信息,以便更好地帮助你解决问题。

英文:

this is RandomNumberConsumer.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";

contract RandomNumberConsumer is VRFConsumerBase {
    event RequestFulfilled(bytes32 requestId, uint256 randomness);

    bytes32 internal keyHash;
    uint256 internal fee;
    uint256 public randomResult;

    constructor()
        VRFConsumerBase(
            0x7a1BaC17Ccc5b313516C5E16fb24f7659aA5ebed, // VRF Coordinator
            0x326C977E6efc84E512bB9C30f76E30c160eD06FB // LINK Token
        )
    {
        keyHash = 0x4b09e658ed251bcafeebbc69400383d49f344ace09b9576fe248bb02c003fe9f;
        fee = 0.1 * 10 ** 18; // 0.1 LINK (Varies by network)
    }

    /**
     * Requests randomness
     */
    function getRandomNumber() public returns (bytes32 requestId) {
        require(
            LINK.balanceOf(address(this)) >= fee,
            "Not enough LINK - fill contract with faucet"
        );
        return requestRandomness(keyHash, fee);
    }

    /**
     * Callback function used by VRF Coordinator
     */
    function fulfillRandomness(
        bytes32 requestId,
        uint256 randomness
    ) internal override {
        randomResult = randomness;
        emit RequestFulfilled(requestId, randomness);
    }

}

I deployed and verified my contract in mumbai testnet.
And I send link token to deployed contract.
But error occurs When I call getRandomNumber.
"We were not able to estimate gas. There might be an error in the contract and this transaction may fail"
How can I fix it?

答案1

得分: 1

看起来你正在使用已弃用的VRF版本1。你应该通过查看Chainlink官方文档中的这个指南来切换到VRF版本2。

英文:

It looks like you are using VRF version 1, which is deprecated. You should switch to VRF version 2 by checking this guide from the Chainlink official docs.

huangapple
  • 本文由 发表于 2023年6月22日 02:21:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76526120.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定