僅供教育參考,不構成投資建議;投資可能產生損失。
直接答案
時間加權平均價格預言機依指定期間內的累積觀測值推導參考價。它不是一套通用公式。Uniswap v2 累積池中兩個方向的線性邊際價格,因此以端點差計算算術 TWAP;Uniswap v3 累積對數價格座標 tick,因此算術平均 tick 映射為相對價格的幾何平均值。
只有鎖定鏈、池、實作、費率級距、代幣順序、基準/報價方向、小數位數、期間端點、經過時間、已填入歷史及捨入規則,結果才有意義。成功讀取不代表公允價值或可成交深度。較長期間可稀釋短暫扭曲,卻會增加落後程度,也無法抵禦持續操縱、集中流動性缺口、提議者或排序器控制、重組,或可提取價值高於操縱成本的使用方。
觀測值時效與市場時效並不相同。現在算出的平均值可能刻意保留舊價格狀態;活躍池仍可能流動性薄弱或偏離外部市場。因此,使用方須檢查歷史、流動性與價格偏離,設定符合特定操作的限額,並明定降級或暫停行為。
運作機制
- 鎖定鏈及區塊、工廠與池地址、協議版本和費率級距、
token0與token1、小數位數、基準/報價方向、使用方操作、期間及風險價值。 - 確認累積對象與單位:v2 的線性
price0Cumulative或price1Cumulative、v3 的tickCumulative,或其他協議明文規定的統計量。不得在不同實作間套用同一平均方法。 - 核對端點時間戳、正的經過時間、最早已初始化歷史、目前觀測容量,以及內插或反事實規則。
observationCardinalityNext是目標容量,不是已填入的歷史。 - 對 v2,以累積價格變化除以經過秒數,再將固定點單位及代幣小數位數標準化。兩個報價方向須分別計算;反向算術 TWAP 通常不等於正向 TWAP 的倒數。
- 對 v3,呼叫協議規定的觀測介面,以累積 tick 變化除以期間;若負商無法整除,應如
OracleLibrary般向負無窮大捨入,再以price = 1.0001^tick將平均 tick 轉成標準化報價。 - 衡量目前區間內、調和、寬區間、各費率級距及外部市場的流動性。壓力測試單區塊與多區塊路徑、費用、套利、排序、審查、平倉損失、重組、落後及使用方可提取價值。
- 在明確的時效和偏離界限下,將 TWAP 與現貨及獨立參考值比較;監控歷史、流動性區間、池升級和鏈上狀況,並演練歷史不足、偏離、暫停、備援、清算及復原路徑。
Uniswap v2 儲存兩個方向的累積值,並隨時間推進。Uniswap v3 在循環緩衝區儲存觀測值,可以在觀測點間內插,也可建構目前的反事實累積值。這些建構端點符合協議運算規則,但不證明當時確有成交。提高容量只為未來觀測值保留空間,不會回填更早歷史。
計算範例
- 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,彼此也不相同;任何一個數值本身都不能說明操縱成本或可成交規模。
風險
- 鏈、工廠、池、費率級距、實作或升級狀態錯誤。
- 基準/報價或
token0/token1方向顛倒。 - 代幣小數位數、固定點尺度或報價標準化錯誤。
- 將 v2 算術價格與 v3 幾何價格視為同一統計量。
- 以正向 TWAP 的倒數計算反向算術 TWAP。
- 使用錯誤的累積端點、經過時間、期間邊界或目前區塊。
- 未妥善處理零值、負值、回繞或實作特有的時間戳運算。
- 要求的歷史早於最早已初始化觀測值。
- 將
observationCardinalityNext誤認為已填入的observationCardinality。 - 將內插或反事實觀測值誤認為實際成交。
- 將負平均 tick 向零而非向負無窮大捨入。
- tick 轉換、整數範圍、溢位或報價捨入不安全。
- 活躍區間內或調和流動性不足以涵蓋受保護曝險。
- 操縱分析忽略寬區間深度缺失或流動性撤出。
- 流動性分散於不同池、費率級距、鏈或相關交易場所。
- 短期間仍容易受到單區塊、原子式或瞬時操縱影響。
- 長期間會落後於真實重新定價、脫鉤或流動性遷移。
- 多區塊提議者、排序器、審查、壅塞、MEV 或重組狀況妨礙價格修復或強化控制。
- 未檢查偏離及深度,便將 TWAP 視為具時效的公允價值或任意規模的可成交價。
- 使用方曝險高於操縱成本,而備援、熔斷、暫停、清算及復原機制並不安全。
常見迷思
- 「TWAP 一律是價格的算術平均值。」 v3 平均的是 tick,因此得到相對價格的幾何平均值。
- 「反向報價一定等於正向 TWAP 的倒數。」 分別平均線性價格時並不具備這種對稱性。
- 「期間越長,就越不可能受到操縱。」 它只是以更大落後換取較低的短暫扭曲敏感度,持續控制或流動性不足仍可影響結果。
- 「提高容量會立即產生更多歷史。」 它僅增加未來容量,後續仍須逐步初始化觀測值。
- 「預言機成功讀取且具時效,就證明市場價值公允並可成交。」 介面成功不能證明經濟時效、深度、獨立性或使用方曝險安全。
相關主題
資料來源
- Uniswap v2 Core - Uniswap(存取日期:2026-08-13)
- Oracles - Uniswap Developers(存取日期:2026-08-13)
- Uniswap v3 Core - Uniswap(存取日期:2026-08-13)
- Price Oracles - Uniswap Developers(存取日期:2026-08-13)
- Oracle.sol - Uniswap v3 Core(存取日期:2026-08-13)
- OracleLibrary.sol - Uniswap v3 Periphery(存取日期:2026-08-13)
- Uniswap v3 TWAP Oracles in Proof of Stake - Uniswap Labs(存取日期:2026-08-13)
- SC03:2026 Price Oracle Manipulation - OWASP Smart Contract Security(存取日期:2026-08-13)