Uniswap V4 Hooks — Hooks介绍 — 找到你的问题的答案

  • zealynx
  • 发布于 3天前
  • 阅读 20

本文是Uniswap Hook Incubator Cohort 2课程中,学生关于Uniswap v4 Hooks提出的问题及导师Haardik的解答。内容涵盖了hooks的功能、恶意hooks的处理、不同类型的hooks、token transfer管理、LP收益与无常损失、hooks的同步/异步性质、地址挖掘、以及与价格查询、解锁调用等相关的问题。

以下是你从 Atrium Academy + Uniswap Foundation 管理的 Uniswap Hook Incubator Cohort 2 的学生处收集的问题,由我们的讲师 Haardik 回答。

本课程是对 Uniswap v4 Hooks 的介绍,包括理论和技术部分,因此以下问题将涉及整体功能和具体技术细节。

1. 如果 hook 合约函数在另一个函数中被调用,它是否需要像闪电贷一样在单个交易或区块时间内完成?如果是,我们不能在 hooks 中包含大量逻辑?

默认情况下,它们假定是同步行为,但从技术上讲,有办法使它们成为异步的。这取决于你。你可以按照你想要的方式创建这些hooks。

2. Uniswap 会管理 hooks 吗?因为可能存在恶意 hooks,或者具有许多功能和能力的高质量 hooks。

V4 尚未部署到主网,因此截至今天,这不是一个真正的问题。但是,最终,当无许可路由开始时,他们可能会对此进行一些思考。但是,就像在上线的第一天,网站可能不会将用户发送到具有随机 hooks 的随机池中。这将在稍后实现。

3. 每个 tokenPair 只有一个 hook (before/after) 吗?或者你可以在 swap 期间即插即用任何hook (before/after) 吗?

每个池最多只有一个 hook。我们有很多不同的 hooks。所以我在这里尝试对它们进行一些分类。因此,有 initialize 之前和之后。当创建新池时,会调用这些函数。因此,当第一次设置池时,它可以选择执行 initialize 之前和之后的调用。然后,我们在添加流动性和移除流动性之前和之后执行操作。从名称上可以清楚地看出这一点,它们在添加或移除流动性之前和之后被调用。

然后,我们有已经讨论过的 swap 之前和之后的 hooks。还有 donate 之前和之后的 hooks。我们目前还没有讨论捐赠,但它们有点小众。它们在非常非常特定的情况下有一个用例,但捐赠实际上就像你只是向池中的 LP 捐款。所以,如果你想给他们小费,也许因为某些原因,你喜欢 LP,并且你想感谢他们为你的无名 shitcoin 增加流动性,我的意思是,你可以偶尔给他们小费并调用 donate,他们会很高兴的。

但是,是的,donate hooks 在那里运行。然后是 swap、添加流动性、移除流动性、返回 delta 之前和之后的 hooks,这些是一些高级 hooks。我们现在不打算讨论这个问题。我们稍后再讨论这个问题,但这些是一些高级 hooks,我们将在本课程的后半部分中介绍。

因此,虽然每个池只能有一个 hook 合约,但该合约可以为不同的操作(如 swap 之前、swap 之后、添加流动性之前等)实现多个 hook 函数。为池启用的特定 hooks 由 hook 合约的地址确定,我们将在下一个关于 hook 地址挖掘的问题中介绍。

4. 核心池逻辑是否也管理 tokens 的转移,还是只进行记账?如果只进行记账,为什么不进行转移?

在最后一步之前,实际上不会发生任何 token 转移。因此,让我们讨论一下这是如何工作的。因此,这背后的主要逻辑实际上是 v4 具有的这种锁定机制。所以,基本上,发生的事情是,假设,每当你想在 Pool Manager 中执行某些操作时,顶级函数(如 swap 和修改头寸之类的)实际上不能由最终用户调用。例如,EOA,EOA 地址,比如你的 MetaMask 钱包之类的,你实际上不能在池管理器上调用这些函数。

你需要的是一个路由合约来代表你调用这些函数。对吧?这也发生在 Uniswap v3 中,你实际上会通过一个路由合约来调用所有实际的池合约。例如,作为最终用户,这些函数不能直接调用。但是,基本上,当路由合约开始对池管理器的调用时,它们首先调用名为 unlock 的函数。

你可以认为它类似于,池管理器最初处于锁定状态。当你的交易开始时,你首先解锁池管理器,并且,它不能已经被解锁。否则,这将恢复。因此,一旦它被解锁,池管理器将回调你的合约,即路由合约。因此,它将调用此回调函数。

在此回调函数中,你可以做任何你想做的事情。你进行 swap,你在某个地方添加一些流动性,你从其他地方移除一些流动性,你或许可以再次进行 swap,你可以做任何你想做的事情。然后,最终,你从该回调函数返回。一旦你从回调函数返回,正如你正在执行这些操作一样,v4 会跟踪余额是如何变化的。它在内部进行记账。

对吧?例如,用户欠池管理器多少钱,池管理器欠用户多少钱?因此,它会在每次操作时跟踪它。例如,如果你一开始以 1 ETH 出售一些 USDC,它会跟踪,好的。我需要从用户那里拿钱。我需要退还给他们 35100 USDC。然后,也许你会说,好的。现在拿出 USDC 并将其中的 1,000 用于交换其他 token。然后,它会跟踪这一点。它会考虑你在每次操作时所做的每一件事。

但是,最终,当你返回时,此时,整个事情应该已经平衡。此时,不应有任何待处理余额。因此,在你所有操作结束时,你必须结算所有余额。你必须向池管理器支付你欠它的任何款项,并且你必须从池管理器中提取它欠你的任何款项。如果情况并非如此,如果存在尚未结算的余额,你的交易将恢复。

否则,池将再次锁定自身,并且你的交易将成功。

5. 如何强制执行 hooks?我的意思是它们连接到特定的 LP,例如当用户增加流动性时,他们会添加连接到特定 hook 逻辑的 LP 吗?

为了澄清一下,这里有一点混淆。LP 没有 hooks。LP 是用户。Hooks 附加到池。

6. 我们是否必须自己编写路由合约,或者它是否可用?

有基本的路由可用。例如,一些路由是可用的,就像他们使用 v3 所做的那样,但是如果你需要一些非常特殊的东西,你可以随时选择创建自己的路由合约,也许这些东西不存在。但是,如果基本的东西不能满足你的需求,你可以创建自己的。

7. 瞬态存储 EIP 编号是什么?

EIP 编号 1153。瞬态记账 (瞬态存储) 是一个非常非常新的 EIP,最近才合并到以太坊主网中。

瞬态存储的很酷的地方在于,读取和写入瞬态存储的数据非常便宜,但是该数据仅存在于单个交易的上下文中。对吧?它不存在于该交易之外。因此,你可以在交易开始时开始写入瞬态存储,然后你可以从中读取,直到交易结束。但是交易完成后,就像它从未存在过一样。对吧?但是使用起来确实很便宜,这很不错。

8. V4 中的 LP 是否能够赚取更多和更少的无常损失?如果是,如何实现?

v4 的核心逻辑与 v3 相同。Swaps、费用、LP 头寸等与 v3 完全相同。因此,假设一个没有附加任何 hooks 的池,它们的工作方式与 v3 完全相同。但是你可以创建 hooks,尝试最大化 LP 的收益,并为他们提供更多并减少 无常损失,但是 v4 的默认行为与 v3 没有什么不同。

9. 这些 hooks 是同步/异步的吗?

默认情况下,它们假定是同步行为,但是从技术上讲,有办法使它们成为异步的。这取决于你。你可以按照你想要的方式创建这些 hooks。

10. Uniswap 如何处理恶意 hooks?

V4 尚未部署到主网,因此截至今天,这不是一个真正的问题。但是,最终,当无许可路由开始时,他们可能会对此进行一些思考。但是,就像在上线的第一天,网站可能不会将用户发送到具有随机 hooks 的随机池中。例如,它将在稍后实现。

11. 在 1155 中,所有 tokens 都是相似的或相同的,但是 6909 可以具有相同 token 架构的不同 tokens,对吧?

ERC-6909 只是单个合约中的多个 ERC-20。因此,不像你可以在其中拥有类似 ERC-20 和 ERC-721 的东西。不。例如,只有多个 ERC-20s。

12. 如果我想知道,例如,ETH 的 USDC 价格,我是否需要按交易对、费用和 hook 进行查询?是否有办法接收所有 hooks 的列表?

如果你想查找交易对的价格,那么,是的,你需要知道你要检查的特定池。而且,同样,可能存在多个 ETH 到 USDC 的池,正如你所说,但是,是的,你可以,当你查看价格或需要指定要查看的特定 ETH-USDC 池时,每个池最多只有一个 hook。

因此,我的意思是,如果你试图找出存在的所有 ETH-USDC 池,我假设你正在从链下收集此数据。因此,这有点像你索引来自 Pool Manager 合约的所有池创建事件,并找到 token 对为 ETH 和 USDC 的所有池。

13. 即使我们设法挖掘一个地址,我们如何确保 hook 被部署到该地址?我们不能事先指定要部署到的地址,对吧?

你可以。你可以做到。有一个名为 create2 的 EVM 操作码,它允许你在合约部署之前找出部署地址。因此,所有 hooks 必须通过 create2 部署。因此,你可以挖掘一个非常具体的地址,然后在那里部署你的 hook。

14. 这个想法是,具有最佳 hook 的最佳池将吸引最多的流动性?

不一定。实际上,更多的是关于将会有不同的用例。对吧?因此,例如,普通的、每天不知情的交易者可能会通过默认的 ETH-USDC 池,该池可能根本没有附加任何 hook。但是,假设还有其他人可能想要进行非常大的交易。他们可能一次交易 50,000,000 美元。他们可能想要通过一个附加了 hookPool,这可以帮助减少 MEV 并降低他们受到 三明治攻击 的风险,并且,你知道,为他们的资金提供更好的价格效率。因此,他们可能会选择那个。

但另一方面,一个可能不想担心重新平衡其头寸并希望这些事情自动发生的 LP。他们可能会通过一个带有 hook 的池,该 hook 会为他们执行此操作。它会自动重新平衡他们的流动性。

因此,不同的人有不同的用例,这有点像一个类比,我认为。但对于普通的、每天不知情的交易者来说,他们可能会通过前端带他们去的地方,或者他们的钱包会带他们去的地方进行交易。

15. 在非 hook 函数中的 hook 合约中调用解锁好吗?还是仅意味着通过路由器调用?

你可以从任何地方调用解锁。任何合约都可以调用解锁来对 Pool Manager 执行某些操作,然后再次锁定它。实际上,你在 hook 合约中不能调用解锁,因为你甚至已经进入 hook 函数这一事实意味着有人调用了解锁,做了一些事情,然后调用了你的 hook。

因此,你不能调用解锁两次。因此,实际上不可能在常规 hook 函数中的 hook 合约内调用解锁。

但是在非 hook 函数中,你可以这样做。是的。抱歉。我误读了你的问题。在非 hook 函数中,你可以这样做。是的。

16. 创建池后可以更新 hooks 吗?

不。我的意思是,我猜你可以使用 代理 和人们所说的东西,但除此之外,不能。

如果你有任何未在此处回答的问题,现在是你的机会!!

在评论中提问,我会回复你寻求的答案。

请务必订阅并继续关注,因为我将在接下来的几个月中发布更多 Uniswap V4 内容。

让我们连接:

Twitter

LinkedIn

如果你需要以下方面的帮助,请进行协作:

  • 智能合约审计(Solidity、Rust、Cairo)
  • 高级安全测试套件(Fuzz、不变性测试 + 形式验证)
  • 智能合约开发
  • Web2 渗透测试

GitHub

Twitter

词汇表

术语 定义
Hooks Uniswap v4 中的外部智能合约,在池生命周期的特定时间点执行自定义逻辑。
Pool Manager Uniswap v4 中的单例合约,用于管理统一系统中的所有池、流动性和调换。
地址挖掘 查找具有特定属性的合约部署地址的过程,在 Uniswap v4 中用于配置 hook 权限。
ERC-6909 Uniswap v4 中用于 gas 高效 token 记账的最小多 token 接口标准。
瞬态记账 EIP-1153 存储模式,用于跟踪交易中的净余额变化,仅结算最终金额以降低 gas 成本。
闪电记账 一种 gas 优化技术,用于在交易期间跟踪余额增量,并且仅结算最终净额。

查看完整词汇表 →

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

0 条评论

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