Compound V2 逻辑整理

  • nilliol
  • 更新于 2024-07-05 19:52
  • 阅读 726

CompoundV2也和AaveV2很相似,有部分区别,但感觉是很多地方相似的,采用的设计逻辑都是由很多相似的地方的。下面依旧从行为的方面进行介绍。借贷Compound的借贷没有像AaveV2那样有闪电贷、浮动利率借贷、稳定利率借贷那么多种,只有一个浮动利率借贷。和Aave

Compound V2 也和 Aave V2 很相似,有部分区别,但感觉是很多地方相似的,采用的设计逻辑都是由很多相似的地方的。下面依旧从行为的方面进行介绍。

借贷

Compound 的借贷没有像 Aave V2 那样有闪电贷、浮动利率借贷、稳定利率借贷那么多种,只有一个浮动利率借贷。

和 Aave V2 的逻辑整理一样,借贷也从借款、还款、清算三件事情出发。

借款

当一个用户想要从 Compound 中借款时需要进行抵押(这是毫无疑问的),而 Compound 采用的借款策略同样时超额抵押借贷(和 Aave V2 一样),而衡量这个超额比例的就是抵押因子(超额抵押的比例)。借款会有这么一个流程:用户借出一笔钱,开始计算利息,等待用户还款,等待过程中还会检查用户的借款是否可能造成坏账(即是否需要清算)。

我们知道 Aave V2 就是采用的复利的方式计算,而 Compound 也是一样。在 Compound 中是怎么计算个体用户的利息呢?这是通过复利累计指数计算的($FV$ 表示当前累计指数,$PV$表示上次累计指数):

$$ FV = PV * (1+x)^{t} $$

那么合约中是怎么实现的呢?每当用户想借一笔款时,先计算复利累计指数(也算是更新当前复利累计指数),然后记录下来,然后开始计算自己的债务,如果过去没有结果款,那么这个债务大小就是当前借款大小,如果过去有债务,那么就用到了一个公式:$\frac{FV}{PV}$,表示借款的增长(从 PV 时刻开始产生的利息加上借款本金的比例)。这个公式展开后起始就是:$(1+x)^t$,其中 $t = \Delta T$ 表示从借出到当前经过的时间,其中 $x = \overline{R_{borrow}}$ 表示这段 $\Delta T$ 时间的平均利率。通过这个公式(PV 即为上次借款时记录的累计指数,FV 即为当前累计指数)乘上过去债务大小,就得到过去欠款的最新大小。两者(新借款和过去借款)相加,即为总债务。最后更新池子中得债务(为了下次更新池子得利率)。

通过上述,我们就可以理解每次借款了,当我们想知道当前实际欠款大小也是利用上面更新过去债务最新大小的思路。($\frac{FV}{PV} * last_{borrow}$ 后者表示上次 Compound 内部记账的金额大小,如此得到欠款总数)

Compound 的借款采用的抵押物实际上是 ctoken(一种 ERC20 代币,用户存款可以获得对应的ctoken,存 ETH 得 cETH),即用用户的存款作为抵押物进行贷款。

还款

还款在 Compound 中既可以还自己得欠款也可以还他人得欠款(这个就是清算)。我们在借款中知道通过抵押物(ctoken)可以获得标的 token,还钱就通过归还标的 token赎回ctoken。在 Aave V2 中采用了债务token(一种魔改 ERC20)记录用户债务,而 Compound 则是内部记账(变量记录地址欠款额度)得方式。

当用户归回欠款时,先计算复利累计指数(更新归还前得利息情况,和前面一样),然后计算过去债务得最新大小,然后减去还款得到最后得债务大小,并存入(总债务这些得也会更新),最后合约将还款转入资金池中。

清算

前面说了,清算就是帮别人还欠款,但人们不会做慈善一样得帮忙还款,清算者需要获得一定得利益。

首先需要明确的时清算条件。前面借款时有说到抵押因子,将用户存款乘以抵押因子就得到所能借出的贷款上限,随着抵押物的价格波动和贷款的利息所带来的贷款增加,这就可能导致用户借款达到贷款上限,从而到达清算条件。

其次是清算人如何来清算的。需要明白的是对于被清算人(借款人)的债务,单次清算上限为债务 50% ,因为清算人也不一定是恶意不还款(可能是币价波动导致清算这些的)。同时对于清算人所获得的抵押资产(ctoken)也是可选的(如果借款人有多种抵押物),可以选择更加青睐的代币类型的抵押物。清算人清算就是通过购买借款人手中的ctoken(即购买对应的token)来替借款人偿还债务,以此进行清算。

那么清算让借款不再处于坏账风险的原因是什么?直接的理解就是超额抵押借贷中的超额让这笔借贷交易处于清算状态,合约通过清算(自动卖出用户的ctoken)实现欠款的偿还,合约只要卖出的价格超过超额抵押的判断下的价格高,即可让交易不再处于坏账风险中。实际上合约是以接近市场价的价格卖出的。

清算人的收益是什么?前面说合约是以接近市场价的价格卖出的,这个接近就是清算人的收益。这个售出价比市场价低,中间的差价便是清算人的收益。具体的计算如下:

$$ seizeTokens = \frac{Amount{Repay} liquidationIncentive price{Borrowed}} {price_{Collateral} * exchangeRate} $$

分子:清算人帮还欠款数额 清算奖励(合约为1.08 ,这两个相乘,放大清算人付出的金额,让清算人能以低于市场价的价格购买) 借款人借出资产的价格。

分母:抵押物的价格(清算人想要获得的token的价格)* 兑换率(ctoken兑换token的比例)

兑换率的存在主要是因为存款中的存款人的利息收益的计算。

存款

在 Compound 中,存款和 Aave V2 一样,都是根据借款所产生的利息而获得存款利息。有借款产生利息,那么用户存款才会有存款利息收益产生,如果 Compound 中没有人进行借款,那么无论往里面存多少钱都不会有利息。

借款产生的收益会分为两部分:一部分给用户作为存款收益,另外一小部分留给合约,作为资金储备池(防止出现取款的挤兑)。

首先需要明白,在 Compound 中存入token会获得一定数量ctoken,而取出的时候也就是利用ctoken换回token,而利息就是存入和取出时两者兑换比例不同所带来的不同。

存入

用户 Compound 中存入一笔金额为 m 的token代币,此时该类型的token的兑换率为$ER$ (tokenctoken = 1toekn:nctoken),那么用户可以拿到 $\frac{m}{ER}$ 个ctoken

随着 Compound 池子中的资金不断被借出,这个兑换率会不断上升,这会使得后来的用户采用同等量的token得到的ctoken更加少,实现了从时间上区分用户的存入(这样同样量的token,无论是否同一用户,只要时间不同存入获得的ctoken不一样),而无需记录其他的信息。

那么这个兑换率是怎么变动实现单调递增的?首先是兑换率的定义:

$$ ER = \frac{Count{t}}{Count{ct}} $$

其中 $Count_t$ 表示资金池中的token总数(不包含资金储备池)即:$underlyingBalance + totalBorrowBalance - reserve$,最后的减号便是去除储备池的金额。

其中 $Count_{ct}$ 表示发行的ctoken数量。当用户存入 m 的代币,我们可以看到兑换率的变化:

$$ ER = \frac{Crountt + m}{Count{ct} + m \frac{Count_{ct}}{Crount_t }} = \frac{Crountt + m}{Count{ct} (1+ \frac{m }{Crount_t })} = \frac{Crountt + m}{\frac{Count{ct}}{Crount_t} * (Crountt+ m )}
= \frac{Count
{t}}{Count_{ct}} $$

可以看到并不会减小汇率,这至少保证了存款不会导致兑换率下降,而借贷毫无疑问只会使得 $ER$ 不断上升。

取出

现在来看看取出,取出就是存入的反向操作,燃烧ctoken,然后根据兑换率获得token,燃烧 m 个ctoken可以获得 $m * ER$ 个token

下面来看看这个过程对于兑换率的影响(其实就是看会不会让兑换率下降):

$$ ER = \frac{Crount{t} - m * \frac{Count{t}}{Count{ct}} }{Crount{ct} - m}

= \frac{Crount{t} * (1 - \frac{m}{Crount{ct}})}{Crount_{ct} - m}

= \frac{Crount{t} * (Crount{ct}- m)}{Crount{ct} * (Crount{ct}- m)}

= \frac{Count{t}}{Count{ct}} $$

我们可以看到兑换率并没有改变,所以兑换率只会单调递增。

参考文章

剖析DeFi借贷产品之Compound:概述篇

剖析DeFi借贷产品之Compound:合约篇

Compound 中文白皮书

关于借贷的思考 - 以compound为例

https://github.com/Dapp-Learning-DAO/Dapp-Learning/blob/main/README-CN.md(这个真的很好)

  • 原创
  • 学分: 14
  • 分类: DeFi
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
nilliol
nilliol
0xbe3e...29A9
web3 的学习者,寻找实习机会中。 博客地址:https://llwh2333.github.io