文章详细介绍了Uniswap协议从V1到V4的演进过程,重点讨论了V3和V4在流动性管理、自动做市商(AMM)机制、手续费优化等方面的新特性和挑战。
在深入探讨 V4 之前,让我们来看看 Uniswap 协议是如何演变的。Uniswap 经过了超过七年的发展,从 V1 迭代到 V4。
Uniswap V1 创建于 2017 年,是一个非常简单的 AMM。它的简单性体现在整个代码库仅约 500 行。正因为这种简单性,Uniswap V1 收取的Gas费比当时的其他 AMM 较低。然而,V1 仅支持 ETH 和 ERC20 代币之间的交换。两个 ERC20 代币之间的交换需要通过 ETH 进行中介,这引入了低效性。
Uniswap V2 于 2020 年 5 月推出,引入了一种更先进的结构,解决了这个问题。它允许在 ERC20 代币之间创建池,从而使两个代币之间能够直接交换,消除了 V1 的低效性。此外,它还引入了新的功能,例如预言机系统,允许直接从 V2 池中查询价格,以及闪电贷,使交易者能够安全地借用资金进行套利机会。
然而,Uniswap V2 仍然存在一些不足之处。一个主要问题是通常所称的懒惰流动性。让我们通过一个例子来检视这个问题。
假设Alice向 Uniswap V2 的 USDC-ETH 池提供了价值 1,000 美元的流动性。这笔流动性被均匀分布在整个价格范围内,从零到无穷大,无论 ETH 价格如何。假设Bob在这个池内进行交换,使 ETH 的价格从 3,000 美元上涨到 3,100 美元。
在这种情况下,Alice的流动性只有一小部分被用于交换,而大部分仍然闲置,没有积极参与交易。这个现象被称为懒惰流动性。
这个问题在稳定币池中变得更加明显。稳定币的价值通常被固定在 1 美元,脱钩事件很少发生。因此,大多数稳定币的交易发生在 1 美元的附近。然而,由于 Uniswap V2 在所有价格区间均匀分布流动性,只有小部分流动性积极参与交易,而其余部分则闲置。这种低效性加剧了 DEX 的资本效率问题,特别是在稳定币交易对中。
为了应对 Uniswap V2 中的问题,Uniswap V3 引入了集中流动性。这一机制允许流动性提供者(LP)定义其流动性有效的特定价格区间。
(Uniswap V3 的集中流动性 | 来源:Uniswap V3 白皮书)
如上图所示,在集中流动性模型下,流动性提供者可以选择他们希望提供流动性的价格范围。即使流动性量相同,当流动性提供者在接近当前价格时提供流动性,流动性的密度也会增加。当交换发生时,费用会按流动性密度的比例分配给流动性提供者。因此,流动性提供者有激励设定较窄的接近当前价格的价格区间,从而赚取更高的费用。这一机制提高了资本效率,并减少了池中的滑点。
一个显著的例子是 Uniswap V3 在以太坊主网的 USDC-DAI 池。如下面图所示,这个池中的大部分流动性集中在价格区间 $0.9998 到 $1.0002 之间。
(Uniswap V3 的 DAI-USDC 池 | 来源: app.uniswap.org)
这种模式表明流动性提供者相信 DAI 和 USDC 不太可能脱钩于 1 美元,因此他们将流动性集中在这一价格附近。通过集中流动性,流动性提供者可以获得更高的交换费用,而交易者则受益于更低的滑点。
然而,Uniswap V3 也引入了两个重大挑战:
由于代码库的限制,灵活性有限。Uniswap V3 强制采用一种通用方法,所有池都遵循相同的代码结构。这在某种程度上限制了灵活性,因为无法根据特定用户需求定制功能。例如,虽然 Uniswap V3 中内置的预言机功能对专业交易者和数据提供者非常有用,但也增加了普通用户进行交易的成本。此外,由于所有池使用相同的硬编码逻辑,因此在 Uniswap V3 中实现自定义功能(如限价单)而无需外部修改非常困难。尽管 Uniswap V3 是一个设计良好的代币交换平台,但它未能发展为一个更广泛的流动性平台,鼓励开发者的创新。
Gas费低效问题。尽管 Uniswap V3 的Gas费用相对较低,但每次交换仍需超过 200,000 的Gas。当交易必须通过多个池进行路由时,这一问题愈加明显,Gas成本大幅上升。解决这些Gas低效问题将极大改善 Uniswap 的用户体验。
Uniswap V4 是一个旨在提高交换效率和可扩展性的协议,以便更广泛的构建者可以利用 Uniswap 的流动性。它旨在解决 V3 中出现的问题,同时扩展协议的能力。Uniswap V4 引入了哪些机制,又能促成哪些新用例?
首先,让我们看看 Uniswap V4 中新增的特性。Uniswap V4 的核心池结构与 V3 类似,遵循集中流动性模型。然而,Uniswap V4 引入了三个关键特性,与 Uniswap V3 相比显著提升了用户体验:
单例架构
闪电结算
钩子(Hook)
让我们深入探讨每个特性及其带来的好处。
到 Uniswap V3 为止,协议有两个独立组件:Factory 和 pool。每当一个新池被创建时,factory 合约就会部署一个新的池合约。然而,在 Uniswap V4 中,一个名为 PoolManager 的单一合约管理所有池。这个新结构使得在多个池之间的交换路由变得更便宜。
(Uniswap V4 与 V3 的交换路由 | 来源: Uniswap Blog)
例如,考虑一个路由场景,用户从 ETH 交换为 USDC,然后从 USDC 转换为 OP。在 V3 中,交换过程涉及将 ETH 发送到 ETH-USDC 池,接收 USDC,然后将其转移到 USDC-OP 池以完成 OP 代币的交换。然而,在 V4 中,路由通过简单地更新同一合约内的内部余额记录来处理。在一次交易的开始和结束时,仅执行一次余额更新,而不是为每个池单独修改余额。这大大简化了路由并降低了成本。
另外,部署新池的成本变得显著便宜。在之前的版本中,部署新池需要部署一个单独的智能合约,由于以太坊高昂的合约部署费用,这样的成本是高昂的。然而,在 V4 中,进入池的方式只需调用 PoolManager 合约中的一个函数,而无需部署新的合约。相比于之前版本,部署成本减少了超过 99%。
Uniswap V4 中引入的第二个关键特性是闪电结算,这是一种通过高效的债务清算模型来减少Gas成本的新方法,用于交换和流动性管理。
Uniswap V4 在交换或其他流动性操作期间追踪池和用户之间的未清余额。系统不会立即结算每一笔交易,而是确保所有未清余额仅在交易结束时才得到完全清算。
让我们用一个例子来详细说明。当用户在 Uniswap V4 中发起一次交换时,有三个关键组件参与其中:
用户:通过 Router 合约请求交换。
Router:接收用户的代币并将请求转发给 Uniswap 的核心合约。
PoolManager:执行交换逻辑并将请求的代币转回用户。
这些组件之间的交互可以可视化如下:
(Uniswap V4 的初始交换流程)
当用户通过 DEX 界面进行交换交互时,Router 调用 PoolManager 合约中的 unlock 函数。该函数解锁合约内的余额修改,从而允许进行更改。
unlock 函数有两个主要目的:
防止重入攻击,通过确保函数不能在同一笔交易中被执行两次。
调用 Router 的回调函数,从而处理实际的交换逻辑。
兑换的实际处理(包括余额更新和最终结算)发生在 Router 的回调函数 unlockCallback 内,该函数调用多个 PoolManager 内的函数来执行请求的操作。
在交换场景中,unlockCallback 执行两个关键步骤:
修改余额并计算未清债务。
结算债务并完成交换。
整体流程可视化如下:
(Uniswap V4 的 unlockCallback() 函数债务结算流程)
一个关键点需要注意的是,在整个交易过程中,某些值必须在执行前后保持不变。其中最重要的是 delta,它代表用户与池之间的未清余额,并应始终在交易的开始和结束时回到零。
以太坊为这种临时数据提供了特定的存储类型:瞬态存储。这一点通过 Dencun 升级 (2024) 中的 EIP-1153 引入。瞬态存储的行为类似于标准以太坊存储,但仅在一次交易中有效。一旦交易结束,所有瞬态存储值将自动重置,如下所示:
(瞬态存储的机制)
由于瞬态存储是临时的,并不会增加以太坊的永久存储负担,因此使用瞬态存储的操作比常规存储便宜得多。例如,向一个空存储槽写入的Gas费用为 20,000,而写入瞬态存储的费用仅为 100。
Uniswap V4 利用这一点通过瞬态存储保存债务余额(delta),大幅降低Gas费用。之前消耗超过 100,000 Gas的交易现在只需几百Gas即可完成。此外,Uniswap V4 中的重入保护也利用瞬态存储,进一步降低了成本。
总之,Uniswap V4 采用了一种独特的“债务结算”模型,旨在通过瞬态存储优化Gas效率,使得交换费用显著低于 Uniswap V3。
这种效率在实际交易中非常明显。以下是一个示例,海登·亚当斯尝试将 0.3 ETH 交换成 USDT。尽管 Uniswap V4 的 ETH-USDT 池仅有大约 40 万美元的流动性,但由于 V4 的Gas效率,Uniswap Router 选择了该路径。
(Uniswap ETH-USDT 交换的路由结果 | 来源: 海登·亚当斯 X)
Router 通过考虑滑点、Gas费用等因素选择交换路径。在这种情况下,V4 较低的Gas费用使其成为优选路径,导致进入 V4 池的交换量增加,并增加了流动性提供者的费用收入。
在所有新特性中,钩子是 Uniswap V4 最重要的补充。
在 Uniswap V3 和其他 DEX 中,用户只能与协议内置的预定义功能进行交互。然而,Uniswap V4 允许池创建者通过钩子自定义他们的池,添加额外逻辑。这样一来,池可以提供适应特定需求的新功能。
根据 Uniswap 的 V4 博客文章,钩子可以使得以下功能成为可能:
根据波动率动态调整费用
交易所内限价单
将超出范围的流动性存入借贷协议
自定义链上预言机
自动复利 LP 费用
将 MEV 利润重新分配给 LP
但钩子如何实现这些功能的?它们能够带来什么其他的用例?开发者们又在构建什么?
接下来,我们将详细探讨钩子,分析它们在 Uniswap V4 中的影响和潜力。
在编程中,钩子指的是在软件组件之间拦截函数调用、消息或事件,以修改或扩展其功能。负责处理这些拦截消息或函数调用的组件称为钩子。这一模式在调试和扩展软件能力时广泛使用。
Uniswap V4 利用这一编程模式,使得构建者能够扩展 DEX 的功能。在 Uniswap V4 中,钩子可以发挥五个主要作用:
功能名称 | 示范 |
---|---|
beforeInitialize / afterInitialize | 在池部署之前/之后执行自定义操作 |
beforeAddLiquidity / afterAddLiquidity | 在用户向池添加流动性之前/之后执行自定义操作 |
beforeRemoveLiquidity / afterRemoveLiquidity | 在用户从池中移除流动性之前/之后执行自定义操作 |
beforeSwap / afterSwap | 在用户在池中进行交换之前/之后执行自定义操作 |
beforeDonate / afterDonate | 在用户向池捐赠代币之前/之后执行自定义操作 |
如功能名称所示,Uniswap V4 允许在特定操作发生前或后进行钩入,从而根据与该操作相关的数据实现自定义操作。例如,beforeSwap 函数在交换执行前被调用,允许钩子开发者在 PoolManager 处理交换前实施自定义逻辑。
一个钩子可以实现单个函数或多个函数,意味着开发者几乎可以将他们希望的逻辑集成到 Uniswap V4 的每个动作中。
在 Uniswap V4 中,钩子是与流动性池独立的单独智能合约。在部署池时,部署者必须指定与池关联的钩子的地址。一旦设置钩子,就无法更改。然而,同一个钩子可以在多个池中共享。
重要的是,即使两个池共享相同的代币对(例如,USDC-ETH)和相同的费用层级,如果它们使用不同的钩子,它们仍被视为不同的池。在 Uniswap V3 中,基于费用层级,代币对只能存在于六个不同的池中。而相比之下,Uniswap V4 允许多个不同功能的 USDC-ETH 池的版本,例如一个集成预言机的池、一个支持限价单的池或一个提供动态费用的池。
总的来说,Uniswap V4 通过钩子实现自定义池,具有特定功能,使其区别于之前的版本。
此时,你可能会想:
钩子是否真能实现任何逻辑?
是否可能通过钩子实现任何复杂程度的逻辑?
让我们来看一下钩子在内部如何运作,以回答这些问题。
要理解钩子的内部工作原理,必需检查其功能结构。在 Uniswap V4 中,为每个钩子函数定义了特定的输入和输出数据格式。本节探讨这些函数的结构,详细说明钩子从 Uniswap V4 合约接收的数据以及它们可以对这些数据执行的操作。
让我们以 beforeSwap / afterSwap 为例。
beforeSwap 函数在 PoolManager 执行交换逻辑之前被触发。它从 PoolManager 接收五个关键参数:
变量 | 示范 |
---|---|
sender | 发起交换的地址 |
zeroForOne | 交换方向(例如,token0 → token1 或反之) |
amountSpecified | 进行交换的代币数量 |
sqrtPriceLimitX96 | 交换者设定的价格限制,以控制最终的最大滑点 |
hookData | 额外逻辑所需的自定义数据 |
这意味着每次发生交换时,钩子可以访问以下关键数据:
谁发起了交换
希望交换多少
交易买入/卖出的是什么代币
用户设置的滑点限制
在执行其逻辑后,beforeSwap 将以下值返回给 PoolManager:
变量 | 示范 |
---|---|
selector | 此钩子的函数选择器 |
beforeSwapDelta | 钩子在交换时的 delta |
lpFeeOverride | 更新后的 LP 费用 |
此时,我们可以看到钩子不仅仅是被动扩展,而是与池的操作进行积极交互的强大机制。
两个关键返回值——beforeSwapDelta 和 lpFeeOverride——允许钩子动态调整交换流程和费用结构。
beforeSwapDelta 值与 Uniswap V4 的债务结算模型直接相关。在 V4 中,交换在 Router 和池之间造成临时的债务,这些债务随后将被清偿。类似地,钩子可以与池建立债务关系,从而主动干预交换过程。
例如,钩子可以:
获取用户交换的一部分作为费用或返还
根据自定义条件修改交易执行路径
根据市场状况提供动态的滑点调整
需要注意的是,钩子并不要求返回 beforeSwapDelta 值。有些钩子可能完全不影响交换机制,而是执行独立、不干扰的操作。
lpFeeOverride 与 Uniswap V4 的动态费用系统相关。在 Uniswap V4 中,根据市场条件,费用可以动态变化,但只能通过钩子实现。
动态费用实现的两种方法是:
永久性费用更新
钩子可以调用 updateDynamicLPFee 函数,永久性调整池的费用,以响应高波动性或低流动性等事件。
这允许池在市场动荡期间提高费用(以补偿 LP 的更高风险),并在交易量较低时降低费用,以鼓励更多交换。
临时费用调整
通过修改 lpFeeOverride,钩子可以仅针对特定用户或交易应用自定义费用,而不是改变池的默认费用。
例如:
为 NFT 持有者提供折扣费用
对套利者收取更高费用
为特定交易行为提供定制激励措施
这种灵活性使得 Uniswap V4 能够在交易级别实现定制的费用政策,而传统的 AMM 无法做到这一点。
总之,beforeSwap 允许钩子执行三个关键操作:
Uniswap V4 钩子可以通过在 beforeSwap 函数中验证发送地址,使开发者能够实施访问控制机制。这意味着钩子可以强制执行允许执行交换的用户自定义条件。例如,池可以被设计成只有持有特定 NFT 的用户才能在其中进行交易。
然而,有一点需要注意的是,用户在执行交换时并不直接与 PoolManager 交互。相反,他们通常通过 Router 合约进行交互,然后 Router 再与 PoolManager 交互。因此,在 beforeSwap 中,钩子看到的发送者地址通常是 Router 地址,而不是实际用户地址。
因此,访问控制逻辑通常是在 Router 级别实现的,而不是钩子内部。钩子决定哪个 Router 应执行交换,而 Router 负责用户身份验证和权限实施。
Uniswap V4 钩子可以直接在交换执行逻辑中干预。因为钩子从 PoolManager 获取所有相关交易细节,所以它们可以动态调整交易执行参数并修改结果。
这一能力促成了各种用例,例如:
实施为特定需求量身定制的交换逻辑
针对不同类型的池调整执行机制
针对不同市场状况优化交换策略
默认情况下,Uniswap V4 使用集中流动性,将价格范围划分为多个涨落区间,每个涨落区间遵循 x * y = k CPMM 算法。然而,钩子可以覆盖这一行为,并应用替代的交换逻辑。
例如,钩子可以针对稳定币对实现与 Curve 类似的 StableSwap 算法,降低滑点,提高资本效率,尤其是对于大规模交易。
最后,钩子能够动态调整 LP 费用,为流动性提供者(LP)提供更大的灵活性和潜在收益。
最常见的动态费用模型之一是基于波动率的费用调整。在高度波动的情况下,LP 面临非永久性损失(IL)和与再平衡损失(LVR),可能导致经济损失。为补偿这一风险,池可以在高波动时期实施更高的费用,以提升整体 LP 收入并吸引更深的流动性。
一个重要的细节是,钩子无法修改所有池的费用。只有明确启用动态费用的池能被钩子调整费用。这意味着,在固定费用池中交易的用户无需担心不可预测的费用变化。
那么,钩子如何安装在流动性池中?是否可以将任何钩子附加到一个池中?答案是否定的。
Uniswap V4 不允许钩子随意附加到任何池。当 PoolManager 部署一个池时,必须经过验证程序,以确保指定的钩子满足特定条件。
钩子合约通过将其实现的函数编码到其合约地址中与 PoolManager 进行通信。这一编码的关键部分是钩子地址的最后四个十六进制数字(16 位)。这 16 位表示钩子实现了哪些函数。
例如,假设一个钩子合约的地址是 0x4f....00C0。最后四位(00C0)是关键部分。00C0 是十六进制值,转换成二进制则为:
0000 0000 1100 0000
这一二进制表示的每一位(0 或 1)对应一个特定的钩子函数。如果某一位为 1,表示钩子实现了该函数;如果为 0,则表示该函数未实现。
下表概述了每一位的含义:
位位置 | 函数名称 |
---|---|
13 | beforeInitialize |
12 | afterInitialize |
11 | beforeAddLiquidity |
10 | afterAddLiquidity |
9 | beforeRemoveLiquidity |
8 | afterRemoveLiquidity |
7 | beforeSwap |
6 | afterSwap |
5 | beforeDonate |
4 | afterDonate |
3 | beforeSwap (返回 delta) |
2 | afterSwap (返回 delta) |
1 | afterAddLiquidity (返回 delta) |
0 | afterRemoveLiquidity (返回 delta) |
在示例 00C0 (0000 0000 1100 0000)中,仅有第 7 位(beforeSwap)和第 8 位(afterRemoveLiquidity)被设置为 1,表示该钩子仅实现这两个函数。
将钩子函数编码到合约地址本身的原因是降低Gas成本。
如果 Uniswap 不使用这种方法,PoolManager 就无法知道钩子实现了哪些函数。它将不得不尝试调用每一个可能的函数,以确定哪些函数存在。这将导致不必要的函数调用并浪费Gas。
例如,假设一个钩子仅实现 beforeSwap。如果 PoolManager 事先不知道这一点,它将试图调用其他函数,比如 afterSwap、beforeAddLiquidity 等,造成不必要的交易和更高的Gas费用。
通过将函数实现直接编码到合约地址中,PoolManager 能够很快知道该执行哪些函数。这使得无效的函数调用可以完全跳过,从而降低了Gas消耗。
在上面的表格中,最后四位(标记为返回 delta)指示钩子是否修改了交换或流动性事件的结果。
例如,如果一个钩子修改了交换执行逻辑,它应返回一个 beforeSwapDelta 值。这一修改的存在通过地址的最后四位表示,从而确保 PoolManager 事先知道是否需要对这些变化采取相应的调整。
这种设计防止了无用的计算,如对于那些不会修改交换结果的钩子,进一步优化了Gas效率。
由于钩子的功能由其地址决定,开发者必须手动找到符合正确函数配置的合约地址。但是,他们该如何做到这一点?
以太坊的 CREATE2 操作码允许开发者通过指定 salt 值在预定地址上部署合约。这一技术称为“地址挖矿”,使开发者能够搜索一个有效的 salt,从而生成具有所需最后四个十六进制数字的地址。
使用 CREATE2 生成以太坊合约地址的公式是:
address = keccak256(0xff + sender + salt + keccak256(init_code))
0xff → 表示 CREATE2 的常量前缀
sender → 部署合约的地址
salt → 开发者定义的任意值
init_code → 正在部署的合约的字节码
通过修改 salt,开发者可以反复生成不同的地址,直到找到最后四位符合所需函数编码的地址。
虽然 CREATE2 使开发者能够生成正确的钩子地址,但手动搜索正确的 salt 可能非常繁琐。此外,测试钩子也变得不便利,因为开发者在每次部署修改过的合约时都必须重复寻找一个新的有效地址。
为简化这一过程,Uniswap 提供了一个名为 HookMiner的工具。该库自动化地址挖矿过程,使开发者能够高效地找到其钩子的有效地址进行测试。
(V4 钩子地址挖矿工具 | 来源: v4hookaddressminer.xyz)
此外,还开发了一个基于 Web 的 UI 工具, V4 Hook Address Miner,使这一过程变得更加简单。
该工具允许开发者:
选择他们希望在钩子中实现的功能。
自动生成一个有效地址所需的 salt。
部署他们的钩子合约,而无需手动挖找有效地址。
通过利用这些工具,开发者能够无缝部署格式正确的钩子,从而使 Uniswap V4 钩子生态系统更加开放和便捷。
到目前为止,我们探讨了 Uniswap V4 钩子的功能及其如何扩大 Uniswap 的能力。然而,这些特性是否引入了任何副作用?
尽管 Uniswap V4 钩子的安装和输入/输出值存在某些限制,但对钩子的内部逻辑实施没有限制。换句话说,恶意开发者可能会设计恶意钩子,窃取交易者或流动性提供者的资金。
例如,恶意开发者可以利用动态费用算法对池实施拒绝服务(DoS)攻击,实际上阻断用户活动。一种可能的攻击场景是,当满足某一价格条件时,将交换费用提高到超过 100%,导致所有交换失败。
此外,不当的访问控制可能导致池的流动性被冻结或被永久锁定。在 Composable Security 的一篇文章中,他们讨论了这种情形的例子—如果 beforeInitialize 函数开放给任何人调用,会导致池中的流动性被永久锁定。
那么,用户在使用 Uniswap 时应注意什么?
对于使用 Uniswap 官方界面的交易者而言,在交换代币时无需担心恶意钩子。这是因为 Uniswap 集成了 UniswapX,一个基于意图的交换执行网络。使用 UniswapX 时,处理与恶意钩子相关的安全风险的责任落在处理用户意图的执行者身上。换句话说,如果你在官方 Uniswap 界面中使用 UniswapX 进行代币交换,则无需担心恶意钩子。
然而,流动性提供者(LP)需更为谨慎。在 Uniswap V4 中提供流动性时,界面允许用户指定与池关联的钩子地址。
(Uniswap 中流动性提供界面 | 来源: Uniswap 官方页面)
如果指定的钩子被黑客攻击或具有恶意,则提供的流动性可能被冻结或被窃取。因此,流动性提供者在使用此功能时需小心,应仅使用经过审计并提供安全保障的钩子。
当用户请求交换时,Uniswap V4 中的路由是如何工作的?
为更好地理解这一点,让我们考察 Uniswap 之前版本的路由演变。
在 Uniswap V3 中,当用户请求交换时,请求会发送到 Uniswap 后端的智能订单路由器。该系统会计算最佳交换路径并返回给用户。用户随后通过将计算出的路径提交给 V3 中的 Router 合约来执行交换。
然而,在 2023 年 7 月,Uniswap 推出了 UniswapX,这是一个去中心化的基于意图的交换执行协议,旨在提高交换效率并增强跨链用户体验。UniswapX 将路由过程从中心化智能订单路由器转移到了去中心化的意图处理器(填充者)网络。这些填充者通过荷兰拍卖参与竞争,以决定谁将处理交换请求。提供最佳交易执行的填充者会被自动选中。
UniswapX 的基本过程如下:
用户签署一个 Permit2 消息,指定:
希望交换的代币(输入)。
希望接收的数量(输出)。
任何最低可接受输出。
填充者在拍卖中竞争,以在用户指定的限制下以最赚钱的方式执行交易。
假设Alice想以 1 ETH 交换 3,200 USDC,最低可接受的输出为 3,190 USDC。
填充者Bob可能在 Uniswap V3 上以 1 ETH → 3,199 USDC 的价格执行交换,保持 9 USDC 的利润。
如果另一个填充者查理能够以 1 ETH → 3,196 USDC(仅保留 3 USDC 的利润)来执行同样的交换,那么选择查理的报价。
胜出的填充者将 Permit2 签名提交至反应器合约,该合约执行交换并验证交易条件是否被满足。
现在,这一算法在 Uniswap V4 中能否顺利运作?
与 Uniswap V3 相比,V4 中的路由变得显著复杂。这是因为除了寻找最佳交换路径外,路由算法现在还必须考虑每个钩子中嵌入的逻辑。
正如我们之前讨论的,钩子可以包含任意逻辑。尽管可以根据地址确定钩子实现了哪些函数,但必须执行该函数才能知道钩子的实际行为。这种不确定性使得 Uniswap V4 中的路由变得较为困难。
(Uniswap V4 的路由问题 | 来源: Alex Nezlobin 的 X)
由于钩子可能存在的安全风险,Uniswap V4 的路由仅在填充者完全了解并信任与流动性池关联的钩子逻辑时才会发生。这意味着 UniswapX 填充者必须仔细验证一个钩子是否经过恰当审发及由社区或链上数据源进行了审查,以便将其纳入路由算法。
因此,广泛使用或集成了重要流动性的钩子更容易被填充者选择并纳入 UniswapX 路由算法。
尽管如此,填充者始终会寻求新钩子和池,以最大化利润机会。因此,如果一个钩子表现出可靠性,就值得考虑如何激励填充者将其纳入路由逻辑。
考虑到这些挑战,透明的钩子相关信息仪表盘变得至关重要。社区已经开始建设这样的工具,其中最突出的例子是 HookRank,它的设计模式类似于 Uniswap V4 钩子的 L2Beat。
(HookRank | 来源: hookrank.io)
在 HookRank 上,用户可以查看:
每个钩子的名称和地址
与钩子相关的池的总锁定价值(Total Value Locked, TVL)
使用该钩子的池的交易成功率
目前,由于 Uniswap V4 处于早期阶段,数据集相对较小。然而,随着钩子和 V4 池数量的增加,像 HookRank 这样的工具将变得对 UniswapX 填充者至关重要。
通过利用这样的仪表盘,填充者可以迅速评估各个钩子的可靠性和安全性,从而优化路由决策,最小化风险暴露。
截至 2025 年 2 月,Uniswap V4 仍处于早期阶段,仅在几周前发布。然而,各个团队已经在构建利用 Uniswap V4 钩子的产品。
在本节中,我们将探讨 notable 的项目,利用 Uniswap V4 钩子,并检查利用这一新框架可以构建的协议的潜在范围。
Uniswap V4 钩子的使用景观
该图表展示了 Uniswap V4 钩子在不同领域的各种用例,包括基于 Uniswap V4 钩子构建的协议。让我们探索 Uniswap V4 钩子如何通过各自的机制集成到这些领域中。
人们在谈论 MEV 时,往往将其与交易者面临的劣势(如三明治攻击)联系在一起。然而,MEV 在 Uniswap 等 DEX 中对流动性提供者(LP)的影响也相当显著。简单来说,LP 由于 MEV 而遭受盈利能力的降低。
这一问题被称为“损失与再平衡 (Loss-Versus-Rebalancing,LVR)”。由于 DEX 中的时间被划分成离散区块,LP 不能动态管理其头寸。因此,当与可持续环境下持续再平衡相比,LP 将遭受损失。
(LVR & LP 的非永久损失(IL)在动态市场条件下 | 来源: Delphi Digital)
例如,假设 ETH 在中心化交易所(CEX)上的价格突然翻倍至 2000 美元,而在 DEX 上仍然为 1000 美元。套利者将利用这一价格差异,在 DEX 买入 ETH 并在 CEX 卖出,盈利于两者之间的差价。然而,DEX 上的 LP 并不能即时响应这一价格变化,他们只能以远低于真实市场价值(2000 美元)的价格出售 ETH。
假设 ETH 的价格又突然回落至 1000 美元。套利者将从 CEX 买入 ETH,再售出于 DEX 以再次获利。LP 再次被迫在低于市场的价格上执行交易。
换句话说:
“DEX LP 只有放弃市场波动带来的所有盈利机会,只能馈赠给套利者。”
“LP 理想情况下应该能够动态地重新平衡其头寸以捕捉这些利润,但由于无法这样做而损失。”
这就是 LVR 的基本概念。
(Loss-Versus-Rebalancing 的毒性 | 来源: 最小化损失与再平衡的自动做市商)
LVR 被认为是降低 Uniswap V3 中 LP 盈利能力的主要问题。上述图表将 Uniswap V3 的 LP 比作“交易者”,并根据其退出头寸的时间计算了他们的盈亏 (PnL)。在几乎所有时间框架下,LP 都面临严重的损失。
LVR 问题的根本原因在于 LP 无法积极响应价格变化。最简单有效的解决这一问题的方式是通过协议机制将一部分 MEV 利润重新分配给 LP。
Arrakis Diamond Protocol – 用于 LVR 最小化的钩子
一个显著的 LVR 最小化钩子示例是 Arrakis Diamond Protocol,它受到 Diamond Protocol 的启发。该钩子的核心思想如下:
套利者在执行池内套利交易之前,必须向钩子存入抵押品。
这一机制降低了 MEV 套利的盈利能力,同时鼓励反向交易,最终最小化 LVR。Arrakis的概念验证(PoC)实现基于两个关键条件:
套利者完全了解即将到来的交易及其将如何影响池的价格和流动性。
在下一个区块生成之前,套利者总是会执行交易以使池的token价格与外部市场价格一致。
在启用Arrakis Hook的池中,套利者必须在进行套利交易之前锁定抵押品。该系统包括两个重要规则:
每个块中的第一笔交易必须调整池的token价格,以匹配外部市场价格。
假设Uniswap V4池中ETH的价格为$1200,而外部市场显示ETH为$1100。
套利者必须执行一笔交易,将Uniswap的价格降低至$1100,然后才能执行其他操作。
这个调整后的价格称为承诺价格。
如果套利者未能做到这一点,则该区块中的交易将不被允许。
套利者的抵押品必须足够大,以在价格偏离的情况下将池价格恢复到承诺价格。
抵押品的大小是根据区块内交易的总金额动态计算的。
由于套利者控制哪些交易进入区块,他们可以相应地确定所需的抵押品金额。
一旦池价格与外部市场对齐,套利者最有利的策略是执行反向传递MEV交易。
但如果他们不遵循这一策略,Arrakis的机制将通过防止套利者在区块结束时收回所有抵押品来处罚他们。这种设置迫使套利者遵循可预测、结构化的交易模式,以确保与外部市场的价格同步。
为了跟踪价格变化和抵押品调整,Arrakis Hook使用afterSwap函数。在每次交换后,它根据池价格偏离承诺价格的程度重新计算套利者可以收回的抵押品数量。
因此,MEV提取显著减少,从而最小化LVR并改善LP的盈利能力。针对不同LVR最小化策略下LP表现的模拟也进一步证实了这一点。
(在不同策略下LP的盈利能力 | 来源:LVR最小化在Uniswap V4中的应用)
上图对比了各种LVR最小化策略与标准Uniswap LP位置(CFMM)。使用这些策略的LP比标准Uniswap LP赚取的利润大约高出5%至20%。
总之,Arrakis的LVR最小化Hook强制执行预测性的套利行为,减少了MEV泄漏,并显著提升了LP的盈利能力。
Sorella Angstrom – 基于AVS的LVR最小化Hook
Sorella的Angstrom是另一种旨在使用Uniswap V4 Hooks最小化LVR的应用特定排序(ASS)解决方案。Sorella将基于AVS的链下共识与Uniswap V4 Hooks结合,创建了一种独特的MEV再分配机制。
(Angstrom架构 | 来源:Sorella博客)
Angstrom架构中的用户流程如下:
套利者参与拍卖以赢得在Angstrom Hook启用的池中提交第一笔交易的权利。
同时,交易者将他们的交换请求提交给Angstrom的AVS节点网络,该网络维护一个共享的内存池。
Angstrom网络处理拍卖结果并构建交易包,然后在线提交。
最高出价的套利者的交易始终首先放入该包中。
然后,将该包发送给以太坊的区块构建者和内存池,并包含在区块链中。
那么,这如何最小化LVR呢?获胜套利者的出价将分配给LP。Angstrom不是让套利者为自己提取MEV,而是拍卖MEV利润并将其重新分配给LP。这有效地通过补偿LP因套利交易而通常遭受的损失来最小化LVR。为了重新分配拍卖利润,Angstrom必须跟踪LP的位置并在流动性添加或移除时更新奖励。通过在Uniswap V4 Hook中使用beforeAddLiquidity和beforeRemoveLiquidity来实现这一点。
与Uniswap V3类似,Uniswap V4通过一个名为feeGrowthInside的变量来跟踪LP的收益,该变量存储给定位置每单位流动性累计的费用。Angstrom将相同的概念应用于分配拍卖奖励。每当Angstrom包执行时,出价金额将增加到LP奖励中。每当LP添加、更新或移除其流动性时,这些值都会通过Hook函数自动更新。
因此,Angstrom确保LP获得MEV利润的一部分,从而有效降低他们的LVR风险。
基于波动性的动态费用
LVR不必仅通过MEV再分配来解决。由于LVR在高波动性时期增加,另一种替代方法是根据市场条件动态调整LP费用。Uniswap V4的架构使得通过Hooks轻松实现基于波动性的费用结构。
许多DEX(去中心化交易所)如Trader Joe、Algebra、Hypersea已经实现了基于波动的费用机制。A51 Finance和Bunni正在为Uniswap V4构建将包含基于波动的动态费用机制的Hooks。这些自适应费用结构将帮助LP获得更多利润并减少LVR损失。
Uniswap V4 Hooks也可用于设计创新的代币发行机制。以下是一些著名项目,它们正在利用V4 Hooks进行代币发行和流动性启动。
Flaunch – 在Uniswap V4上的公平发行
一个主要用例是公平发行,在这种情况下,每个人都有平等的机会以固定价格购买代币。Flaunch开发了一种公平发行Hook,使代币销售可以完全在Uniswap V4池中进行。与传统的公平发行协议需要在迁移流动性到Uniswap之前单独的智能合约不同,Flaunch将整个过程集成到V4中。
在Flaunch中,部署Uniswap V4池后,代币以固定价格提供。在公平发行阶段,所有交易都以这个固定价格进行。一旦销售结束,代币开始在Uniswap V4上正常交易。
这通过beforeSwap函数实现。该Hook保持“公平发行激活”状态。如果公平发行正在进行,所有交换均按固定价格执行。一旦销售结束,交易将恢复到标准Uniswap行为。
通过Uniswap V4 Hooks,Flaunch消除了单独启动合约的需要,同时简化了代币分配。
Whetstone Research的Doppler – 荷兰拍卖 + 动态绑定曲线Hook
与公平发行机制类似,Uniswap V4也可以为需要初始流动性的代币项目启动流动性。一个代表性的例子是Whetstone Research提出的Doppler。Doppler利用基于荷兰拍卖的动态绑定曲线算法来确定代币的初始价格,并在Uniswap V4池中启动流动性。
传统的静态绑定曲线机制允许代币在没有初始流动性的情况下进行交易。然而,它们容易受到狙击手机器人的影响,后者在低价时购买代币,并在价格上涨时立即卖出。Doppler通过通过Uniswap V4 Hook将荷兰拍卖与绑定曲线结合起来解决了这个问题。
Doppler的代币发行系统由两个阶段组成:
在发现初始市场价格之前,价格迅速下降。
在发现初始市场价格后,价格根据动态绑定曲线逐渐上升。
在第一阶段,进行荷兰拍卖,期间代币价格随时间下降,使用表示Uniswap V3和V4中价格水平的刻度。该拍卖将继续,直到出现买家,以帮助确定代币的初始价格。
(目标刻度随时间的衰减 | 来源:Doppler白皮书)
一旦初始价格被发现,该代币将采用基于绑定曲线的自由交易机制。关键的不同在于,绑定曲线不是静态的,而是根据市场条件动态调整。
Doppler将绑定曲线的进度分为多个纪元:
如果在一个纪元内售出了足够的代币,绑定曲线将向上移动。
如果没有足够的代币售出,绑定曲线将向下移动。
这种方法确保价格发现更准确地反映实际市场需求,并干扰可预测的机器人行为,从而使狙击攻击和MEV提取更困难。
(动态绑定曲线 | 来源:Doppler白皮书)
此外,Doppler在绑定曲线阶段结束时不是一次性部署所有流动性,而是在多个纪元内逐步投入流动性。这种方法通过确保流动性不被一次性注入池中来防止抢跑和三明治攻击。如果没有这一点,机器人可能会操纵流动性添加以干扰正常用户的交易和池操作。
这些机制通过Uniswap V4 Hook函数实现,例如:
beforeSwap
afterSwap
beforeAddLiquidity
总之,Doppler通过结合荷兰拍卖和动态绑定曲线提供了一种独特的流动性启动解决方案。这种方法解决了关键挑战,例如发现代币的适当初始价格,以及预防传统绑定曲线中常见的MEV相关问题。
该系统的核心实现依赖于Uniswap V4 Hooks,使其成为Hooks如何用于先进代币发行机制的典型例子。
Uniswap是以太坊历史上使用最广泛的DEX,而Uniswap V4使其更加模块化、高效和可定制。这意味着什么,Uniswap V4和DeFi将如何在未来发展?
AMMs最大的限制之一是效率低下。诸如无常损失、LVR和高Gas费等问题一直备受关注。Uniswap V4通过单例架构、闪电会计和原生ETH支持等策略应对高Gas费。因此,池的部署成本降低了99%以上,交换费用相比Uniswap V3显著降低。这使得Uniswap V4能够在以太坊主网上提供大大改善的用户体验,在该网络上交易费用通常很高。
此外,V4通过Hooks赋予构建者高度自主权,使得Uniswap达到可以与中心化交易所竞争的资本效率水平。许多hooks,例如应用特定排序和MEV最小化机制,正在开发中,以为LP提供更高的盈利能力。将部分MEV收入再分配给LP的模式也可能成为标准。通过最小化MEV带来的损失,并增加LP的盈利能力,Uniswap V4能够帮助建立一个更可持续的DeFi结构。
Uniswap V4最大的创新之一是Hooks的引入。该功能使开发者能够自由调整AMM结构,采用动态费用模型,并设计自定义策略。因此,预计针对不同市场条件优化的流动性池将会出现,从而打破过去僵化的AMM模型。
如前所述,Uniswap V4作为一个平台,使开发者能够创建具有针对代币发行、基于波动性的自动费用调整、MEV最小化以及最大化LP利润的定制策略的流动性池。这使得开发者能够设计满足不同需求和市场环境的池。
此外,尽管未在上述内容中详细提及,但新的流动性提供模型也可能会出现,例如在Uniswap流动性基础上构建的借贷或衍生协议,以及关注机构的流动性池,它们限制特定用户的访问以符合监管要求。
这意味着Uniswap正在超越单纯的DEX的发展,未来它有潜力成为一个流动性平台,各种协议将基于其流动性构建,利用Hooks推动生态系统的增长。
从这一结构中产生的Uniswap V4生态系统具有一个关键特征:可持续性。例如,Curve生态系统在2022年初经历高峰,主要依赖于$CRV代币奖励驱动的投票激励。因此,在市场低迷期间,它难以维持。相比之下,Uniswap的生态系统被设计成一个以建设者驱动的环境,各种项目整合独特的逻辑以建立竞争优势。Uniswap V4吸引建设者的兴趣不再依赖于代币奖励,而是提供Hooks的灵活性和可编程性。
在这个建设者驱动的生态系统中,优质项目通过竞争与合作,在逐步推进协议的同时,Uniswap V4预计会创造出积极的反馈循环——提升LP盈利能力,增加总锁定价值(TVL),从而驱动更大的交易量,进一步巩固其作为领先DeFi平台的地位。
关注 @2077Research 以获取更多研究文章,访问网站以深入了解以太坊研发主题。
- 原文链接: research.2077.xyz/a-comp...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!