深入研究 Curve Finance:核心机制、安全性和集成洞察

  • zealynx
  • 发布于 2025-10-11 13:33
  • 阅读 13

本文深入分析了 Curve Finance 协议的各个方面,包括 v1 和 v2 版本的 AMM 机制、crvUSD 稳定币及其 LLAMMA 算法,以及 veCRV 的治理和激励模型。同时,还详细回顾了 Curve 历史上发生的安全事件,并为开发者和审计人员提供了一份全面的安全检查清单,旨在帮助他们更安全地集成和使用 Curve 协议。

Curve Finance 是 DeFi 领域不可或缺的支柱,以设计高效的代币互换而闻名。它的旅程始于 Curve v1 中具有开创性的 Stableswap 池,旨在最大限度地减少稳定币(DAI、USDC)和封装资产(wBTC)等Hook资产的滑点。该协议的演变随着 Curve v2 的 Cryptoswap 池 继续,这扩展了其处理 ETH 和 WBTC 等波动性大、不相关的资产的能力,使其能够与传统的 DEX 竞争。

除了其核心 AMM 之外,进一步的创新导致了 crvUSD 稳定币 及其独特的 LLAMMA(借贷-清算 AMM),这是一种用于管理抵押品和最大限度地减少清算的新颖机制。对于开发人员和安全研究人员来说,深入理解这些复杂的机制不仅仅是学术性的,对于安全的集成、强大的应用程序开发以及 Curve 生态系统中的知情参与至关重要。

Curve v1:代码和集成见解

理解 Curve v1 是基础。本节深入研究 Curve 原始 StableSwap 池的核心机制,概述其公式、实现细节以及控制其行为的关键参数。

什么是 StableSwap?Curve v1 背后的引擎

Curve的数学引擎经过精确设计,旨在最大限度地减少特定用例的滑点和费用,主要用于稳定币和其他Hook资产的交换。构思 StableSwap 不变量是为了解决在像 Uniswap V2 这样的传统恒定乘积 AMM 上交易稳定币时出现的高滑点这一严重问题,这些 AMM 将流动性均匀地分布在所有价格范围内。对于预期以或接近 1:1 Hook交易的资产,这种统一的流动性分布效率非常低。

StableSwap 不变量定义了一个混合 键合曲线,该曲线动态地融合了两个更简单模型:恒定和不变量 (x1+x2+⋯+xn=Kx_1 + x_2 + \dots + x_n = Kx1​+x2​+⋯+xn​=K) 和恒定乘积不变量 (x1⋅x2⋅⋯⋅xn=Kx_1 \cdot x_2 \cdot \dots \cdot x_n = Kx1​⋅x2​⋅⋯⋅xn​=K)。当池的资产处于平衡状态时,曲线的行为类似于一条直线(近似于恒定和模型,这意味着接近零滑点),这是稳定币的预期状态。但是,当交易将池推离此平衡状态时,曲线会平稳过渡以类似于双曲线(近似于恒定乘积模型)。这种巧妙的设计确保了流动性始终可用,即使在极端的市场条件下也是如此,尽管价格越来越不利。这种优雅的降级可以防止池完全耗尽一种资产——纯粹恒定和模型的一个关键缺陷。

具有 nnn 个币的池的广义 StableSwap 不变量公式为:

Ann∑xi+D=ADnn+Dn+1nn∏xiA n^n \sum x_i + D = A D n^n + \frac{D^{n+1}}{n^n \prod x_i}Ann∑xi​+D=ADnn+nn∏xi​Dn+1​

其中:

  • xix_ixi​:池中第 iii 个币的余额(储备)。
  • nnn:池中不同币的总数。
  • DDD:不变量,一个至关重要的值,表示如果所有币都以相同的价格定价,则池中的虚拟币的总数。它类似于 Uniswap 中的常数 kkk,但计算起来要复杂得多。DDD 在交换期间必须保持不变(忽略费用)。
  • AAA:放大系数,一个可配置参数,是不变量行为的核心。

放大系数 AAA 是控制 键合曲线形状的关键参数。它决定了曲线近似恒定和模型的程度与恒定乘积模型的程度。较高的 AAA 值会“展平”平衡点周围的曲线,从而有效地集中流动性并减少不会显着失衡池的交易的滑点。从这个意义上讲,AAA 充当一种虚拟杠杆的形式:它放大了公式的线性部分,从而允许在定义的范围内实现极低的滑点。随着池变得越来越不平衡,放大系数的影响会减小,并且曲线的行为会优雅地降级为恒定乘积 AMM 的行为。选择合适的 AAA 值是每个池的关键治理决策,可以在降低滑点的需求与价格差异的风险之间取得平衡。

Vyper 中的实现:从理论到代码

Curve 的智能合约主要用 Vyper 编写,Vyper 是一种专为以太坊虚拟机 (EVM) 设计的 Pythonic 编程语言。选择 Vyper 是因为其强调可审计性、安全性和简单性,与 Solidity 相比,它通常强制执行更严格的编码模式以减少潜在的漏洞。

StableSwap 不变量的数学优雅性掩盖了其实现的复杂性。对于具有两个以上币的池 (n>2n>2n>2),直接代数解不变量 DDD 是不可行的,因为它需要在链上求解一个高次多项式方程,这是一项计算量大的任务。这种数学约束直接决定了实现策略:协议必须依赖迭代数值方法来近似 DDD 的正确值和交换的输出量。

求解 D 和 Y 的挑战

两个最关键的链上计算是 get_D() 和 get_y()。get_D() 函数计算在添加或删除流动性之后或收集费用时,给定池中所有币的当前储备的不变量 DDD 的值是必要的,因为这些操作会改变池的状态。get_y() 函数在交换期间使用;它计算出一个用户将收到多少输出币 jjj 给定数量的输入币 iii,同时保持 DDD 恒定。

为了求解这些值,Curve 的合约采用了牛顿法,这是一种强大的求根算法。该过程涉及:

  • 将不变量方程重新排列成 f(D)=0f(D)=0f(D)=0 的形式。
  • 计算此函数的导数,f′(D)f'(D)f′(D)。
  • 从 DDD 的初始猜测开始(通常是所有币余额的总和)。
  • 使用公式迭代改进猜测:Dnew=D−f(D)f′(D)D_{new} = D - \frac{f(D)}{f'(D)}Dnew​=D−f′(D)f(D)​ 直到 DDD 的值收敛到稳定的解决方案。

此方法的链上实现,可在 CurveStableSwapNGMath.vy 等合约中找到,是 gas 优化数值计算的杰作。它具有一个有界循环(通常迭代高达 255 次),该循环使用整数算术执行这些计算,以避免浮点数学的复杂性和潜在的不准确性。在循环内,每次迭代后都会执行收敛检查,将新的 DDD 值与前一个值进行比较。如果差异小于或等于一个单位 (D−Dprev≤1D - D_{prev} \le 1D−Dprev​≤1),则认为计算完成,并返回该值。如果循环完成但未收敛,则该函数会恢复并带有 raise 语句,表明池处于无法解决的状态——这是一个至关重要的安全机制。

raise "Did not converge"

此实现对开发者具有深远的影响。与 Curve 交互的 gas 成本不是恒定的;它取决于这些迭代计算的复杂性。此外,非收敛的可能性(无论多么罕见)都会引入可能导致失败的路径,任何集成智能合约都必须处理该路径。

Curve v2:代码和集成见解

Curve v2 代表了其前身的一个重大演变,扩展了该协议有效管理波动性和不相关资产之间交换的能力。对于开发人员和安全研究人员来说,理解其数学模型和实现中的基本转变对于安全有效的集成至关重要。

CryptoSwap 不变量:范式转变

与 Curve v1 的 StableSwap 不变量(侧重于彼此Hook的资产)不同,Curve v2 的 CryptoSwap 不变量专为具有动态、不相关价格变动的资产而设计。核心创新在于它能够围绕当前市场价格创建一个高度集中的流动性池,并根据市场活动动态调整其“Hook”。这种“重新Hook”的过程使 Curve v2 池能够实现比传统的恒定乘积 AMM(例如,x⋅y=kx \cdot y = kx⋅y=k)更高的资本效率,而传统的恒定乘积 AMM 将流动性均匀地分布在从零到无穷大的所有可能价格上,从而导致波动率较大的资产对出现高滑点。

CryptoSwap 白皮书 中详细介绍了此不变量的数学推导,它比 StableSwap 的推导要复杂得多。CryptoSwap 中引入的关键参数包括:

gamma\\gammagamma (gamma):此参数控制Hook周围流动性集中的宽度。较小的 gamma\\gammagamma 值会导致更高的流动性集中,从而导致当前价格附近的交易滑点较低,但推离价格的交易滑点较高。相反,较大的 gamma\\gammagamma 会更广泛地分散流动性。

K0K_0K0​(内部价格比例参数):此参数对于管理池内的内部价格至关重要。它允许池适应当前市场价格,从而有效地充当浮动Hook。池的内部价格会随着时间的推移根据交易和预言机数据进行调整,从而确保流动性保持在最需要的地方。

对于开发人员来说,这意味着 CryptoSwap 池的定价逻辑不是静态的,而是本质上依赖于路径。给定交换的汇率受池的当前状态、其历史交易活动以及其内部价格比例的动态调整的影响。这与 StableSwap 相对更简单、以平衡为中心的模型形成鲜明对比。

Curve v2 中的关键组件和机制

与 Curve v2 集成或审计 Curve v2 需要深入了解其复杂的组件:

  • 动态Hook和重新平衡:CryptoSwap 池没有固定的Hook。相反,它们不断重新平衡其内部“虚拟价格”,以与外部市场价格保持一致。这是通过交易活动和潜在的外部预言机的组合来实现的。池不断计算一个最佳的 D(不变量)值,该值将使其内部价格与目标价格保持一致,并随着时间的推移缓慢地向该 D 移动。这种缓慢的调整机制对于稳定性和防止突然的巨大变化至关重要。
  • 预言机集成:虽然并非总是直接的,但一些 Curve v2 池可能会利用外部价格馈送或依赖套利者来使其内部价格与更广泛的市场保持一致。更新内部价格比例和促进重新Hook过程的机制是安全审查的关键领域,因为预言机操纵可能会导致重大损失。
  • 放大系数 (A) 和 Gamma (gamma\\gammagamma) 交互:与 v1 类似,Curve v2 仍然使用放大系数 AAA,但它与 gamma\\gammagamma 的交互会创建一个更细致的曲线形状。AAA 仍然控制曲线的“平坦度”,但 gamma\\gammagamma 进一步细化了动态Hook周围的流动性集中。了解这些参数的相互作用对于评估不同市场条件下的池行为至关重要。
  • 费用结构:Curve v2 池通常具有更复杂的费用结构,包括可以根据池不平衡或市场波动进行调整的动态费用。此外,可能会实施“重新Hook费用”以激励套利者使其池的内部价格与外部价格保持一致。这些费用是经济模型不可或缺的一部分,必须在任何集成中加以考虑。
  • 交换计算的迭代解决方案:与 v1 类似,CryptoSwap 不变量太复杂,无法在链上进行直接代数求解。合约再次依赖于使用牛顿法的迭代方法,从而对可变 gas 成本和非收敛的可能性产生相同的影响。

Curve 池架构和合约类型

Curve 复杂的数学不变量部署在几种不同的智能合约架构中,每种架构都经过精心定制以满足特定目的。理解这些结构对于正确的集成、安全分析以及与协议的有效交互至关重要。下表总结了主要的池类型:

池类型 主要用例 资产类型 关键 AMM 不变量 示例 关键集成函数
普通池 核心稳定币交换 稳定币 (DAI, USDC, USDT),封装 BTC StableSwap 3pool (DAI/USDC/USDT) exchange()
借贷池 赚取双重收益(交易费用 + 借贷利息) 生息代币 (cDAI, aUSDC) StableSwap Compound 池 (cDAI/cUSDC) exchange(), exchange_underlying()
Metapool 将新资产与深度基础流动性配对 新稳定币 + 基础池 LP 代币 StableSwap FRAX/3CRV exchange(), exchange_underlying()
加密池 (V2) 交易波动、非Hook资产 波动资产 (ETH, WBTC, CRV) CryptoSwap Tricrypto2 (USDT/WBTC/WETH) exchange()
Stableswap-NG 具有增强功能的下一代池 稳定币、Rebasing (stETH)、ERC4626、crvUSD StableSwap sDAI/crvUSD exchange(), add_liquidity(), remove_liquidity()

池架结构详细分解:

普通池

普通池是 StableSwap 不变量的最直接实现。它们在一个合约中直接持有两个或多个Hook资产。规范的例子是“3pool”,它促进了 DAI、USDC 和 USDT 之间的高效交易。该池是 DeFi 中基础流动性枢纽,通常作为主要稳定币的标准流动性来源集成到其他协议中。对于开发人员来说,与普通池交互通常涉及直接调用 exchange() 来交换资产。

借贷池

借贷池体现了 DeFi 强大的可组合性。这些池不是直接持有基础资产,而是持有来自主要借贷协议(如 Compound(例如,cDAI、cUSDC)或 Aave(例如,aDAI、aUSDC))的相应生息代币。这种架构允许流动性提供者同时从两个来源赚取收益:来自 Curve 的交易费用和来自底层借贷协议的借贷利息。虽然对于收益优化来说很强大,但这种可组合性也引入了依赖风险。集成借贷协议中的漏洞或失败可能会直接影响 Curve 池中持有的资产,从而使这些池的安全分析本质上更加复杂,因为它需要理解多个协议。这种连接——可组合性等功能既会增加收益,又会带来继承的风险——是安全分析的关键考虑因素。常见的函数包括 cToken 本身的 exchange() 和基础资产直接交换的 exchange_underlying()。

Metapool

Metapool 是一项提高资本效率和扩展新资产流动性的关键创新。当启动一种新的稳定币(例如,FRAX)时,metapool 将新资产与高流动性基础池的 LP 代币配对,而不是要求它与 USDC 和 USDT 等已建立的资产形成一个全新的池——这会分散流动性(例如,将 FRAX 与 3CRV LP 代币配对)。这种设计允许用户在新资产和基础池的任何底层资产之间进行单笔高效交易的交换,从而利用基础池的深度流动性而不会稀释它。这种结构特别有利于新兴稳定币引导流动性。与 Metapool 集成通常涉及使用 exchange() 在 metapool 中进行直接交换,或使用 exchange_underlying() 交换为底层池的基础资产。

加密池 (V2)

使用 Curve v2 引入的加密池代表了设计的根本背离,专为交易波动、非Hook资产(如 ETH、WBTC 和 CRV)而定制。如前所述,这些池利用复杂的 CryptoSwap 不变量,该不变量动态调整其内部价格以围绕当前市场价格集中流动性。与 v1 池相比,这种动态重新Hook机制能够显着提高波动asset pairs的资本效率。与加密池的集成需要更细致地了解其动态定价、对预言机数据的潜在依赖性以及复杂的费用结构,其中可能包括动态费用和“重新Hook费用”。主要交互仍然通过 exchange() 函数进行,但底层计算要复杂得多。

Stableswap-NG(下一代)

Stableswap-NG 代表了原始 StableSwap 池架构的重大演变,专为增强模块化、灵活性以及对更广泛的代币类型的支持而设计。这些下一代合约支持最多八个代币的池,以原生方式处理各种代币标准,例如 rebasing 代币(例如,Lido 的 stETH)和 ERC4626 vault 代币,并且可以包括内置的移动平均预言机。对于开发人员来说,与 NG 池交互需要仔细注意特定的代币机制,因为简单的 balanceOf() 调用可能无法准确反映 rebasing 或生息资产的潜在价值。这些池提供了更高的可定制性和面向未来的功能,使其成为了解 Curve 如何继续适应不断发展的 DeFi 格局的关键领域。集成的典型函数包括 exchange()、add_liquidity() 和 remove_liquidity(),但它们的内部逻辑会根据所涉及的代币类型而有很大差异。

crvUSD 稳定币和 LLAMMA 机制

Curve 超越其作为去中心化交易所的角色而进行的战略扩张包括通过引入 crvUSD 进入稳定币领域的冒险。此举伴随着清算机制的重大创新,称为借贷-清算 AMM 算法 (LLAMMA)。crvUSD 和 LLAMMA 的设计代表了对抵押债务头寸 (CDP) 应如何管理风险的根本性重新思考,从传统的惩罚性清算模式转向更动态和连续的过程。

crvUSD 的架构

crvUSD 的核心是一种与美元软Hook的去中心化稳定币,其架构与 MakerDAO 的 DAI 等已建立的稳定币类似。用户可以通过将接受的波动性加密资产(如以太坊 (ETH) 或比特币 (BTC))作为抵押品存入智能合约来铸造 crvUSD。此头寸必须过度抵押,这意味着存入的抵押品的价值必须超过铸造的 crvUSD 的价值一定幅度。详细的机制在 Curve 创始人 Michael Egorov 撰写的 白皮书中 进行了概述,该白皮书与官方智能合约代码一起发布,提供了从一开始就对系统设计进行透明观察。

LLAMMA 机制:软清算

LLAMMA 从根本上将传统清算流程重新设计为可以称为“软”清算。LLAMMA 没有采用通常会导致借款人遭受重大损失的单一、离散的清算事件,而是制定了一个由专用 AMM 管理的连续且渐进的抵押品转换流程。有关 LLAMMA 的全面概述,请参阅 Curve 文档

该机制的工作方式如下:

  • 降低价格下跌的风险:随着用户抵押品(如 ETH)的市场价格开始下跌并接近其特定的清算阈值,LLAMMA 协议会自动并逐步开始出售少量 ETH 抵押品以换取 crvUSD。这种积极的出售行为降低了对下跌抵押品的风险敞口,从而降低了头寸的风险。
  • 恢复价格的回报:相反,如果 ETH 的价格回升并偏离清算阈值,协议会逆转该过程,使用累积的 crvUSD(来自先前的销售)逐步回购 ETH 抵押品。这恢复了用户最初的抵押品头寸。

这种设计将清算“从具有巨大滑点损失的锯齿状、一次性、全有或全无的事情转变为平稳过渡”。这种理念上的转变是深刻的:LLAMMA 不会将清算视为一种需要惩罚的二元失败状态,而是将其视为一种需要积极管理的连续风险范围。对于借款人来说,该系统提供了一个针对短期价格变化和闪电崩盘的缓冲,因为他们的头寸不会立即被清算。相反,它会被动态地降低风险。在价格在清算范围附近徘徊的情况下,持续的买卖甚至可以为借款人创造交易费用,从而将通常具有破坏性的过程转变为潜在的增值过程。

LLAMMA 中的安全挑战

LLAMMA 的实施本质上是复杂的,需要在价格预言机、管理抵押品转换的特殊 AMM 以及划分为“流动性带”的各个用户头寸的状态管理之间建立复杂的互动。这种复杂性需要采取严格的安全姿态。crvUSD 及其相关的借贷合同已经过 MixBytes、ChainSecurity 和 StateMind 等公司进行的多次安全审计,反映了该系统的重要性。

这些审计对于识别和缓解由这种新颖设计引起的潜在漏洞起到了重要作用。例如,StateMind 的一项审计发现 AMM 中动态费用计算存在一个严重缺陷。在特定的、持续的市场条件下(例如,在 14 个连续区块内发生 5% 的价格变化),累积费用在数学上可能会超过 100%。这将破坏 calc_swap_out 函数,从而可能允许攻击者通过交换单个代币来耗尽流动性带。立即采取的缓解措施是 DAO 提案,以设置非零 admin_fee,这将导致计算由于溢出而恢复,从而阻止利用。

if new_fee > FEE_INV - 1:
  return MAX_UINT256
  # revert("dev: new_fee > max_fee")

同一审计的另一项重大发现是操纵借款利率的潜力。Controller 合约中的 liquidate_extended 函数使用了一种可以通过跨合约重入来利用的回调机制。此外,利率计算依赖于对 CONTROLLER_FACTORY.total_debt() 的调用,该调用可能已过时,这为攻击者操纵借款利率以谋取自身利益或损害其他用户利益创造了一个载体。这些发现强调,crvUSD 的安全性不仅仅在于 CDP 的逻辑,而且还深深地嵌入在其内部价格预言机的完整性以及其动态费用和利率设置算法的数学合理性中,尤其是在对抗性条件下。

veCRV(投票托管的 CRV)机制

Curve DAO 生态系统证明了精心设计的代币经济的力量,其核心激励措施通过围绕 veCRV 的系统进行管理。

Curve DAO 生态系统:计量器、铸币机和费用

Curve 流动性提供者 (LP) 的经济激励通过相互连接的智能合约系统进行管理,这些合约协同工作以分配 CRV 代币排放。

  • 流动性计量器:当 LP 将资产存入 Curve 池时,他们会收到一个 LP 代币,代表他们在该池中的份额。要获得 CRV 奖励,这些 LP 代币必须在相应的“流动性计量器”合约中进行质押。这些计量器是 LP 表示他们参与奖励计划的主要机制。
  • 计量器控制器:该合约充当 CRV 分配系统的中枢神经系统。它是一个注册表,维护所有批准的计量器及其关联的“类型”(例如,稳定币池、加密池)的列表。其最关键的功能是计算每个计量器的相对“权重”,该权重决定了该计量器将收到的新 CRV 排放的比例。这些权重不是静态的;它们每周都会根据 veCRV 持有者的投票动态更新。向计量器控制器添加新计量器是一项重要的治理行动,需要 DAO 投票成功。
  • 铸币机:顾名思义,铸币机合约负责根据协议预定义的排放计划铸造新的 CRV 代币。它与计量器控制器交互以确定每个计量器有权获得的代币数量。然后,LP(或代表他们行事的聚合器协议)可以在铸币机合约上调用诸如 mint(gauge_addr) 或 mint_many(gauge_addrs) 之类的函数来声明他们应计的 CRV 奖励。
  • 费用分配器:Curve 协议对所有交换收取少量交易费,通常为 0.04%。这些费用的 50% 分配给交易发生的池中的流动性提供者。其余 50% 被收集并发送到费用分配器合约。该合约会定期将收取的费用转换为稳定资产(如 3CRV),并使其可供 veCRV 持有者认领。

veCRV 机制:投票托管的 CRV

Curve 生态系统中的治理权力和经济利益都以 veCRV 的概念为中心,veCRV 是代币经济学中的一项开创性模型,此后已被许多其他协议采用。

  • 核心概念:veCRV 不是可转移的 ERC20 代币。它是投票权的代表,只能通过获取 CRV 代币并在投票托管智能合约中对其进行时间锁定来获得。此机制旨在使治理参与者的激励与协议的长期健康保持一致。
  • 时间加权投票权:用户收到的 veCRV 数量取决于他们锁定的 CRV 的数量以及锁定的持续时间。用户可以将他们的 CRV 锁定一段时间,从一周到最多四年不等。锁定时间越长,每个 CRV 收到的 veCRV 越多。例如,将 1 CRV 锁定四年会产生 1 个 veCRV,而将其锁定一年只会产生 0.25 个 veCRV。这种时间加权严重偏爱长期承诺。
  • 三重效用:持有 veCRV 可赋予其所有者三个截然不同的强大好处:

    • 治理:veCRV 是在 Curve DAO 中进行投票的唯一工具。持有者可以对塑造协议未来的提案进行投票,例如调整费用、部署新池以及(最重要的是)通过对计量器权重进行投票来指导 CRV 排放。
    • 协议费用:veCRV 持有者有权获得协议交易费的按比例份额,他们可以从费用分配器合约中认领这些费用。
    • 奖励提升:也许是最强大的经济激励措施,veCRV 持有者可以将他们从自己的流动性头寸中获得的 CRV 奖励提升高达 2.5 倍。准确的提升是根据用户相对于特定计量器中总流动性的比例的总 veCRV 供应比例计算的。这为 LP 创造了一个强烈的激励,让他们也成为 CRV 的长期持有者。

这个错综复杂的系统创造了一个强大的、自我加强的经济飞轮。为了使协议的稳定币获得成功,它需要深厚的流动性。实现此目的的最具资本效率的场所是 Curve。为了吸引足够的流动性,一个池需要提供高 CRV 奖励。这些奖励的分配由计量器权重投票决定,而这些投票由 veCRV 持有者控制。这为协议创建了一个直接的激励,即获取 CRV,将其锁定为最大时长的 veCRV,并使用该投票权将其排放导向他们自己的池。这种对治理影响力的竞争性动态,被著名地称为“Curve Wars”,是 veCRV 架构的直接且有意的结果,并促使创建了整个协议子生态系统(如 Convex Finance),致力于聚合和优化 veCRV 权力。

跨链 veCRV 基础设施

为了允许用户在以太坊主网 (L1) 上的 veCRV 余额提高 Arbitrum 和 Optimism 等Layer2网络上的奖励,Curve 使用了一个跨链预言机系统。该系统通过部署在每个 L2 上的 L2VotingEscrowOracle 智能合约运行。

但是,此架构引入了一个关键的安全权衡。L2 预言机的状态未以无需信任的方式更新;相反,它依赖于一小组称为“验证器”的、经过许可的帐户。这些验证器负责安全地从 L1 中继 veCRV 余额和投票数据。

Curve 主要安全事件的事后分析

对于与 Curve Finance 协议交互、在此基础上构建或审计 Curve Finance 协议的任何人来说,了解过去的安全事件至关重要。这些事后分析为即使是最复杂的 DeFi 协议也可能遭受的漏洞类型提供了宝贵的见解,为开发商、安全研究人员甚至用户提供了关于集成和使用最佳实践的重要经验教训。通过剖析这些事件,我们可以识别常见的陷阱、识别新兴的攻击向量,并加强整个 Web3 生态系统的集体安全态势。

2023 年 7 月 Vyper 编译器漏洞

2023 年 7 月 30 日,DeFi 社区因一系列针对多个 Curve Finance 池的漏洞而受到震动,导致累计损失超过 6000 万美元。该攻击影响了几个“工厂池”(无许可创建的池),包括用于 Alchemix (alETH-ETH)、JPEG’d (pETH-ETH) 和 Metronome (msETH-ETH) 等著名项目的池,以及 Curve 的主要 CRV/ETH 池之一。

根本原因:潜在的编译器错误

最初的猜测指向一种新的重入攻击,但根本原因要根本得多,也更阴险。该漏洞并非位于 Curve 开发人员编写的应用程序级别逻辑中,而是在特定版本的 Vyper 编程语言编译器中的一个潜在错误。受影响的版本被确定为 0.2.15、0.2.16 和 0.3.0。

该错误是编译器如何为重入保护生成字节码的一个缺陷,重入保护是一种旨在防止同一事务中递归调用函数的关键安全功能。正确实现的重入保护使用存储槽作为锁;它在函数执行开始时设置锁,并在结束时清除锁,从而恢复找到已设置锁的任何调用。编译器错误阻止在某些条件下正确设置或清除此锁,从而有效地使受影响池中的重入保护失效。

此事件深刻地强调了认识到协议的安全性超出了其应用程序级别的智能合约代码的重要性。整个工具链(包括编译器本身)都必须被认为是安全边界的关键组成部分。开发人员不仅要编写安全代码,还要敏锐地意识到所使用的特定编译器版本、其已知的漏洞以及可能损害安全性的潜在交互。强大的部署策略必须包括验证编译器完整性和随时了解特定于编译器的错误披露。

get_virtual_price 只读重入(2022 年 4 月)

2022 年 4 月,安全公司 ChainSecurity 披露了一种不同但更微妙的重入漏洞,该漏洞影响了一些 Curve 池。这种被称为“只读重入”的攻击并非旨在直接从 Curve 窃取资金。相反,它利用 Curve 视图函数来操纵与 Curve 集成的其他协议的价格预言机。

漏洞的技术分析

攻击向量集中在 remove_liquidity 函数和 get_virtual_price() 视图函数上。该漏洞利用在单个事务中以精确的步骤顺序展开:

  • 发起提款:攻击者在包含原生 ETH 的 Curve 池(例如,stETH/ETH 池)上调用 remove_liquidity。
  • 销毁 LP 代币:remove_liquidity 函数首先销毁攻击者的 LP 代币。此操作会立即减少 LP 代币合约的 totalSupply。
  • 触发 Fallback:然后,该函数继续将底层资产返还给攻击者。原生 ETH 的转移触发攻击者智能合约的 fallback 函数,使他们能够控制执行流程。
  • 创建不一致状态:在这个确切时刻,Curve 池处于瞬态、不一致的状态。LP 代币的 totalSupply 已减少,但由于 ETH 转移尚未完成,池的底层资产内部余额仍然很高。
  • 重新进入并操纵价格:从其 fallback 函数中,攻击者的合约在下游借贷协议(例如,MakerDAO、Abracadabra)上调用一个函数,该函数使用 Curve 池的 LP 代币作为抵押品。为了评估此抵押品的价值,借贷协议调用 Curve 池的 get_virtual_price() 函数。
  • 利用 view 函数:get_virtual_price() 函数使用公式 D / totalSupply 计算 LP 代币的价格。由于 D(从池的仍然很高的内部余额中得出)很大,而 totalSupply 现在很小,因此该函数为 LP 代币返回一个被大量人为抬高的价格。

影响与缓解

这种被操纵的、人为抬高的价格随后可能被用于利用借贷协议,例如,允许攻击者借入的资产数量远远超过其抵押品的真实价值。此漏洞使超过 1 亿美元的资金面临多个主要 DeFi 协议的风险。

此事件打破了开发人员普遍认为 view 函数本质上免受重入攻击的假设,因为它们不会修改状态。它表明,在高度可组合的生态系统中,如果可以在合约处于暂时不一致的状态时调用 view 函数,则它可能成为强大的攻击媒介。不能孤立地评估函数的安全性;还必须考虑其针对集成协议的潜在攻击性。

建议的缓解措施是让集成协议对这种情况进行防御性编程。在调用 get_virtual_price() 之前,协议应首先在 Curve 池上调用一个良性的状态更改函数,例如 withdraw_admin_fees。此操作将触发池自身的重入保护,如果池正处于另一个操作中,将导致后续对 get_virtual_price() 的调用失败,从而阻止 oracle 操纵。

其他漏洞和审计发现

除了引起公众关注的高调漏洞利用之外,Curve 协议的安全态势还通过多次专业的安全审计不断完善。这些审计由该领域的领先公司进行,提供了对协议风险状况更深入、更细致的看法。综合这些报告中的发现,揭示了反复出现的主题和常见的陷阱,这些对于在 DeFi 领域(尤其是在具有复杂经济逻辑的系统上)进行构建的任何开发人员都具有指导意义。

综合审计情报

Curve Finance 通过让顶级审计公司(包括 Trail of Bits、Quantstamp、MixBytes 和 ChainSecurity)对其合约进行严格审查,从而展示了对安全的一贯承诺。审计涵盖了生态系统的各个方面,从核心 DAO 和 DEX 合约到较新的 crvUSD 稳定币和借贷基础设施。

对这些审计报告的审查揭示了几个常见的主题和漏洞类型:

  • 价格计算操纵:在 Curve 更复杂系统的审计中,反复出现的问题是 oracle 价格操纵的可能性。例如,ChainSecurity 对 crvUSD 的审计发现了一个中等严重程度的问题,其中 AggregateStablePrice 合约的价格计算可能会受到临时改变池 totalSupply 的闪电贷的影响。最初的缓解措施包括实施指数移动平均线 (EMA) 以消除此类波动。但是,审计报告指出,这仍然使价格在单个区块内部分可操纵,并建议采用更强大的解决方案,例如使用前一个区块的价格。
  • 三明治攻击:一些审计强调了三明治攻击的风险,这是一种常见的 MEV 策略,其中攻击者抢先和后运行受害者的交易。在 Curve 的上下文中,这被确定为 oracle 价格更新期间的风险,攻击者可以从更新交易的临时价格影响中获利。
  • Checks-Effects-Interactions 模式:在早期审计中发现了违反基本“Checks-Effects-Interactions”安全模式的行为,后来得到了纠正。此模式要求合约应首先执行所有检查(例如,require 语句),然后更新自己的状态变量(effects),然后才与外部合约交互。遵守此模式是防御经典重入攻击的主要手段。
  • 不正确的健康检查和逻辑缺陷:crvUSD 审计中的高严重性发现包括诸如不正确验证贷款的健康限制之类的问题,这可能导致不正确的清算。其他较低严重性的发现指出了细微的逻辑缺陷,例如允许任何人更新用户清算折扣的函数,或者发出不正确参数的事件。

这些发现共同表明,对于像 Curve 这样复杂的协议,安全性不是一次性的成就。审计报告本身通常包含免责声明,声明它们是“有时限的,无法发现所有漏洞”。一长串审计的存在不应被解释为绝对安全的保证,而应被解释为风险管理和缓解的持续过程的证据。最关键的漏洞通常不在于简单的访问控制错误,而在于复杂的金融数学与可以使用闪电贷等工具模拟的对抗性市场条件之间的微妙交叉点。

价格 Oracle 安全性:系统性挑战

在 Curve 及其集成协议中发现的许多漏洞都与价格 oracle 安全性有关,这是 DeFi 中的一项系统性挑战。

  • AMM Oracle 的固有风险:使用链上 AMM 的现货价格作为价格 oracle 是众所周知的 insecure。原因是闪电贷。攻击者可以从像 Aave 这样的协议中借入大量的资产,而无需任何抵押品,使用它在目标 AMM 池中执行大规模的交换,从而在一次交易的持续时间内极大地扭曲储备金,从而扭曲现货价格。然后,他们可以使用这个被操纵的价格来利用第二个协议,然后再偿还闪电贷,所有这些都在同一个区块中。
  • 缓解策略:为了解决这个问题,DeFi 生态系统开发了更强大的 oracle 设计:

    • 时间加权平均价格 (TWAP):TWAP oracle 不依赖于瞬时现货价格,而是计算资产在设定时期(例如,过去 30 分钟)内的平均价格。这使得操纵的成本更高,因为攻击者必须在多个区块中维持被操纵的价格,这通常需要大量的资本,并且由于套利通常无利可图。Curve 的 Stableswap-NG 池包括用于此目的的内置移动平均 oracle。
    • 去中心化 Oracle 网络:更安全的方法是使用像 Chainlink 这样的去中心化 oracle 网络。这些网络聚合来自众多独立的链下来源(例如,主要的中心化交易所)和链上来源的价格数据。这种冗余和去中心化使得攻击者极难操纵最终报告的价格。
    • 断路器和健全性检查:协议可以构建自我保护机制。如果来自 oracle 的价格源偏离次要来源或其自身最近的历史值的幅度超过预定义的阈值,则断路器可以自动暂停关键功能(如借贷或清算)。这充当了针对受损 oracle 的最后一道防线。

Curve Bug Bounty 计划

除了正式审计之外,Curve 还维护着一个积极且利润丰厚的 bug bounty 计划,作为持续的安全防御层。该计划激励独立的安全研究人员和白帽黑客在恶意行为者利用漏洞之前发现并负责任地披露漏洞。该计划提供丰厚的经济奖励,对于发现可能导致用户资金大量损失或协议核心功能出现故障的关键 bug,其支出高达 250,000 美元。范围已明确定义为侧重于智能合约漏洞,不包括前端代码或先前已知的 bug 问题。该计划通过提供持续的、开放的邀请来审查协议的代码,从而补充了正式审计。

Curve 集成商的安全清单

根据对协议设计和过去安全事件的分析,与使用 Curve 的协议集成或审计协议的开发人员应遵守以下安全清单:

  • 从链上注册表(如 AddressProviderMetaRegistry)动态获取所有合约地址。永远不要硬编码它们。
  • 使用 MetaRegistry 作为唯一的事实来源,以编程方式验证所有池和代币数据。在每次交互之前,查询链上以获取币列表、费用和池类型。
  • 通过计算和强制执行每个交换的非零 min_amount_out(或 max_amount_in)来实施强大的滑点保护,以防御抢先交易和价格波动。
  • 通过在调用 get_virtual_price() 进行关键 oracle 读取之前触发合约的重入锁定(例如,通过调用 withdraw_admin_fees)来防止只读重入。
  • 处理特定于池的 API 和非标准代币。查询 MetaRegistry 以识别池类型,并调整你的逻辑以适应独特的代币机制,如 rebasing (stETH) 或 ERC4626 金库。
  • 保护你的价格 oracle。避免将瞬时 AMM 现货价格用于关键功能。集成强大的解决方案,如时间加权平均价格 (TWAP) 或像 Chainlink 这样的去中心化网络,并实施断路器作为最后的保障。
  • 在执行之前检查协议状态标志。在提交资金之前,验证目标池或其依赖项是否未暂停或处于紧急关闭状态。
  • 审计你的整个依赖项堆栈,而不仅仅是你的应用程序代码。仔细检查你交互的特定编译器版本、库和外部合约,以避免继承的漏洞。
  • 严格遵守 Checks-Effects-Interactions (CEI) 模式。首先执行所有验证检查,其次更新合约的状态,然后才执行对外部的调用以防止重入。
  • 进行你自己的独立尽职调查。假设没有任何东西是安全的。在与任何 Curve 池或第三方协议集成之前,执行彻底的安全审查和风险评估。
  • 通过主动监控 Curve 的官方安全披露、审计报告和公告来保持知情。参与像 bug bounty 这样的安全措施,为生态系统的安全做出贡献。

结论

与 Curve Finance 集成是利用深度流动性和高级 AMM 功能的强大方法,但这需要高水平的技术严谨性和安全意识。通过认真遵循此清单,开发人员和审计人员可以更安全地驾驭 Curve 生态系统的复杂性,从而降低风险并构建更具弹性的去中心化应用程序。

如需进一步学习和实践学习,请参阅官方 Curve 文档:

此外,请考虑 Cyfrin 上全面的 Curve v1、v2 课程,以更深入地了解协议的机制:

保持联系

在 Zealynx,我们深入了解像 Curve Finance 这样的协议的复杂 AMM 设计、经济模型和安全挑战。无论你是构建新的 DeFi 协议、审计现有协议,还是需要 AMM 项目安全方面的专家指导,我们的团队都随时准备提供帮助 — 请联系我们

想要通过更深入的分析来保持领先地位吗?订阅我们的 Newsletter,确保你不会错过未来的见解。


常见问题解答:深入探讨 Curve Finance:核心机制

  1. Curve v1 的 StableSwap 的核心创新是什么?

Curve v1 的 StableSwap 不变量是一种混合 bonding curve,旨在最大限度地减少稳定币等Hook资产的滑点和费用。对于平衡池(接近零滑点),它的行为类似于一条直线,并且随着池变得不平衡而平滑过渡到双曲线,即使在极端情况下也能确保流动性可用性。

  1. Curve v2 的 CryptoSwap 与 v1 的 StableSwap 有何不同?

Curve v2 的 CryptoSwap 不变量专为波动性较大的、不相关的资产而设计。与 StableSwap 的固定Hook不同,CryptoSwap 动态调整其内部“Hook”并将流动性集中在当前市场价格附近,从而提高波动性交易对的资本效率。

  1. 什么是 crvUSD 以及 LLAMMA 机制?

crvUSD 是 Curve 的去中心化稳定币,通过存入波动性加密资产作为抵押品来铸造。其独特的 LLAMMA(借贷清算 AMM)机制可实现“软”清算,随着价格下跌,持续且逐步地将抵押品转换为 crvUSD,并在价格回升时将其买回,从而减轻传统清算的影响。

  1. 什么是 veCRV 及其主要优势?

veCRV(vote-escrowed CRV)是通过限时锁定 CRV 代币获得的不可转让的投票权。它赋予三大好处:Curve DAO 中的治理权、协议费用的按比例 शेयर 以及将流动性仓位的 CRV 奖励提高多达 2.5 倍的能力。

  1. 2023 年 7 月的 Vyper 编译器漏洞利用事件是什么原因造成的?

2023 年 7 月的漏洞利用是由于 Vyper 编程语言编译器(0.2.15、0.2.16 和 0.3.0)特定版本中的潜在 bug 造成的。此缺陷阻止了重入保护(一项关键的安全功能)被正确地设置或清除,使其在受影响的池中无效。

  1. 什么是“只读重入”,如何缓解?

只读重入是一种漏洞,其中可以操纵 view 函数以在合约处于瞬态、不一致状态时返回人为膨胀的价格。这可以在 Curve 的 get_virtual_price() 函数中看到。缓解措施包括通过在关键 oracle 读取之前触发合约的重入锁定(例如,调用 withdraw_admin_fees)来进行防御性编程。

  1. 为什么价格 oracle 安全性是 DeFi 中的一项系统性挑战,解决方案是什么?

价格 oracle 安全性具有挑战性,因为存在通过闪电贷操纵 AMM 现货价格的风险,这可能会在一次交易中极大地扭曲价格。强大的解决方案包括时间加权平均价格 (TWAP)、像 Chainlink 这样的去中心化 oracle 网络以及在价格源明显偏离时暂停功能的断路器。

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

0 条评论

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