﻿---
title: "TWAP 預言機"
description: "TWAP 預言機依特定協議的累積觀測值推導時間加權參考價；v2 算術價格與 v3 平均 tick 在數學、歷史、流動性及操縱邊界上均不相同。"
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.

# TWAP 預言機

> 僅供教育參考，不構成投資建議；投資可能產生損失。

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

## 直接答案

時間加權平均價格預言機依指定期間內的累積觀測值推導參考價。它不是一套通用公式。Uniswap v2 累積池中兩個方向的線性邊際價格，因此以端點差計算算術 TWAP；Uniswap v3 累積對數價格座標 tick，因此算術平均 tick 映射為相對價格的幾何平均值。

只有鎖定鏈、池、實作、費率級距、代幣順序、基準/報價方向、小數位數、期間端點、經過時間、已填入歷史及捨入規則，結果才有意義。成功讀取不代表公允價值或可成交深度。較長期間可稀釋短暫扭曲，卻會增加落後程度，也無法抵禦持續操縱、集中流動性缺口、提議者或排序器控制、重組，或可提取價值高於操縱成本的使用方。

觀測值時效與市場時效並不相同。現在算出的平均值可能刻意保留舊價格狀態；活躍池仍可能流動性薄弱或偏離外部市場。因此，使用方須檢查歷史、流動性與價格偏離，設定符合特定操作的限額，並明定降級或暫停行為。

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

## 運作機制

1. 鎖定鏈及區塊、工廠與池地址、協議版本和費率級距、`token0` 與 `token1`、小數位數、基準/報價方向、使用方操作、期間及風險價值。
2. 確認累積對象與單位：v2 的線性 `price0Cumulative` 或 `price1Cumulative`、v3 的 `tickCumulative`，或其他協議明文規定的統計量。不得在不同實作間套用同一平均方法。
3. 核對端點時間戳、正的經過時間、最早已初始化歷史、目前觀測容量，以及內插或反事實規則。`observationCardinalityNext` 是目標容量，不是已填入的歷史。
4. 對 v2，以累積價格變化除以經過秒數，再將固定點單位及代幣小數位數標準化。兩個報價方向須分別計算；反向算術 TWAP 通常不等於正向 TWAP 的倒數。
5. 對 v3，呼叫協議規定的觀測介面，以累積 tick 變化除以期間；若負商無法整除，應如 `OracleLibrary` 般向負無窮大捨入，再以 `price = 1.0001^tick` 將平均 tick 轉成標準化報價。
6. 衡量目前區間內、調和、寬區間、各費率級距及外部市場的流動性。壓力測試單區塊與多區塊路徑、費用、套利、排序、審查、平倉損失、重組、落後及使用方可提取價值。
7. 在明確的時效和偏離界限下，將 TWAP 與現貨及獨立參考值比較；監控歷史、流動性區間、池升級和鏈上狀況，並演練歷史不足、偏離、暫停、備援、清算及復原路徑。

Uniswap v2 儲存兩個方向的累積值，並隨時間推進。Uniswap v3 在循環緩衝區儲存觀測值，可以在觀測點間內插，也可建構目前的反事實累積值。這些建構端點符合協議運算規則，但不證明當時確有成交。提高容量只為未來觀測值保留空間，不會回填更早歷史。

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

## 計算範例

- **v2 累積價格。** 若 `C_start = 1,000,000 price-seconds`、`C_end = 1,360,000 price-seconds`，且 `elapsed = 3,600 seconds`，則 `TWAP = (1,360,000 - 1,000,000) / 3,600 = 100 quote/base`。端點、方向、縮放尺度和時間戳都是結果的一部分。
- **倒數陷阱。** 正向價格先以 `100` 持續 `900 seconds`，再以 `400` 持續 `900 seconds`，其算術 TWAP 為 `250`。反向現貨價分別為 `0.01` 及 `0.0025`；反向算術 TWAP 為 `0.00625`，其倒數是 `160`，並非 `250`。求平均與取倒數不能交換順序。
- **負平均 tick。** 設 `tickCumulativeDelta = -39,601`，期間為 `3,600 seconds`。Solidity 有號除法截斷後得到有餘數的 `-11`，但 v3 輔助程式庫向下取整為 `meanTick = -12`。相對幾何價格為 `1.0001^-12 = 0.998800779636`。正負號或捨入錯誤會系統性改變報價方向。
- **稀釋與落後。** 池價先以 `100` 持續 `1,740 seconds`，再以 `400` 持續 `60 seconds`，觀測期間為 `1,800-second`。v2 式算術 TWAP 為 `(100 * 1,740 + 400 * 60) / 1,800 = 110`；v3 式幾何平均為 `100^(29/30) * 400^(1/30) = 104.7294122821`。兩者都不同於目前現貨價 `400`，彼此也不相同；任何一個數值本身都不能說明操縱成本或可成交規模。

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

## 風險

- 鏈、工廠、池、費率級距、實作或升級狀態錯誤。
- 基準/報價或 `token0`/`token1` 方向顛倒。
- 代幣小數位數、固定點尺度或報價標準化錯誤。
- 將 v2 算術價格與 v3 幾何價格視為同一統計量。
- 以正向 TWAP 的倒數計算反向算術 TWAP。
- 使用錯誤的累積端點、經過時間、期間邊界或目前區塊。
- 未妥善處理零值、負值、回繞或實作特有的時間戳運算。
- 要求的歷史早於最早已初始化觀測值。
- 將 `observationCardinalityNext` 誤認為已填入的 `observationCardinality`。
- 將內插或反事實觀測值誤認為實際成交。
- 將負平均 tick 向零而非向負無窮大捨入。
- tick 轉換、整數範圍、溢位或報價捨入不安全。
- 活躍區間內或調和流動性不足以涵蓋受保護曝險。
- 操縱分析忽略寬區間深度缺失或流動性撤出。
- 流動性分散於不同池、費率級距、鏈或相關交易場所。
- 短期間仍容易受到單區塊、原子式或瞬時操縱影響。
- 長期間會落後於真實重新定價、脫鉤或流動性遷移。
- 多區塊提議者、排序器、審查、壅塞、MEV 或重組狀況妨礙價格修復或強化控制。
- 未檢查偏離及深度，便將 TWAP 視為具時效的公允價值或任意規模的可成交價。
- 使用方曝險高於操縱成本，而備援、熔斷、暫停、清算及復原機制並不安全。

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

## 常見迷思

- **「TWAP 一律是價格的算術平均值。」** v3 平均的是 tick，因此得到相對價格的幾何平均值。
- **「反向報價一定等於正向 TWAP 的倒數。」** 分別平均線性價格時並不具備這種對稱性。
- **「期間越長，就越不可能受到操縱。」** 它只是以更大落後換取較低的短暫扭曲敏感度，持續控制或流動性不足仍可影響結果。
- **「提高容量會立即產生更多歷史。」** 它僅增加未來容量，後續仍須逐步初始化觀測值。
- **「預言機成功讀取且具時效，就證明市場價值公允並可成交。」** 介面成功不能證明經濟時效、深度、獨立性或使用方曝險安全。

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

## 相關主題

- [自動造市商](/zh-tw/crypto/amm/)
- [預言機攻擊](/zh-tw/crypto/oracle-attack/)
- [預言機價格過期](/zh-tw/crypto/oracle-price-staleness/)

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

## 資料來源

- [Uniswap v2 Core](https://app.uniswap.org/whitepaper.pdf) - Uniswap（存取日期：2026-08-13）
- [Oracles](https://developers.uniswap.org/docs/protocols/v2/concepts/oracles) - Uniswap Developers（存取日期：2026-08-13）
- [Uniswap v3 Core](https://uniswap.org/whitepaper-v3.pdf) - Uniswap（存取日期：2026-08-13）
- [Price Oracles](https://developers.uniswap.org/docs/protocols/v3/concepts/price-oracles) - Uniswap Developers（存取日期：2026-08-13）
- [Oracle.sol](https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/Oracle.sol) - Uniswap v3 Core（存取日期：2026-08-13）
- [OracleLibrary.sol](https://github.com/Uniswap/v3-periphery/blob/main/contracts/libraries/OracleLibrary.sol) - Uniswap v3 Periphery（存取日期：2026-08-13）
- [Uniswap v3 TWAP Oracles in Proof of Stake](https://blog.uniswap.org/uniswap-v3-oracles) - Uniswap Labs（存取日期：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-twap/index.mdx
