在链上,我们需要一个价格:
- 能抗操纵(不被 flash loan 轻易影响)
- 能反映一段时间内的真实价格
- 不依赖链下记录
因此引入时间加权价格:
TWAP (Time Weighted Average Price)
V2 的做法,通过累加价格来实现:
a(t)=a(t−1)+price⋅Δt
查询区间价格:
p(t1,t2)=t2−t1a(t2)−a(t1)
V3 的核心改进,不再直接记录 price,而是记录:
tick=log1.0001(price)
因此:
price=1.0001tick
本质变化,是将 price⋅Δt 转换为 tick⋅Δt
利用:
log(p1⋅p2)=logp1+logp2
1. tickCumulative(核心累加器)
定义:
tickCumulative(t)=∑tick⋅Δt
更新方式:
tickCumulative=tickCumulative+tickcurrent⋅(tnow−tlast)
2. TWAP 计算
给定两个时间点:
t1,t2
Step 1:平均 tick
tickˉ=t2−t1tickCumulative(t2)−tickCumulative(t1)
Step 2:还原价格
p(t1,t2)=1.0001tickˉ
3. 为什么使用 tick(log)
几何平均
log(p1)+log(p2)=log(p1⋅p2)
对应价格关系
price=1.0001tick
4. Observation(历史快照)
V3 在链上存储多个时间点的状态,每个记录包含:
- 时间戳
- tickCumulative
- secondsPerLiquidityCumulative
每个 Observation 表示“某一时刻的累加器快照”。
5. secondsPerLiquidity Oracle
定义:
secondsPerLiquidityCumulative=∑liquidityΔt
含义
表示单位流动性参与做市的时间。
- liquidity 越大 → 单位分到时间越少
- liquidity 越小 → 单位分到时间越多
6. Oracle 查询
查询两个时间点:
t1,t2
计算:
TWAP=t2−t1tickCumulative(t2)−tickCumulative(t1)
与 Fee 系统的统一视角
Fee 系统:
f(ilower,iupper)=fg−fb−fa
Oracle 系统:
p(t1,t2)=ΔtΔtickCumulative
所以 V2 和 V3 在本质上是统一的,都表达为:
value=cumulative(end)−cumulative(start)
区别仅在维度:
- fee:在 tick 空间做差分
- oracle:在时间维度做差分
V3 的 Oracle 本质是:
- 对 tick(log price)进行时间积分
- 查询时通过差分恢复平均价格
最终得到:
TWAP=ΔtΔtickCumulative
其核心设计与 fee 系统完全一致:
- 累加器(cumulative)
- 区间差分(delta)
只是应用在不同维度:
- fee → 空间(price range)
- oracle → 时间(time)