اوراکل قیمت روی زنجیره · فیدهای قیمت دارایی‌های دنیای واقعی

اوراکل قیمت برای قراردادهای هوشمند: فارکس، طلا، شاخص‌ها و سهام روی زنجیره

یک گزارش قیمت امضاشده از API ما بگیرید و به قراردادتان بدهید. قرارداد تأییدکننده ما امضا را روی زنجیره بررسی می‌کند، پس قرارداد شما می‌تواند بدون اعتماد به پیام‌رسان به قیمت اعتماد کند.

چگونه کار می‌کند

  1. دریافت گزارش امضاشده: GET /oracle/report با کلید API شما.
  2. آن را در تراکنش خود ارسال کنید: قرارداد تأییدکننده ما امضا را با ecrecover بررسی می‌کند.
  3. از قیمت تأییدشده استفاده کنید؛ اگر برای کاربرد شما خیلی قدیمی است ردش کنید.

گزارش‌ها داده‌های تایپ‌شده 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
AUDUSD0x5577fa17b1be8ae0f1517fe1864ea534d6992f3721000cdb6585b11e7046d5ec
EURGBP0xeaff3420d70d388655273db9b4f3000962445a6f0ea23ec1f04d843e4dbae4b0
EURUSD0x0730076c3c0f5da594eb635c5d5a22116233bdb2a9c2977279cc348b8b8ce917
GBPUSD0xd30842147b60fe333c2700bcae5eee6815b8529847955d19522858806bca8217
IEF0x309dab183458dd939568dca0d68bea45d34aa25d31fa47fc5f12030e8f227f4e
OILCash#0xe21b90a237aa0663c02092eca221a0098c6c477054a61d05ecd3692f6631f6ff
SHY0x78f1083af8e72ddefc2e66fad95680c38a953b3136f413c61ab40f99b72991bc
SPY0xcea23e8f56b5ac447ac08d57e0808e35f468a65f29bb659b3d48934481e7c67a
TLT0x4abd434857e07567d49487ccf888348e55d5cfc15498c09a9dbcba2820e40ee4
USDCAD0xa36f6cf3195abb4e93bf276660acee423f78878e6cfdbad0eab36e455afca97e
USDCHF0xd85af9ebd6fec6b317a7ac07f6d6455c4fc915cc8e1cfe19471faca002582907
USDJPY0x3d6c40e9d821c10e442cb3fc6cb1c589ffd8b906e734a1ab3b3f7d213ac395d6
USDSGD0x8a1375bd16e33aff9be7037f83e076defe9df6efea6d39a51d0b08f17ac9bc6d
XAGUSD0x67107df7f0e95594d9bf8ad8840bbb2ff95617123c227e10aab4d161dd6959b6
XAUUSD0xe21c86d8b6a127bfef214d88fdb0c279e55d27dd8c443733e46c8d3de3c98cd6

شبکه‌ها

شبکهشناسه زنجیرهقرارداد تأییدکننده
Optimism100xaeF7f701acFB42267015D3F593ce17CF536Afd6B
Optimism Sepolia تست‌نت111554200xBBf36E7Cd75494f28E02C5698EaD35fF4960a943

نشانی امضاکننده: 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 شما. خواندن قیمت‌هایی که از قبل روی زنجیره ذخیره شده‌اند رایگان است.

کاربردهای فیدهای قیمت روی زنجیره ما

چرا یک اوراکل کششی امضاشده؟

اوراکل‌های فشاری طبق برنامه به‌روزرسانی می‌شوند و کسی گس هر به‌روزرسانی را می‌پردازد. با اوراکل کششی، قرارداد شما دقیقاً وقتی نیاز دارد یک قیمت تازه با امضای رمزنگاری‌شده می‌گیرد: هزینه کمتر، داده تازه‌تر و همان تأیید روی زنجیره. وضعیت بازار، اسپرد خرید و فروش و انقضا بخشی از هر گزارش امضاشده‌اند.

پرسش‌های متداول اوراکل قیمت

اوراکل قیمت بلاکچین چیست؟

اوراکل قیمت، قیمت‌های بازار خارج از زنجیره را به قراردادهای هوشمند می‌رساند. اوراکل ما هر قیمت را با امضای 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 هستند. گزارش‌ها حدود یک دقیقه معتبرند، پس درست پیش از ارسال تراکنش دریافتشان کنید.

هشدار ریسک. قیمت‌ها داده‌های بازار تقریبی از منبع ما هستند، نه یک محل اجرای معامله. قراردادهای هوشمندی که بر اساس هر اوراکلی وجوه را جابه‌جا می‌کنند باید تازگی را بررسی کنند، به‌روزرسانی‌های جاافتاده را مدیریت کنند و اثر قیمت نادرست را محدود کنند. پیش از اتکا به اوراکل در محیط عملیاتی، شرایط را بخوانید.