Aave协议
Aave协议
Aave是基于以太坊上的加密资产抵押借贷协议,也是区块链学习中非常常用的协议。它允许来自全世界的人公开透明的使用安全的借贷功能,享受区块链去中心化金融的服务。本文将精读Aave v2和v3的白皮书,详细解释Aave的核心功能和作用。
Aave v1
现在能查到的比较详细的说明都是v2之后的,因为主要用的也是后边的版本。但是白皮书中只会讲它比上一个版本增加了什么,所以有必要知道Aave的基础,也就是Aave v1的内容。
网上关于v1的介绍也不多,只有一些模棱两可的描述。v1主要创造了闪电贷和资金池的概念。但是这个阶段用户只能借ETH或LEND代币。资金池比较重要,它把p2p的借贷转变为了资金池,也就也就有了流动性和TVL的概念。
向池子中提供流动性的用户可以获得流动性代币 aToken
,随着池子流动性的变化,这些代币会收到利息,会吸引一些流动性提供者;池子中代币数量的平衡与否也造成了交易中选择池子、增大TVL、减小AMM影响等的一系列问题。
这里重点说一下 aToken
,因为在v2中对这部分做了升级。用户把ETH(举例,不一定非要是ETH)存入流动性池后会获得等量aETH
。它会随着利息增长而增加余额,基于余额增值:由于aToken
都是ERC20代币,所以一枚aToken
的值和性质不会改变,是一种非可升级利息收益代币,现实中的法币也是这样,银行卡里的钱可能会因为利息增长,但一块钱的价值并不会因此改变。
Aave v2
到了v2,有三个重要变化:
aToken
变为可升级token
- 债务token
- flash loan V2
下面按白皮书对这三个升级做详细解释:
aToken
首先,它支持了EIP-2612号提案,也就是用户可以通过签名授权代币转账,而无需先调用 approve
,可以做到离线授权。关于离线授权之前的文章里有说。
另外,白皮书提到v2可能去掉了利率重定向(将存款的利息收益转移到另一个地址,而不改变存款的所有权),因为可升级的aToken
显然是更优的收益管理策略。
关于aToken以及流动性的一些概念和计算方法也要在这说明,但这些其实是继承v1的内容:
当前流动性率(the current liquidity rate)
用
其中资金利用率
累计流动性指数(cumulated liquidity index)
用
它直观表示了1个单位的资产随着贷款利率随时间变化,该资产的价值如何增长。
储备金正常化收入(reserve normalized income)
用
比例余额(ScB)
这个概念其实是用来算 aToken余
额的。在v1中,有用户指数的概念:它存着用户拥有的流动性指数。aToken
的余额可以这样算:
其中,
注意,储备金正常化收入中的收入其实是对资金池说的,对用户来讲这个收入越多留给自己的aToken
反而越少,这件事也被反映在了公式里。可以看出只要涉及到用户资产的,
到了v2,Aave放弃了上述算法,转而使用ScB。任何时刻,用户手上的aToken
的数量为:
这就很直观了,用户的余额和储备金正常化收入挂钩,看起来与上边不同,这里用户和池子变成了利益共同体,但是这并不意味着
存款时
这是因为由于你的存款,让池子的流动性更好了,那你理应获得一部分额外的ScB。额外的ScB算法也很直观,就是存款数
看一个来自learnBlockChain的例子:
初始时刻t=0,用户还没有向Aave中存钱,
t=1时,用户存入m个token,按公式aToken
余额是:
t=2时,用户啥也没干,但是池子的储备金涨了,所以用户的余额也会涨:
当然,储备金要是跌了就是另一回事。
t=3时,用户又往里存了n个token,套用公式,
就能根据上一状态算出余额。
债务token
这块就是说你欠多少债就给你发多少债务token。注意,债务token不是nft,它仍然是ERC20代币。一个池子里债务token供给变化率永远是所有用户再此时刻t的ScB之和:
这个值也是利率的增速。这表示:ScB总和高就说明池子里的钱被借出去的多,那自然发出去的债务token就会多。
某一种资产在时刻t对应的总的债务为:稳定贷款利率在此时刻t的总供给与可变贷款利率在时刻t的总供给之和:
其实就是稳定利率和可变利率供给的和。
债务token比较巧妙,它不允许转账:
function transfer(address recipient, uint256 amount)
public
virtual
override
returns (bool) {
recipient;
amount;
revert('TRANSFER_NOT_SUPPORTED');
}
否则先借了钱再把债务token转到黑洞地址岂不无敌了。
这里也细说一下刚才提到的两种债务:
可变债务
累计可变债务借贷利率指数
用户累计可变利率指数
用户总借贷金额
均化累计可变贷款
这个公式和上边一模一样,但其实它反映的是平均、平滑的过程,之后在算总利率时用的都是
债务Token的数量跟aToken
的逻辑类似,也是会变化的,甚至变化的方式也都差不多,在用户借钱时:
因子会比之前多一项,这一项的意思和aToken
里其实是一样的:用用户的贷款量比总贷款量,反映你借的款对整体的“贡献”。但是它并不直接等于借款占总量的比例。
还钱时也是一样,只是把加变成减:
可以看出,如果要把这一项变成0,用户总共需要还
这么多钱,这也是用户债务总量的计算方法。
稳定利率债务
总的稳定平均贷款利率是
其中
此时如果用户以
当然这个公式是没还完的情况,如果一次把
到这里可以看出,Aave中稳定利率并非表示利率不会改变,而是它与流动性池的总借贷利率无关。
Flash loan v2
简化流程
v1的闪电贷把钱转账给用户之前,Aave会对闪电贷的货币余额进行一次快照,闪电贷结束后,检查闪电贷货币余额是否大于等于之前的快照加上闪电贷的利息。如果不满足条件,revert。
在v2中,转账前没有操作,直接转。闪电贷结束时,Aave从用户账户中拉取借贷金额和手续费,如果拉取失败,则闪电贷失败。它不需要snapshot,也就不需要防重入检查。
抵押品交易
v2提供了一种交换存入资产的方法,这两种资产无需用作抵押。它基于v2的闪电贷实现:
用户首先调用 flashloan()
,传入接收合约地址、要交换的资产及其数量列表、最大滑点和其他必要参数。接收合约会用收到的资金在DEX兑换目标资产,代表用户把这些兑换后的资产再次存入Aave协议,最后从用户账户里转走对应数量的资金来还闪电贷。
以抵押物还款
此功能允许将一个或多个资产作为抵押品存入协议的用户使用它们(抵押品)来偿还部分或全部债务头寸。
用户还是调 flashloan()
,向接收合约传用于还债的抵押品和价值表,还有需要偿还的资产及价格表,还需要传一个额外的表,表示每个债务资产的借款模式(稳定或可变)。接收方合约将期望收到需要偿还的金额的确切金额。其实这个和上边是一样的,合约会先把抵押品在DEX兑成债务资产。
信贷委托
用户可以将它在Aave中deposit得到的信用额度转移给其他账户,而其他账户可以拿着得到的信用额度来进行贷款等。
它其实相当于代理,具体的流程如下:

① 有大量资金的存款人存入10000USDT作为抵押,以此获得大量的信用额度;
② 存款人用创建一个信贷委托金库CDV,旁边的3%是能产生3%利率的信用额度(我个人这样理解)。
③ 如果有人想借钱,就创建一个借贷协议,并让借款人签署。注意,这里的利率一定是要大于3%的,否则存款人赚不到钱,这里假设它是8%,也就是借款人无抵押地以8%的利率借了7500USDT的额度,也基本上就相当于获得了7500USDT。
④ 金库发送额度;
⑤ 把借款人的钱包加入CDV的名单。
最后,由于存款人用一部分额度来开CDV,所以它在Aave获得的利率变成了5% - 3% = 2%
,但是他自己颁发的无抵押借贷协议的利率高达8%,所以它总共获得近8%的利率,比初始的5%要高很多。
Aave只允许超额抵押,这对普通人是及其不友好的,我有钱抵押干嘛还要借钱?但有了信贷委托后就允许无抵押贷款,同时也让存款人有机会拿到更高的利率。
Gas优化
这部分暂且略过,它完全是内部实现,知不知道原理用起来都是一样。
Aave v3
和上边一样,这部分我直接从白皮书中《Aave v3 Overview》这一节开始写。v3相对v2主要进行了资本效率和风险管理类的改进。对于书中提到的Current solutions,如果涉及到对比我会直接在对应改进处注明。
传送门
允许用户在不同区块链网络上的各种V3部署之间无缝移动资产。这意味着用户提供的流动性可以从一个网络转移到另一个网络,只需在源网络(例如以太坊)上燃烧aToken
,同时在目标网络(例如Polygon)上铸造它们。Aave协议V3允许经过批准的网桥在源网络上烧掉aToken
,同时在目标网络上立即铸造aToken
。然后,可以将基础资产以延迟的方式提供给目标网络上的Aave,方法是在资产通过桥接器移动后将其传递到池中。
为了实现上述目标,协议需要两个额外功能:
1、铸造无担保的 aTokens
,为无担保的 aTokens
提供担保:
在跨链传输过程中,目标链上的 aTokens
必须能够立即提供给用户,而不必等待源链上的资产完全锁定或桥接完成。这意味着目标链上的 aTokens
可能会暂时处于无担保状态,直到实际资产流入。因此,协议需要允许铸造无担保的 aTokens
,以提高跨链转账的效率。由于无担保的 aTokens
本质上是“预支”给用户的,必须有机制来确保它们最终能够得到资产的支持。
2、对希望使用这些功能的合同实施白名单机制:
允许任何合约随意铸造无担保的 aTokens
可能会引发安全风险,如无限增发或滥用。因此,传送门协议需要确保只有受信任的跨链桥或授权合约才能铸造无担保的 aTokens
。
除了这些功能外,还需要对每个储备的无担保金额进行额外的内部核算,以及对利率计算的更新。
对于无担保 aTokens
,还会涉及利率计算问题。当铸造无担保 aTokens
时,相当于增加了供应量,但这些代币在最初阶段并没有被借出(因为它们尚未有真实资产支持)。这会导致供应利用率下降,进而降低借款利率。由于借款利率是流动性提供者收益的来源,供应利用率下降会导致他们赚取的利息减少。换句话说,LP 提供的资金被额外铸造的代币稀释了,导致他们的实际收益降低。
i
这里有个比较简单的理解方式。aToken
正常状态下是要抵押得来的,它是你提供流动性的凭证——日后在计算利息时你持有的aToken
占比越多,拿到的钱就越多。另外,池子里的钱借出去的比例越高,收益也会越多。那这时候如果凭空多出来一堆 aToken
,上边那两个比例肯定都会降低,LP们拿的就少。
为了抵消LP的利息损失,提供担保的实体需要支付一笔费用,这笔费用会累积到流动性指数,这个流动性指数用于计算 LP 的收益,并按这个数补贴。
来看一个使用传送门的例子:
① 用户想要将资金从以太坊 L1 转移到 L2,他把 bridge tx
交易请求提交给经过验证的桥接协议(例如Connext
);
② 交易被广播,并且在以太坊主网(L1)上被矿工打包进区块。一旦交易在 L1 被确认,桥接协议在 L2 目标链上执行以下操作:
③ 在目标链上将无担保的 aToken
铸币到中间合约,中间合约会使用这些 aTokens
进行兑换,将其转换回基础资产(USDC)。此时尽管 aTokens
仍然无担保,用户已经能够在 L2 上收到 USDC。
③ 桥接协议将兑换出的 USDC 发送给用户,使其可以立即使用,而不必等待跨链转账完成。
其中,由于 L1 到 L2 的跨链传输成本较高(例如 gas 费用),桥接协议不会逐个处理交易,而是批量聚合多个桥接请求,在L1上批量收集,一起转到L2后再分发。
E-Mode (高效模式)
在 Aave 的原始设计中,所有资产的抵押价值和借入资产的价值通常都被标准化为某种基础货币(ETH 或 USD),链上无法直接知道哪些抵押品支持哪些借入资产。由于没有资产分类,Aave 只能采用统一的风险参数,这就可能导致用户需要更多抵押品才能借到相同资产(增加资本占用),并且提高了被清算的风险。而E-Mode就是为了解决上述问题。
Aave v3 将所有列出的资产划分到不同的类别,通常同一类别的资产在价格上高度相关,比如stETH
、sETH
、alETH
,用户可以选择特定的 eMode 类别,这样当用户借入该类别的资产时,Aave 允许他们使用更高效的抵押规则。例如用户启用了 BTC eMode,并且用 WBTC 抵押借入 renBTC,Aave 可以允许更高的 LTV,即用户可以用更少的抵押品借入更多资产。
另外,eMode 允许为特定类别的资产使用特定的价格预言机,进一步优化清算逻辑。在默认情况下,不同资产的价格由不同的预言机提供,例如:WBTC/USD 预言机 和 renBTC/USD 预言机,它们更新的时间可能会不同,导致短暂的价格偏差,从而引发不必要的清算。eMode 允许在 BTC eMode 下统一使用 BTC/USD 预言机(其实还是把这两种币看作同一类),确保 WBTC 和 renBTC 的价格更新同步,降低误清算风险。
但是这样做会有一些难点,比如由于链上无法自动分类资产,必须由 Aave 治理手动维护资产分类,决定哪些资产应该归入同一类别,以及是否使用特定预言机。
即使能解决,还会面临一些风险,比如某个资产出现严重问题(例如黑客攻击导致资产贬值),使用相同的价格预言机可能会掩盖该资产的真实价值,从而导致协议内部的资不抵债。

Isolation Mode (隔离模式)
在 Aave v2 及类似的流动性协议中,当一个新资产被添加到 Aave 作为可抵押资产时,存在一个重大风险:新资产的持有者可以使用它作为抵押品,借用整个协议中的所有可用流动性(即任何其他资产),如果新资产价格波动剧烈或出现恶性事件(如黑客攻击、清算困难等),其抵押价值可能骤降,导致坏账。由于上述风险,Aave 需要对新资产进行极其严格的审查,这降低了协议对新资产的兼容性,也降低了借款人的资本效率。隔离模式就是为了解决上述问题。
当某个资产被作为抵押品列入隔离模式时,该资产只能用来借取特定的稳定资产(如 USDC、DAI),不能借取协议中的所有资产,这样可以避免新资产影响整个流动性池,降低系统性风险。
v3还允许治理决定新资产的最大借款规模,每个隔离资产都有一个最大借款上限,表示整个协议最多允许多少资金被借出。比如 TokenX
这种资产被隔离了,即使用户有更多 TokenX
作为抵押品,也最多只能借 1000 万 USDC,超出部分无法借出。
风险管理
这部分之后暂且也先不列。这些内容也几乎不会影响到开发过程中的操作。
Aave v4
v4的白皮书现在还没有出,而且这篇帖子写到这里我发现它已经远超我预想的长度,所以就大概看一下v4中有什么新功能。
统一流动性层
在 v3 及其他去中心化借贷协议中,流动性管理面临一些挑战,不同模式(如 隔离模式、E-Mode)下的资金无法自由流通,导致资金使用效率降低;如果要增加新的借贷功能(如 RWA 模块 或 CDP(抵押债务头寸)),需要对整个协议进行修改,影响清算机制。引入新功能往往需要迁移现有流动性,增加用户操作复杂度,并可能造成市场摩擦。
统一流动性层让不同的借贷功能模块可以共享和调用同一个流动性池,避免流动性碎片化,并提供更强的扩展性(我暂时想不到这玩意要怎么实现来兼容隔离模式的功能)。
模糊利率控制
这部分主要就是采用全自动利率,按流动性溢价等算法调整市场的借款成本。
其它
根据binance的说法,可能还会加入自动化资产下载、自动化资金管理和清算引擎之类的,反正剩下的功能对于一个协议来说其实比较额外了。