现代 DeFi 借贷协议是如何构建的 - 合集

  • mixbytes
  • 发布于 2024-09-21 12:27
  • 阅读 33

这篇文章深入探讨了现代去中心化金融(DeFi)借贷协议的实施细节,涵盖了多个前沿技术和理念,包括集中流动性、层次化协议和新型高效的数学模型。文章具有清晰的结构,通过不同借贷协议的对比,提供了丰富的实际案例,使开发者和审计员能够更好地理解并应对面临的挑战。

介绍

在我们关于现代借贷协议实现的系列文章中,我们探索了多种新协议,每个协议都有其独特的特征和实现技巧。现在,是时候将最重要的想法和实施见解汇聚在一起,以帮助 DeFi 开发者和审计员构建更高效、安全和创新的 DeFi 结构了。 开发新的借贷协议面临着一系列挑战,无论是从商业还是技术层面来看。在商业层面,需要确保借款人和供应商的安全性和激励机制,管理坏账等。在技术层面,则要考虑如何保持交易的可负担性,如何有效地进行清算,如何保护协议免受突发变化,以及如何保护其核心逻辑不被破坏。 这些问题的解决方案是复杂的——我们处理的是先进的数学模型、动态速率限制、协议内“范围”操作的额外聚合结构、多层架构等。在本文中,我们将详细探讨这些解决方案。与我们以前的讨论一样,我们不会将任何方法标记为严格的“好”或“坏”,因为考虑的范围太广。无论是处理经济问题的高级数学,还是具有强治理的更简单、安全的代码,或是完全无权限的设置,只有时间能证明哪种方法是最好的。

话虽如此,所有这些改进都应该被描述,以给 DeFi 开发者和审计员提供新的见解,帮助他们解决这些挑战。让我们开始吧。

集中流动性和范围内的操作

Uniswap v3

将价格区间分割为独立的 tick 的想法首次由 Uniswap V3 大规模实现,使流动性提供者能够在特定价格范围内放置自己的流动性。这些协议中的价格(两个资产之间的比率)由方程定义:ratio=G ,其中 G 是一个略高于 1.0 的值(如 1.0015 或 1.005),t 是一个有符号的“tick”(或“带”,或“桶”)编号。每个 t 的值代表某种固定比率(或范围)的价格:

Uniswap V3 的 ticks

这种方法的效率不仅在于流动性提供者能够精确定位他们的流动性,还在于算法能够跟踪“ticks”内的附加值。在 Uniswap V3 中,这导致了一个高效的收费系统,使 LP 可以在“ticks”范围内提供流动性,而无需对每个 tick 执行“每个”的操作。收取的费用也可以在不需要触碰范围内每个 tick 的情况下收集(只有下边界和上边界的 ticks 会受到影响( 文章))。

在借贷协议中,“ticks” 通常代表债务代币和抵押代币之间的比例。我们已经讨论过这些实施方案,如 CrvUSD LlamaLendFluid + Vault 协议和 Ajna。尽管所有这些协议都使用相同的价格范围概念,但它们应用该概念的方式各不相同。

CrvUSD LlamaLend

在 CrvUSD LlamaLend 中,每个“带”包含自己的流动性,并且协议还具有外部预言机价格。这允许“带”的流动性朝向预言机价格“移动”,不断地进行债务到抵押或抵押到债务的交换。这一过程使所有左侧的带完全处于债务资产中,而右侧的带完全处于抵押资产中(类似于 Uniswap V3 的 ticks)。在 CrvUSD 中,带的池还充当一个 DEX,允许市场制造商兑换债务和抵押的资产,反之亦然。这使得这些操作在当前带向实际市场价格更近的方向上变得更具盈利性。CrvUSD 中一个非常有趣的机制不仅包括当前价格带的“移动”,还包括整个价格范围规模的“调整”,使得带的范围变得“更宽”或“更窄”,以提高软清算的盈利性。同时,这种移动用抵押品替换掉不足抵押的债务,类似于传统借贷协议中的清算功能。

CrvUSD LlamaLend bands

Fluid Vault

Fluid Vault 协议同样使用集中流动性的概念,将池中的全部债务-抵押金额拆分为“ticks”,每个 tick 代表特定的债务-抵押比率。与 CrvUSD 相似,外部预言机价格决定下一个借贷者会落入哪个 tick。然而,协议的其余部分与 CrvUSD 有显著区别。

在 Fluid Vault 中,协议跟踪预言机价格的变化。当抵押价格下跌时,协议会开始在名为“分支”的特殊结构中聚合有关变为不足抵押的 ticks 的信息。这些分支用于将流动性从不足抵押的 ticks 转移到已抵押的 ticks,依次移除“坏”的流动性并将其放入“安全”的 ticks 中:

Fluid + Vault 的清算

这些在 Fluid Vault 中的操作并不是在“每个位置”基础上执行的,类似于 Uniswap V3 的收费系统,这种方式极为高效,因为在单个“清算”操作后,许多借款者的头寸同时变得“更安全”。

Ajna

Ajna 项目( 文章)使用相同的债务-抵押比率 ticks(或“桶”),但“无预言机”概念使该协议脱颖而出。每个借款者的位置属于特定的桶,表示债务单位的固定价格。借款者可以将其存款放入任何“允许”的桶中,其中“允许”意味着债务得到抵押的桶的范围(在 Ajna 中非常简单,因为每个桶直接代表债务和抵押之间的价格):

Ajna 的桶

Ajna 使用两个阈值来跟踪桶的范围:最低利用价格(LUP)和最高阈值价格(HTP)。协议中每项债务/抵押的操作都会使这些值向市场价格靠拢。与 CrvUSD 或 Fluid Vault 不同的是,Ajna 的操作无法聚合,而是需要与每个位置和桶进行直接交互。结果,没有操作的聚合。相反,Ajna 利用特殊的数据结构来跟踪桶中债务/抵押的部分总和(使用 Fenwick 树)和一个“最大堆”树以跟踪最大值。

所有使用集中流动性概念的协议——将流动性拆分为离散的桶/ticks/bands——方式各不相同。这种方法允许“软”清算、对多个位置的聚合操作,以及创建“无预言机”的机制。然而,它也要求对多个实体进行更细致的控制,并要求使用先进的数据结构才能足够高效满足 DeFi 的需求。尽管如此,这仍然是现代借贷协议中使用的一种关键现代 DeFi 机制。

多层协议

DeFi 代表“去中心化金融”,因此,最小化治理和外部控制对 DeFi 项目至关重要。所有现代 DeFi 项目在一方面旨在与任何 ERC20 资产进行交互,为用户提供最大的灵活性,但在另一方面,任意 ERC20 代币(例如带有攻击者陷阱的代币、可重基代币或具有“转账时收费”机制的代币)可能破坏项目的逻辑并导致漏洞或黑客攻击。同样,策略和 Vault 逻辑可能在一组资产中运行良好,但在不同的资产组或变化的市场条件下可能会失败。

解决这些问题的一种方法是多层策略。它使用多个层(至少两个),在“基础”层提供基本功能,同时在第二层给予用户和项目更多的自由。如上所述,借款者/贷方安全之间的权衡是不可避免的。寻找最有效的解决方案是一个持续的过程,给用户和“子”协议实施自己的风险管理方案的能力是自然的,而不需要重建“基础”层。

这个“基础”层可以负责持有基础资产、提供预言机价格,以及实施一些防御函数(例如重入保护或速率限制)。这种方法的一个有趣方面是它对更高级的数学和复杂模型的要求较少。相反,它需要更简单、更易读和可靠的代码——至少在基础层——以确保安全性。开发人员无法妥协基础层,因此代码应当经过良好文档化、审核,并可便捷地供外部项目使用。

Euler V2

Euler V2 的关键理念是“模块化借贷生态系统”,它实现了多层方法。这不仅仅是一个单一的借贷项目,而是一个为用户创建的多种类型借贷平台的生态系统,它基于代币 Vault。在这方面重要的一点是,Euler V2 的 Vault 仅包含一种资产,每个 Vault 使用单一的基础代币:

Euler V2 的 Vault 和控制器

Euler V2 中的多层方法是通过控制器实现的,控制器通过访问控制和多路调用相互连接多个 Vault。用户在 Euler V2 的操作本质上是对几个不同的 Vault 进行多路调用,存储抵押品和借款资产。因此,Euler V2 中的基础层是控制器,负责访问控制(确定哪些账户可以访问某个特定的 Vault)、重入保护、账户冒充(从另一个“操作员”地址操作一个账户),以及多 Vault 操作的原子执行。

Vault 可以由用户创建,并且它们的组合可以实现各种风险管理配置文件。一些 Vault 是不可变的,没有治理,充当真正的“保险库”以存放抵押品。其他 Vault 可以提供借贷,支持升级,实施外部激励,并在与抵押 Vault 组合时,使用在控制器的单一入口点形成许多不同的借贷解决方案。

Fluid

Fluid(以及基于它构建的多个协议)也展示了一种用于构建 DeFi 项目(不仅是借贷)的多层方法。Fluid 有一个基础层,称为“流动性层”,拥有管理员和用户组件。管理员组件负责治理操作、设置模型参数、交换价格和代币配置,而用户组件则处理基本操作,包括在协议中的供款/提取和借款/偿还操作。

Fluid 中的基础层保护协议的关键方面:预言机价格、借贷/供款利率、最终代币转移,并且具有一个非常重要的特性——在协议内限制操作的速率,以保护其免受资金的急剧流动。

Fluid 的第二协议层利用基础层,但实现其自己的逻辑,允许 Fluid 使用相同的基础层构建多个协议。例如,它可以是利用传统方案构建的“传统”借贷协议(如 Fluid 的 Lending),或者一个更高级和复杂的协议,如 Fluid 的 Vault( 文章),后者使用集中流动性、ticks 和软清算。所有这些协议首先实现其逻辑以计算目标金额,自行更新状态,然后使用基础层来“结算”结果。由于基础层仅跟踪全局的借款/供款余额和存款/提取限制,因此这些协议的逻辑可以非常灵活——例如,可以将同一供款/借款余额拆分为价格“ticks”,在不同资产之间再平衡,或用于实现其他任何逻辑。

Morpho Blue

Morpho Blue 是一个旨在作为其他协议基础层的项目。它具有非常清晰、极简和可靠的代码库,实现了纯粹的借贷逻辑,没有任何意外。这使得在 Morpho Blue 中,无权限和不可变的市场可以用作其他外部协议的 Vault。在这种情况下,Morpho Blue 可以作为更复杂协议的“结算”层。

CrvUSD LLamaLend

CrvUSD LLAMMA 是 CrvUSD 稳定币的关键组成部分。它是一个去中心化交易所(DEX),同样采用了集中流动性概念和价格带,使其能够在稳定币和抵押资产之间重新平衡其储备。然而,在 LLamaLend 中,LLAMMA 被用作对债务/抵押重新平衡负责的层(详细描述见 此处)。其设计使借贷协议能够在稳定币和反之亦然之间交换抵押品,使流动性池更接近市场价值。在该协议中,LLAMMA 通过激励市场制造者去清除“不健康”资产(稳定币或抵押)并添加“健康”资产(抵押或稳定币)来帮助避免对“不健康”头寸的直接清算。这种将 DEX 用作负责抵押/债务重新平衡的层的方法非常有吸引力,使得协议能够同时充当“借贷”和“DEX”,使交易者承担清算者的角色。

聚合、优化和数据结构

现代 DeFi 需要越来越复杂的数学和对大量实体(ticks、头寸、市场)的操作。因此,DeFi 开发中的一个关键方向是优化计算和使用专门的数据结构以降低Gas费用。从算法上讲,这一领域最好的成果是常量(!) 交易成本,因为可预测性对于市场做市软件至关重要。EVM 缺乏许多专用数学指令,并且由于确定性限制,无法使用 FPU。因此,DeFi 协议通常实现专门的计算并使用定制的数据结构。让我们探讨其中一些解决方案。

Uniswap

Uniswap 并不是一个借贷协议,但自 V2 起,特别是在 V3 中,Uniswap 展示了专用数学模型如何替代繁重的计算。在我们的文章中对此进行了更详细的说明,我们展示了如何使用 sqrtPrice 和流动性来定义:

从而使协议能够在其代码中完全避免计算 sqrt()(因为 Solidity 中的 sqrt 是一个迭代算法)。Uniswap v3 中几乎所有的操作都是简单的加法/乘法/除法。以这种方式替换关键协议变量已导致高效的解决方案。Uniswap V3 的另一个重要特性是在放置/移除流动性时,能够以恒定数量的实体(ticks)进行操作,而不触动范围内的每一个 tick,并且有效地计算集体收费,通过在价格 ticks 中存储局部全球收费值实现。

这种方法在协议模型需要在不同交易类型之间进行非标准操作(超过加法/乘法/除法)时尤为有效。在这种情况下,使用预计算的状态变量(例如 xy->sqrt(xy)y/x -> sqrt(y/x))替换状态变量可以简化协议交互并避免使用非常数的数值计算。当可以更高效地实现时,没有必要盲目遵循传统金融模式。

Fluid Vault

Fluid 的 Vault 协议,如前所述,使用了集中流动性概念,类似于 Uniswap V3。Vault 协议的关键特性之一是有效的清算过程,与 CrvUSD 的软清算和 Uniswap V3 的收费收集可相比。这是通过补充聚合结构称为“分支”实现的,该结构收集有关变为“不健康”的 ticks 的信息,enable 同时影响多个用户头寸的清算。这种方法在涉及多个实体的操作中是高效的。通过使用“累积”结构,协议可以避免直接与每个实体进行交互,从而减少Gas费用。

此外,Fluid 使用非标准位长(如 19 位或 51 位),因此 Fluid(和 Vault)中的结构被紧密地打包为 256 位值,读写操作主要依赖于按位掩码和移位。你可以在我们的之前文章中阅读更多相关内容。当一个协议在结构内采用许多非标准位长并且需要对值进行紧包装时,这种方法是特别有利的。

Aave

Aave(V2 和 V3)处理用户的抵押-债务头寸使用可重基代币。用户向协议供款时收到供应代币,而借贷资产的用户则收到不可转让的债务代币。这两个资产的余额会持续增加,随着时间的推移累积利息。相对而言,其他协议更倾向于将用户的抵押-债务头寸处理为复杂的结构,持有供款-借款资产的数量,并要求在操作时手动计算累计利息。

使用可重基代币的方法可以实现简单高效的借款/偿还/供款/提取程序,仅涉及铸造/销毁相应的资产,并将基础代币转移到用户的账户中。然而,在某些情况下,使用可重基代币的操作可能会非常棘手,例如需要定期进行“重基”或使得将这些资产集成到外部协议中变得困难。

此外,使用可重基代币的方法通过简单地获取协议代币的总供应量来简化协议储备和债务的计算,使得可能灵活和简便地更新市场策略。此外,该方法使用协议代币仅进行有效的操作(如偿还/清算),即使用自身的供应代币偿还债务或将抵押品作为协议供应代币来收回。

Ajna

Ajna 项目通过其使用价格“桶”和流动性移动,要求比仅仅迭代地遍历桶集更高效的解决方案。为了解决这一问题,它采用了两种数据结构,这可能会对 DeFi 开发者和审计员产生改变游戏规则的影响。

首先,有 Fenwick 树 - 一种允许在数组中计算部分总和的结构。这在需要对特定范围计算总数的协议中尤其有用。

第二个数据结构是“最大堆”(或“最小堆”)树,通过简单地检索第一个元素的方法,允许快速访问数组中的最大(最小)值(构建此树的良好可视化请参考 这里)。尽管向树中插入需要更多时间,但当插入/删除(如存款/提取)操作稀少而需要快速访问顶值时,这种结构非常理想。

无许可和无需信任

众所周知的借贷协议,如 Aave 或 Compound,有严格的治理程序,它们的 DAO 对从协议变更到支持的资产、费用和限制等所有事项做出决定。这种方法使这些协议非常安全,许多安全事件通过控制 DAO 的正确操作得到缓解。然而,这也使得创建新的(潜在风险)市场的过程变得复杂。自然地,许多参与者希望能更简化地访问市场,并更容易引入新的代币和策略。

一种更开放的方法可能无法提供像结构良好、专家推动的 DAO 那样的安全水平,但它确实在 DeFi 领域提供了一个有价值的替代方案。Uniswap 已证实,构建完全无权限和无需信任的市场正是市场所需要的,并且它可以有效运作。因此,向无权限和无信任 DeFi 的转变似乎是当前 DeFi 的一种持续趋势。

Ajna

在“无权限和无信任”的竞赛中,Ajna 无疑处于领先地位。像 Uniswap 一样,Ajna 允许任何人创建不可变的借贷池,并且完全没有治理。此外,Ajna 不依赖于价格预言机——抵押品价格和不健康位置由流动性在不同价格桶之间的移动来处理。

虽然目前还无法确定这种情况在现实市场中会如何发展,但这种方法完全消除了与预言机价格操控和治理复杂性相关的潜在问题。有时,解决工程问题的最好方法就是完全消除问题 :)

Euler V2

Euler V2 同样反映了无权限和无信任市场的趋势,允许用户为任何资产创建市场。其控制器层仅连接各种单代币 Vault,并且仅操作这些 Vault 的份额。如有需要,Euler V2 允许创建无权限、不可变的 Vault。例如,安全性最关键的 Vault 可作为无治理和不可变的形式进行部署,确保用户始终可以从这些 Vault 中检索其资产。

这种设计使得 Euler V2 有灵活性,既支持保管及 DAO 治理的项目,也支持完全无权限的项目,所有这些都通过控制器层的多路调用能力组合在一起。

Morpho Blue

Morpho Blue 强调最小化治理行为及支持与预言机无关的市场。Morpho Blue 的治理主要集中在管理费用、LTV(贷款价值比)比率允许值和引入新市场类型。在部署之后,唯一允许的治理动作是设置协议费用。因此,Morpho Blue 也反映了 DeFi 中向去中心化的转变,促进更安全和无信任的市场。

结论

当然,我们不能覆盖现代借贷协议的每个新特性;随着 Solidity 和以太坊多年来的发展,变化非常多。然而,借贷领域的关键创新有:

  • 无权限和无信任的市场
  • 集中流动性(ticks、桶、抵押/债务比率的带)
  • 多层协议和生态系统
  • 聚合操作(软清算、费用收集、累积数据结构)
  • 新的高效Gas数学模型和优化技术
  • 无价格预言机的方法

因此,如果有人认为 DeFi 开发停滞不前,他们错了。协议在不断演变,许多项目中出现了新数据结构、设计和模式。我们还看到受到 SNARK 启发的创新 DeFi 设计浪潮,提供了对整个 DeFi 领域的独特视角。

本文结束了我们关于现代借贷实现的系列文章。我们涵盖了:Euler V2CrvUSD LLamaLendFluid + VaultAjnaMorpho BlueAave V3

敬请关注我们即将发布的文章!

  • MixBytes 是谁?

MixBytes 是一个由专家区块链审计员和安全研究人员组成的团队,专注于为与 EVM 兼容和基于 Substrate 的项目提供全面的智能合约审计和技术咨询服务。请关注我们的 X,以保持对最新行业趋势和见解的了解。

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

0 条评论

请先 登录 后评论
mixbytes
mixbytes
Empowering Web3 businesses to build hack-resistant projects.