链上价格预言机 · 现实世界资产价格源
面向智能合约的价格预言机:外汇、黄金、指数和股票上链
从我们的 API 获取签名价格报告并传给您的合约。我们的验证合约会在链上检查签名,因此您的合约无需信任传递者即可信任该价格。
运作方式
- 获取签名报告:使用您的 API 密钥调用
GET /oracle/report。 - 在您的交易中提交它:我们的验证合约使用
ecrecover检查签名。 - 使用已验证的价格;如果对您的用例来说太旧,则拒绝它。
报告是 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 |
|---|---|
| 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 |
网络
| 网络 | 链 ID | 验证合约 |
|---|---|---|
| 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(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 余额中扣除。读取已存储在链上的价格是免费的。
我们链上价格源的应用场景
- 代币化资产与 RWA:使用考虑交易时段的价格数据,为代币化股票、黄金支持代币及其他现实世界资产定价。
- DeFi 借贷与抵押品:使用新鲜、可验证的价格以及可防止错误清算的时效检查,为外汇和大宗商品支持的抵押品估值。
- 合成资产与链上外汇:以签名参考价格结算合成外汇、指数和大宗商品头寸。
- 稳定币与支付:使用实时 EUR/USD、GBP/USD 及其他外汇汇率在链上进行货币兑换。
为什么选择签名拉取式预言机?
推送式预言机按计划更新,每次更新都有人支付 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 的两个参数。报告有效期约一分钟,因此请在发送交易前即时获取。
风险提示。价格是来自我们数据源的指示性市场数据,并非交易执行场所。基于任何预言机转移资金的智能合约都必须检查时效、处理缺失的更新,并限制错误价格的影响。在生产环境中依赖该预言机之前,请阅读条款。