اوراکل قیمت روی زنجیره · فیدهای قیمت داراییهای دنیای واقعی
اوراکل قیمت برای قراردادهای هوشمند: فارکس، طلا، شاخصها و سهام روی زنجیره
یک گزارش قیمت امضاشده از API ما بگیرید و به قراردادتان بدهید. قرارداد تأییدکننده ما امضا را روی زنجیره بررسی میکند، پس قرارداد شما میتواند بدون اعتماد به پیامرسان به قیمت اعتماد کند.
چگونه کار میکند
- دریافت گزارش امضاشده:
GET /oracle/reportبا کلید API شما. - آن را در تراکنش خود ارسال کنید: قرارداد تأییدکننده ما امضا را با
ecrecoverبررسی میکند. - از قیمت تأییدشده استفاده کنید؛ اگر برای کاربرد شما خیلی قدیمی است ردش کنید.
گزارشها دادههای تایپشده EIP-712 PriceReport(bytes32 feedId,int256 price,uint64 timestamp,uint64 validUntil,uint8 marketStatus,uint32 spreadBps) هستند، به یک زنجیره و یک قرارداد تأییدکننده گره خوردهاند (بدون استفاده مجدد در جای دیگر) و فقط تا validUntil پذیرفته میشوند، حدود یک دقیقه پس از امضا (انباشتن گزارشهای مساعد ممکن نیست). قیمتها میانگین خرید و فروش با 8 رقم اعشار هستند؛ spreadBps اسپرد خرید و فروش است. وقتی گزارشی را در تراکنش خودتان ارسال میکنید، گس آن را میپردازید. فیدهای پرتقاضا را رلهکننده ما هم گاهبهگاه روی زنجیره ذخیره میکند (خواندن رایگان)، اما همیشه عمر قیمت ذخیرهشده را بررسی کنید.
ساعات بازار
هر گزارش وضعیت بازار را اعلام میکند: OPEN (قیمت زنده، حداکثر 60 ثانیه قدیمی)، CLOSED (آخرین قیمت رسمی پیش از بسته شدن، برای همه یکسان، که هر زمان در مدت بسته بودن بازار امضا میشود) یا HALTED (معاملات متوقف). getPriceNoOlderThan فقط قیمتهای OPEN را برمیگرداند، پس قیمت بسته شدن هرگز بهجای قیمت زنده پذیرفته نمیشود. توکنهای پشتوانهدار باید سفارشهایی را که در زمان بسته بودن بازار ثبت شدهاند با قیمت OPEN بعدی تسویه کنند (قیمتگذاری پیشرو، همان کاری که صندوقها و ETFها میکنند).
مدارشکن
هر فید میتواند حداکثر جهش مجاز داشته باشد. حرکت بزرگتر ذخیره نمیشود: فید تا زمانی که ما آن را بررسی و دوباره باز کنیم متوقف میماند، پس قیمت نادرست یا دستکاریشده هرگز به قرارداد شما نمیرسد.
فیدها
| نماد | feedId |
|---|---|
| AUDUSD | 0x5577fa17b1be8ae0f1517fe1864ea534d6992f3721000cdb6585b11e7046d5ec |
| EURGBP | 0xeaff3420d70d388655273db9b4f3000962445a6f0ea23ec1f04d843e4dbae4b0 |
| EURUSD | 0x0730076c3c0f5da594eb635c5d5a22116233bdb2a9c2977279cc348b8b8ce917 |
| GBPUSD | 0xd30842147b60fe333c2700bcae5eee6815b8529847955d19522858806bca8217 |
| IEF | 0x309dab183458dd939568dca0d68bea45d34aa25d31fa47fc5f12030e8f227f4e |
| OILCash# | 0xe21b90a237aa0663c02092eca221a0098c6c477054a61d05ecd3692f6631f6ff |
| SHY | 0x78f1083af8e72ddefc2e66fad95680c38a953b3136f413c61ab40f99b72991bc |
| SPY | 0xcea23e8f56b5ac447ac08d57e0808e35f468a65f29bb659b3d48934481e7c67a |
| TLT | 0x4abd434857e07567d49487ccf888348e55d5cfc15498c09a9dbcba2820e40ee4 |
| USDCAD | 0xa36f6cf3195abb4e93bf276660acee423f78878e6cfdbad0eab36e455afca97e |
| USDCHF | 0xd85af9ebd6fec6b317a7ac07f6d6455c4fc915cc8e1cfe19471faca002582907 |
| USDJPY | 0x3d6c40e9d821c10e442cb3fc6cb1c589ffd8b906e734a1ab3b3f7d213ac395d6 |
| USDSGD | 0x8a1375bd16e33aff9be7037f83e076defe9df6efea6d39a51d0b08f17ac9bc6d |
| XAGUSD | 0x67107df7f0e95594d9bf8ad8840bbb2ff95617123c227e10aab4d161dd6959b6 |
| XAUUSD | 0xe21c86d8b6a127bfef214d88fdb0c279e55d27dd8c443733e46c8d3de3c98cd6 |
شبکهها
| شبکه | شناسه زنجیره | قرارداد تأییدکننده |
|---|---|---|
| Optimism | 10 | 0xaeF7f701acFB42267015D3F593ce17CF536Afd6B |
| Optimism Sepolia تستنت | 11155420 | 0xBBf36E7Cd75494f28E02C5698EaD35fF4960a943 |
نشانی امضاکننده: 0x83fa2d8836525251FAd214A78A72038D0864f877. فهرست ماشینخوان: /oracle/feeds.
یکپارچهسازی
1. دریافت گزارش امضاشده
curl -H "Authorization: Bearer $API_KEY" \
"https://api.marketapi.app/v1/oracle/report?symbols=EURUSD&chain_id=10"
برای هر نماد report (تاپل کدگذاریشده ABI) و signature (۶۵ بایت) برمیگرداند. کلید شما به دامنه read:oracle نیاز دارد.
2. تأیید آن در قرارداد شما
interface IMarketApiOracle {
struct PriceReport { bytes32 feedId; int256 price; uint64 timestamp; uint64 validUntil;
uint8 marketStatus; uint32 spreadBps; }
function submit(PriceReport calldata r, bytes calldata sig) external returns (bool); // verifies, stores if newer
function getPriceNoOlderThan(bytes32 feedId, uint256 maxAge)
external view returns (int256 price, uint64 timestamp); // OPEN and fresh only, else reverts
function getPrice(bytes32 feedId) external view
returns (int256 price, uint64 timestamp, uint8 marketStatus, uint32 spreadBps); // incl. CLOSED
}
contract MyVault {
IMarketApiOracle immutable oracle;
bytes32 constant EURUSD = keccak256("EURUSD");
constructor(IMarketApiOracle o) { oracle = o; }
function act(IMarketApiOracle.PriceReport calldata r, bytes calldata sig) external {
oracle.submit(r, sig); // reverts on a bad signature
(int256 price, ) = oracle.getPriceNoOlderThan(EURUSD, 60); // 8 decimals
// ... use price ...
}
}
مصرفکنندگان به سبک Chainlink میتوانند فید را از طریق MarketApiFeedAdapter بخوانند (latestRoundData()، AggregatorV3Interface).
تعرفهها
5 اعتبار برای هر گزارش امضاشده، پرداخت از موجودی عادی API شما. خواندن قیمتهایی که از قبل روی زنجیره ذخیره شدهاند رایگان است.
کاربردهای فیدهای قیمت روی زنجیره ما
- داراییهای توکنیزه و RWA: سهام توکنیزه، توکنهای پشتوانهدار طلا و دیگر داراییهای دنیای واقعی را با دادههای قیمتی که ساعات بازار را در نظر میگیرند قیمتگذاری کنید.
- وامدهی DeFi و وثیقه: وثیقههای مبتنی بر فارکس و کالا را با قیمتهای تازه و قابل تأیید و بررسیهای تازگی ایمن برای لیکوئید شدن ارزشگذاری کنید.
- داراییهای مصنوعی و FX روی زنجیره: موقعیتهای مصنوعی فارکس، شاخص و کالا را با قیمتهای مرجع امضاشده تسویه کنید.
- استیبلکوینها و پرداختها: با نرخهای زنده EUR/USD، GBP/USD و دیگر نرخهای فارکس، ارزها را روی زنجیره تبدیل کنید.
چرا یک اوراکل کششی امضاشده؟
اوراکلهای فشاری طبق برنامه بهروزرسانی میشوند و کسی گس هر بهروزرسانی را میپردازد. با اوراکل کششی، قرارداد شما دقیقاً وقتی نیاز دارد یک قیمت تازه با امضای رمزنگاریشده میگیرد: هزینه کمتر، داده تازهتر و همان تأیید روی زنجیره. وضعیت بازار، اسپرد خرید و فروش و انقضا بخشی از هر گزارش امضاشدهاند.
پرسشهای متداول اوراکل قیمت
اوراکل قیمت بلاکچین چیست؟
اوراکل قیمت، قیمتهای بازار خارج از زنجیره را به قراردادهای هوشمند میرساند. اوراکل ما هر قیمت را با امضای EIP-712 امضا میکند؛ قرارداد شما پیش از استفاده آن را روی زنجیره با ecrecover تأیید میکند، پس قیمت در مسیر جعل نمیشود.
فیدهای قیمت چه داراییهایی را پوشش میدهند؟
جفتارزهایی مانند EUR/USD، فلزات گرانبها مانند طلا (XAU/USD) و نقره، شاخصهای سهام و سهام منفرد، طبق فهرست فیدهای منتشرشده در این صفحه. هر فید یک feedId ثابت دارد (keccak256 نماد).
آیا برای RWA و داراییهای توکنیزه مناسب است؟
بله. گزارشها وضعیت بازار (باز، بسته، متوقف) را دارند، پس سهام توکنیزه، کالاها و دیگر داراییهای دنیای واقعی میتوانند خارج از ساعات بازار قیمتگذاری پیشرو به کار ببرند، نه معامله با قیمت کهنه.
آیا اوراکل با Chainlink سازگار است؟
هر فید را میتوان از طریق آداپتوری خواند که Chainlink AggregatorV3Interface (latestRoundData) را پیادهسازی میکند، پس کد DeFi موجودی که فیدهای قیمت به سبک Chainlink را میخواند با کمترین تغییر کار میکند.
از دستکاری چگونه جلوگیری میشود؟
گزارشها حدود یک دقیقهای منقضی میشوند و باید از قیمت ذخیرهشده جدیدتر باشند، یک مدارشکن برای هر فید پس از جهش غیرعادی فید را متوقف میکند، و با چند کارگزار، قیمت میانه منابع مستقل پس از حذف دادههای پرت است.
کارمزد گس را چه کسی میپردازد؟
این یک اوراکل کششی است: برنامه شما گزارش امضاشده را در تراکنش خودش ارسال میکند و گس آن را میپردازد. رلهکننده ما هم فیدهای پرتقاضا را گاهبهگاه روی زنجیره ذخیره میکند؛ خواندن قیمتهای ذخیرهشده رایگان است، اما پیش از استفاده عمرشان را بررسی کنید.
کدام بلاکچینها پشتیبانی میشوند؟
هر زنجیره EVM که قرارداد تأییدکننده روی آن مستقر شده باشد، برای مثال Ethereum، Base، Arbitrum، Optimism، BNB Smart Chain و Polygon و تستنتهایشان؛ فهرست فعلی در بالا آمده است.
توصیهشده: الگوی کششی (قیمتهای همیشه تازه)
به قیمتی که از قبل روی زنجیره ذخیره شده تکیه نکنید. یک گزارش تازه امضاشده بگیرید و آن را در همان تراکنشی که از آن استفاده میکند ارسال کنید: قرارداد شما همیشه قیمت فعلی را میبیند و فقط هزینه بهروزرسانیهای خودتان را میپردازید.
// 1) off-chain: GET https://api.marketapi.app/v1/oracle/report?symbols=EURUSD&chain_id=CHAIN_ID (header: Authorization: Bearer KEY)
// 2) on-chain: verify, store and use the report atomically
interface IMarketApiOracle {
struct PriceReport { bytes32 feedId; int256 price; uint64 timestamp; uint64 validUntil; uint8 marketStatus; uint32 spreadBps; }
function submit(PriceReport calldata r, bytes calldata sig) external returns (bool);
function getPriceNoOlderThan(bytes32 feedId, uint256 maxAge) external view returns (int256 price, uint64 timestamp);
}
contract MyVault {
IMarketApiOracle immutable oracle;
bytes32 constant EURUSD = keccak256("EURUSD");
constructor(IMarketApiOracle o) { oracle = o; }
function settle(IMarketApiOracle.PriceReport calldata r, bytes calldata sig) external {
oracle.submit(r, sig); // ignored if an equal/newer price is stored
(int256 price, ) = oracle.getPriceNoOlderThan(EURUSD, 60); // reverts unless OPEN and fresh
// ... use price (8 decimals)
}
}
فیلدهای report و signature گزارش از API دقیقاً دو آرگومان submit هستند. گزارشها حدود یک دقیقه معتبرند، پس درست پیش از ارسال تراکنش دریافتشان کنید.
هشدار ریسک. قیمتها دادههای بازار تقریبی از منبع ما هستند، نه یک محل اجرای معامله. قراردادهای هوشمندی که بر اساس هر اوراکلی وجوه را جابهجا میکنند باید تازگی را بررسی کنند، بهروزرسانیهای جاافتاده را مدیریت کنند و اثر قیمت نادرست را محدود کنند. پیش از اتکا به اوراکل در محیط عملیاتی، شرایط را بخوانید.