﻿---
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-tw/crypto/oracle/)
- [預言機攻擊](/zh-tw/crypto/oracle-attack/)
- [排序器停機應變](/zh-tw/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-tw/crypto/oracle-price-staleness/index.mdx
