在 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;
}
}
我写了一个简单的代码,通过使用 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;
}
}