链上价格预言机 · 现实世界资产价格源

面向智能合约的价格预言机:外汇、黄金、指数和股票上链

从我们的 API 获取签名价格报告并传给您的合约。我们的验证合约会在链上检查签名,因此您的合约无需信任传递者即可信任该价格。

运作方式

  1. 获取签名报告:使用您的 API 密钥调用 GET /oracle/report。
  2. 在您的交易中提交它:我们的验证合约使用 ecrecover 检查签名。
  3. 使用已验证的价格;如果对您的用例来说太旧,则拒绝它。

报告是 EIP-712 类型化数据 PriceReport(bytes32 feedId,int256 price,uint64 timestamp,uint64 validUntil,uint8 marketStatus,uint32 spreadBps),绑定到一条链和一个验证合约(无法在别处重放),且仅在 validUntil 之前被接受,约为签名后一分钟(无法囤积有利报告)。价格为买价和卖价的中间价,保留 8 位小数;spreadBps 为买卖价差。当您在自己的交易中提交报告时,由您支付该 Gas。需求较大的价格源也会由我们的中继器不定期存储到链上(可免费读取),但请始终检查已存储价格的时效。

交易时段

每份报告都注明市场状态: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

网络

网络链 ID验证合约
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(65 字节)。您的密钥需要 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 余额中扣除。读取已存储在链上的价格是免费的。

我们链上价格源的应用场景

为什么选择签名拉取式预言机?

推送式预言机按计划更新,每次更新都有人支付 Gas。使用拉取式预言机,您的合约在需要时才获取新鲜的、经加密签名的价格:成本更低、数据更新鲜,且链上验证不变。市场状态、买卖价差和到期时间都包含在每份签名报告中。

价格预言机常见问题

什么是区块链价格预言机?

价格预言机将链下市场价格带入智能合约。我们的预言机用 EIP-712 签名对每个价格签名;您的合约在使用前通过 ecrecover 在链上验证,因此价格在传输过程中无法被伪造。

价格源涵盖哪些资产?

外汇货币对(如 EUR/USD)、贵金属(如黄金 XAU/USD 和白银)、股票指数和个股,以本页发布的价格源列表为准。每个价格源都有固定的 feedId(代码的 keccak256)。

它适用于 RWA 和代币化资产吗?

是的。报告包含市场状态(开市、休市、暂停),因此代币化股票、大宗商品和其他现实世界资产可以在交易时段外采用远期定价,而不是按过时价格交易。

该预言机与 Chainlink 兼容吗?

每个价格源都可通过实现 Chainlink AggregatorV3Interface(latestRoundData)的适配器读取,因此读取 Chainlink 风格价格源的现有 DeFi 代码只需极少改动即可使用。

如何防止操纵?

报告约一分钟内过期,且必须比已存储价格更新;每个价格源的熔断机制会在异常跳动后暂停该价格源;在有多个经纪商时,价格取剔除异常值后各独立来源的中位数。

谁支付 Gas 费?

这是一个拉取式预言机:您的应用在自己的交易中提交签名报告并支付相应 Gas。我们的中继器也会不定期将需求较大的价格源存储到链上;读取已存储的价格是免费的,但使用前请检查其时效。

支持哪些区块链?

任何部署了验证合约的 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)
    }
}

API 返回报告中的 report 和 signature 字段正是 submit 的两个参数。报告有效期约一分钟,因此请在发送交易前即时获取。

风险提示。价格是来自我们数据源的指示性市场数据,并非交易执行场所。基于任何预言机转移资金的智能合约都必须检查时效、处理缺失的更新,并限制错误价格的影响。在生产环境中依赖该预言机之前,请阅读条款。