﻿---
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-cn/crypto/amm/)
- [预言机攻击](/zh-cn/crypto/oracle-attack/)
- [预言机价格过期](/zh-cn/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-cn/crypto/oracle-twap/index.mdx
