06.Uniswap V2 闪电贷

核心摘要 (Key Takeaways)

  • Flash Swaps (闪电交换) 是一种无需任何抵押即可借出资产的机制,但前提是必须在同一笔区块链交易内归还借款本金及相应的手续费。
  • 该机制的核心是原子性 (Atomicity),即整笔复杂操作(借款、执行自定义逻辑、还款)要么全部成功,要么全部失败回滚,从而保证资金池的安全。
  • Flash Swaps 是 DeFi 可组合性 (Composability) 的强大体现,允许开发者像搭乐高一样,在单笔交易中调用多个协议(如 Uniswap, Compound, Aave)来执行复杂的套利或其它金融策略。
  • 为了确保协议盈利,用户需要支付一笔手续费。这笔费用的最低标准是借出资产数量的 3/997,这个数值是通过数学计算确保资金池资产不会减少而得出的。
  • 实现 Flash Swap 需要用户编写并部署一个智能合约,该合约必须实现一个特定的回调接口(uniswapV2Call),Uniswap 的交易对(Pair)合约会通过调用这个接口来执行用户的自定义逻辑。

1. Flash Swaps 核心概念

Flash Swaps,也常被称为闪电贷 (Flash Loan),是 Uniswap V2 引入的一项创新功能。它与普通交易(Swap)的根本区别在于资金的获取和使用方式。

07.Uniswap V2 TWAP

Uniswap V2 的时间加权平均价格 (TWAP) 学习笔记

核心摘要 (Key Takeaways)
  • Spot Price (瞬时价格) 的高风险: 直接用储备量相除得出的瞬时价格(Spot Price)非常容易受到闪电贷等方式的操控,不适合在实际应用中作为可靠的价格预言机。
  • TWAP 的核心思想: TWAP (Time-Weighted Average Price) 通过将每个价格与其持续的时间进行加权平均,提供了一个更能抵抗市场瞬时操纵、反映真实市场价格的指标。
  • TWAP 的数学原理: 其本质是计算“价格-时间”图下的面积(价格与持续时间的乘积累加),再除以总时间长度,从而得到该时间段内的平均价格。
  • Uniswap V2 的高效实现: 为了避免在链上存储大量历史价格数据和进行高成本的循环计算,Uniswap V2 巧妙地只维护一个累积价格变量 (Price Cumulative)。通过在两个不同时间点读取这个累积值并做差,可以高效地计算出任意时间区间的 TWAP。

为什么需要 TWAP?—— Spot Price 的局限性

Spot Price (瞬时价格) 的定义

Spot Price 是指在特定时刻,交易池中两种代币储备量的比率。它反映了当前瞬间的兑换价格。

08.Uniswap V3简介

核心摘要 (Key Takeaways)

  • 解决核心痛点:Uniswap V3 的首要目标是解决 V2 版本资金利用率低下的问题。V2 将流动性平均分布在 (0, +∞) 的价格区间,导致大部分资金在常规价格波动范围之外被闲置。
  • 核心创新:集中流动性 (Concentrated Liquidity):V3 允许流动性提供者 (LP) 将资金集中在自定义的价格区间 [PA, PB] 内。这使得在有限的资本下,可以实现与 V2 庞大资金池相同的交易深度,从而极大地提高了资本效率。
  • LP 角色与凭证的转变:由于每个 LP 提供的价格区间和资金量都可能不同,其流动性头寸是独一无二的。因此,LP 凭证从 V2 的同质化代币 ERC-20 演变为 V3 的非同质化代币 ERC-721 (NFT)。这也要求 LP 从被动提供者转变为主动的策略管理者
  • 功能与风险的优化:集中流动性不仅能带来更高的手续费收益,还能在极端行情下提供更好的风险控制。此外,它还催生了新功能,如通过设置极窄的价格区间来模拟限价订单 (Range Orders)
  • 灵活的手续费机制:V3 摒弃了 V2 单一的 0.3% 手续费,引入了基于交易对波动性的多级费率(如 0.01%, 0.05%, 0.3%, 1%),为不同类型的资产(稳定币、主流币等)提供了更合理的定价。

1. Uniswap V2 的核心问题:资金利用率低下

img

09.Uniswap V3 集中流动性

核心摘要 (Key Takeaways)

  • 核心问题与解决方案:Uniswap V2 的流动性平均分布在 (0, +∞) 的整个价格区间,导致对价格稳定的资产(如稳定币)或价格波动在可预测范围内的资产,资本效率极低。Uniswap V3 引入集中流动性,允许流动性提供者(LP)将资金集中在自定义的价格区间 [Pa, Pb] 内,从而极大地提高了资本效率。
  • 虚拟流动性 (Virtual Liquidity):通过将流动性集中在特定区间,V3 能用较少的真实资产x_real, y_real)创造出等效于 V2 中巨大资金量的虚拟流动性。这个虚拟的 k 值(流动性深度)在进行交易计算时生效,能为交易者提供更低的滑点
  • 价格区间与资产构成:当市场价格在 LP 设置的 [Pa, Pb] 区间内波动时,其持有的两种代币会根据交易进行兑换。一旦价格超出这个区间,LP 的全部流动性头寸会自动转换成区间边界上的一种代币(在 Pa 点全部变为 X 代币,在 Pb 点全部变为 Y 代币)。
  • 价格区间的宽度是关键:LP 设置的价格区间越窄,资本效率的提升倍数就越高,但也面临着价格更容易偏离区间的风险。反之,区间越宽,其表现越接近于 Uniswap V2,资本效率越低,但管理更省心。

1. Uniswap V2 的核心问题:资本效率低下

Uniswap V2 使用一个非常简洁的恒定乘积做市商(AMM)公式来定义资产池的行为:

10UniswapV3流动性计算

核心摘要 (Key Takeaways)

  • Uniswap V3 的核心创新:通过引入价格区间 p[pa,pb]p \in [p_a, p_b]虚拟流动性 (xvirtualx_{virtual}, yvirtualy_{virtual}) 的概念,实现了集中流动性,允许用户将资金集中在特定价格范围,从而极大地提高了资金效率。
  • V3 核心公式:V3 的流动性计算公式是 V2 中 xy=L2x \cdot y = L^2 的演进,具体形式为 (xreal+Lpb)(yreal+Lpa)=L2(x_{real} + \frac{L}{\sqrt{p_b}}) \cdot (y_{real} + L\sqrt{p_a}) = L^2。这个公式是理解 V3 机制的关键。
  • 资金效率与价格区间的关系:用户设定的价格区间 [pa,pb][p_a, p_b] 越窄(即 pap_a 越大,pbp_b 越小,两者越接近),提供的虚拟流动性就越大。这意味着可以用更少的真实资金(xrealx_{real}, yrealy_{real})达到与 V2 相同的流动性深度(L 值),即资金效率越高。
  • 模拟限价订单:利用价格区间特性,用户可以通过在价格区间的某一端点(如 pap_a)存入单一资产,当市场价格穿过整个区间到达另一端点(pbp_b)时,该资产会被完全兑换成另一种资产,从而实现类似限价订单的效果。

11.Uniswap V3 Tick 与价格表示

核心摘要 (Key Takeaways)

  • tick 引入目的与作用: Uniswap V3 引入了 tick 机制,将连续的价格范围离散化,以解决集中流动性中用户随意设置价格区间导致的高 Gas 消耗问题,从而大幅节省 Gas 费用。
  • 价格与 tick 的数学关系: Uniswap V3 中的价格 PPtick 索引 TT 之间通过公式 P=1.0001TP = 1.0001^T 建立精确的指数关系。
  • 合约价格存储: Uniswap V3 合约的 slot0 结构中,价格信息并非直接存储为 PP,而是以 P×296\sqrt{P} \times 2^{96} 的形式(即 sqrtPriceX96)存储,并采用 Q64.96 定点数格式,以适应 Solidity 对浮点数处理的限制并优化 Gas 消耗。
  • 实际价格计算的复杂性: 从合约中读取的价格需要考虑 Token 精度差异token0/token1 顺序(可能导致价格倒数)进行修正,才能得到真实的市场价格。
  • tick 范围的由来: tick 的范围被限制在 -887272 到 +887272,这一范围是根据 Q64.96 定点数格式所能表示的 P\sqrt{P} 的上下限,通过价格与 tick 的数学关系推导而来,并硬编码在合约中。

1. tick 的引入与作用

1.1 问题背景:集中流动性的 Gas 消耗

  • Uniswap V3 的核心创新: 引入了集中流动性 (Concentrated Liquidity),允许用户在任意价格区间 PaP_aPbP_b 内提供流动性。
  • 潜在问题: 如果用户可以随意设置 PaP_aPbP_b (例如 1795.02341795.02341800.000121800.00012),会带来以下问题:
    • 每个用户设置的价格范围都是独一无二且随意的。
    • 维护和记录每个用户添加的 PaP_aPbP_b 范围会消耗巨量的 Gas 费用,因为合约状态需要存储大量不规则的数据。

1.2 解决方案:引入 tick 进行离散化

An illustration of Uniswap price curve getting sliced by ticks