Solidity合约编写(三)

解决问题:

在 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();
    }
}

代码说明:

  1. AggregatorV3Interface : Chainlink 提供的接口,用于与价格喂价合约交互。它包含 latestRoundData 函数,可以获取最新的价格数据。

  2. priceFeed :这是一个 AggregatorV3Interface 类型的变量,用于存储价格喂价合约的地址。

  3. 构造函数 :在部署合约时,需要传入 Chainlink 价格喂价合约的地址(_priceFeedAddress)。不同网络的 Chainlink 价格喂价合约地址不同。

  4. getLatestPrice 函数 :调用 latestRoundData 获取最新的价格数据。返回 int256 类型的 ETH/USD 价格。

  5. getDecimals 函数:返回价格的小数位数(通常是 8)。

  6. getDescription 函数 :返回价格描述(例如 "ETH / USD")。


以下是一些测试网络的 Chainlink ETH/USD 价格喂价合约地址:

  • Goerli 测试网

    • ETH/USD: 0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
  • Sepolia 测试网

    • ETH/USD: 0x694AA1769357215DE4FAC081bf1f309aDC325306
  • Mainnet 主网

    • ETH/USD: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419

价格格式化为更易读的形式,可以添加以下函数:

复制代码
// 将价格格式化为带小数位的数值
function getFormattedPrice() public view returns (uint256) {
    int256 price = getLatestPrice();
    uint8 decimals = getDecimals();
    return uint256(price) / (10 ** uint256(decimals));
}
相关推荐
小赖同学啊16 分钟前
区块链技术在物联网(IoT)中的核心应用场景
物联网·区块链
YSGZJJ6 小时前
股指期货空头减仓说明了什么?
区块链
小赖同学啊6 小时前
基于区块链的物联网(IoT)安全通信与数据共享的典型实例
物联网·安全·区块链
TechubNews11 小时前
东方之珠·数链未来:香港回归28周年RWA革命赋能全球金融
区块链·稳定币
yoona102019 小时前
在 Sepolia 上使用 Zama fhEVM 构建隐私代币与流动性池:全流程实战指南
区块链·隐私币·zama
选择不变19 小时前
日线周线MACD指标使用图文教程,通达信指标
大数据·区块链·通达信指标公式·炒股技巧·短线指标·炒股指标
链上Sniper20 小时前
智能合约状态快照技术:实现 EVM 状态的快速同步与回滚
java·大数据·linux·运维·web3·区块链·智能合约
TechubNews1 天前
稳定币发行量创纪录地超过 Visa 交易量
区块链
dingzd951 天前
结合指纹防护技术,释放Web3去中心化的潜力
web3·去中心化·区块链·facebook·tiktok·instagram·clonbrowser
OEC小胖胖1 天前
去中心化身份:2025年Web3身份验证系统开发实践
前端·web3·去中心化·区块链