深度解读以太坊上借贷应用架构演变
作者:@albertocuestacanada
翻译:登链社区
借贷产品演变图
借贷是基于以太坊的区块链应用的基石。已经有数十亿资产被借出[5],所以了解借贷的运作方式对于开发者、架构师或研究员来说至关重要。
就像编程范式的演变一样,这些 DeFi 应用程序具有不同的架构设计,反映了从安全性到效率极用户体验等不断变化的优先级。
本文着眼于分析借贷应用程序的架构,例如 MakerDAO、Compound、Aave、Euler 和 Yield。我们将重点介绍关键的创新和设计模式,它们是未来借贷应用程序开发的重要经验教训。
如果你是开发者、架构师或安全研究员,那么本文适合你。最后,你将轻松了解以太坊上的新借贷应用程序,快速而全面地掌握其架构。深入了解这些 DeFi 巨头是如何从头开始构建的。
DeFi 中的借贷
大多数 DeFi 借贷是超额抵押[6]。如果用户提供的抵押品价值高于借贷的价值,则用户可以借入特定资产。与传统借贷不同,许多此类借贷没有定期还款或固定还款日期。从本质上讲,你可以借,永远不还。
然而,有一个问题就是:抵押品的价值必须始终超过借贷价值预定的边界。
如果抵押品价值低于此边界,则贷款将会被清算[7]。在清算期间,其他人偿还你的部分或全部贷款,并且他们会收到你的部分或全部抵押品作为回报。
遵循这种金融结构的所有借款申请都需要相同的构建,然后可以通过多种方式进行安排:
- 存储用户抵押品和借入资产的金库(treasury )
- 跟踪每个用户的抵押品和债务的账单(Accounting)系统
- 决定借款人利率的函数
- 验证借贷是否有足够抵押的机制,通常涉及外部价格预言机
- 抵押不足时借贷的清算路径
- 记录借贷总额和其他安全指标的风险管理系统,例如全局和每个用户的借贷限额、最低抵押品和特定的超额抵押率
- 供用户添加和删除抵押品、借贷和偿还标的接口
MakerDAO 中的借贷流程,所有应用资产使用相同的步骤和功能
借款和贷款可以被视为独立的功能。在 DeFi 中,我们在大多数借贷应用程序中都发现了这两种功能,但它们并不总是能够很好地集成。在 Compound ,Aave和Euler ,借款人和贷款人的利率是内部相关的;事实上,这就是使这些应用程序以最少的干预运行的原因。
另一方面,MakerDAO 和 Yield 借给借款人的资产来自于他们自己(协议本身)。
他们不要求用户提供资产以便其他用户可以借用。
本文将重点讨论链上借款(borrowing),并在很大程度上忽略贷款(lending)。由于抵押要求,借款要复杂得多,并且了解借款模式通常可以更好地理解整个协议。
MakerDAO 的架构演变
MakerDAO[8],于 2019 年 11 月推出[9],它持有 $4.95B 抵押品。尽管其模块化架构具有针对每个功能的不同合约和独特的术语,但它仍然易于理解和验证。
MakerDAO 中的金库(Treasury)功能由Join合约[10]管理。
每个被批准作为抵押资产的代币都有一个单独的合约[11]。
MakerDAO 不拥有任何借贷资产 DAI。它只是根据需要铸造和销毁[12] DAI。
账单(Accounting) 在 vat.sol 合约[13]内处理。当抵押品进入或退出系统时,Join 会更新此合约[14]。如果用户借款,他们会直接与 vat.sol 合约[15]进行交互。
此操作会更新用户的债务余额,并允许他们在 DAI 中铸造 DAI。
为了偿还,用户在 DAI Join 合约 中燃烧 DAI。然后,此过程会更新 Vat,使用户能够结算借贷。
此外, vat.sol合约充当风险管理[16]引擎。它维持全部借贷限额,设定每个用户的最低阈值,并监督抵押比率。当用户的债务或抵押品余额发生变化时,vat.sol 合约会评估利率和现货(spot)。
这些是指基于所使用的抵押品和现行 DAI 与抵押品价格比率的利率。有趣的是,这些值由其他 MakerDAO 合约输入到 vat.sol 合约中,这种方法与大多数其他应用程序不同。
MakerDAO 在设计阶段就将安全放在首位——当时 gas成本等因素是次要的,用户体验是次要问题,竞争也可以忽略不计。
因此,它可能会显得古怪、使用成本高昂且难以驾驭。
然而,其管理的庞大资产和没有重大违规行为的运营记录凸显了其稳健的设计和执行。
MakerDAO 亮点:
每个资产都有自己合约。
账单功能集中在单个合约中,该合约还记录和执行风险参数,包括抵押检查
与其他应用程序不同,预言机来更新合约,监督抵押
价格和利率预言机使用不同的接口
利率源自外部
要借款,用户必须与多个合约交互
Yield 协议的架构演变
Yield v1[17] 作为使用 YieldSpace[18] 的固定利率的概念证明。该版本在 MakerDAO 之上构建了其抵押债务引擎。然而,Yield v1 使用起来既昂贵又难以通过新功能进行增强。
认识到 YieldSpace 的潜力后,我们迅速转向开发 Yield v2[19]。Yield v2 仍从 MakerDAO 中汲取灵感,但现已完全独立,于 2021 年 10 月推出[20];Yield v2 优先考虑降低 Gas 成本和增强用户体验。
Yield v2 中的借贷流程深受 MakerDAO 影响
所有账单、风险管理和抵押检查都合并到一个合约中:Cauldron[21]。效仿 MakerDAO 的方法,将金库功能分布在 Join 合约[22]中,每个合约专用于一项特定资产。
改进了预言机集成,将价格和利率预言机合并为一个通用接口[23]。我们反转了 MakerDAO 的预言机流程,以便 Cauldron[24] 根据抵押检查的需要查阅预言机。据我所知,这是除 MakerDAO 之外的所有其他应用的首选流程。
与 MakerDAO 方法的另一个重大差异是引入了Ladle[25]。该合约充当用户和 Yield 之间的唯一中介。它对金库和账单拥有广泛的控制权,以之相应的,它为功能开发提供了巨大的灵活性。
总而言之,Yield v2 中的借贷工作原理如下:
- 每项资产都有自己专用的金库合约。
- 单一合约集中了账单职能。该合约还监督风险管理措施并执行抵押检查。
- 抵押功能查阅预言机来确定价格和利率。
- 价格和利率预言机共享统一的接口。
- 利率是外部产生的。
- 用户可以通过向一个合约发出单个交易来借款。
Compound 的架构演变
Compound 的第一个版本[26]是概念验证[27],表明可以在以太坊上建立货币市场。因此,其设计优先考虑简单性。MoneyMarket.sol[28]合约封装了所有功能,包括借贷。
Compound v1 中的借款过程,简单有效
金库、账单和风险管理任务(例如抵押检查)被合并到一份合约中。
该合约从预言机检索价格,但根据资产利用率确定利率。
用户仅与该合约交互,尽管它必须单独调用来提供抵押品和借入资产。
Compound v2
Compound v2[29] 于 2019 年 5 月推出,点燃了流动性挖矿时代,激发了无数分叉。它也起到货币市场的作用,允许用户存款和借入资产。
基于其白皮书[30]和结构,很明显,Compound v2 的主要目标是使用 ERC20 标准来表示借贷头寸。这确保了可组合性,允许用户借给Compound,然后在其他区块链应用程序中使用这些计息头寸。
有趣的是,白皮书并没有强调Compound v2 将奖励[31]纳入其智能合约中。由于这一遗漏,该功能的巨大影响可能无法预见。
Compound v2 中的借款过程,首次将借贷头寸代币化
每项资产都有自己的资金合约。
账单功能也是分开的,每个 cToken 都会记录用户的抵押品和债务。
单一合约(Comptroller)记录并执行风险管理参数,包括抵押检查。
Comptroller 负责抵押检查的合约参考价格的预言机和 cToken 的利率。
价格和利率预言机通过不同的接口运行。
利率源自资产内部利用率。
用户必须与多个合约交互才能借款。
Compound v3
Compound v3[32] 于 2022 年发布[33],采用了更为保守的风险管理策略,将流动性隔离到每个可借资产的池[34]中。该设计也表面其对用户友好性和Gas成本的关注。
Compound v3 (Comet) 中的借用过程。回到基础,回到安全。不过,有了更好的用户体验。
由于所需调用次数的减少,该系统对于开发人员和用户来说都更加直观。此外,单一合约设计通过最大限度地减少合约之间的调用来降低Gas成本。隔离的货币市场是对基于预言机的攻击的防御,而这是当前一个主要的安全问题。
文中提到的其他相关功能包括(在发行说明中提到的):
彻底改造的风险管理和清算引擎。这种设计增强了资金安全性,同时对借款人更加友好。
在整个市场上对个人抵押资产设置限制以降低风险。
收入和借款的利率模型现在是分开的,治理对经济政策具有完全控制权。
有趣的是,Compound v3 镜像了Compound v1 的架构,让单个合约处理每个可借资产的所有功能。其他值得注意的功能包括:
只有借贷资产才能借款,抵押资产不能借款。
在Compound v3 中,抵押品不会产生回报。
禁止借用抵押品提高了抵押品存入者的安全性。这降低了治理错误或故意攻击危及抵押品的可能性。
移除抵押品供给回报可能是由于Compound 设法在 v2 中积累了大量流动性的结果。我的直觉是,在Compound v2 中,借贷限额要么低于或不高于用户贷给应用程序的资产。
假设他们将为 v3 管理类似水平的流动性,禁止借出抵押品可以使应用程序安全,这是 v3 的核心目标之一。
从架构的角度来看:
每个货币市场都是一个独立合约包含金库、账单和风险管理
每个货币市场都保留可借资产及其所有批准的抵押资产代币,从而让资产分布在整个应用中
喂价是唯一的外部输入;借贷利率由内部产生
供给(supply)/提取(withdraw)/借(borrow)/还(repay)等传统功能得到巧妙整合。现在,从货币市场提取(withdraw)可借资产意味着借款,而供给(supply)可借资产则意味着根据用户的偿还债务或贷款
集成了路由合约,允许在一次调用中执行多个操作
Aave 的架构演变
Aave v1[35] 于 2019 年 10 月推出[36],接替 ETHLend。Aave v1 引入了共享流动性池,而不是 ETHLend 的点对点方法。
Aave v1 中的借款过程,汇集流动性提交计算效率
正如在 Yield v2 中一样, 路由合约[37]控制了业务逻辑。LendingPoolCore[38] 实现了账单、风险管理和金库功能。将金库集中在一个合约中是与Compound v2 的一个区别点。
将抵押检查留在自己的合约[39]中,从路由器而不是会计合约中调用,这一决定看似薄弱,但由于 Aave v2 版本在 v1 版本发布两年后才发布,因此很可能符合目的。
LendingPoolCore 合约处理金库和账单
LendingPoolDataProvider 管理抵押检查并与预言机交互
LendingPool作为用户入口并实现业务逻辑
借贷利率由内部决定,仅依赖于价格反馈
Aave v2
Aave v2[40] 于 2021 年 12 月发布[41]。虽然它保留了与 Aave v1 类似的功能,但与 Aave v1 和 Compound v2 相比,它引入了改进且更简单的架构。在此版本中,Aave 还引入了 aToken[42](类似于Compound 的 cToken)和 vToken[43],它们代表代币化债务。
Aave v2 具有非常干净的架构,完全代币化
为了简单起见,省略了 Aave v1 中有限使用的某些功能。Aave v1 中的问题(例如应计利息的复杂表示)已在 Aave v2 中得到解决。
LendingPool 合约整合了全局账单和风险管理功能,例如抵押检查。它作为用户的主要访问点
aToken 表示抵押品,类似于借贷头寸。用户的抵押品通过其持有的 aToken 体现,金库功能分布在所有 aToken 上
vToken 用于表示债务头寸。用户的债务由他们持有的 vToken 表示
Aave v3
Aave v3[44] 于 2023 年 1 月发布[45],具有多链支持和其他功能。添加这些不会改变核心架构。此次更新还改进了风险管理和Gas效率。
尽管有许多进步,但就本研究而言,Aave v3 与 Aave v2 并没有本质上的不同。事实上,这可能表明 Aave v2 的架构在 2023 年仍然保持稳健。
Euler 的架构演变
Euler[46] 于 2022 年 12 月推出[47],旨在为货币市场提供无需许可的功能和最少的治理。
其设计的一个标志是钻石[48]般的模式。单个合约拥有应用程序的所有存储空间[49]。该存储可以通过不同的代理[50]进行访问,每个代理管理系统的不同概念元素。
Euler
尽管一份合约存储了所有资产、账单和风险管理数据,但仍然有用于抵押品和借贷的 eToken,以及用于债务的 dToken,类似于 Aave v2。然而,这些代币合约仅仅是中央存储合约的视图。
Storage合约[51]管理账单变量。
BaseLogic 合约[52]充当金库。
RiskManager 合约[53]监督风险管理变量和功能,包括抵押检查。
对代码的分析表明,最小的Gas成本是首要任务,从而导致整体设计消除了合约间调用的需要。通过严格的测试和审核确保了安全性。只有逻辑分布在各个模块中,作为存储合约的实现,存储合约主要充当代理合约。
这种统一的设计还支持轻松升级。如果不需要更改存储,则可以快速更换模块以修改或引入功能。
Euler 在发布 15 个月后被黑客攻击,在升级引入被利用的漏洞 6 个月后被黑客攻击。
我不认为是由于其整体架构导致资产流失;相反,是对代码更新的监督不够。
结论
MakerDAO、Compound 和 Aave 等早期以太坊应用程序展示了以太坊超额抵押借贷的潜力。一旦这些概念验证被证明是成功的,重点就转移到引入一系列新功能以占领市场份额。Compound 和 Aave 的后续版本引入了流动性挖矿、可组合性和集合流动性,这些技术在牛市条件下尤其蓬勃发展。
一个重大发展是 Compound v2引入了代币化借贷头寸,这使得这些头寸能够被其他应用程序识别为标准资产。Aave v2 和 Euler 通过实施代币化债务头寸更进一步,其更广泛的效用仍然是一个争论的话题。
高 Gas 成本成为牛市期间的主要问题,促使用户体验发生变化,如 Yield v2、Aave v2 和 Euler 所追求的。路由器合约和作为整体实现有助于降低用户的交易成本。然而,这是以更复杂、因此风险更大的代码为代价的。
Compound v3 似乎开创了先例,将安全性置于金融效率之上。它背离了传统的流动性池模型,以更好地防范潜在的黑客攻击。L2 网络的兴起(其中 Gas 成本变得越来越可以忽略不计)可能会影响未来抵押借款应用的设计。
在本文中,我全面概述了以太坊上的关键抵押借款应用程序。我用来分析每个应用的方法也可以用于快速掌握其他抵押借款应用的复杂性。
在开发区块链借贷应用时,请始终考虑资产的存储、账单记录的放置以及风险和抵押品评估方法。当你考虑这些注意事项时,请利用之前应用的历史变更及本概述中的见解来为你的决策提供信息。