Kovan测试网调用FundMe.getVersion触发VM执行错误回滚如何解决
问题根因
你遇到的Attn: call to FundMe.getVersion errored: VM execution error. Reverted 0x报错由以下原因触发:
代码中
getVersion()函数硬编码的喂价合约地址仅在以太坊主网部署了对应AggregatorV3Interface合约,不同链环境相互隔离,你当前部署FundMe合约的Kovan测试网上不存在该地址的合约,调用无返回结果不符合函数预期的uint256返回值要求,触发交易回滚。
修复方案
- 方案1:替换为对应测试网的喂价地址
如果你需要在Kovan测试网完成测试,直接将硬编码的喂价地址替换为Kovan链对应的ETH/USD喂价地址即可,修改后的代码片段如下:function getVersion() public view returns (uint256) { // 替换为Kovan测试网ETH/USD喂价地址 AggregatorV3Interface priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); return priceFeed.version(); } - 方案2:切换部署网络
如果你不需要测试逻辑,直接将FundMe合约部署到以太坊主网,即可正常调用当前硬编码的主网喂价地址。 - 方案3:优化代码适配多链
避免硬编码喂价地址,改为部署时通过构造函数传入对应链的喂价地址,适配不同部署环境,完整优化代码参考如下:// SPDX-License-Identifier: MIT pragma solidity >=0.6.6 <0.9.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } contract FundMe { mapping(address =>uint256) public addressToAmountFunded; AggregatorV3Interface public immutable priceFeed; // 部署时传入当前链对应的喂价地址 constructor(address _priceFeed) { priceFeed = AggregatorV3Interface(_priceFeed); } function fund() public payable { addressToAmountFunded[msg.sender] += msg.value; } function getVersion() public view returns (uint256) { return priceFeed.version(); } }
内容的提问来源于stack exchange,提问作者Jonathan Cruz
相关产品推荐
相关产品推荐

