18.Uniswap V3 手续费计算(一)

核心摘要 (Key Takeaways)

  • V3手续费的复杂性根源:与V2的全范围流动性不同,Uniswap V3的集中流动性允许LP在自定义价格区间(ticks)提供流动性,这使得手续费的计算和分配变得极其复杂。
  • 全局手续费累加器 feeGrowthGlobal:Uniswap V3引入了一个全局状态变量 feeGrowthGlobal,它代表每单位流动性可以获得的总手续费。这个值会随着每笔交易单调递增。
  • 手续费按token in收取:手续费只对交易中“进入”池子的代币收取。因此,系统需要为交易对中的两种代币(token0token1)分别维护两个独立的feeGrowthGlobal变量,导致其增长呈现阶梯状。
  • LP的核心关注点 feeGrowthInside:LP只关心在其提供的流动性区间内产生的手су费。因此,需要从全局feeGrowthGlobal中剥离掉区间外的部分,得到feeGrowthInside
  • 精巧的边界记录机制 feeGrowthOutside:V3通过在每个tick边界上记录一个名为feeGrowthOutside的值,来巧妙地计算任意区间的feeGrowthInside。当价格穿越一个tick时,该tickfeeGrowthOutside值会被更新,从而精确追踪内外手续费的累积情况。

1. Uniswap V2 vs. V3 手续费机制对比

1.1 Uniswap V2:简单直接
  • 流动性模型:流动性平均分布在从 0+∞ 的整个价格曲线上。
  • 手续费收取
    • 对每笔交易收取固定的千分之三(0.3%)手续费。
    • 手续费只对 token in (交易中流入池子的代币)收取。
    • 案例
      • 用 X 换 Y:收取 0.003 * X,实际用于交易的是 0.997 * X
      • 用 Y 换 X:收取 0.003 * Y,实际用于交易的是 0.997 * Y
  • 手续费分配:收取的手续费会自动累积到流动性池中,为LP实现自动复投增值,无需任何额外操作。
1.2 Uniswap V3:挑战重重
  • 核心挑战集中流动性 (Concentrated Liquidity)
    • 不同的LP可以在不同的价格区间(由tick lowertick upper定义,视频中也称为PAPB)提供流动性。
    • 手续费档位:V3提供了多个手续费档位供流动性池选择,如 0.01%, 0.05%, 0.3%, 1%
  • 需要解决的问题
    1. 按比例分配:在同一个tick区间内,手续费需按LP提供的流动性比例进行分配。
    2. tick计算:当交易价格跨越tick边界,导致总流动性发生变化时,如何精确计算每个LP在其活跃区间内应得的手续费。

2. 手续费分配的基本原理与 feeGrowth 的引入

2.1 单次交易的分配逻辑
  • 核心思想:LP在某个价格区间获得的手续费,等于该区间产生的总手续费乘以该LP提供的流动性占比
  • 案例:单次跨tick交易
    • 背景
      • 一个LP在某个范围内提供了流动性,大小为 S
      • 一笔交易发生,使得价格从tick_0移动到tick_1
      • tick0tick_0区间的总流动性为L0L_0,产生的总手续费为F0F_0
      • tick_1区间的总流动性为L1L_1,产生的总手续费为F1F_1
    • 计算LP应得手续费:该LP获得的手续费 FeeSFee_S 是其在每个tick区间所获手续费的总和。 FeeS=(F0SL0)+(F1SL1) Fee_S = \left(F_0 \cdot \frac{S}{L_0}\right) + \left(F_1 \cdot \frac{S}{L_1}\right)
2.2 feeGrowthGlobal:全局手续费累加器
  • 概念推导:将上述逻辑扩展到 N 次交易,LP的总手续费可以表示为: FeeS=Si=0NFiLi Fee_S = S \cdot \sum_{i=0}^{N} \frac{F_i}{L_i}
  • 定义:Uniswap V3将公式中求和的部分 i=0NFiLi\sum_{i=0}^{N} \frac{F_i}{L_i} 定义为一个全局变量,称为 feeGrowthGlobal (视频中简称为FG)。
    • 物理含义feeGrowthGlobal 代表从系统部署开始,每单位流动性 (S=1) 累计可以获得的总手续费。
    • 简化公式:LP的总手续费 FeeS=SfeeGrowthGlobalFee_S = S \cdot feeGrowthGlobal
  • 核心特性
    1. 全局状态feeGrowthGlobal 是一个存储在合约中的全局变量,随每次交易更新。
    2. 单调递增:只要有交易发生,feeGrowthGlobal 的值就会不断累积,永远不会减少。
    3. 按代币分离:由于手续费只对 token in 收取,因此合约为交易对中的两个代币分别维护了两个feeGrowthGlobal变量:
      • **feeGrowthGlobal0** (针对 token0)
      • **feeGrowthGlobal1** (针对 token1)
    4. 阶梯式增长
      • 当价格上涨时(例如,用token0token1),feeGrowthGlobal0会增加,而feeGrowthGlobal1保持不变(呈水平线)。
      • 当价格下跌时(例如,用token1token0),feeGrowthGlobal1会增加,而feeGrowthGlobal0保持不变。
      • 这导致每个feeGrowthGlobal变量的增长曲线都呈现出阶梯状

3. 从全局到局部:计算 feeGrowthInside

  • LP的视角:一个在特定价格区间 [il,iu][i_l, i_u] (tick lower, tick upper) 提供流动性的LP,只关心在这个区间内(inside)累积的手续费,区间外(outside)的与他无关。
  • 核心概念
    • feeGrowthInside:在LP指定的 [il,iu][i_l, i_u] 区间内累积的每单位流动性手续费。
    • feeGrowthOutside:在该区间之外累积的手续费。
  • 计算逻辑feeGrowthInside 等于全局的 feeGrowthGlobal 减去所有在区间之外累积的部分。
    • 白皮书与视频中的公式 (变量名来自视频讲解): FR(il,iu)=FgFB(il)FA(iu) F_{R(i_l, i_u)} = F_g - F_{B(i_l)} - F_{A(i_u)}
    • 公式解读
      • FR(il,iu)F_{R(i_l, i_u)}:我们想求的 feeGrowthInside (Range Fee)。
      • FgF_g:当前的全局 feeGrowthGlobal
      • FB(il)F_{B(i_l)}:所有低于下边界 ili_l 的手续费累积 (Fee Below)。
      • FA(iu)F_{A(i_u)}:所有高于上边界 iui_u 的手续费累积 (Fee Above)。

4. feeGrowthOutside:精巧的边界状态记录机制

为了高效计算任意区间的FB(il)F_{B(i_l)}FA(iu)F_{A(i_u)},V3合约并不直接记录它们,而是采用了一个更巧妙的机制:在每个被激活的tick记录一个状态变量 **feeGrowthOutside** (视频中简称为FO(i)F_{O(i)})。

19.Uniswap V3 手续费计算(二)

Uniswap V3 手续费计算深度解析 (二)

核心摘要 (Key Takeaways)
  • 核心公式: 为特定价格区间 (il,iu)(i_l, i_u) 计算手续费的核心思想是:用全局累计手续费 fgf_g 减去该区间下方的累计手续费 fbf_b 和上方的累计手续费 faf_a。公式为:fr(il,iu)=fgfb(il)fa(iu)f_r(i_l, i_u) = f_g - f_b(i_l) - f_a(i_u)
  • 关键变量 fo,if_{o,i}: Uniswap V3 引入了一个名为 feeOutside (笔记中记为 fo,if_{o,i}) 的关键变量。每个 tick i 都会记录这个值,它巧妙地追踪了当价格在 tick i 的“外部”时所累积的单位流动性手续费。
  • fo,if_{o,i} 的更新机制: 当价格穿越一个 tick i 时,该 tick 对应的 fo,if_{o,i} 会进行一次“翻转”更新。更新规则为:fo,inew=fgcurrentfo,ioldf_{o,i}^{\text{new}} = f_g^{\text{current}} - f_{o,i}^{\text{old}}。这个机制是整个计算逻辑的精髓。
  • 推导关系: 通过 fo,if_{o,i} 和当前全局手续费 fgf_g,可以精确推导出任意时刻的 fbf_bfaf_a。它们的值取决于当前价格 ici_c 相对于目标 tick i 的位置。

1. 背景:V3 手续费计算的复杂性

  • 根本原因: 集中流动性 (Concentrated Liquidity)。与 V2 不同,V3 的流动性提供者 (LP) 将资金集中在特定的价格区间内。

20.Uniswap V4 简介

Uniswap V4 简介

核心摘要 (Key Takeaways)
  • 架构性革新: Uniswap V4 的核心升级在于代码架构而非底层的 AMM 数学原理。它从 V2/V3 的“工厂模式”转变为“单例模式”,旨在大幅降低 Gas 费并提升效率。
  • 高度可定制化 (Hooks): V4 引入了**“钩子 (Hooks)”**机制,允许开发者在交易生命周期的关键节点(如交易前/后、添加流动性前/后)插入自定义逻辑,极大地增强了协议的灵活性和可扩展性。
  • 显著降低 Gas 费: 通过单例模式闪电记账 (Flash Accounting) 和支持原生 ETH 交易,V4 从多个维度解决了 V3 及之前版本中 Gas 费用高昂的问题,尤其是在多路径交易和涉及 ETH 的交易中。
  • 战略定位转变: V4 的发布标志着 Uniswap 从一个单纯的去中心化交易所 (DEX) 向一个DeFi 基础设施平台的战略转型,旨在搭建一个舞台,让更多开发者在其之上构建多样化的应用。

一、 Uniswap V4 发展历程

  • 发布形式: 以一种创新的 “社区共建” 模式发布。
    • 2023年6月13日: Uniswap 官方发布了 V4 的代码草案 (Code Draft),当时代码完成度约 60-70%。
    • 社区参与: 官方并未像传统项目那样先完成内部开发和审计,而是提前将代码开源,并设立了 1550 万美元的悬赏基金,鼓励全球社区共同寻找 Bug 和安全漏洞。
  • 正式上线:
    • 经过约一年半的社区共建和测试,Uniswap V4 于2024年1月正式发布到生产环境。

二、 Uniswap 版本演进与 V3 的痛点

每个新版本的发布都是为了解决前一版本的问题。

01.Uniswap 简介

Uniswap 简介

核心摘要 (Key Takeaways)

  • Uniswap 作为 DeFi 核心基础设施: 掌握 Uniswap V2, V3, V4 能帮助深度理解 DeFi 领域,超越行业内90-95%的人。其团队以创新力著称,而非营销。
  • 恒定乘积做市商模型 (AMM) 的起源: Vitalik Buterin 在2017年提出无订单簿交易方案,核心是 XY=KX \cdot Y = K 公式,由 Hayden Adams 实现并部署了 Uniswap V1。
  • Uniswap V2 引爆 DeFi 赛道: 2020年5月发布,引入 ERC20-ERC20 直换、闪电贷、预言机等,直接推动 DeFi 总锁仓量 (TVL) 从平稳期飙升至千亿规模。
  • 创新与竞争: Uniswap V2 因其宽松的开源协议被 SushiSwap 抄袭并挖走大量流动性,促使 Uniswap 发行 UNI 代币并空投反击。此事件凸显了创新与营销在加密货币领域的博弈。
  • V3 与 V4 的技术飞跃: V3 引入集中流动性LP NFT,显著提升资本效率并改进开源协议(2年商用保护期)。V4 引入 Hooks (钩子)Singleton 架构,旨在成为更快、更省 Gas、更易集成的 DeFi 基础设施。

1. Uniswap 简介与重要性

  • 本系列将以 Uniswap 为主线,深入讲解其 V2、V3、V4 版本。
  • 深度理解 DeFi: 大部分人对于Uniswap仅停留在 X * Y = K 的肤浅认知。
  • 创新驱动: Uniswap 团队是业界极具创新力的团队,与多数仅靠营销的项目不同。它为行业带来了巨大的变革和创新。
  • DeFi 基础设施: 如果只了解一个区块链项目,那必须是 Uniswap。

2. Uniswap V1:恒定乘积做市商的诞生

  • 诞生时间: 2017年6月22日,Vitalik Buterin 发表文章。
  • Vitalik 的文章:
    • 标题: “On Path Independence”
    • 核心思想: 提出无需订单簿模式也能完成代币互换 (swap) 的方案。
    • 数学机制: 基于 恒定乘积做市商 (Constant Product Market Maker, CPMM) 模型,即: XY=K X \cdot Y = K 其中,XXYY 分别代表两种代币的储备量,KK 是一个常数。价格波动通过曲线上代币余额的变化来体现。
  • Hayden Adams 的实现:
    • 背景故事: 曾是西门子机械工程师,被解雇后在好友 Karl 的建议下开始学习以太坊和智能合约开发。Hayden 在《A Short History of Uniswap》中记录了这段经历。
    • 对话案例:
      • Hayden: “我刚被开除了…”
      • Karl: “恭喜你!这是你身上发生的最好的事情了!以太坊是未来,你的新使命就是写智能合约。”
      • Hayden: “我也不知道怎么写代码啊…”
      • Karl: “没事,写代码很简单,而且那个时候(2017年)也没人知道怎么写智能合约,学学就好了。”
    • 开发历程: 学习 Solidity 和 JavaScript 两个月后开始编写代码,并与团队伙伴共同尝试实现 Vitalik 的公式。
  • 部署与初期影响:
    • 部署时间: 2018年11月2日,在 伊斯坦布尔会议 期间正式部署到以太坊主网。
    • 市场环境: 处于熊市 (比特币价格约 30003000-4000,此前高峰 $20000),因此 V1 发布后并未引起广泛关注。
    • 开发语言: 使用 Viper 语言编写 (类似 Python),由 Vitalik 建议。
  • V1 的局限性:
    • 仅支持 ERC20-ETH 互换: 所有流动性池都必须是 ERC20 代币与 ETH 的配对。
    • 案例: 若要将 DAI 兑换为 USDC,必须先将 DAI 兑换为 ETH,再将 ETH 兑换为 USDC,需要两次交易。
  • 合约结构:
    • UniswapExchange:负责代币互换逻辑,代码逻辑简单,约 490行
    • UniswapFactory:负责创建新的交易对。
    • 特点: 合约代码简洁,被视为“历史遗迹”。
  • 名字由来:
    • 最初内部名称: UniPeg (铆钉)。
    • Vitalik 建议: UniSwap。
    • Logo: 独角兽 (Unicorn)。

3. Uniswap V2:引爆 DeFi 赛道

  • 发布时间: 2020年5月。
  • 核心特性:
    • ERC20-ERC20 直接互换: 允许任意两种 ERC20 代币直接组成流动性池 (例如 DAI-USDC 池),无需通过 ETH 中转。
    • 闪电贷 (Flash Swaps): 允许用户在同一笔交易中借入资产、使用、并归还,无需抵押品。
    • 价格预言机 (Price Oracles): 提供链上价格数据,供其他 DeFi 协议使用。
    • 改进手续费设计。
  • 对 DeFi 行业的影响 (引爆 DeFi):
    • 数据案例: 2020年5月 V2 发布后,DeFi 领域的 总锁仓量 (TVL) 从平稳状态迅速飙升,并在2021年达到约2000亿美元的峰值。V2 的发布是这一增长的起点。
    • 个人经历案例: 2020年7月,老师的朋友主动联系讨论 Fork Uniswap,显示了 V2 巨大的市场热度。
3.1 Uniswap 与 SushiSwap 的竞争:UNI 代币的诞生
  • 背景: Uniswap V2 采用宽松的开源协议,允许任何人商用其代码。
  • SushiSwap (2020年8月发布):
    • 策略: Fork Uniswap V2 代码,并在此基础上增加了对 流动性提供者 (LP) 的奖励 (即流动性挖矿)。
    • 影响: 通过 SUSHI 代币的激励,SushiSwap 从 Uniswap 挖走了数十亿美元的流动性,对 Uniswap 造成巨大冲击。
  • Uniswap 的反击 (2020年9月):
    • 发行 UNI 代币: 作为治理代币。
    • 空投: 向所有在特定时间点前使用过 Uniswap 的地址空投 400个 UNI 代币
      • 价值案例: 以当前价格 7/UNI 计算,空投价值 2800。历史最高价曾达 $40/UNI。
    • 意义: 这是 Uniswap 团队夺回劳动成果、反击抄袭者的一种方式。
  • Hayden Adams 的理念与团队风格:
    • 反浮躁: 批评加密货币领域过度炒作、高估值(例如:“不是所有项目一发布就必须成为独角兽”)。他认为,一个项目在百万到十亿级别(10710910^7 \sim 10^9)的市场估值已是非常了不起的成就。
    • 注重实际价值: 认为项目估值应基于实际成就,而非短期炒作。
    • 团队风格: Uniswap 团队秉持踏实、有远见的风格,不追求短期利益和泡沫,不频繁喊单,因此能够走得更远,成为行业创新的引领者。

4. Uniswap V3:资本效率的飞跃

  • 发布时间: 2021年5月。
  • 核心特性:
    • 集中流动性 (Concentrated Liquidity): 允许 LP 将其流动性集中在特定的价格区间内,显著提高资本效率。
    • 优化手续费设置: 提供多层手续费选项。
    • LP Token 作为 NFT: 流动性提供者代币 (LPT) 从 ERC20 形式改为 NFT 形式,以支持集中流动性的复杂性。
    • 改进开源协议: 引入 2年商业使用保护期。在此期间,社区成员可学习代码,但禁止直接 Fork 并发布商用产品。
    • 市场影响: 2023年5月保护期结束后,许多 DEX 纷纷宣布“更新到 V3”,实则抄袭了 Uniswap V3 的代码。市场会通过自我纠错机制,最终认可创新而非简单的抄袭。

5. Uniswap V4 (草案):基础设施愿景

  • 代码草案发布时间: 2023年6月23日。
  • 核心特性:
    • Hooks (钩子): 允许开发者在 Uniswap 协议的固定操作点 (如 beforeSwap, afterSwap) 插入自定义逻辑。
      • 案例: 可用于创建带有 KYC 验证的去中心化交易所 (在 Swap 前调用 Hook 检查地址的 KYC 信息)。
    • Singleton 架构: 将所有交易对部署在一个合约中,而非每个交易对一个合约,显著降低部署成本和 Gas 费用。解决了 V2/V3 中每个交易对都需要独立部署合约的问题。
    • 重新引入原生 ETH 支持 (Reintroduction of Native ETH): V4 将再次支持原生 ETH,无需 WETH 中转。
    • Flash Accounting。
  • 目标: 成为一个更快、更省 Gas、更易集成、更具可扩展性的 DeFi 领域基础设施平台。

6. 核心概念解析:ETH, ERC20, WETH

  • ETH (以太坊原生代币):
    • 定义: 以太坊区块链的原生代币,用于支付 Gas 费用。
    • ERC20 兼容性: 不符合 ERC20 标准。
    • 原因: ETH 早于 ERC20 标准诞生。它没有 approvetransferFrom 等 ERC20 标准中定义的函数。
    • 转账方式: 在智能合约中,转账原生 ETH 通常使用 address.transfer()address.call{value: ...}()
  • ERC20 (代币标准):
    • 定义: 以太坊上的第20个改进提案 (EIP-20) 提出的一种代币协议标准。
    • 功能: 规定了代币必须实现的一系列函数 (如 transfer, transferFrom, approve, balanceOf) 和事件 (如 Transfer, Approval)。
    • 目的: 确保不同代币之间的互操作性。
  • WETH (Wrapped ETH / 封装的 ETH):
    • 定义: 将原生 ETH “封装”成符合 ERC20 标准的代币。
    • 作用: 由于 Uniswap V2 和 V3 等 DEX 主要支持 ERC20 代币之间的交易,原生 ETH 无法直接参与。WETH 使得 ETH 能够以 ERC20 的形式在这些智能合约和 DeFi 协议中使用。
    • 历史版本支持:
      • Uniswap V1: 支持原生 ETH。
      • Uniswap V2/V3: 依赖 WETH 才能与 ERC20 代币配对。
      • Uniswap V4: 重新引入对原生 ETH 的支持。

7. Uniswap V2 与 SushiSwap 竞争时序图

以下 Mermaid 时序图展示了 Uniswap V2 发布后,SushiSwap 如何通过 Fork 代码和流动性挖矿与 Uniswap 竞争,以及 Uniswap 如何通过发行 UNI 代币反击的过程。

去中心化借贷

核心摘要 (Key Takeaways)

  • 核心机制:去中心化借贷协议本质上是一个资金池,存款人 (Lender) 提供闲置资产赚取利息,借款人 (Borrower) 通过超额抵押资产来借出其他资产,整个过程由智能合约自动执行。
  • 动态利率模型:借贷利率并非固定不变,而是由资金使用率 (Utilization Rate) 动态调节。当资金池中大量资产被借出时(使用率高),利率会自动升高以抑制借款、鼓励存款;反之则降低利率。
  • 安全基石:超额抵押与清算:为应对加密资产的价格波动,所有借款都必须超额抵押。协议通过健康因子 (Health Factor) 监控每笔贷款的风险。一旦抵押物价值跌破清算阈值监控者 (Keeper) 会触发清算程序(如拍卖或市场售出)以保护存款人的资金。
  • 关键外部依赖:预言机 (Oracle):协议需要预言机来获取抵押物和借出资产的实时价格,以准确计算健康因子。因此,预言机的稳定性和安全性至关重要,是协议最主要的攻击点之一,对于黑客来说,预言机就是提款机
  • 记账方式的演进:协议通过向存款人发放凭证Token(如Compound的cToken)来代表其在资金池中的份额。这种方式相比传统的复式记账法,极大地简化了利息计算和用户资产追踪。

1. 去中心化借贷的核心价值与传统对比

1.1. 为什么需要借贷?

借贷是源远流长的金融活动,核心在于提高资金利用效率满足流动性需求,而非简单地“没钱才借”。

恒定乘积自动做市商 (CPAMM) 学习笔记

恒定乘积自动做市商 (CPAMM) 学习笔记

核心摘要 (Key Takeaways)

  • CPAMM 核心公式X×Y=KX \times Y = K 是恒定乘积自动做市商(Constant Product Automated Market Maker, CPAMM)的核心,它定义了去中心化交易所(DEX)中流动性池中两种资产数量的关系。
  • DEFI 基石:该公式是 2020-2021 年 DEFI 浪潮的起点,支撑了数百亿美元的 DEFI 市值发展,实现了无需中心化对手方的代币交换。
  • 交换中的 K 值恒定:在用户进行代币买卖(Swap)时,池子的总流动性 KK 保持不变,但池中两种代币的比例会根据交易量动态调整。
  • 滑点 (Slippage):交易量相对于池子总流动性的比例越大,交易产生的滑点就越大,导致实际成交价格偏离预期市场价格。用户在交易时可设置滑点容忍度
  • 流动性提供者 (LP):用户可以通过向池子提供两种代币,成为流动性提供者,获得 LP 凭证 (LPT) 并赚取交易手续费;添加和移除流动性会改变 KK 值。

1. 恒定乘积自动做市商 (CPAMM) 核心原理

1.1 定义与核心公式