Đọc giá
Tìm địa chỉ hợp đồng PriceFeed, kết nối bằng giao diện Chainlink, và đọc giá hiện tại với xác thực đúng cách.
Bước 1: Tìm Địa Chỉ Oracle
Ba cách để tìm địa chỉ hợp đồng PriceFeed cho một cặp nhất định:
Price Oracle Tracker (dễ nhất trong khi phát triển): price-oracle-tracker.vercel.app (hiển thị tất cả các cặp đã triển khai, giá trực tiếp, decimals, heartbeat, và địa chỉ).
On-chain qua OracleFactory: gọi
pairToOracle(string pair). Ký hiệu cặp phải được truyền bằng chữ hoa (ví dụ:"PSG/USDT"); factory không chuẩn hóa đầu vào khi đọc.Bulk on-chain qua OracleFactoryReader: gọi
getActiveOracles()để lấy tất cả các cặp đang hoạt động và địa chỉ của chúng trong một lần gọi.
interface IOracleFactory {
function pairToOracle(string memory pair) external view returns (address);
function getOracleCount() external view returns (uint256);
}
function resolveFeed(address factory, string memory pair)
external view returns (address)
{
// Pair symbol must be passed in uppercase (e.g. "PSG/USDT").
return IOracleFactory(factory).pairToOracle(pair);
}Bước 2: Kết Nối Bằng Giao Diện
Hợp đồng PriceFeed triển khai IAggregatorV3Interface chuẩn của Chainlink, cộng với các phần mở rộng riêng của Chiliz cho trạng thái sức khỏe và tạm dừng.
Bước 3: Đọc Giá
Nguồn giá không revert khi ở trạng thái stale hoặc bị tạm dừng: đây là có chủ ý. latestRoundData() revert với NoDataAvailable() nếu chưa có round nào, nhưng không kiểm tra xem nguồn giá có bị tạm dừng hay stale không. Điều này phù hợp với thiết kế Chainlink AggregatorV3Interface: người dùng có trách nhiệm kiểm tra paused() và getHealthStatus() trước khi sử dụng giá. Lưu ý: các hàm helper scalar (latestAnswer(), latestTimestamp(), getAnswer(), getTimestamp()) trả về 0 thay vì revert khi không có dữ liệu. Xem Thực Hành Tốt Nhất để biết mẫu xác thực đầy đủ.
Hàm chính là latestRoundData(), trả về giá hiện tại cùng với metadata round và timestamp.
Nếu giao thức của bạn sử dụng decimals gốc của nguồn giá thay vì chuẩn hóa về 18:
Dữ Liệu Lịch Sử
Oracle lưu trữ tất cả dữ liệu round lịch sử on-chain. Mỗi lần cập nhật giá tạo ra một round mới với roundId tăng dần.
Các hàm helper view bổ sung được cung cấp bởi Chiliz feed:
latestAnswer()
Giá mới nhất, hoặc 0 nếu không có
latestTimestamp()
updatedAt mới nhất, hoặc 0 nếu không có
latestRound()
ID round hiện tại
getAnswer(uint80 roundId)
Giá cho một round cụ thể, hoặc 0
getTimestamp(uint80 roundId)
Timestamp cho một round cụ thể, hoặc 0
getRoundsData(uint80[] roundIds)
Mảng RoundData hàng loạt
roundExists(uint80 roundId)
true nếu updatedAt > 0
Sự Kiện
Mỗi hợp đồng PriceFeed phát ra:
AnswerUpdated(int256 indexed current, uint80 indexed roundId, uint256 updatedAt): phát ra mỗi lần cập nhật giá. Lọc theo giá hoặc round.NewRound(uint80 indexed roundId, address indexed startedBy, uint256 startedAt): phát ra khi bắt đầu một round mới. Lọc theo round hoặc theo địa chỉ đã bắt đầu nó.
Hàm Khám Phá (OracleFactoryReader)
getActiveOracles()
Trả về tất cả các cặp đang hoạt động với địa chỉ oracle của chúng
getAllOracles()
Trả về tất cả oracle, bao gồm cả các oracle không hoạt động
getOraclesByPairs(string[] pairs)
Phân giải nhiều tên cặp thành địa chỉ oracle trong một lần gọi
getOracleHealthStatus(address oracle)
Trạng thái sức khỏe cho một oracle duy nhất
getAllOracleHealthStatus()
Trạng thái sức khỏe cho mọi oracle trong hệ thống
Cập nhật lần cuối
Nội dung này có hữu ích không?