解决问题:
在 Solidity 合约中使用 Chainlink 获取 ETH/USD 的价格(汇率),需要使用 Chainlink 的 AggregatorV3Interface
接口。以下是一个样板代码,展示了如何在测试链(如 Goerli 或 Sepolia)上获取 ETH/USD 的价格。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// 导入 Chainlink 的 AggregatorV3Interface 接口
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract EthPriceFeed {
// Chainlink 价格喂价合约地址(ETH/USD)
AggregatorV3Interface internal priceFeed;
// 构造函数:初始化价格喂价合约地址
constructor(address _priceFeedAddress) {
priceFeed = AggregatorV3Interface(_priceFeedAddress);
}
// 获取最新的 ETH/USD 价格
function getLatestPrice() public view returns (int256) {
(
uint80 roundID,
int256 price,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
) = priceFeed.latestRoundData();
// 返回 ETH/USD 价格
return price;
}
// 获取价格的小数位数
function getDecimals() public view returns (uint8) {
return priceFeed.decimals();
}
// 获取价格描述
function getDescription() public view returns (string memory) {
return priceFeed.description();
}
}
代码说明:
-
AggregatorV3Interface
: Chainlink 提供的接口,用于与价格喂价合约交互。它包含latestRoundData
函数,可以获取最新的价格数据。 -
priceFeed
:这是一个AggregatorV3Interface
类型的变量,用于存储价格喂价合约的地址。 -
构造函数 :在部署合约时,需要传入 Chainlink 价格喂价合约的地址(
_priceFeedAddress
)。不同网络的 Chainlink 价格喂价合约地址不同。 -
getLatestPrice
函数 :调用latestRoundData
获取最新的价格数据。返回int256
类型的 ETH/USD 价格。 -
getDecimals
函数:返回价格的小数位数(通常是 8)。 -
getDescription
函数 :返回价格描述(例如"ETH / USD"
)。
Chainlink 价格喂价合约地址
以下是一些测试网络的 Chainlink ETH/USD 价格喂价合约地址:
-
Goerli 测试网:
- ETH/USD:
0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
- ETH/USD:
-
Sepolia 测试网:
- ETH/USD:
0x694AA1769357215DE4FAC081bf1f309aDC325306
- ETH/USD:
-
Mainnet 主网:
- ETH/USD:
0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
- ETH/USD:
价格格式化为更易读的形式,可以添加以下函数:
// 将价格格式化为带小数位的数值
function getFormattedPrice() public view returns (uint256) {
int256 price = getLatestPrice();
uint8 decimals = getDecimals();
return uint256(price) / (10 ** uint256(decimals));
}