ERC-4626 Vault和类Vault合约之间的共享漏洞:深入探讨第一部分

  • cr0___
  • 发布于 2023-10-18 10:37
  • 阅读 13

本文深入探讨了ERC-4626 vault合约及其变体(“vault-like”合约)的共同特性和潜在漏洞。文章解释了ERC-4626标准的产生背景及其在统一yield-bearing vaults技术参数方面的作用,并分析了该标准未被广泛采用的原因。此外,文章还定义了“vault-like”合约的特征,并结合Compound V2和The Graph的Staking合约等实例进行了说明。

作者:Alexis Williams,于 2023 年 4 月 20 日撰写。

最近 Hundred Finance 遭受的攻击利用了一个漏洞路径,该路径让人联想到通常为 ERC-4626 vault 保留的攻击。但实际上,ERC-4626 vault 的漏洞适用于范围广泛的智能合约,这些合约最初可能看起来与 vault 标准没有任何共同之处。在这个分为三个部分的深入探讨中,我们将探讨 vault 合约和“类似 vault”合约的常见特征,详细检查它们共同的漏洞,并逐步介绍几种缓解策略及其有效性。

什么是 ERC-4626?

在深入分析之前,我们需要了解什么是 ERC-4626。历史上,vault 合约有很多实现方式,每种方式都有自己独特的处理 staking 和奖励的方式。这种碎片化造成了糟糕的用户体验,因为用户必须重新熟悉每种独特的 vault 实现方式。此外,这种碎片化使得第三方与这些合约集成更加耗时,并增加了不正确集成的风险,从而导致安全漏洞。级联效应是,其他协议安全地集成和与这些 vault 交互变得更加困难。

ERC-4626 应运而生,这是一个旨在统一收益型 vault 的技术参数的标准。然而,尽管创建了 ERC-4626 vault 标准,但如今仍然存在碎片化。其中的原因包括:

  • 许多流行的 vault 实现方式在 2021 年底 ERC-4626 创建并在 2022 年初最终确定之前就已经存在。这些 vault 至今仍在使用,其中许多 forks 和外部协议已集成到其中。更改这些较旧的 vault 实现方式(假设它们不是不可变的!)将是一项不小的工程壮举,并且肯定会破坏所有现有的集成。
  • ERC-4626 旨在成为 vault 的基本实现,因此对于希望向其 vault 合约添加独特功能的协议而言,该标准对于它们的用例来说可能过于约束。此外,该标准的某些方面有意地具有通用性或抽象性。这很容易给希望获得更便捷解决方案的开发者带来困惑。

上述原因,加上许多其他原因,阻碍了 ERC-4626 作为“事实上的” vault 标准的采用。

介绍“类似 vault”的智能合约

vault 合约实现的早期碎片化,加上 ERC-4626 vault 标准实现的复杂性,导致开发者们创建了自己的部分 vault 实现。更令人困惑的是,存在许多智能合约,它们不一定像 vault 那样运行,但仍然使用相同的底层逻辑。因此,我们有三大类与我们将在本次深入探讨中讨论的漏洞相关的合约:ERC-4626 vault 合约、ERC-4626 之前存在的 vault 合约(或非 ERC-4626 vault)和“类似 vault”的合约。智能合约必须具有以下特征才能被归入“类似 vault”类别:

  • 接收资产作为合约的存款。
  • 将资产的存款人记入以下内容:
  • 存储在合约中的总资产的一部分。这可以表示为合约中的状态变量,也可以表示为全新的资产(通常称为份额)。
  • 相对于存入的资产数量的未来奖励。

使用上述特征,我们可以开始识别智能合约中被认为是类似 vault 实现的特征的函数。这些函数将具有与 ERC-4626 vault 合约和 ERC-4626 之前存在的 vault 合约类似的一组逻辑。通常,该逻辑将涉及对以下比例的操作:

从这个比例中,我们可以推导出一组更具体的公式,这些公式映射到四个主要函数:deposit、mint、withdraw 和 redeem。请注意,类似 vault 的合约只需要实现每对函数中的一个函数,这样 deposit/withdraw、deposit/redeem、mint/withdraw 或 mint/redeem 的存在都会导致合约被认为是类似 vault 的。我们可以使用以下数学公式表示这四个函数中的每一个:

请注意,deposit 和 withdraw 的计算方式相同,mint 和 redeem 的计算方式相同。每对相似计算之间的唯一区别是除法的舍入方向。我们将在本次深入探讨的第 2 部分和第 3 部分中更详细地讨论舍入。

顺便说一句,以上 deposit/mint 和 withdraw/redeem 函数之间的差异是微妙的。但是,我们可以使用以下问题来帮助识别正在使用的函数:

现在我们有了一个定义特征列表和一组数学公式,我们可以使用这些信息来识别类似 vault 的合约。

非 ERC-4626 vault 合约和类似 vault 合约的示例

如果你阅读过 ERC-4626 标准,你可能已经熟悉 deposit、mint、withdraw 和 redeem 函数,因为它们在标准中被逐字定义。但是,如何在不符合 ERC-4626 标准的智能合约函数中表示所述特征和算术运算可能并不那么明显。有许多众所周知的非 ERC-4626 vault 合约和类似 vault 合约的示例,它们具有你可能不知道的上述函数特征。

Compound V2 是一个 vault 合约的示例,其实现比 ERC-4626 标准更早。外部 mint 函数与内部 mintFresh 函数相结合,允许用户存入资产并返回等效的 cToken 资产,这满足了 mint 函数的特征。外部 redeem 函数与内部 redeemFresh 函数相结合,允许用户赎回其 cToken 资产,以换取原始存款资产的成比例数量,以及合约中产生的奖励。这满足了 redeem 函数的特征,因此 Compound 可以被归类为非 ERC-4626 vault。

可以在 The Graph 的协议中找到类似 vault 的合约示例。虽然它们的协议跨越多个不同的合约,每个合约都有自己的功能,但有一些合约可以被认为是类似 vault 的。其中一个例子是 Staking 合约。Staking 合约中的外部 delegate 函数与内部 _delegate 函数相结合,允许用户委托 GRT,但不会向用户返回全新的资产。相反,它只是将用户的存款记入合约。然后,用户可以调用外部 undelegate 函数,该函数使用内部 _undelegate 函数来赎回此内部会计余额,以换取成比例数量的 GRT。作为委托给索引器的激励,委托人通过 The Graph 的协议获得额外的 GRT,索引器反过来处理分配给索引器的 subgraph 上的查询。虽然这些函数本身可能不像 ERC-4626 兼容合约那样运行,但 The Graph 协议中的 Staking 合约允许用户参与类似于 vault 的功能。因此,Staking 合约可以被归类为类似 vault 的合约。

结论

在本次深入探讨的第一部分中,我们讨论了创建 ERC-4626 标准的原因,以及导致开发者在将其智能合约适应标准方面犹豫不决的陷阱。此外,我们还介绍了使智能合约具有类似 vault 特征的特征,详细描述了表示这些特征的数学公式,并确定了非 ERC-4626 兼容或类似 vault 的智能合约的相关示例。请继续关注本次深入探讨的第二部分,我们将介绍 ERC-4626 vault 合约、非 ERC-4626 vault 合约和类似 vault 合约共有的漏洞。

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

0 条评论

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