英文:
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
时出现错误:"我们无法估算燃气。合约可能存在错误,此交易可能失败。" 你应该如何修复它?
如你所描述的错误信息指出,这可能是由于无法估算交易燃气而导致的问题。要解决这个问题,你可以尝试以下几个步骤:
-
检查链链接是否正确:确保你的合约部署在Mumbai测试网上,并且与Mumbai测试网的VRF Coordinator和LINK代币进行了正确的连接。检查这两个地址是否正确。
-
验证LINK代币余额:在调用
getRandomNumber
之前,确保合约地址拥有足够的LINK代币以支付交易费用(至少等于fee
)。你可以使用链链接的faucet来获得测试LINK代币,并将其发送到合约地址。 -
检查合约代码:确保你的合约代码没有任何错误或异常,特别是在
getRandomNumber
函数中。确保在请求随机数之前,require
语句中的条件为真,否则交易将失败。 -
使用较高的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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论