调用Chainlink VRF的rollDice函数报cannot estimate gas错误如何解决
错误原因
- 合约调用地址不匹配:报错日志中交易的目标地址为
0x5887946875A01D1BB79d6Fb357BceeA5A0096D2e,但你实际部署成功的合约地址为0x7b72d80670512c87605ab8ac7e6113fda9c57de4,调用错误地址要么对应地址未部署对应合约,要么该地址没有转入足够LINK,会触发rollDice函数第一个require校验回滚,导致节点无法预估gas。 - 重复调用触发校验规则:如果参数传入的地址
0x014Da1D627E6ceB555975F09D26B048644382Ac6已经发起过掷骰子请求,会触发第二个require(s_results[roller] == 0, "Already rolled")校验回滚,同样会引发gas预估失败。 - 配置文件gas参数不合理:
hardhat.config.js里Kovan网络的gas参数设置为2700000000,远超过Kovan测试网的区块gas上限(约3000万),错误的gas参数会干扰交易预估和发送流程。
修复方案
- 修正调用合约地址:将
quickRun.js中的address变量替换为你实际部署的合约地址0x7b72d80670512c87605ab8ac7e6113fda9c57de4,同时确认你转入LINK的地址就是该部署地址,且余额≥0.1 LINK(你代码中设置的s_fee为1e17 wei即0.1 LINK)。 - 避免重复调用:如果已经用当前地址调用过
rollDice,可以换一个新地址作为参数传入,也可以新增一个重置测试状态的函数方便多次测试。 - 修正hardhat配置参数:将
hardhat.config.js里Kovan网络的gas参数调整为合理值,比如gas: 3000000,删除多余的不合理gas限制。 - 手动指定gas limit临时验证:如果调整后仍然报错,可以在调用
rollDice时手动指定gas limit,修改调用代码为:
var sendPromise = contract.rollDice('0x014Da1D627E6ceB555975F09D26B048644382Ac6', {gasLimit: 3000000});
内容的提问来源于stack exchange,提问作者topgun741
相关产品推荐
相关产品推荐

