pragma solidity ^0.8.21;
import “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
contract OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;
// Visibility for constructor removed
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
在这个部分,我们已经指定我们的合约将使用 Chainlink 价格预言机。构造函数接受以太坊网络上价格预言机合约的地址。
1.
从预言机获取数据
1.
让我们扩展我们的合约以获取最新的以太坊价格:
Solidity
function getLatestEthPrice() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
1.
Chainlink聚合接口的 `latestRoundData()` 函数为我们提供了各种数据,包括最新的价格。
## 处理预言机响应:收到数据后管理数据
从预言机获取的数据通常以原始格式提供,可能不立即适用于我们的需求。在我们的智能合约中正确处理这些数据至关重要:
1.
格式化数据
1.
假设预言机以美元为单位返回以太坊的价格,但乘以 10^8 以确保没有小数位(这在预言机设置中很常见)。要获得实际价格,您需要格式化数据:
Solidity
function getFormattedEthPrice() public view returns (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
1.
这个函数获取原始价格数据,然后除以 10^8 以获得现实世界的价值。
1.
错误处理
1.
总是要考虑预言机获取数据失败的可能性:
Solidity
function safeGetLatestEthPrice() public view returns (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}
1.
在这里, `latestRoundData()` 函数还提供了一个时间戳。如果时间戳是 0,那很可能意味着预言机未能获取数据,我们通过一个`require` 语句来处理这种情况。
你的完整代码应显示如下:
Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
import “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
contract OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;
// Visibility for constructor removed
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
function getLatestEthPrice() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
function getFormattedEthPrice() public view returns (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
function safeGetLatestEthPrice() public view returns (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}
}
```
在完成本课程后,您应该能够在 Remix 中编写一个简单的智能合约,该合约可以使用预言机来获取最新的以太坊价格并处理返回的数据。 在下一节课中,我们将学习如何部署该合约,使用预言机的最佳实践和其中的细微差别。
pragma solidity ^0.8.21;
import “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
contract OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;
// Visibility for constructor removed
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
在这个部分,我们已经指定我们的合约将使用 Chainlink 价格预言机。构造函数接受以太坊网络上价格预言机合约的地址。
1.
从预言机获取数据
1.
让我们扩展我们的合约以获取最新的以太坊价格:
Solidity
function getLatestEthPrice() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
1.
Chainlink聚合接口的 `latestRoundData()` 函数为我们提供了各种数据,包括最新的价格。
## 处理预言机响应:收到数据后管理数据
从预言机获取的数据通常以原始格式提供,可能不立即适用于我们的需求。在我们的智能合约中正确处理这些数据至关重要:
1.
格式化数据
1.
假设预言机以美元为单位返回以太坊的价格,但乘以 10^8 以确保没有小数位(这在预言机设置中很常见)。要获得实际价格,您需要格式化数据:
Solidity
function getFormattedEthPrice() public view returns (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
1.
这个函数获取原始价格数据,然后除以 10^8 以获得现实世界的价值。
1.
错误处理
1.
总是要考虑预言机获取数据失败的可能性:
Solidity
function safeGetLatestEthPrice() public view returns (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}
1.
在这里, `latestRoundData()` 函数还提供了一个时间戳。如果时间戳是 0,那很可能意味着预言机未能获取数据,我们通过一个`require` 语句来处理这种情况。
你的完整代码应显示如下:
Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
import “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
contract OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;
// Visibility for constructor removed
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
function getLatestEthPrice() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
function getFormattedEthPrice() public view returns (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
function safeGetLatestEthPrice() public view returns (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}
}
```
在完成本课程后,您应该能够在 Remix 中编写一个简单的智能合约,该合约可以使用预言机来获取最新的以太坊价格并处理返回的数据。 在下一节课中,我们将学习如何部署该合约,使用预言机的最佳实践和其中的细微差别。