Lição 3

Xây dựng một hợp đồng tích hợp Oracle đơn giản

Bây giờ chúng ta đã thiết lập Remix IDE và nhập các thư viện Chainlink cần thiết, chúng ta sẽ tạo một hợp đồng thông minh cơ bản tích hợp với oracle. Điều này sẽ cho phép chúng tôi tìm nạp và xử lý dữ liệu bên ngoài.

Soạn thảo hợp đồng: Khái niệm cơ bản về tích hợp Oracle

  1. Bắt đầu với những điều cơ bản:
    Hãy bắt đầu bằng cách xác định hợp đồng của chúng ta, chỉ định phiên bản Solidity và nhập thư viện Chainlink mà chúng ta sẽ sử dụng:
    ```
    Độ 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;

// 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.

Isenção de responsabilidade
* O investimento em criptomoedas envolve grandes riscos. Prossiga com cautela. O curso não se destina a servir de orientação para investimentos.
* O curso foi criado pelo autor que entrou para o Gate Learn. As opiniões compartilhadas pelo autor não representam o Gate Learn.
Catálogo
Lição 3

Xây dựng một hợp đồng tích hợp Oracle đơn giản

Bây giờ chúng ta đã thiết lập Remix IDE và nhập các thư viện Chainlink cần thiết, chúng ta sẽ tạo một hợp đồng thông minh cơ bản tích hợp với oracle. Điều này sẽ cho phép chúng tôi tìm nạp và xử lý dữ liệu bên ngoài.

Soạn thảo hợp đồng: Khái niệm cơ bản về tích hợp Oracle

  1. Bắt đầu với những điều cơ bản:
    Hãy bắt đầu bằng cách xác định hợp đồng của chúng ta, chỉ định phiên bản Solidity và nhập thư viện Chainlink mà chúng ta sẽ sử dụng:
    ```
    Độ 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;

// 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.

Isenção de responsabilidade
* O investimento em criptomoedas envolve grandes riscos. Prossiga com cautela. O curso não se destina a servir de orientação para investimentos.
* O curso foi criado pelo autor que entrou para o Gate Learn. As opiniões compartilhadas pelo autor não representam o Gate Learn.