本文是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 的介绍,包括理论和技术部分,因此以下问题将涉及整体功能和具体技术细节。
默认情况下,它们假定是同步行为,但从技术上讲,有办法使它们成为异步的。这取决于你。你可以按照你想要的方式创建这些hooks。
V4 尚未部署到主网,因此截至今天,这不是一个真正的问题。但是,最终,当无许可路由开始时,他们可能会对此进行一些思考。但是,就像在上线的第一天,网站可能不会将用户发送到具有随机 hooks 的随机池中。这将在稍后实现。
每个池最多只有一个 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 地址挖掘的问题中介绍。
在最后一步之前,实际上不会发生任何 token 转移。因此,让我们讨论一下这是如何工作的。因此,这背后的主要逻辑实际上是 v4 具有的这种锁定机制。所以,基本上,发生的事情是,假设,每当你想在 Pool Manager 中执行某些操作时,顶级函数(如 swap 和修改头寸之类的)实际上不能由最终用户调用。例如,EOA,EOA 地址,比如你的 MetaMask 钱包之类的,你实际上不能在池管理器上调用这些函数。
你需要的是一个路由合约来代表你调用这些函数。对吧?这也发生在 Uniswap v3 中,你实际上会通过一个路由合约来调用所有实际的池合约。例如,作为最终用户,这些函数不能直接调用。但是,基本上,当路由合约开始对池管理器的调用时,它们首先调用名为 unlock 的函数。
你可以认为它类似于,池管理器最初处于锁定状态。当你的交易开始时,你首先解锁池管理器,并且,它不能已经被解锁。否则,这将恢复。因此,一旦它被解锁,池管理器将回调你的合约,即路由合约。因此,它将调用此回调函数。
在此回调函数中,你可以做任何你想做的事情。你进行 swap,你在某个地方添加一些流动性,你从其他地方移除一些流动性,你或许可以再次进行 swap,你可以做任何你想做的事情。然后,最终,你从该回调函数返回。一旦你从回调函数返回,正如你正在执行这些操作一样,v4 会跟踪余额是如何变化的。它在内部进行记账。
对吧?例如,用户欠池管理器多少钱,池管理器欠用户多少钱?因此,它会在每次操作时跟踪它。例如,如果你一开始以 1 ETH 出售一些 USDC,它会跟踪,好的。我需要从用户那里拿钱。我需要退还给他们 35100 USDC。然后,也许你会说,好的。现在拿出 USDC 并将其中的 1,000 用于交换其他 token。然后,它会跟踪这一点。它会考虑你在每次操作时所做的每一件事。
但是,最终,当你返回时,此时,整个事情应该已经平衡。此时,不应有任何待处理余额。因此,在你所有操作结束时,你必须结算所有余额。你必须向池管理器支付你欠它的任何款项,并且你必须从池管理器中提取它欠你的任何款项。如果情况并非如此,如果存在尚未结算的余额,你的交易将恢复。
否则,池将再次锁定自身,并且你的交易将成功。
为了澄清一下,这里有一点混淆。LP 没有 hooks。LP 是用户。Hooks 附加到池。
有基本的路由可用。例如,一些路由是可用的,就像他们使用 v3 所做的那样,但是如果你需要一些非常特殊的东西,你可以随时选择创建自己的路由合约,也许这些东西不存在。但是,如果基本的东西不能满足你的需求,你可以创建自己的。
EIP 编号 1153。瞬态记账 (瞬态存储) 是一个非常非常新的 EIP,最近才合并到以太坊主网中。
瞬态存储的很酷的地方在于,读取和写入瞬态存储的数据非常便宜,但是该数据仅存在于单个交易的上下文中。对吧?它不存在于该交易之外。因此,你可以在交易开始时开始写入瞬态存储,然后你可以从中读取,直到交易结束。但是交易完成后,就像它从未存在过一样。对吧?但是使用起来确实很便宜,这很不错。
v4 的核心逻辑与 v3 相同。Swaps、费用、LP 头寸等与 v3 完全相同。因此,假设一个没有附加任何 hooks 的池,它们的工作方式与 v3 完全相同。但是你可以创建 hooks,尝试最大化 LP 的收益,并为他们提供更多并减少 无常损失,但是 v4 的默认行为与 v3 没有什么不同。
默认情况下,它们假定是同步行为,但是从技术上讲,有办法使它们成为异步的。这取决于你。你可以按照你想要的方式创建这些 hooks。
V4 尚未部署到主网,因此截至今天,这不是一个真正的问题。但是,最终,当无许可路由开始时,他们可能会对此进行一些思考。但是,就像在上线的第一天,网站可能不会将用户发送到具有随机 hooks 的随机池中。例如,它将在稍后实现。
ERC-6909 只是单个合约中的多个 ERC-20。因此,不像你可以在其中拥有类似 ERC-20 和 ERC-721 的东西。不。例如,只有多个 ERC-20s。
如果你想查找交易对的价格,那么,是的,你需要知道你要检查的特定池。而且,同样,可能存在多个 ETH 到 USDC 的池,正如你所说,但是,是的,你可以,当你查看价格或需要指定要查看的特定 ETH-USDC 池时,每个池最多只有一个 hook。
因此,我的意思是,如果你试图找出存在的所有 ETH-USDC 池,我假设你正在从链下收集此数据。因此,这有点像你索引来自 Pool Manager 合约的所有池创建事件,并找到 token 对为 ETH 和 USDC 的所有池。
你可以。你可以做到。有一个名为 create2 的 EVM 操作码,它允许你在合约部署之前找出部署地址。因此,所有 hooks 必须通过 create2 部署。因此,你可以挖掘一个非常具体的地址,然后在那里部署你的 hook。
不一定。实际上,更多的是关于将会有不同的用例。对吧?因此,例如,普通的、每天不知情的交易者可能会通过默认的 ETH-USDC 池,该池可能根本没有附加任何 hook。但是,假设还有其他人可能想要进行非常大的交易。他们可能一次交易 50,000,000 美元。他们可能想要通过一个附加了 hookPool,这可以帮助减少 MEV 并降低他们受到 三明治攻击 的风险,并且,你知道,为他们的资金提供更好的价格效率。因此,他们可能会选择那个。
但另一方面,一个可能不想担心重新平衡其头寸并希望这些事情自动发生的 LP。他们可能会通过一个带有 hook 的池,该 hook 会为他们执行此操作。它会自动重新平衡他们的流动性。
因此,不同的人有不同的用例,这有点像一个类比,我认为。但对于普通的、每天不知情的交易者来说,他们可能会通过前端带他们去的地方,或者他们的钱包会带他们去的地方进行交易。
你可以从任何地方调用解锁。任何合约都可以调用解锁来对 Pool Manager 执行某些操作,然后再次锁定它。实际上,你在 hook 合约中不能调用解锁,因为你甚至已经进入 hook 函数这一事实意味着有人调用了解锁,做了一些事情,然后调用了你的 hook。
因此,你不能调用解锁两次。因此,实际上不可能在常规 hook 函数中的 hook 合约内调用解锁。
但是在非 hook 函数中,你可以这样做。是的。抱歉。我误读了你的问题。在非 hook 函数中,你可以这样做。是的。
不。我的意思是,我猜你可以使用 代理 和人们所说的东西,但除此之外,不能。
如果你有任何未在此处回答的问题,现在是你的机会!!
在评论中提问,我会回复你寻求的答案。
请务必订阅并继续关注,因为我将在接下来的几个月中发布更多 Uniswap V4 内容。
让我们连接:
如果你需要以下方面的帮助,请进行协作:
| 术语 | 定义 |
|---|---|
| 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!