độ rắn pragma ^0,8,21;
nhập “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
hợp đồng OracleIntegratedContract {
Bộ tổng hợpV3Giao diện giá nội bộNguồn cấp dữ liệu;
// Khả năng hiển thị của hàm tạo đã xóa
hàm tạo (địa chỉ _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
Trong phân đoạn này, chúng tôi đã xác định rằng hợp đồng của chúng tôi sẽ sử dụng Nguồn cấp dữ liệu giá Chainlink. Nhà xây dựng lấy địa chỉ cho hợp đồng cung cấp giá trên mạng Ethereum.
1.
Tìm nạp dữ liệu từ Oracle
1.
Hãy gia hạn hợp đồng của chúng ta để lấy giá Ethereum mới nhất:
Độ rắn chắc
hàm getLatestEthPrice() chế độ xem công khai trả về (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
1.
Hàm `latestRoundData()` từ giao diện Chainlink Aggregator cung cấp cho chúng tôi nhiều dữ liệu khác nhau, bao gồm cả giá gần đây nhất.
## Xử lý phản hồi của Oracle: Quản lý dữ liệu sau khi nhận được
Dữ liệu được tìm nạp từ oracle thường ở định dạng thô có thể không phù hợp ngay với nhu cầu của chúng ta. Điều quan trọng là phải xử lý dữ liệu này một cách chính xác trong hợp đồng thông minh của chúng tôi:
1.
Định dạng dữ liệu
1.
Giả sử oracle trả về giá của Ethereum bằng USD nhưng nhân với 10^8 để đảm bảo không có số thập phân (phổ biến trong các thiết lập oracle). Để có được giá thực tế, bạn cần định dạng dữ liệu:
Độ rắn chắc
hàm getFormattedEthPrice() chế độ xem công khai trả về (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
1.
Hàm này lấy giá thô, sau đó chia cho 10^8 để có giá trị thực tế.
1.
Xử lý lỗi
1.
Luôn tính đến khả năng oracle không tìm nạp được dữ liệu:
Độ rắn chắc
hàm safeGetLatestEthPrice() chế độ xem công khai trả về (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}
1.
Ở đây, hàm `latestRoundData()` cũng cung cấp dấu thời gian. Nếu dấu thời gian bằng 0, điều đó có thể có nghĩa là oracle không truy xuất được dữ liệu và chúng tôi xử lý việc đó bằng câu lệnh `require`.
Mã đầy đủ của bạn sẽ trông như thế này:
Độ rắn chắc
// SPDX-Mã định danh giấy phép: MIT
độ rắn pragma ^0,8,21;
nhập “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
hợp đồng OracleIntegratedContract {
Bộ tổng hợpV3Giao diện giá nội bộNguồn cấp dữ liệu;
// Chế độ hiển thị của hàm tạo đã xóa
hàm tạo (địa chỉ _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
hàm getLatestEthPrice() chế độ xem công khai trả về (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
hàm getFormattedEthPrice() chế độ xem công khai trả về (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
hàm safeGetLatestEthprice() chế độ xem công khai trả về (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}
}
```
Đến cuối bài học này, bạn sẽ có một hợp đồng thông minh tích hợp oracle cơ bản được soạn thảo trong Remix. Hợp đồng này lấy giá Ethereum mới nhất và xử lý dữ liệu được trả về. Trong các bài học tiếp theo, chúng ta sẽ triển khai hợp đồng này và đi sâu hơn vào các phương pháp và sắc thái tốt nhất.
độ rắn pragma ^0,8,21;
nhập “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
hợp đồng OracleIntegratedContract {
Bộ tổng hợpV3Giao diện giá nội bộNguồn cấp dữ liệu;
// Khả năng hiển thị của hàm tạo đã xóa
hàm tạo (địa chỉ _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
Trong phân đoạn này, chúng tôi đã xác định rằng hợp đồng của chúng tôi sẽ sử dụng Nguồn cấp dữ liệu giá Chainlink. Nhà xây dựng lấy địa chỉ cho hợp đồng cung cấp giá trên mạng Ethereum.
1.
Tìm nạp dữ liệu từ Oracle
1.
Hãy gia hạn hợp đồng của chúng ta để lấy giá Ethereum mới nhất:
Độ rắn chắc
hàm getLatestEthPrice() chế độ xem công khai trả về (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
1.
Hàm `latestRoundData()` từ giao diện Chainlink Aggregator cung cấp cho chúng tôi nhiều dữ liệu khác nhau, bao gồm cả giá gần đây nhất.
## Xử lý phản hồi của Oracle: Quản lý dữ liệu sau khi nhận được
Dữ liệu được tìm nạp từ oracle thường ở định dạng thô có thể không phù hợp ngay với nhu cầu của chúng ta. Điều quan trọng là phải xử lý dữ liệu này một cách chính xác trong hợp đồng thông minh của chúng tôi:
1.
Định dạng dữ liệu
1.
Giả sử oracle trả về giá của Ethereum bằng USD nhưng nhân với 10^8 để đảm bảo không có số thập phân (phổ biến trong các thiết lập oracle). Để có được giá thực tế, bạn cần định dạng dữ liệu:
Độ rắn chắc
hàm getFormattedEthPrice() chế độ xem công khai trả về (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
1.
Hàm này lấy giá thô, sau đó chia cho 10^8 để có giá trị thực tế.
1.
Xử lý lỗi
1.
Luôn tính đến khả năng oracle không tìm nạp được dữ liệu:
Độ rắn chắc
hàm safeGetLatestEthPrice() chế độ xem công khai trả về (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}
1.
Ở đây, hàm `latestRoundData()` cũng cung cấp dấu thời gian. Nếu dấu thời gian bằng 0, điều đó có thể có nghĩa là oracle không truy xuất được dữ liệu và chúng tôi xử lý việc đó bằng câu lệnh `require`.
Mã đầy đủ của bạn sẽ trông như thế này:
Độ rắn chắc
// SPDX-Mã định danh giấy phép: MIT
độ rắn pragma ^0,8,21;
nhập “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
hợp đồng OracleIntegratedContract {
Bộ tổng hợpV3Giao diện giá nội bộNguồn cấp dữ liệu;
// Chế độ hiển thị của hàm tạo đã xóa
hàm tạo (địa chỉ _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
hàm getLatestEthPrice() chế độ xem công khai trả về (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
hàm getFormattedEthPrice() chế độ xem công khai trả về (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
hàm safeGetLatestEthprice() chế độ xem công khai trả về (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}
}
```
Đến cuối bài học này, bạn sẽ có một hợp đồng thông minh tích hợp oracle cơ bản được soạn thảo trong Remix. Hợp đồng này lấy giá Ethereum mới nhất và xử lý dữ liệu được trả về. Trong các bài học tiếp theo, chúng ta sẽ triển khai hợp đồng này và đi sâu hơn vào các phương pháp và sắc thái tốt nhất.