الدرس رقم 3

การสร้างสัญญาแบบรวม Oracle อย่างง่าย

ตอนนี้เราได้ตั้งค่า Remix IDE และนำเข้าไลบรารี Chainlink ที่จำเป็นแล้ว เราจะสร้างสัญญาอัจฉริยะพื้นฐานที่ผสานรวมกับ Oracle สิ่งนี้จะทำให้เราสามารถดึงและจัดการข้อมูลภายนอกได้

การร่างสัญญา: พื้นฐานของการรวม Oracle

  1. เริ่มต้นด้วยพื้นฐาน:
    เริ่มต้นด้วยการกำหนดสัญญาของเรา ระบุเวอร์ชัน Solidity และนำเข้าไลบรารี Chainlink ที่เราจะใช้:
    ```
    ความแข็งแกร่ง
    // SPDX-ใบอนุญาต-ตัวระบุ: MIT

ความแข็งแกร่งของแพรกมา ^0.8.21;

นำเข้า “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;

สัญญา OracleIntegratedContract {
AggregatorV3Interface ราคาภายใน Feed;

// การมองเห็นสำหรับคอนสตรัคเตอร์ลบคอนสตรัคเตอร์ 
 รายการ (ที่อยู่ _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

1. 
ในส่วนนี้ เราได้ระบุว่าสัญญาของเราจะใช้ฟีดราคา Chainlink ตัวสร้างรับที่อยู่สำหรับสัญญาฟีดราคาบนเครือข่าย Ethereum

1. 
 การดึงข้อมูลจาก Oracle 

 1. 
 มาขยายสัญญาของเราเพื่อรับราคา Ethereum ล่าสุด:

ความแข็งแกร่ง
ฟังก์ชั่น getLatestEthPrice() ส่งคืนมุมมองสาธารณะ (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}


1. 
ฟังก์ชัน `latestRoundData()` จากอินเทอร์เฟซ Chainlink Aggregator ให้ข้อมูลที่หลากหลายแก่เรา รวมถึงราคาล่าสุด

## การจัดการการตอบสนองของ Oracle: การจัดการข้อมูลเมื่อได้รับ 

 ข้อมูลที่ดึงมาจาก oracles มักจะมาในรูปแบบดิบที่อาจไม่เหมาะสมกับความต้องการของเราในทันที การประมวลผลข้อมูลนี้อย่างถูกต้องภายในสัญญาอัจฉริยะของเราเป็นสิ่งสำคัญ: 



 1. 
 การจัดรูปแบบข้อมูล 

 1. 
สมมติว่า oracle ส่งกลับราคาของ Ethereum เป็น USD แต่คูณด้วย 10^8 เพื่อให้แน่ใจว่าไม่มีทศนิยม (พบได้ทั่วไปในการตั้งค่า oracle) หากต้องการรับราคาจริง คุณจะต้องจัดรูปแบบข้อมูล:

ความแข็งแกร่ง
ฟังก์ชั่น getFormattedEthPrice() ส่งคืนมุมมองสาธารณะ (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}


1. 
ฟังก์ชันนี้จะดึงราคาดิบแล้วหารด้วย 10^8 เพื่อให้ได้มูลค่าตามความเป็นจริง

1. 
 การจัดการข้อผิดพลาด 

 1. 
 คำนึงถึงความเป็นไปได้ที่ oracle ล้มเหลวในการดึงข้อมูลเสมอ:

ความแข็งแกร่ง
ฟังก์ชั่น safeGetLatestEthPrice() ส่งคืนมุมมองสาธารณะ (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}


1. 
 ในที่นี้ ฟังก์ชัน `latestRoundData()` ยังมีการประทับเวลาด้วย หากการประทับเวลาเป็น 0 อาจหมายความว่า Oracle ไม่สามารถดึงข้อมูลได้ และเราจัดการเรื่องนั้นด้วยคำสั่ง `require`
รหัสเต็มของคุณควรมีลักษณะดังนี้:

ความแข็งแกร่ง
// SPDX-ใบอนุญาต-ตัวระบุ: MIT

ความแข็งแกร่งของแพรกมา ^0.8.21;

นำเข้า “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;

สัญญา OracleIntegratedContract {
AggregatorV3Interface ราคาภายใน Feed;

// การมองเห็นสำหรับตัวสร้างที่ถูกลบออก 
 ตัวสร้าง (ที่อยู่ _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

ฟังก์ชั่น getLatestEthPrice() มุมมองสาธารณะส่งคืน (int) {
    (,int price,,,) = priceFeed.latestRoundData();
    return price;
}

ฟังก์ชั่น getFormattedEthPrice() มุมมองสาธารณะส่งคืน (int) {
    int rawPrice = getLatestEthPrice();
    return rawPrice / 10**8;
}

ฟังก์ชั่น safeGetLatestEthPrice() มุมมองสาธารณะ ส่งคืน (int) {
    (,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
    require(timestamp > 0, "Failed to fetch data from the oracle");
    return price;
}

}
```

เมื่อสิ้นสุดบทเรียนนี้ คุณควรมีสัญญาอัจฉริยะที่ผสานรวมกับ Oracle พื้นฐานที่ร่างไว้ภายใน Remix สัญญานี้จะดึงราคา Ethereum ล่าสุดและจัดการข้อมูลที่ส่งคืน ในบทเรียนถัดไป เราจะปรับใช้สัญญานี้และเจาะลึกเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดและความแตกต่างเล็กๆ น้อยๆ

إخلاء المسؤولية
* ينطوي الاستثمار في العملات الرقمية على مخاطر كبيرة. فيرجى المتابعة بحذر. ولا تهدف الدورة التدريبية إلى تقديم المشورة الاستثمارية.
* تم إنشاء الدورة التدريبية من قبل المؤلف الذي انضم إلى مركز التعلّم في Gate. ويُرجى العلم أنّ أي رأي يشاركه المؤلف لا يمثّل مركز التعلّم في Gate.
الكتالوج
الدرس رقم 3

การสร้างสัญญาแบบรวม Oracle อย่างง่าย

ตอนนี้เราได้ตั้งค่า Remix IDE และนำเข้าไลบรารี Chainlink ที่จำเป็นแล้ว เราจะสร้างสัญญาอัจฉริยะพื้นฐานที่ผสานรวมกับ Oracle สิ่งนี้จะทำให้เราสามารถดึงและจัดการข้อมูลภายนอกได้

การร่างสัญญา: พื้นฐานของการรวม Oracle

  1. เริ่มต้นด้วยพื้นฐาน:
    เริ่มต้นด้วยการกำหนดสัญญาของเรา ระบุเวอร์ชัน Solidity และนำเข้าไลบรารี Chainlink ที่เราจะใช้:
    ```
    ความแข็งแกร่ง
    // SPDX-ใบอนุญาต-ตัวระบุ: MIT

ความแข็งแกร่งของแพรกมา ^0.8.21;

นำเข้า “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;

สัญญา OracleIntegratedContract {
AggregatorV3Interface ราคาภายใน Feed;

// การมองเห็นสำหรับคอนสตรัคเตอร์ลบคอนสตรัคเตอร์ 
 รายการ (ที่อยู่ _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

1. 
ในส่วนนี้ เราได้ระบุว่าสัญญาของเราจะใช้ฟีดราคา Chainlink ตัวสร้างรับที่อยู่สำหรับสัญญาฟีดราคาบนเครือข่าย Ethereum

1. 
 การดึงข้อมูลจาก Oracle 

 1. 
 มาขยายสัญญาของเราเพื่อรับราคา Ethereum ล่าสุด:

ความแข็งแกร่ง
ฟังก์ชั่น getLatestEthPrice() ส่งคืนมุมมองสาธารณะ (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}


1. 
ฟังก์ชัน `latestRoundData()` จากอินเทอร์เฟซ Chainlink Aggregator ให้ข้อมูลที่หลากหลายแก่เรา รวมถึงราคาล่าสุด

## การจัดการการตอบสนองของ Oracle: การจัดการข้อมูลเมื่อได้รับ 

 ข้อมูลที่ดึงมาจาก oracles มักจะมาในรูปแบบดิบที่อาจไม่เหมาะสมกับความต้องการของเราในทันที การประมวลผลข้อมูลนี้อย่างถูกต้องภายในสัญญาอัจฉริยะของเราเป็นสิ่งสำคัญ: 



 1. 
 การจัดรูปแบบข้อมูล 

 1. 
สมมติว่า oracle ส่งกลับราคาของ Ethereum เป็น USD แต่คูณด้วย 10^8 เพื่อให้แน่ใจว่าไม่มีทศนิยม (พบได้ทั่วไปในการตั้งค่า oracle) หากต้องการรับราคาจริง คุณจะต้องจัดรูปแบบข้อมูล:

ความแข็งแกร่ง
ฟังก์ชั่น getFormattedEthPrice() ส่งคืนมุมมองสาธารณะ (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}


1. 
ฟังก์ชันนี้จะดึงราคาดิบแล้วหารด้วย 10^8 เพื่อให้ได้มูลค่าตามความเป็นจริง

1. 
 การจัดการข้อผิดพลาด 

 1. 
 คำนึงถึงความเป็นไปได้ที่ oracle ล้มเหลวในการดึงข้อมูลเสมอ:

ความแข็งแกร่ง
ฟังก์ชั่น safeGetLatestEthPrice() ส่งคืนมุมมองสาธารณะ (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}


1. 
 ในที่นี้ ฟังก์ชัน `latestRoundData()` ยังมีการประทับเวลาด้วย หากการประทับเวลาเป็น 0 อาจหมายความว่า Oracle ไม่สามารถดึงข้อมูลได้ และเราจัดการเรื่องนั้นด้วยคำสั่ง `require`
รหัสเต็มของคุณควรมีลักษณะดังนี้:

ความแข็งแกร่ง
// SPDX-ใบอนุญาต-ตัวระบุ: MIT

ความแข็งแกร่งของแพรกมา ^0.8.21;

นำเข้า “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;

สัญญา OracleIntegratedContract {
AggregatorV3Interface ราคาภายใน Feed;

// การมองเห็นสำหรับตัวสร้างที่ถูกลบออก 
 ตัวสร้าง (ที่อยู่ _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

ฟังก์ชั่น getLatestEthPrice() มุมมองสาธารณะส่งคืน (int) {
    (,int price,,,) = priceFeed.latestRoundData();
    return price;
}

ฟังก์ชั่น getFormattedEthPrice() มุมมองสาธารณะส่งคืน (int) {
    int rawPrice = getLatestEthPrice();
    return rawPrice / 10**8;
}

ฟังก์ชั่น safeGetLatestEthPrice() มุมมองสาธารณะ ส่งคืน (int) {
    (,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
    require(timestamp > 0, "Failed to fetch data from the oracle");
    return price;
}

}
```

เมื่อสิ้นสุดบทเรียนนี้ คุณควรมีสัญญาอัจฉริยะที่ผสานรวมกับ Oracle พื้นฐานที่ร่างไว้ภายใน Remix สัญญานี้จะดึงราคา Ethereum ล่าสุดและจัดการข้อมูลที่ส่งคืน ในบทเรียนถัดไป เราจะปรับใช้สัญญานี้และเจาะลึกเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดและความแตกต่างเล็กๆ น้อยๆ

إخلاء المسؤولية
* ينطوي الاستثمار في العملات الرقمية على مخاطر كبيرة. فيرجى المتابعة بحذر. ولا تهدف الدورة التدريبية إلى تقديم المشورة الاستثمارية.
* تم إنشاء الدورة التدريبية من قبل المؤلف الذي انضم إلى مركز التعلّم في Gate. ويُرجى العلم أنّ أي رأي يشاركه المؤلف لا يمثّل مركز التعلّم في Gate.