本文深入探讨了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。历史上,vault 合约有很多实现方式,每种方式都有自己独特的处理 staking 和奖励的方式。这种碎片化造成了糟糕的用户体验,因为用户必须重新熟悉每种独特的 vault 实现方式。此外,这种碎片化使得第三方与这些合约集成更加耗时,并增加了不正确集成的风险,从而导致安全漏洞。级联效应是,其他协议安全地集成和与这些 vault 交互变得更加困难。
ERC-4626 应运而生,这是一个旨在统一收益型 vault 的技术参数的标准。然而,尽管创建了 ERC-4626 vault 标准,但如今仍然存在碎片化。其中的原因包括:
上述原因,加上许多其他原因,阻碍了 ERC-4626 作为“事实上的” 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 标准,你可能已经熟悉 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!