AAVE白皮书
1.介绍
Aave协议的诞生标志着Aave从P2P直接贷策略转为池化策略。贷方通过在池化合约中存入多种加密货币来提供流动性。同时,在同一个合约中,基金池可以通过签署一个抵押物来进行借款。借款金额不需要与提供者存款金额匹配,取而代之的是借款金额、抵押物与池化基金。这样具有基金池状态特征的借款就被创建了。简化的协议架构如图1所示:
借方、贷方利率由算法约定:
- 借方:借款利率取决于资金成本--特定时间下基金池中可用的金额。随着从基金池中借出的金额增加,利率上升。
- 贷方:贷方的存款利率与收益率相关,由算法保证一定的流动性储备,来保证贷方可以随时取款
1.1基础概念
借款池的核心是储备:每一个池子用多种货币储存,讲这一揽子货币转化为以太币的总量定义为池子的总流动性。储蓄允许贷方取出。用户可以从池子的基金中借款。借款人需要质押一笔更大的金额作为抵押物,这样这笔借款才会被许可。池化的储备中的特定币种,可以被配置为抵押物或者标记为不可借,只有低风险币种才应当被考虑上述配置。可借款总量取决于储备金中可用的存款金额。每一个储备金都有一个特定的LTV(Loan to value),该LTV由该种货币在不同抵押物中LTV的加权平均来计算,这里LTV的权重是用以太坊计价的抵押物中该货币的数额。图三是一个简单的例子:
每一个借款的位置可以用稳定利率或者变化利率开启。借款时间没有限制,同时没有还款计划:你可以在任何时间选择归还所有本金利息或者其中一部分。
出现价格波动的时候,借款可能会被清算。当抵押物价格低于清算阈值LQ时,清算事件将会发生。达到清算阈值时,会引入清算奖励,清算奖励鼓励清算者用一个折扣价格购入抵押物。每一个储备金都有一个清算阈值,计算方法与LTV相同。平均清算阈值的计算被动态执行,这里使用抵押物潜在价值的清算阈值来进行加权平均计算。
任何时间点,借款位置会用特征因子Hf来特征化,使用所有抵押物和所有借款来指示一笔借款是否资不抵债。
Hf<1,贷款就被认为资不抵债,将会被清算。关于清算更多内容可以在3.6中获取。
1.2正式定义
变量 | 描述 |
---|---|
T,当前时间戳 | 区块链时间戳,由block.stamp定义 |
Tl,上一次更新时间戳 | 上一次更新储备金数据时间戳,每一次发生借款、存款、还款、赎回、存款、交换、清算都会更新该变量 |
ΔT,变化差 | |
Tyear,second | 一年的时间有多少秒Tyear=31536000 |
Lt,总流动性 | 储备金中所有可用流动性总额,这个值的精度取决于对应货币种类的精度。 |
Bs,稳定利率总借款 | 以稳定借款利率借出的流动性总额,这个值的精度取决于对应货币种类的精度。 |
Bv,浮动利率总借款 | 以浮动借款利率借出的流动性总额,这个值的精度取决于对应货币种类的精度。 |
Bt,总借款 | |
U,利用率 | 流动性使用比例,如果 |
Uoptimal,目标优化利用率 | 当利用率达到该数值,利率会大幅提升 |
Rv0,基础浮动借款利率 |
|
Rslope1,达到Uoptimal前的利率曲线 |
|
Rslope2,达到Uoptimal后的利率曲线 |
|
Rv,浮动借款利率 | |
Rs,稳定借款利率 | 在4.2中实现,表现为射线。 |
Mr,平均市场借款利率 | <table frame=void><tr><td>基础稳定借款利率,由i个平台的借款利率 |
<table frame=void><tr><td>当稳定利率借款量 具体实现可参考函数decreaseTotalBorrowStableAndUpdateAverageRate() 和 increaseTotalBorrowsStableAndUpdateAverageRage()表现为射线 |
|
|
储备金的总体借款利率,根据总浮动利率借款和总稳定利率借款加权平均获得 |
|
总借款利率和使用率的乘积 |
|
储备金在 |
|
储备金忠累计的利息收入 |
|
浮动利率借款 |
|
特定用户浮动利率借款索引,当用户发起一笔浮动利率借款是被保存 |
|
账户在用户发起一笔借款时保存,当出现多次借款时,利息会被加上,并生成一个新的基础账户 |
|
浮动利率借款 |
|
当健康因子 |
2.协议架构
2.1.借贷池核心库
借贷池核心库合约是AAVE协议的中心,它:
- 保存每一笔储备金的状态以及所有存储的资产
- 处理基础逻辑(收集索引,计算利率等。。。)
2.2.借贷池数据供应者
借贷池数据提供者合约在抽象的更高一层(相比借贷池核心库)提供计算功能,同时给借贷池提供数据,包括:
- 以ETH计价,计算用户余额(借款、抵押物、流动性),决定用户可以借款多少,以及计算健康因子
- 从借贷池核心库中统计数据,提供借贷池的宏观信息
- 计算平均带宽,用来计算平均清算率
2.3.借贷池
借贷池的合用使用借贷池核心库和借贷池数据提供者来操作储备金完成以下操作:
- 存款
- 借款
- 交换
- 闪电贷
- 赎回
- 还款
- 清算
借款位置上的代币化这个高级功能也在借贷池的合约中实现。当用户存了特定的储备金,他将受到具有关联关系的一笔代币----Aave token(简写为aTokens)。aTokens用来映射存款的流动性以及明确储存的资产的利息。aTokens在存款过程中被铸造,它们的价值会一直增加,直到赎回或者清算流程,才被销毁。无论什么时候,用户发起一笔借款,被当做储备金的代币就被锁定了,而且不能转账。更多代币化相关内容参见3.8。
2.4.借贷池配置者
借贷池配置者为借贷池、借贷池核心库提供主要的配置功能:
- 储备金初始化
- 储备金配置
- 启用/禁用储备金借款功能
- 启用/禁用将特定的储备金作为抵押物
借贷池配置者的合约汇集成在AAVE协议治理功能中
2.5.利率策略
利率策略的合约包含了更新特定币种汇率需要的信息,以及实现利率更新的方法。每一种储备金都包括特定的利率策略合约。特别指出,在DefaultReserveInterestRateStrategy 中,以下内容被定义:
- 贷款利率
- 优化前利率曲线
- 优化后利率曲线
当前可变借款利率是:
这个利率模型可以通过关键利率来进行校准:
- 超过优化点
后,考虑到资本利用成本,利率陡峭上升。
稳定借款利率参考4.2中描述的模型。
2.6.治理
协议的权利由LEND代币进行控制。启动时,AAVE协议将会基于DAOStack框架执行一套连上的去中心化治理方案,最终行程一个完全匿名的协议。上链意味着所有的投票都会被绑定,投票结果注定会被执行.
为了理解治理的愿景,我们需要明确:
- AAVE协议会持续演进,将会允许创建多个隔离了流动性、参数、权限、资产类型的借贷池。
- AAVE借款协议是第一个AAVE协议借贷池,直到Pool Factory(池化工厂)更新的发布,每个人将可以创建自己的池子。
在AAVE协议中,治理将会从两个层面发生:
- 协议的治理投票权重由LEND代币决定,与协议参数更新、智能合约升级相关的议案将由投票决定。这个可以和MakerDAO中的治理类比,就如同股东为协议中未来需要的参数投票一样。
- 池治理投票权重由你在池子中的流动性权重来决定,权重表现形式是aTokens。这里的投票覆盖了池子中的特定参数,比如能被用于作为储备金的资产或者可以被借出的资产。
更多的细节将会在社区中的治理建议里公布。
3.借贷池合约
在借贷池中实现的功能允许用户与储备金进行交互。所有的行为依照下面的流程:
3.1存
存款是最简单的一个,不需要检查状态,流程如下:
3.2赎回
赎回操作允许用户交换一定数量的aTokens作为潜在资产,实际可以赎回的数量通过aTokens/进行计算,
是潜在交换率,并将在3.8中介绍。赎回流程如下:
3.3借贷
借贷功能将转账给用户一笔资产,同时质押的抵押物将被锁定。流程如下:
3.4偿付
偿付功能允许用户偿还全部或者部分借款,同时会加上利息和手续费,流程如下:
3.5交换费率
交换费率功能允许用户将一笔正在处理中的借款利率在稳定利率和浮动利率间切换。流程如下:
3.6清盘叫价
清盘叫价允许外部的执行人员以折扣价格购买抵押物,在清算事件发生时,最高50%的借款可以被清算,这样可以让健康因子重新回到1以上。流程为:
3.7闪电贷
闪电贷允许用户从备用金中通过一次交易完成借款,只要用户还款时归还更多的流动性。
闪电贷根据IFlashLoanEnabledContract.sol会临时的将基金转账到一个智能合约。这个合约的地址是行动的一个参数。转账结束后,executeOperation方法在外部合约中执行。这个合约可以对这笔借款基金执行任何必要的行为。在executeOperation()方法完成后,将会执行一项检查,确认借款和手续费被归还到借贷池中。手续费会被增加到储备金中,储备金的状态也会更新。如果归还的金额少于借款金额,交易会被退回。
3.8代币化
AAVE协议实现了代币化的方法给流动性提供者。当存款时,存款人将会根据存款的价值1:1的得到一笔aTokens。这个aTokens的余额会基于存款利率,根据时间增长。aTokens是一个完整的ERC20代币。
aTokens自身实现了利率重新定位。根据利率累计的利息会从本金中区分出来。一旦有一笔aTokens余额,累计的利息可以被重新定位到任何地址,可以方便的把本金和利息区分出来。我们称持续累计的利息为利息流。
为了实现上述代币化的策略,AAVE在aTokens的协议中引入了下面的概念:
- 用户x 账户索引
:上一次用户操作后备用金收入金额
- 基础账户
:在ERC20 aTokens合约中存储的余额。每一次用户在aTokens合约中执行操作后,基础账户会被更新(存、赎回、转账、清算、利息重定位)。
- 重新定向地址
:当用户决定将利息流放入一个新的地址,一个新的
将会被创建。如果没有重新定向,
。
- 重新定向账户
:当用户重新定向了利息流,重新定向的利息余额将被增加到重新定向账户
中。定义如下:
当用户
赎回或者转账aTokens到不属于x的地址时,重新定向的余额会减少
- 当前账户
:这个值是aTokens合约中balanceOf()函数的返回值,定义如下:
3.8.1.代币化模型的限制
上述代币化模型在日常使用中有很多优点,但是也有一些局限:
- 不可能一次将整个余额完成转账:一个一直不断持续累计的利息的账户,无法获得确切可以转账的总金额,甚至在确认交易的过程中,利息也在不断累计。这意味着转账后账户余额变为0是不可能发生的。会有一笔很小的金额留在账户当中。我们可以增加某些特定的逻辑,来实现这种极端情况。但是这就不是标准的ERC20的转账函数了,也正因为如此,我们避免了这个额外的功能。
-
如果有一个基础账户,利息流才能被重新定向:这意味着只有基础余额账户
才能重新定向利息流。如果用户赎回或者转账了所有资产,他们的利息定向会被重置。这样的副作用是只由定向过的账户
产生的利息,不能被重新定向。
4.稳定率理论
接下来的一章将会介绍系统是如何保证稳定利率的,以及相应的缺点。
在资金池上建立一个固定利率的功能已经实现了。确实,固定利率非常难用算法来实现,随着市场环境和流动性的变化,借款的成本也随时变动。也许实现一个固定借款利率的环境需要有些特定的基于时间或者经济约束的有启发性的方法。下面我们来讨论两种可能的固定利率:
- 严格时间约束:时间约束也许能让固定利率完美工作。如果一个借款有固定的借款期限,那借款就能在极端的市场环境中生存,因为借款人必须在借款期限的最后归还借款。不幸的是,时间约束的固定利率在我们的用例下并不适用。他需要特定程度的UX阻力(?),让用户来进行多笔不同时间约束的借款。
- 严格利率约束:如果利率在借款开始的时候被计算,可能后续会受市场影响而无法保持稳定。如果利率变化太大。它可以被再次调整。这不是一个单纯的固定利率,开放协议借款--因为在借款期间利率可能变动--这样,用户将会在一个时间期限内体验到一个真正固定利率,或者当有足够流动性的时候。这个实现已经被集成到了AAVE协议中,在stale rate这个名下。
4.1.借贷率预言
4.2.当前稳定借贷率
4.3.稳定率位置的限制
4.4.稳定率平衡
4.5.流程再平衡
5.结论
AAVE协议基于借贷池模型来提供流动性。借款由抵押物背书,表示为aTokens,不同种类的代币都可以计息。系统参数诸如利率、LTV是按代币来设定的。
AAVE提升Defi当前提供的服务,主要有两个关键的进步在借贷经济体系中:
- 稳定利率帮助借款者进行财务规划
- 闪电贷单笔交易中的无抵押物借贷
在主网上线后,AAVE会遵守诺言,增加功能。PoolFactory允许任何人创建他们自己的借贷池。治理也会上链,并按照如下规则进行代表:
- LEND代币在协议层面更新智能合约
- aTokens在借贷池层面修改具体参数