本文介绍了Uniswap V4中的Hook(hooks),讨论了Hook的功能、实施方式以及其对流动性提供者(LP)的影响。文章深入解析了比特币池中的Hook逻辑同步与异步调用,以及恶意Hook的潜在处理,对技术层面进行详细探讨,并附带了一些操作示例。
下面,你将找到由 Uniswap Hook Incubator 第二期的学生提出的问题,回答者是我们的讲师 Haardik,课程由 Atrium Academy + Uniswap Foundation 共同管理。
这节课是对 Uniswap v4 hooks 的介绍,包括理论和技术部分,因此以下问题将涵盖整体功能与具体技术细节。
1. 如果在另一个函数中调用一个 hook 合约函数,是否需要在一次交易或区块时间内完成,就像闪电贷一样?如果是,那么我们不能在 hooks 中进行大逻辑吗?
它们默认假设同步行为,但技术上有办法使其异步。由你决定。你可以根据自己的需要创建这些 hooks。
2. Uniswap 会对 hooks 进行策展吗?因为可能会出现恶意 hooks,或者真的质量很高,拥有很多功能和能力的 hooks。
V4 尚未部署到主网,因此目前并没有真正的问题。不过,最终,当无权限路由开始时,它将会,他们会对此进行一些考虑。但在主网上线的第 1 天,网站可能不会通过随机的 pool 和随机的 hooks 引导用户。这将在后续出现。
3. 每个 token 对只有一个 hook(前/后)吗?还是可以在交换期间插入和播放任何 hook(前/后)?
每个 pool 仅最多有一个 hook。我们有很多不同的 hooks。所以我在这里试着对它们做了一些分类。这里有初始化前和初始化后。这些在新 pool 创建时被调用。当一个 pool 第一次设置时,你知道,它有可能经历初始化前和初始化后的调用。然后我们有添加流动性和移除流动性的前后。这显然可以从名称看出,但它们在添加或移除流动性之前和之后被称为。
然后我们有,像是交易前和交易后的 hooks,我们已经讨论过。还有捐赠前和捐赠后的 hooks。捐赠是我们目前尚未讨论的内容,但它们是一种小众功能,有很特定的使用场景,但捐赠字面上就是你在 pool 中给流动性提供者(LP)捐钱。所以,如果你想给他们小费,也许出于某种原因,或许你喜欢这些 LP,想感谢他们为你的冷冷门币添加流动性,你可以偶尔给他们小费并调用捐赠,他们会对此感到高兴。
但是,是的,捐赠 hooks 就在那里运行。然后是交易前和交易后,添加流动性,移除流动性,返回增量。这些是一些高级 hooks。我们现在不会讨论这一点,稍后会谈论这些,第二阶段的课程中会涵盖这些。
所以每个 pool 只能有一个 hook 合约,但该合约可以实现多个不同动作的 hook 函数(比如交易前,交易后,添加流动性之前等等)。池能启用的特定 hooks 通过 hook 合约的地址来决定,我们将在下一个有关 hooks 地址挖掘的问题中讨论。
4. 核心池逻辑是否也管理代币转账或仅仅是会计?如果只是会计,为什么不进行转账?
实际上,直到最后才会发生任何代币转账。让我们谈谈这是如何运作的。这个背后的主要逻辑真的是 v4 所具有的这个锁定机制。所以,基本上,发生的事情是,比如说,无论何时你想在池管理器中做一些操作,像是交换和修改位置之类的顶层函数,实际上并不能被终端用户调用。像,EOA,一个 EOA 地址,比如说你的 MetaMask 钱包或其他东西,你实际上不能直接在池管理器上调用这些函数。
你需要一个路由合约代表你调用这些函数。对吧?这在 Uniswap v3 中也是这样,你实际上会通过路由合约进行所有实际的池合约调用。那些函数不能被终端用户直接调用。但是会发生的是,基本上,当路由合约开始对池管理器的调用时,他们首先调用一个名称为 unlock 的函数。
你可以将其视作,池管理器最初处于锁定状态。当你的交易开始时,你首先解锁池管理器,并且,它不能已经解锁。否则,将会回滚。因此一旦解锁,池管理器将会回调你的合约,也就是路由合约。于是它会调用这个回调函数。
在这个回调函数中,你可以做任何你想做的事情。你可以进行交换,你可以在某个地方添加一些流动性,或者从其他地方移除一些流动性,或者你可能再进行一次交易,做任何你想做的事情。最终,你从回调函数返回。一旦你从回调函数返回,正如你进行这些操作时,v4 会跟踪余额如何变化。它在内部进行了会计处理。
对吧?就像,用户欠池管理器多少钱,池管理器欠用户多少钱?它跟踪了每个动作中的这一点。如果你一开始以某种方式出售 1 ETH 换取一些 USDC,它会跟踪“好的,我需要从用户那里拿钱,我需要给他们 35100 USDC。”然后也许你会说,“好的。现在拿 USDC 和其中的 1000 进行其他代币的交换。”所以它会继续跟踪这一点。它为你所做的每一个操作进行了会计。
但最终,当你返回时,整体的内容应该是平衡的。到那个时候,不应该有未结余额。所以,在你所有操作的最后,你必须结清所有余额。你必须将欠池管理器的钱还给它,同时你必须从池管理器那里拿走它所欠你的一切。如果没有这样,若有余额未结算,你的交易将会回滚。
否则,池将再次锁定,而你的交易将会成功。
5. hooks 是如何强制执行的?我的意思是它们与特定的 LP 相关,用户在添加流动性时是否将 LP 连接到特定的 hook 逻辑?
澄清一下,这里有一点混淆。LP 并没有 hooks。LP 是用户。Hooks 附加在 pools 上。
6. 我们需要自己编写路由合约还是它是可用的?
有基本的路由器可用。像是,一些路由器像 v3 一样可用,但如果出于某种非常特定的情况需要,你总有机会创建自己的路由合约。但如果基本功能无法满足你的需求,你可以创建自己的合约。
7. 瞬态存储 EIP 号是什么?
EIP 号是 1153。瞬态存储是一个非常非常新的 EIP,最近已合并到以太坊主网。
瞬态存储的一个酷点是,它读写数据的费用非常低,但该数据仅存在于单个交易的上下文中。对吧?它在交易之外是不存在的。因此,你可以在交易开始时开始写入瞬态存储,并在交易结束之前读取它。但交易结束后,就像它从未存在过一样。对吧?但使用它成本很低,这点还不错。
8. V4 中的 LP 会得到更多或更少的无常损失吗?如果是,怎么做到的?
V4 的核心逻辑与 V3 是相同的。交换、费用、LP 仓位等等的工作方式与 V3 完全相同。所以假设一个没有附加 hooks 的 pool,它们的工作方式与 V3 一模一样。但是你可以创建 hooks 来尝试为 LP 最大化收益并减少无常损失,但 V4 的默认行为与 V3 没有区别。
9. 这些 hooks 是同步的还是异步的??
它们默认假设同步行为,但技术上有办法使其异步。由你决定。你可以根据自己的需要创建这些 hooks。
10. Uniswap 如何处理恶意 hooks?
V4 尚未部署到主网,因此目前并没有真正的问题。不过,最终,当无权限路由开始时,它将会,他们可能会对此进行一些考虑。但是,在主网开放的第 1 天,网站可能不会通过随机的 pools 和随机的 hooks 引导用户。会在稍后出现。
11. 在 1155 中,所有代币是相似的或相同的,但 6909 可以拥有相同代币架构的不同代币,对吗?
6909 只是单个合约中的多个 ERC-20。因此,不是说你可以在里面有一个 ERC-20 和一个 ERC-721 或其他什么。没有,只有多个 ERC-20。
12. 如果我想知道 ETH 与 USDC 的价格,我需要通过对、费用和 hook 来查询吗?有没有办法收到所有 hooks 的列表?
如果你想查询一个对的价格,那么,是的,你需要知道你要检查的特定 pool。而且,再次说,正如你所说,可能会有多个 ETH 到 USDC 的 pool,但当你查看价格或需要指定一个特定的 ETH-USDC pool 进行检查时,每个 pool 仅最多有一个 hook。
所以,我的意思是,如果你试图找出存在的所有 ETH-USDC pools,那么,我假设你是在链下收集这些数据。所以,这有点像你从池管理器合约索引所有池创建事件,并找到所有 token 对为 ETH 和 USDC 的池。
13. 即使我们成功挖到一个地址,我们如何确保 hook 部署到该地址?我们无法预先指定要部署的地址,对吗?
你可以。你可以做到。有一个 EVM 操作码叫 create2,可以让你在合约部署之前确定一个部署地址。所以所有 hooks 必须通过 create2 部署。因此你可以挖掘一个非常具体的地址,然后在那儿部署你的 hook。
14. 最好的 pool 和最好的 hook 会吸引最多流动性吗?
不一定。实际上,更关乎的是,会有不同的使用场景。 对吧?例如,普通的普通无知交易者可能会通过默认的 ETH-USDC pool,这或许没有附加任何 hook。但假设另一个人可能会想进行非常大的交易。他们处理的资金量,可能每次是 $50,000,000。或许他们想通过带有 hook 的 pool,这可以帮助减少 MEV 并降低被夹击的风险,且为这些资金提供更好的价格效率。那么他们可能会选择那样的 pool。
但另一方面,想要不担心重新平衡自己位置的 LP 可能会希望有 pool 的 hook 自动为他们重新平衡流动性。
所以,不同人的不同用途可以算是一种更好的类比。但对于普通的普通无知交易者,他们可能会通过前端给他们带来的任何 pool,或者他们的钱包将他们带到那里。
15. 在 hook 合约内部的非书籍函数中调用 unlock 是好的吗?还是只能通过路由器调用?
你可以在任何地方调用 unlock。任何合约都可以调用 unlock 来对池管理器进行某些操作,然后再将其锁定。实际上,你无法在 hook 合约内部调用 unlock,因为你进入 hook 函数意味着某人调用了 unlock,做了一些事,然后调用了你的 hook。
所以,你不能调用 unlock 两次。因此,在 hook 合约中无法在常规 hook 函数内调用 unlock。
但在非书籍函数中,你可以做到。是的,对不起。我误解了你的问题。在非书籍函数中,你可以这样做。是的。
16. hooks 能在 pool 创建后更新吗?
不能。我想,我想你可以使用代理等其他东西,实际上也不行。
如果有任何在此未回答的问题,现在是提问的机会!!
在评论区提问,我会尽快回复你所需的答案。
确保订阅并保持关注,因为接下来几个月我会发布更多 Uniswap V4 的内容。
让我们联系:
https://www.linkedin.com/in/carlos-vendrell-felici/
如果你需要帮助,欢迎合作:
https://github.com/ZealynxSecurity
- 原文链接: medium.com/@bloqarl/unis...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!