Uniswap v4 架构与安全分析:Hooks、Singleton、Flash Accounting

  • zealynx
  • 发布于 13小时前
  • 阅读 19

Uniswap v4 是对 Uniswap 协议的重大架构演进,旨在将该协议从一个独立的应用转变为链上流动性的基础平台。它通过“Hooks”实现了资本效率和可编程性的结合,并通过“Singleton”架构和“Flash Accounting”实现了显著的 Gas 优化。文章还深入探讨了 v4 版本的安全性分析,开发者集成指南以及如何安全地 Fork 和扩展 Uniswap v4。

Uniswap v4 代表了该协议的下一个重大架构演进。它不仅仅是一个迭代,而是对 Uniswap 在 DeFi 生态系统中的角色进行的一次根本性的重新构想。V4 的愿景是将该协议从一个独立的应用程序转变为一个基础平台——一个链上流动性的操作系统。它通过结合 v3 的资本效率和通过 "Hooks" 实现的一种激进的新可编程层,以及通过 "Singleton" 架构和 "Flash Accounting" 实现的显著 Gas 优化来实现这一点。

核心架构和愿景

Uniswap v4 被设计成一个高度可扩展和高效的流动性层,它建立在其前任的基础上,创造了一个去中心化交易所开发的新范例。

Hooks 是 v4 的旗舰功能,也是其可定制性的主要驱动力。它们是可以注册到池中的外部智能合约,用于在其生命周期的特定、明确定义的点上执行自定义逻辑。这种 "插件" 架构允许开发者将自己的代码注入到核心池逻辑中,从而实现以前不可能或复杂得令人望而却步的大量新功能。

这些回调在关键时刻被触发,包括:

  • beforeInitialize / afterInitialize
  • beforeSwap / afterSwap
  • beforeAddLiquidity / afterAddLiquidity
  • beforeDonate / afterDonate

这为直接构建到池执行流程中的功能开启了一个设计空间,例如:

  • 链上限价单:创建比 v3 的范围订单更具表现力且 gas 效率更高的限价单。
  • 动态费用:实施基于波动率或其他链上数据算法调整的费用结构。
  • 自定义 AMM 曲线:超越标准集中流动性模型,实施独特的粘合曲线。
  • 集成 MEV 保护:构建诸如通过私有中继路由交易或实施 TWAMM(时间加权平均做市商)功能等机制,以保护用户。

V4 放弃了所有先前版本中使用的工厂/配对模型。相反,所有池及其流动性都在一个名为 PoolManager 的单一、统一的合约中进行管理。这种 singleton 设计通过集中逻辑和状态提供了大量的 Gas 节省:

  • 池创建:创建一个新的池不再是一个完整的合约部署 (CREATE2),而是 PoolManager 中的一个简单的状态更新,使其成本降低高达 99%。
  • 多跳交易:当跨多个池进行交易时(例如,A -> B -> C),token 不再需要在单独的池合约之间转移。所有会计处理都在 singleton 内部处理,从而大大降低了复杂交易的 Gas 成本。

作为 singleton 架构的补充,是一个名为 Flash Accounting 的新系统,它利用了 EIP-1153(瞬态存储)。在涉及多个操作的交易期间(例如,交换后添加流动性),PoolManager 不会为每个中间步骤执行 token 转移。相反,它会跟踪用户钱包的净余额变化,即 "deltas"。只有在整个操作序列的最后,才会使用单个 token 转移来结算最终的净余额。这最大限度地减少了昂贵的 transfer 和 transferFrom 调用,从而进一步降低了交易成本。

singleton 和 Flash Accounting 模型的结合使得重新引入原生 ETH 对变得可行,而无需导致在 v2 中采用 WETH 的复杂性和流动性碎片化问题。由于原生 ETH 转移在 Gas 方面比 ERC-20 转移便宜得多,这为最常见的交易对提供了另一层效率。

安全性分析:一种积极的评估

随着 Uniswap v4 部署在主网上,其安全性分析侧重于其高度灵活的设计引入的新攻击面。安全模型从信任单一的、整体的协议转变为更复杂的、共同责任模型。

Hooks 是来自核心 PoolManager 的外部调用,如果开发时没有格外小心,这本身就会引入新的攻击向量。

  • 重入风险:Hooks 的本质重新引入了重入攻击的风险,这是一种在 v2 和 v3 的核心合约中已基本解决的漏洞。如果在自己的状态完全更新之前,hook 对不受信任的合约进行外部调用,则可能会被利用来耗尽资金或操纵池状态。
  • 恶意逻辑和访问控制:Hook 是任意代码。恶意 hook 可能会被设计为抽取交易的百分比、抢先交易其自己的用户或阻止特定条件下的提款。Cork 协议中发现的一个严重漏洞(该协议使用了 v4 风格的 hook 架构)是由于缺乏访问控制。这允许攻击者直接调用 hook 的函数(绕过 PoolManager)并操纵其内部状态以铸造无抵押的衍生 token。这凸显了 hook 验证其调用者是否为合法的 PoolManager 的绝对必要性。
  • 基于 Gas 的拒绝服务 (DoS):包含无界循环或计算成本高昂的操作的 hook 可能会消耗交易中的所有 Gas,导致其还原。攻击者可以利用这一点使池永久不可用或通过确保任何提款交易都失败来困住用户资金。

对 Uniswap Labs 和 OpenZeppelin 开发的示例 hook 的安全审计已经揭示了安全编写它们所需的微妙之处。对 AntiSandwichHook 和 LiquidityPenaltyHook 的审计发现了完全破坏其预期安全机制的关键缺陷。例如,专为即时 (JIT) 流动性提供者设计的惩罚可以通过特定的一系列操作完全绕过。

这些发现表明,编写安全的 hook 异常困难。v4 架构将 Uniswap 从一个简单的应用程序转变为一个平台。PoolManager 充当安全的 "内核",提供状态管理和会计等核心服务。Hooks 是在此内核上运行的 "用户空间应用程序"。这创造了一种共同责任:

  • Uniswap Labs 负责 PoolManager 内核的安全性。
  • Hook 开发者负责其代码的安全性。
  • 最终用户负责决定信任哪些 hook。

"Uniswap v4 漏洞" 很容易发生在流行的第三方 hook 中,而核心协议中没有任何缺陷,这使得整个生态系统的信任和风险评估变得复杂。

开发者集成指南

为 Uniswap v4 进行开发是一种根本不同的体验。开发者现在不是简单地与一个完成的协议集成,而是通过自定义构建的逻辑来扩展其核心功能。

  • 设计和实施 Hooks:v4 中的主要开发任务是创建 hook。这包括选择所需的核心 hook 函数(beforeSwapafterAddLiquidity 等)并安全有效地实施它们。
  • Hook 地址挖掘:hook 的权限(允许它实施哪些函数)被编码在其已部署合约地址的最低有效位中。这种节省 Gas 的措施允许 PoolManager 使用按位运算而不是存储读取来检查权限。因此,开发者必须使用 "挖掘" 工具(如提供的 HookMiner 实用程序)来查找 CREATE2 salt,该 salt 生成具有正确权限标志已启用的合约地址。
  • 与 Singleton 和 unlock 交互:所有池操作都通过单个 PoolManager 合约启动。标准交互模式涉及调用 unlock,这会授予调用者一个临时锁并回调调用者的合约。在此回调中,开发者可以执行一系列池操作(交易、流动性修改)。
  • 理解 Flash Accounting 和 Deltas:集成必须围绕 Flash Accounting 系统构建。逻辑不应跟踪单个 token 转移,而是对池操作返回的 BalanceDelta 对象进行操作。此对象表示在 unlock 范围结束时每个 token 的用户余额的净变化。

安全 hook 开发是在 v4 上构建的最关键的方面。开发者必须采用纵深防御方法。

  • 访问控制:PoolManager 调用的所有 hook 函数必须验证 msg.sender 是否为 PoolManager 地址,以防止直接的、恶意的外部调用。
  • 重入保护:执行对另一个合约的外部调用的任何 hook 函数都必须使用重入保护(nonReentrant 修饰符)来防止递归执行。
  • 输入验证:Hooks 必须严格验证所有参数。攻击者可以使用恶意或非标准的 ERC-20 token 创建一个池来利用 hook 逻辑中的漏洞。
  • 状态管理:如果 hook 旨在由多个池使用,则必须仔细设计其状态管理,以防止来自一个池的数据影响另一个池(例如,通过将状态变量映射到 PoolId)。
  • 自定义会计风险:具有修改会计 deltas 权限的 hook 特别强大和危险。逻辑必须在数学上合理且经过严格测试,以防止与舍入误差、整数溢出/下溢或经济操纵相关的漏洞。
  • 信任假设和可升级性:开发者必须对其 hook 的信任假设保持透明。如果 hook 具有特权所有者或可以通过代理升级,则会引入重大的中心化风险,必须通过强大的治理机制(例如,时间锁或多签名钱包)来保护。

安全地 fork 和扩展 Uniswap v4 的指南

Uniswap v4 的架构从根本上改变了 "fork" 协议的含义。虽然 fork 核心 PoolManager 合约是可能的,但自定义的主要机制是构建 hook。本节为考虑使用 hook 扩展 v4 和执行 fork 核心协议的更重要任务的团队提供指导。

从历史上看,DEX fork 一直受到反复出现的安全故障的困扰。v4 的复杂性为这些经典错误引入了新的变体。

  • 低估核心复杂性:团队经常 fork 他们不完全理解的代码。v4 PoolManager 依赖于 singleton 架构、Flash Accounting、瞬态存储 (EIP-1153) 和 hook 回调系统之间的微妙相互依赖关系。对会计逻辑或锁定机制的看似微小的更改可能会产生灾难性的、级联的后果,从而破坏核心不变性。
  • 引入不安全的可升级性:一个常见且危险的错误是将 fork 的 PoolManager 包装在由简单的 EOA 或小型多重签名控制的可升级代理中。这集中了对所有池和流动性的控制,从而创建了一个单点故障。管理员密钥的泄露可能导致立即盗取协议中的所有资金。
  • 忽略 Hook 安全模型:v4 fork 的安全性不仅仅是核心合约,而是构建在其上的整个 hook 生态系统。未能为其 hook 构建者提供明确的安全指南、开发者教育和工具的 fork 协议正在创建一个危险的环境。安全责任是分担的,fork 的创建者必须领导这项工作。
  • 假设原始审计就足够了:这是一个关键错误。任何修改,无论多么小,都会使原始审计的安全假设失效。fork 是一个新协议,必须接受其自己的全面、独立的安全性审查,包括经济建模和可能的形式化验证。

在部署 Uniswap v4 核心的 fork 之前,开发团队应严格解决以下几点。此清单对于构建严重依赖 hook 的复杂系统的开发者也很有价值。

1. 核心协议修改

  • [ ] 证明 Fork 的合理性:你所需的功能是否可以作为 hook 而不是核心协议更改来实现?核心 fork 应该是绝对的最后手段。
  • [ ] 不变性测试:你是否编写了一套全面的不变性测试(例如,使用 Foundry)以确保你的更改不会破坏协议的基本会计原则?关键不变性包括:

    • PoolManager 持有的 token 总余额必须始终等于所有池余额的总和。
    • 用户的余额 delta 永远不能被操纵来创建或销毁 token。
  • [ ] 分析 Gas 和状态影响:你的更改如何影响常见操作(如交易和流动性管理)的 Gas 成本?你是否引入了任何新的状态增长向量,这些向量可能会导致随着时间的推移 Gas 膨胀?
  • [ ] 仔细检查底层代码:如果你修改了任何汇编或未检查的数学块,这些更改是否已由多个工程师独立审查,并在可能的情况下进行了形式化验证?这些是最有可能出现严重错误的来源。

2. Hook 生态系统安全

  • [ ] 定义 Hook 策略:你对于将在你的生态系统中鼓励或阻止的 hook 类型是否有明确的策略?你会为第三方 hook 提供注册表或审查流程吗?
  • [ ] 开发者教育:你是否创建了专门为在你的 fork 协议上编写 hook 而设计的强大的文档、教程和安全最佳实践?这应包括有关重入、访问控制和状态管理的明确警告。
  • [ ] Hook 权限的治理:你是否考虑了 hook 权限系统的影响?如果你更改它,你将如何防止开发者创建过度授权的、危险的 hook?

3. 经济安全

  • [ ] 建模经济交互:你是否建模了你的核心更改如何与各种 hook 设计交互以创建新的经济漏洞?例如,当与特定的交易模式结合使用时,是否可以操纵动态费用 hook 来耗尽池?
  • [ ] Oracle 完整性:如果你的任何更改影响到刻度和流动性的存储或计算,你是否验证了 TWAP oracle 仍然具有抗操纵性?
  • [ ] MEV 向量分析:你是否分析了你的修改是否创建了新的、有利可图的 MEV 机会(除了标准套利和 sandwich 攻击)?这些机会可能会损害用户。

4. 运营安全

  • [ ] 安全部署和管理:你的部署流程是否已编写脚本、经过测试且安全?如果协议包含任何管理角色(例如,用于协议费用收集),这些密钥是如何管理和保护的?
  • [ ] 事件响应计划:你是否在启动前准备好了详细的事件响应计划?这应包括监控系统、通信策略、技术和法律专家作战室以及在必要时暂停协议的工具。
  • [ ] Bug 赏金计划:你是否已资助并启动了一项具有竞争力的、公开的 Bug 赏金计划,其中包含明确的范围和奖励等级?这应在你的主网启动之前上线,以吸引白帽来审查你的代码。

结论

Uniswap v1 到 v4 的演变是去中心化协议设计的一门大师课,它勾勒了一条从根本的简单性到深刻的可定制性的刻意路线。每个版本都代表了一组不同的权衡,平衡了资本效率、用户复杂性和安全保证。虽然 v1 证明了 AMM 的概念,而 v2 将其完善为一个强大的 DeFi 乐高积木,但 v3 以牺牲简单性为代价打破了资本效率的壁垒。现在,v4 完全提出了一个新的范例——将 Uniswap 从一个应用程序转变为一个平台。对于开发者、审计员和用户来说,理解这一轨迹至关重要。选择不再仅仅是使用哪个 DEX,而是构建在哪个链上流动性层之上,以及这种选择所带来的安全责任。

联系方式

在 Zealynx,我们深刻理解复杂的 AMM 设计,从集中流动性到新兴的 hook 架构以及 Uniswap 等协议的安全挑战。无论你是构建新的 DeFi 协议、审计现有协议,还是需要有关 AMM 项目安全的专家指导,我们的团队都随时准备提供帮助 - 联系我们

想要通过更多像这样的深入分析保持领先地位吗?订阅我们的新闻通讯,确保你不会错过未来的见解。

常见问题解答:深入了解 Uniswap 协议

1. 什么是自动化做市商 (AMM)? 自动化做市商 (AMM) 是一种去中心化交易协议,它使用数学公式为资产定价,而不是传统的订单簿。在像 Uniswap 这样的 AMM 中,流动性提供者将 token 对存入智能合约(流动性池),交易者可以直接针对这些池交换 token。价格根据池中 token 的比率以算法方式确定,从而实现 24/7 交易,无需中介或中心化交易所。 2. Uniswap v4 中的 Hooks 是什么以及它们如何工作?Hooks 是 Uniswap v4 的旗舰功能。它们是外部智能合约,允许开发者在池生命周期的特定点执行自定义逻辑(例如,交易之前或之后、添加流动性或移除流动性)。这种 "插件" 架构使开发者能够将新的功能(例如基于波动率调整的动态费用、链上限价单、自定义 AMM 曲线或集成 MEV 保护)直接添加到池的执行流程中。 3. Uniswap 中的集中流动性是什么?集中流动性是 Uniswap v3 中引入并在 v4 中延续的一项功能,允许流动性提供者为其资本指定自定义价格范围。LP 不会在整个价格曲线(0 到无穷大)上提供流动性,而是可以将资金集中在交易活动最有可能发生的特定价格边界内。与 v2 相比,这导致高达 4000 倍的资本效率,因为可以用明显更少的资本实现相同的流动性深度。 4. Singleton 架构如何降低 Uniswap v4 中的 Gas 成本? Singleton 架构将所有池整合到一个名为 PoolManager 的单一智能合约中,取代了先前版本的工厂/配对模型。这从两个方面显着降低了 Gas 成本:(1) 创建新池成为简单的状态更新而不是部署新合约(便宜 99%),以及 (2) 多跳交易(例如,交易 A→B→C)不再需要在单独的合约之间转移 token - 所有会计处理都在 singleton 内部进行,从而节省了复杂交易的大量 Gas。 5. Uniswap v4 中的 Flash Accounting 是什么?Flash Accounting 是 Uniswap v4 中的一种 Gas 优化技术,它使用 EIP-1153 瞬态存储来跟踪交易期间的余额变化,而无需执行中间 token 转移。PoolManager 不会在每次操作后转移 token,而是维护 "deltas"(净余额变化)的运行总计,并且仅在交易序列结束时结算最终的净额。这消除了多个昂贵的 ERC-20 转移调用,从而大大降低了复杂操作的交易成本。 6. 什么是 MEV 以及它如何影响 Uniswap 用户?MEV(最大可提取价值)是指可以通过重新排序、包含或排除区块中的交易来提取的利润。在 Uniswap 的上下文中,最常见的 MEV 攻击是 "sandwich 攻击",其中机器人检测到待处理的交易,在其之前放置买单并在其之后放置卖单,从而从受害者的交易的价格影响中获利。Uniswap v4 hook 使开发者能够将 MEV 保护机制直接构建到池中,例如通过私有中继路由交易或实施 TWAMM(时间加权平均做市商)功能。 7. 开发者在构建 Uniswap v4 hook 时应考虑哪些安全风险? 由于几个关键风险,为 Uniswap v4 开发安全 hook 需要格外小心:(1) 来自对不受信任的合约的外部调用的重入攻击,(2) 如果 hook 未能验证调用者是合法的 PoolManager,则存在访问控制漏洞,(3) 来自无界循环或昂贵操作的基于 Gas 的拒绝服务,以及 (4) 来自不正确的 delta 计算的会计操纵。v4 架构创建了一个共同责任模型,其中 hook 开发者必须实施严格的访问控制、重入保护、输入验证和彻底的测试,以防止漏洞。

词汇表

本文中使用的关键术语的快速参考:

术语 定义
自动化做市商 (AMM) 一种去中心化交易协议,它使用数学公式为资产定价,而不是订单簿。
Hooks Uniswap v4 中的外部智能合约,它在池生命周期的特定点执行自定义逻辑。
Singleton 架构 一种设计模式,其中所有池都在单个统一合约中进行管理,从而降低了 Gas 成本。
Flash Accounting 一种 Gas 优化技术,它跟踪交易期间的余额 deltas,并且仅结算最终的净额。
集中流动性 一种流动性提供模型,其中 LP 可以为其资本指定自定义价格范围。
MEV(最大可提取价值) 通过重新排序、包含或排除区块中的交易来提取的利润。
重入攻击 一种漏洞,其中外部调用允许恶意合约在状态更新完成之前递归地回调。

查看完整的词汇表 →

  • 原文链接: zealynx.io/blogs/uniswap...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zealynx
zealynx
江湖只有他的大名,没有他的介绍。