แนวทางปฏิบัติที่ดี
รูปแบบการตรวจสอบ Health status API การตรวจสอบความเก่า และ checklist การรวมระบบ สำหรับการใช้งาน Chiliz Chain price feeds อย่างปลอดภัย
อัปเดตล่าสุด
สิ่งนี้มีประโยชน์หรือไม่?
รูปแบบการตรวจสอบ Health status API การตรวจสอบความเก่า และ checklist การรวมระบบ สำหรับการใช้งาน Chiliz Chain price feeds อย่างปลอดภัย
latestRoundData() revert ด้วย NoDataAvailable() หากยังไม่มี round แต่ไม่บังคับตรวจสอบความเก่าหรือการ pause — คืนค่าที่เก็บไว้ตามที่เป็น ก่อนใช้ค่าราคาใดๆ ให้ตรวจสอบสามข้อเหล่านี้เสมอ:
ตรวจสอบ pause: เรียก paused() และปฏิเสธหาก feed ถูก paused
ตรวจสอบ answer เป็นบวก: กำหนดให้ answer > 0
ตรวจสอบความเก่า: ใช้ getHealthStatus().isHealthy เป็นเงื่อนไข
ตัวอย่าง getSafePrice() ใน การอ่านราคา รองรับทั้งสามข้อ
PriceFeed แต่ละรายการเปิดเผย view getHealthStatus() ที่รวบรวมข้อมูลความสดในการเรียกครั้งเดียว:
function getHealthStatus()
external view
returns (
uint256 lastUpdateTimestamp,
uint256 totalRounds,
uint256 timeSinceLastUpdate,
bool isHealthy
);lastUpdateTimestamp
updatedAt ของ round ล่าสุด
totalRounds
จำนวน round ทั้งหมดที่เขียน
timeSinceLastUpdate
block.timestamp - lastUpdateTimestamp (หรือ block.timestamp หากไม่มีข้อมูล)
isHealthy
true หาก timeSinceLastUpdate <= updateInterval × healthFactor
health factor ถูกกำหนดค่าเริ่มต้นเป็น 2 แต่สามารถกำหนดค่าต่อ feed โดย oracle admin ผ่าน setHealthFactor() อย่า hardcode 2 — อ่านโดยตรงจาก contract:
health window คือ updateInterval × healthFactor ซึ่งกำหนดค่าต่อ feed — updateInterval คือระยะห่างขั้นต่ำ on-chain ขนาดเล็ก ไม่ใช่ heartbeat ซึ่งแตกต่างกันต่อ feed: CHZ/USDC ใช้ 5s × 720 = window 1 ชั่วโมง PEPPER/CHZ ใช้ 10s × 720 = window 2 ชั่วโมง ในขณะที่ off-chain pipeline ส่งข้อมูลตาม heartbeat ~1 ชั่วโมง อย่าใช้ updateInterval เพียงอย่างเดียวเป็นเกณฑ์ความเก่า — ใช้ isHealthy เป็นเงื่อนไข — ดู getSafePrice() ใน การอ่านราคา สำหรับรูปแบบฉบับสมบูรณ์
ใช้ getAllOracleHealthStatus() บน OracleFactoryReader เพื่อตรวจสอบทุก feed ในระบบพร้อมกัน — มีประโยชน์สำหรับ dashboard และการแจ้งเตือน off-chain
decimals()คู่แต่ละคู่มีความแม่นยำ decimal ของตัวเอง — เรียก decimals() เสมอเพื่อยืนยันก่อนตีความค่าราคา Decimals ถูกกำหนดในช่วง deployment และไม่เปลี่ยนแปลง ดังนั้นให้อ่านครั้งเดียวตอน contract initialization แทนการอ่านทุกครั้งที่อ่านราคา:
ในกรณีฉุกเฉิน oracle manager สามารถ pause feed ได้ จัดการ revert ที่เกิดขึ้นอย่างสะอาดแทนการใช้ค่าที่ไม่ดีโดยเงียบ:
Price Oracle Tracker ให้คุณเปรียบเทียบราคา on-chain กับ CoinMarketCap และ CoinGecko แบบเรียลไทม์ ทำให้ง่ายต่อการตรวจสอบความแม่นยำของ feed ระหว่างการรวมระบบ รวมถึงแสดงสถานะสุขภาพสด พารามิเตอร์ heartbeat และที่อยู่ contract แต่ละรายการสำหรับทุกคู่
อัปเดตล่าสุด
สิ่งนี้มีประโยชน์หรือไม่?
สิ่งนี้มีประโยชน์หรือไม่?
uint80 factor = priceFeed.healthFactor(); // per-feed; do NOT assume the default of 2 (live feeds use 720)uint8 public immutable feedDecimals;
constructor(address _feed) {
priceFeed = IChilizPriceFeed(_feed);
feedDecimals = priceFeed.decimals();
}require(!priceFeed.paused(), "Feed paused");