﻿---
title: "预言机价格陈旧"
description: "当预言机价格记录的更新时间早于特定操作允许的最大期限时，该价格对该消费者而言即属陈旧；安全处理还须验证数据源、排序器、备用机制及受控恢复。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 预言机价格陈旧

> 仅供教育参考，不构成投资建议；投资可能产生损失。

<a id="answer"></a>

## 直接答案

当 `age = consumerClock - sourceTimestamp` 超过该操作配置的 `maxAge` 时，预言机数值对特定消费者操作而言即属陈旧。价格没有变化仍可能是新鲜的，而刚发布的数值仍可能在经济上错误。消费者必须先拒绝缺失或未来的时间戳及无效答案，再应用针对数据源、资产、链、市场时段和操作的验收政策。

心跳与偏差阈值是发布触发条件，并非新鲜度保证或服务等级协议。触发后报告仍可能延迟，市场变动也可能低于偏差阈值，而某项操作要求更严格的最大期限。拉取式预言机还有另一项边界：调用者可能须先提交经过认证的更新再读取，合约则必须拒绝早于其规定期限的更新。

在 L2 上，排序器状态与恢复宽限期构成独立门槛。通过该门槛并不能证明资产价格新鲜、L2 已最终确认或所有用户均有平等访问机会。备用价格和最后有效价格是受控降级模式，不是真相；每个来源与恢复路径都需要明确单位、时间戳、独立性、权限、允许操作及对账规则。

<a id="mechanism"></a>

## 运作机制

1. 固定链、区块与时钟、消费者合约与操作、数据源代理与聚合器、资产对与小数位、接口版本、备用配置及升级状态。
2. 通过已部署接口读取精确响应，并处理回退或无数据状态。先验证答案、状态或适用的置信度，以及 `sourceTimestamp != 0` 和 `sourceTimestamp <= consumerClock`，然后再做减法。
3. 记录心跳、偏差、市场时段与发布配置，再为每项操作独立设置 `maxAge`。明确规定边界，例如接受 `age <= maxAge`，拒绝 `age > maxAge`。
4. 在支持的 L2 部署上，验证排序器数据源的初始化和状态，依据文档规定的字段计算恢复后经过时间，执行配置的宽限期，再单独检查价格新鲜度。
5. 追踪复合价格、比率价格和备用价格的每个必要组成部分。统一方向与单位，并以最陈旧的必要依赖项限制有效新鲜度，而非采用最新时间戳。
6. 按操作定义正常、降级和暂停状态。新增借款、铸造或杠杆可以安全关闭，同时允许还款或增加抵押品；以陈旧价、备用价和恢复价测试风险敞口、流动性及清算执行者容量。
7. 监控来源与代理变更、更新延迟、拒绝率、排序器状态、跨来源偏差及市场时段；演练中断、备用失败、跳价恢复、集中清算、MEV、坏账核算及恢复正常模式。

对于 Chainlink 风格的接口，`latestRoundData()` 可以提供轮次标识符、带符号答案、开始时间、更新时间和旧版轮次字段。当前 API 将 `answeredInRound` 标为已弃用，因此不能把历史上的不等式检查表述为当前通用规则；必须检查具体代理、聚合器和实现。时间戳表示文档所述数据源状态的更新时间，并不说明该数值可按任意规模成交。Solidity 的 `block.timestamp` 是共识约束下的当前区块时间戳，不是外部挂钟预言机。

<a id="example"></a>

## 计算示例

- **最大期限边界。** 设 `consumerClock = 1,800,000,000`，`sourceTimestamp = 1,799,999,100`，则 `age = 900 seconds = 15 minutes`。`maxAge = 600 seconds` 的政策会因超出 `300 seconds` 而拒绝；`maxAge = 1,200 seconds` 的政策则接受，并留有 `300 seconds` 余量。因此，同一数据源数值可对一项操作有效，对另一项操作陈旧。
- **触发条件并非新鲜度。** 上次发布价格为 `100.00`，偏差触发值为 `1%`，心跳为 `3,600 seconds`。经过 `2,700 seconds` 后，市场观察价 `100.80` 仅偏离 `0.8%`，两个教学触发条件均未触发。价格达到 `101.20` 时偏差为 `1.2%`，可能启动发布，但在有效新报告上链前，消费者仍会读到 `100.00`。
- **L2 双重门槛。** 排序器数据源报告正常，`startedAt = 1,799,996,400`、`consumerClock = 1,800,000,000`、`grace = 3,600 seconds`，所以经过时间恰为 `3,600 seconds`。若政策在 `elapsed <= grace` 时阻止操作，该操作仍被阻止，到 `3,601 seconds` 才符合条件。是否最终可执行仍取决于独立的价格时间戳、答案及消费者的其他检查。
- **恢复断崖。** 抵押品为 `10 ETH`、债务为 `12,000 USD`、清算阈值为 `75%` 时，陈旧的 `2,000 USD/ETH` 价格给出 `healthFactor = 10 * 2,000 * 0.75 / 12,000 = 1.25`。恢复后的 `1,400 USD/ETH` 价格给出 `0.875`。按这些教学输入，该账户变为符合清算条件，但实际执行仍取决于协议规则、流动性、清算执行者、燃料费、排序及链可用性。

<a id="risks"></a>

## 风险

- 链、数据源、代理、聚合器、资产对或接口版本错误。
- 消费者读取不带时间戳或文档所述状态的答案。
- 未拒绝缺失的零时间戳、未来时间戳或减法下溢。
- 对资产、操作、市场时段或波动性而言，最大期限过于宽松。
- 最大期限过严，造成拒绝服务或阻止降低风险。
- 把心跳视为保证的发布时间期限或服务等级协议。
- 未触发偏差阈值时，低于阈值的漂移或基差持续累积。
- 已触发的报告因来源、签名者、网络、燃料费、中继或链故障而延迟。
- 把已弃用或特定实现的轮次检查普遍应用。
- 数据源、代理、聚合器、心跳、偏差或接口配置变化未被发现。
- 忽略休市、假日、暂停交易或结转数据的语义。
- 复合或比率价格看似新鲜，但必要组成部分之一已陈旧。
- L2 排序器状态被忽略、未初始化、延迟或从错误网络读取。
- 恢复宽限期缺失、配置错误或存在差一边界错误。
- 排序器状态通过，但资产价格仍陈旧或不可用。
- 混淆 L1 时间、L2 区块时间、来源观察时间、发布时间与挂钟时间。
- 拉取式更新缺失、过旧、被选择性提交、格式错误或资金不足。
- 备用价或最后有效价格陈旧、高度相关、尺度不同或形成循环依赖。
- 开放式失败允许不安全操作，而一律关闭会阻止还款、增加抵押品或有序恢复。
- 恢复跳价、清算聚集、MEV、流动性不足、暂停竞态或坏账对账导致次生损失。

<a id="misconceptions"></a>

## 常见误区

- **“心跳保证每个间隔都有新鲜更新。”** 它只是更新触发配置，来源或链故障仍会延迟发布。
- **“近期时间戳证明价格正确且可成交。”** 它只证明文档所述更新时间；来源质量、单位、置信度、市场深度及消费者逻辑仍是独立问题。
- **“一个最大期限适用于所有数据源和操作。”** 资产、市场时段、链，以及借款、清算、交易与结算操作有不同延迟和活性需求。
- **“排序器恢复就能立即恢复所有操作。”** 恢复宽限期和价格新鲜度是独立门槛，协议或链安全政策还可能增加更多条件。
- **“备用机制或让所有函数回退总是最安全。”** 薄弱的备用机制会错误定价风险，而无差别失败会阻止用户还款或改善抵押率。

<a id="related"></a>

## 相关主题

- [预言机](/zh-cn/crypto/oracle/)
- [预言机攻击](/zh-cn/crypto/oracle-attack/)
- [排序器停机响应](/zh-cn/crypto/sequencer-downtime-response/)

<a id="sources"></a>

## 来源

- [Chainlink Data Feeds](https://docs.chain.link/data-feeds) - Chainlink Documentation（查阅日期：2026-08-13）
- [Data Feeds API Reference](https://docs.chain.link/data-feeds/api-reference) - Chainlink Documentation（查阅日期：2026-08-13）
- [Developer Responsibilities](https://docs.chain.link/data-feeds/developer-responsibilities) - Chainlink Documentation（查阅日期：2026-08-13）
- [L2 Sequencer Uptime Feeds](https://docs.chain.link/data-feeds/l2-sequencer-feeds) - Chainlink Documentation（查阅日期：2026-08-13）
- [How to Use Real-Time Data in EVM Contracts](https://docs.pyth.network/price-feeds/core/use-real-time-data/pull-integration/evm) - Pyth Developer Hub（查阅日期：2026-08-13）
- [Best Practices](https://docs.pyth.network/price-feeds/core/best-practices) - Pyth Developer Hub（查阅日期：2026-08-13）
- [Units and Globally Available Variables](https://docs.soliditylang.org/en/latest/units-and-global-variables.html) - Solidity Documentation（查阅日期：2026-08-13）
- [SC03:2026 Price Oracle Manipulation](https://scs.owasp.org/sctop10/SC03-PriceOracleManipulation/) - OWASP Smart Contract Security（查阅日期：2026-08-13）

Source: https://wiki.fcontext.com/zh-cn/crypto/oracle-price-staleness/index.mdx
