Compound原理

1 Compound

1.1 Compound是什么

Compound是DeFi上的借贷市场,这个借贷市场提供了存币和借币的功能,就像一个银行,用户可以存币并获得利息收益,或进行抵押借币。
Compound不是点对点的市场,而是流动性的资金池市场,这种模式让它更接近于传统银行的借贷模式。但与此同时,它的运作是基于智能合约来完成的,这让它具备了更多实时性、不可篡改性以及市场决定利率的特性。
在实现原理上,Compound的帐本模型也与银行类似,并遵循了国际会计准则。

注意:目前区块链上没有负债和信用的概念,需要超额抵押资产才能完成借贷行为。例如想要借出价值100的资产A,则需要抵押价值150元的资产B。

1.2 Compound协议

Compound协议让开发者可以基于以太坊建立各种各样的货币市场(money market)。
所谓的“货币市场”,其实就是一个个的币池,每个币池里只有同一种ERC-20的币,协议通过算法来决定这个池子里的币借贷的利率是多少。简单点说,这个算法会基于人们对这个币借贷的供需关系自动计算出利率。例如在Dai这个货币市场里,目前(2020年12月13日)放贷可以收取的年利率是3.04%,贷款需要付出的年利率则是11.11%,这些利率对每个人都一视同仁,而且每时每刻都可能处于浮动状态。

1.3 不是P2P

不管你是来贷款还是放贷,你都是在跟Compound协议直接打交道。这一点跟那些点对点的借贷协议不太一样。在点对点的方案里,借贷双方会做匹配,然后你需要跟找你借钱的人(或者借你钱的人)进行沟通,双方自己商定好借款的利率、到期时间和抵押物品等等。

而在Compound协议里,每个ERC-20代币都有一个属于自己的借贷市场,里面包含每个用户在这个市场里的余额,以及各笔生效的借贷交易,乃至每段时期的历史利率,等等。

1.4 主要的合约

  • MoneyMarket 合约
    负责主要的借贷逻辑的实现,包括了一系列的操作函数,比如放贷(SUPPLY)、提现(WITHDRAW)、借贷(BORROW)、偿还贷款(REPAY BORROW)、 清算(LIQUIDATE)等等。

  • InterestRateModel 合约
    提供借贷利率的计算模型。

  • PriceOracle 合约
    用来提供各个ERC-20代币的价格信息。比如这个合约可以通过排名前十的交易所得出一个币的当前价格,为其他合约所调用。

最主要的合约是MoneyMarket。在最简单的形式下,一个货币市场的MoneyMarket合约,就相当于一个ERC-20 约,这个合约会维护一张表,里面记录每个用户持有币的数量,也就是余额,余额同时也会随着时间计算利息。

1.5 gas费

Compound引入了一个低gas费的方法来更新合约内的用户余额。每当用户借贷或者放贷的时候,合约会自动更新余额表格里相应资产的条目。此外,Compound还会根据这张记录余额的表格来计算目前借贷和放贷各自的利率应该是多少。

1.6 存币

Compound协议汇总了每个用户的供给,提供了更多的流动性,保持了资金系统的平衡。借款人和放款人在流通数字货币的同时,遵守了相应的约定便可以获取奖励(利息)。交易所可以通过“清算”余额来将Compound协议调整增量或进行回报用户,这有可能为以太坊生态系统解锁全新的业务模型。

1.7 借入资产

Compound允许用户以cTokens作为抵押,毫不费力地从协议中借用,以用于以太坊生态系统中的任何地方。每个货币市场都有由市场力量设定的浮动利率,该利率决定了每种资产的借贷成本。

1.7.1 抵押品价值

协议持有的资产都有一个从 0 到 1 的抵押因子,基础资产的流动性和价值决定了抵押因子的大小。抵押物和乘以抵押因子即等于用户的可借贷数额。

1.7.2 风险与清算

由于加密货币价格的不稳定,那么使用加密资产作为抵押物就是有风险的,因为当抵押物价格下跌时,可能都不够偿还借款的价值(loan value)。如果某个帐户的未偿还借贷价值超过其还贷能力,则可以按当前市场价格减去清算折扣来偿还一部分借贷,以消除协议的风险。若用户的资金出现还款危机时,可能会继续执行清算程序。
任何拥有借入资产的以太坊地址都可调用清算功能,将其资产交换为借方的cToken抵押品。由于这两个用户,资产和价格都包含在Compound协议中,因此清算是毫不费力的执行,并且不依赖任何外部系统或订单。

通常来说,Defi协议为了鼓励及时清算都会向清算人提供奖励,这被称为** 清算奖金(Liquidation Bonus)或Bonus **。协议的目的是确保在价格变化太大之前进行清算,否则可能导致协议破产。值得注意的是,一旦抵押物价格跌至债务价格以下,很明显借款人不会偿还其贷款,这将使该协议无力偿还(insolvency)。

例如,假设今天BAT和REP的价格都是1元,我用1个BAT作为抵押物,从Defi借贷协议借了1个REP。第二天BAT的价格跌到了0.5元,但是REP还是 1美元,如果现在我不还款,那么Defi协议就会损失0.5美元,因为Defi借贷协议会试图卖掉我抵押的BAT来偿还1个REP。

1.7.3 用例

为 DApp 消费者,交易者和开发人员提供了新的超能力:

  • 无需等待订单执行或需要链下行为,DApp 就可以借用 token 在以太坊生态系统中使用 .
  • 交易者可以使用其现有投资组合作为抵押,通过借入以太币为新的 ICO 投资筹集资金 .
  • 希望做空 token 的交易者可以借入它,将其发送到交易所并出售该 token,进而 做空获益 .

1.8 利率模型

Compound协议无需和供应商、借款人、条款、利率进行谈判,而是利用一种利率模型,该模型基于供求关系实现利率均衡。根据经济学理论,利率(货币的“价格”)应随需求而增加;当需求低时,利率应该低,反之亦然。

  • 资金利用率

Ua = Borrowsa / (Casha + Borrowsa)

  • 借款利率:
    需求曲线通过治理进行编码,并表示为利用率的函数。例如,借入利率可能类似于以下内容:

Borrowing Interest Ratea = 10% + Ua * 30%

说明:借款利率受需求影响,借款需求旺盛时,借款利率上升,借款需求疲软时,借款利率下降。这只是一个示意公式,10%、30%并不一定是固定不变的。

  • 存款利率:

Supply Interest Ratea = Borrowing Interest Ratea * Ua * (1 − S)

说明:S类似于存款准备金,以备用户的提现需求。

Compound该协议不保证流动性;相反,它依靠利率模型来激励它。在对资产的极端需求时期,协议的流动性(可用于提取或借出的 token)将下降;发生这种情况时,利率会上升,从而刺激供应并抑制借贷。

1.9 账务

Compound维护了一个包括所有交易的完整可审计的资产负债表和现金分类账:

现金 + 借款 = 存款 + 抵押资产

遵循国际会计准则:

事件
存入代币现金供给
提取代币供给现金
借出代币借款现金
偿还代币现金借款
清算(借款人)供给(抵押)借款(资产)
清算(清算人)现金(资产)供给(抵押)
利率增长(供给)抵押净值供给
利率增长(贷)借款抵押净值

2 借贷行为

Compound本质是一个拥有一定资产的人可以接入另一种资产的市场,和现实社会中的银行借贷非常类似。

2.1 现实社会中的借贷行为

现实社会中,我们向银行申请抵押贷款时,如下所示:
Compound-现实-抵押贷款.png

假设该房产价值10w,银行会按照抵押物一定比率进行放贷,例如80%,那么此时用户可以获得8w的贷款。只要借款人定时向银行还贷并付息,就可以保住房产,如上图所示。不过,如果借款人无法还款付息,银行就会出售房产以回收贷款和利息,额外部分将退回给借款人。

银行的钱来自储户,大量用户存款汇聚起来就形成了资金池,可以进行任何形式的放款,如下图所示:在这里插入图片描述

储户将钱存放到银行,银行需要支付利息,如下图所示:
在这里插入图片描述

在现实社会的抵押贷款中,银行是一个资金池,出借方(储户)和借款方没有进行绑定,这意味着储户任何时候都可以提取资金,当然这里有一个前提:有足够的存款准备金。另外,在当今社会中,利率和流动性储备由国家法规决定。

2.2 Compound中的借贷行为

在Compound的世界中,需求侧使用ERC-20代币来替代资产(如房产),供给侧使用DAI来替代货币,用智能合约替代银行的金库。如下图所示:在这里插入图片描述

说明:

  • 出借人可以将自己持有的ETC、BTC等转换成Dai存入Compound并获取响应的利息,就像我们将钱存入银行获取利息收入一样。
  • 借款人可以将自己持有的ERC-20代币作为抵押物从Compound中贷款;例如抵押价值15W Dai价值的资产从compound中贷款10W Dai。
  • 因为代币价格波动比较快,当用抵押物价值偿还借出的Dai(本金+利息)存在一定风险时,Compound会触发清算,否则可以一直借款。
  • 贷款人偿还本金+利息以后,可以拿回自己的抵押物。
  • 贷款人偿还的本金+利息以储备的形式存放在Compound中。
  • 当出借人尝试提款时,他会得到起原始存款+利息收入,这些利息是储备中累计的;如果不提款,会持续赚取利息。

注意:Dai是稳定币,类似于显示社会中的人民币;cDAI类似于实时的Dai储蓄账户。

3 利率模型

注意:
Compound是根据每个区块时间来计算利息,但是它并不是自动在后台完成计算的,而是依赖于用户行为(例如存款、贷款、清算等)来触发利息计算。触发后,函数将统计自上次利息计算以来过去了多少个块,并在其之上应用最新的利息。句话说,如果不采取任何用户动作,则协议将不会计算利息。
简单来说:Compound是在交易事件(存款、借款、提现、还款)发生时进行结算,并计算利息,本节将给予此进行介绍。注意,这和银行稍有不同。

3.1 利率模型

银行的简单模型就是通过借款产生营收,营收作为存款用户的利息。在不设定浮动的借款利率,不考虑盈利,只保证账目借贷平衡时,简化的利率模型如下所示:

借款营收 = 存款利息
其中:
借款营收 = 借款总额*借款利率*时间
存款利息 = 存款总额*存款利率*时间
得出:
借款总额*借款利率*时间 = 存款总额*存款利率*时间
进一步:
借款总额*借款利率 = 存款总额*存款利率

由此可见:

借款总额为零(没有人进行借款),此时没有营收产生,存款利率为零
借款利率不变时,如果借款总额增大,借款营收会增加;此时若存款总额不变,存款利息会提高。
借款营收不变时:存款总额增大,存款利率降低

结论:

** 利率随着借款总额和存款总额的变动而变动。**

3.2 利率

如果没有任何交易事件(存款、提现、借款、还款)发生,存款总额、借款总额就不会发生变化,利率在这个段时间里也会一直保持不变。但是伴随交易事件的产生,存款、借款总额会发生变化,这会引起利率发生改变。

假设借款利率5%,那么在发生存款、借款、还款等事件时(存款利率变化暂不考虑时间因素),如下所示:在这里插入图片描述

说明:

  • 初始状态下没有借款就没有营收,存款利率=借款营收/存款总额=0/100,所以存款利率=0。
  • 有新增借款后,借款营收=50*5%=2.5,存款利率=借款营收/存款总额=2.5/100,所以存款利率=2.5%。
  • 有新增存款后,借款总额不变所以借款营收不变,存款利率=借款营收/存款总额=2.5/(100+50),所以存款利率=1.67%。
  • 有部分还款后,借款总额变少所以营收变少,存款利率=借款营收/存款总额=(30*5%)/(100+50),所以存款利率=1%。

结论:

** 交易事件(存款、借款、提现、还款)引起利率变化。**

3.3 利率与时间

现实中,借款营收、存款利息与时间紧密相关,由公式可知:

借款营收 = 借款总额*借款利率*时间
存款利息 = 存款总额*存款利率*时间

扩展一下上面的示例,假设月利率5%,叠加时间后,下过如下所示:
在这里插入图片描述

注意:示例中将上一个月的存款利息放入本月的存款总额中,即现实社会中的复利。

注意:这里使用复利计算

将上一个月的存款利息放入本月的存款总额中。
将上一个月的借款利息放入本月的借款总额中。

说明:

初始阶段(持续1个月):

  • 1月期初:存款总额=100,借款总额=0,存款利率=0,借款利率=5%
  • 1月底进行结算:本月没有借款就没有营收,存款利率=借款营收/(存款总额*时间)=0/(100*1),所以存款利率=0。
  • 1月期末:存款总额=100,借款总额=0,存款利率=0,借款利率=5%

第二阶段(持续2个月)

  • 2月期初:存款总额=100,借款总额=50,存款利率=0,借款利率=5%。
  • 3月底进行结算:借款营收=50*5%*2=5,存款总额=100,存款利率=借款营收/(存款总额*时间)=5/(100*2),所以存款利率=2.5%。
  • 3月期末:存款总额=105,借款总额=55,存款利率=2.5%,借款利率=5%。

第三阶段(持续3个月)

  • 4月期初:存款总额=155,借款总额=55,存款利率=2.5%,借款利率=5%。
  • 6月底进行结算:借款总额=55,借款营收=55*5%*3=8.25,存款总额=155+155*2.5%*3=166.63,存款利率=借款营收/(存款总额*时间)=8.25/(166.63*3),所以存款利率=1.65%。
  • 6月期末:存款总额=166.63,借款总额=63.25,存款利率=1.65%,借款利率=5%。

第四阶段(持续1个月)

  • 7月期初:存款总额=166.63,借款总额=43.25,存款利率=1.65%,借款利率=5%。
  • 7月底进行结算:借款营收=43.255%1=2.16,存款总额=166.63+166.631.65%1=169.40, 存款利率=借款营收/(存款总额时间)=2.16/(166.631),所以存款利率=1.30%。
  • 7月期末:存款总额=169.40,借款总额=43.25,存款利率=1.30%,借款利率=5%。

结论:

** 交易事件(存款、借款、提现、还款)发生时进行结算,结算结束后按事件调整余额并引起利率变化。**

3.4 账户明细账

Compound作为一个借贷平台,其存款、借款利率随市场需求变化。这里有一个问题,Compound上有非常多账户,那么每个账户的余额是如何计算出来的呢?
其实只要有历史利率就可以通过迭代运算计算出每个明细账户的当前余额,所以在进行结算操作时只需要对事件操作的明细帐进行结算,其他账户可以暂时不用结算,直到它们被操作时再计算即可,如下图所示:
在这里插入图片描述

结论:

** 当账户发生交易事件(存款、借款、提现、还款)时进行结算,每次只计算此账户的明细帐并更新总帐,其他账目可以等到被操作时再进行计算。**

5 Compound的治理

5.1 COMP

Compound协议只能由COMP代币持有者及其代理升级和配置。 协议的所有潜在更改,包括增加新市场或调整系统参数(如抵押因子或利率算法),都必须通过治理智能合约中指定的提案和投票过程。

COMP是在Compound治理中具有1:1投票权的代币。以太坊钱包中的COMP代币持有人可以使用 COMP治理合约中提供的函数将投票权委托给自己或任何其他以太坊地址。

委托投票权的接收者(称为代理人),无论他们是COMP持有人本身还是其他地址,都可以提案、投票和执行提案以修改协议。你可以在 Compound 治理面板上看到当前的代理列表。

5.2 Compound的治理

详细信息参考Compound Governance,社区治理流如下所示:在这里插入图片描述

5.3 核心概念

  • COMP ERC-20 代币
    用于指定用户的投票权。用户钱包中的COMP余额越多,他们对提案的授权或投票就越重。

  • Delegation 委托
    COMP持有人只有在将投票权委托给某个地址后才能投票或创建提案。一次可以委托给一个地址,可以委托给COMP持有人自己的地址。被委托人的投票数相当于用户账号的COMP代币余额,投票将从当前区块开始进行委托,直到发送者再次委托或者转移其COMP。

  • Proposals 提案
    提案是可执行的代码,可修改协议及其工作方式。为了创建提案,必须至少有所有COMP的1%委托给该地址。现有总计1KW个COMP,因此用户必须将至少10W个COMP委托给其地址。提案存储在Governor智能合约的“proposals”映射中。所有提案的投票期均为3天。如果提案者在整个投票期间未维持其投票权重,则任何人都可以取消该提案。

  • Voting 投票
    用户将投票权委托给其地址后,便可以对单个提案投票赞成或反对。提案处于“有效(Active)”状态时可以进行投票。投票可以使用castVote立即提交,也可以使用castVoteBySig离线签名稍后提交。如果大多数票(达到4%,即40WCOMP)对某个提案投票赞成,则该提案将在时间锁中排队。

  • Timelock 时间锁
    所有治理和其他管理操作都必须在时间锁中停留至少2天,然后才能在协议中实施。每个cToken 合约和Comptroller合约都允许Timelock地址修改。Timelock合约可以修改系统参数、逻辑和合约,以"延迟时间、选择退出"的升级模式进行修改。

6 参考文档

详解 Compound 运作原理
https://learnblockchain.cn/article/1015

初学者的DeFi指南
https://learnblockchain.cn/article/570

Compound工作原理
https://www.chainnode.com/question/457841

使用 Defi 协议之前需要了解的几个概念
https://learnblockchain.cn/article/1181

Compound Governance
https://compound.finance/docs/governance?ref=medium

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值