在 Solidity 和 Remix 中恢复执行

Execution is reverted in Solidity and Remix

我写了一个简单的代码,通过使用 Chainlink 接口获取 ETH 价格,如下所示:

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";

contract ABI {

    AggregatorV3Interface internal priceFeed;

    constructor() public {
        priceFeed = AggregatorV3Interface(0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c);
    }

    function latestPrice() public view returns (int256) {
        (, int256 answer,,,) = priceFeed.latestRoundData();
        return answer;
    }

}

问题是用Remix编译的时候没有问题,执行后报如下错误:

ContractName.FunctionName 的调用出错:执行已恢复

你觉得问题出在哪里?

因为你的问题没有指定你在哪个网络上 运行 脚本,我假设你使用的是 Remix VM 模拟器。

指定的 Chainlink contract 仅在以太坊主网上可用。任何其他网络(包括模拟器)都没有在这个地址上部署这个合约。

要在 Remix 中使用数据馈送合约,您可以创建主网的本地分支,然后在 IDE.

中连接到本地网络。

在 Remix IDE 中将 ENVIRONMENT 更改为 Injected Web3 并连接到 metamask。例如,如果您使用 Kovan 网络使用地址,如 docs.

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

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

contract PriceConsumerV3 {

    AggregatorV3Interface internal priceFeed;

    /**
     * Network: Kovan
     * Aggregator: ETH/USD
     * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331
     */
    constructor() {
        priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
    }

    /**
     * Returns the latest price
     */
    function getLatestPrice() public view returns (int) {
        (
            /*uint80 roundID*/,
            int price,
            /*uint startedAt*/,
            /*uint timeStamp*/,
            /*uint80 answeredInRound*/
        ) = priceFeed.latestRoundData();
        return price;
    }
}