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 现实社会中的借贷行为

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

假设该房产价值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

Compound原理相关推荐

  1. MongoDB · 引擎特性 · MongoDB索引原理

    MongoDB · 引擎特性 · MongoDB索引原理 数据库内核月报 原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引? 当你抱怨M ...

  2. 数据库中的索引原理阅读

    数据库中的索引原理阅读: 实际上,您可以把索引理解为一种特殊的目录.微软的SQLSERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclu ...

  3. 【Elasticsearch】Elasticsearch 7.3 的 offheap 原理

    1.概述 转载:Elasticsearch 7.3 的 offheap 原理 一直以来,ES 堆中常驻内存中占据比重最大是 FST,即 tip(terms index) 文件占据的空间,1TB 索引大 ...

  4. Android界面性能优化最全总结、原理剖析

     界面是 Android 应用中直接影响用户体验最关键的部分.如果代码实现得不好,界面容易发生卡顿且导致应用占用大量内存. 我司这类做 ROM 的公司更不一样,预装的应用一定要非常流畅,这样给客户 ...

  5. 洁厕灵的工作原理、使用方法和危害 //2021-1-27

    目录 前言: 正文: 1.洁厕灵的成分和工作原理: deodorant n.除臭剂(而不是消毒剂!!) #①有机酸与无机酸的区别 有机酸价值: 2.使用方法很简单不言而喻,其他用途呢? 3.危害(常识 ...

  6. RTP协议学习大总结从原理到代码

    一.流媒体概念  流媒体包含广义和狭义两种内涵:广义上的流媒体指的是使音频和视频形成稳定和连续的传 输流和回放流的一系列技术.方法和协议的总称,即流媒体技术:狭义上  的流媒体是相对 于传统的下载-回 ...

  7. bytebuddy实现原理分析 源码分析 (三)- advice 详解

    advice详解 八.advice 8.1 AsmVisitorWrapper 8.1.1 ForDeclareFields 8.1.1.1 Entry 8.1.1.2 DispatchingVisi ...

  8. 智能合约升级原理01---起源

    3年前就学习过一遍智能合约升级架构和原理,当时只初步了解到了思路和delegatecall用法,缺少更多的实践知识.现在重点研究BSN-DDC平台上的数藏合约源码,这次代码研读中又遇到了大量的合约升级 ...

  9. Android-skin-support 换肤原理全面解析

    一.背景 公司业务上需要用到换肤.为了不重复造轮子,并且快速实现需求,并且求稳,,于是到Github上找了一个star数比较多的换肤框架-Android-skin-support(一款用心去做的And ...

最新文章

  1. 2016计算机二级java_2016计算机二级JAVA练习题及答案
  2. 机器学习领域最新十篇论文,来自谷歌、Facebook、普林斯顿大学、斯坦福大学等团队的最新研究成果...
  3. kafka同一个gruopid下多个consumer订阅同一个topic,只有一个consumer能消费到数据
  4. 9、MySQL系统变量(查看和修改)
  5. linux面试题-基础题1
  6. Python | 深入浅出字符串
  7. html在表格添加下拉按钮,Bootstrap-table 使用说明--如何在表格td里增加一个按钮
  8. python字符子串_子字符串和子序列(Python),子串,python
  9. 华为手机使用应用沙盒动态修改分辨率参数
  10. 从零入门 Serverless | 函数计算的开发与配置
  11. IPtables终于可以使用了,客户机不可以上网的问题解决了
  12. 利用hashmap的java_利用Java如何实现对HashMap的集合使用
  13. 汽车门店管理系统 php,大型汽车4s店维修管理系统多门店版(源码+数据库+截图)...
  14. 简约大气毕业论文答辩PPT模板
  15. 如何保证战略落地_如何真正让企业战略规划体系落地
  16. [ur_driver-2] process has died
  17. DOSBox+MASM,汇编语言环境搭建
  18. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述
  19. 曲率(Curvature)
  20. 前端学习之理解304过程

热门文章

  1. C#中绘制三维模型的方法——面面拉伸
  2. ZigBee无线点灯示例
  3. IDEA中出现module not specified异常如何jiejue
  4. 计算机技术在口腔医学中的应用研究,计算机技术在口腔医学的运用.docx
  5. 基于vue焕心眼镜商城的设计与实现毕业设计源码091546
  6. 开源软件及国内发展趋势
  7. 智能手环数据研究1——系统响应时延简易评估
  8. gVim编辑器——基本设置、常用命令、代码片段
  9. lingo中@wrap函数的理解
  10. 压力测试Jmeter+badboy