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

  • bixia1994
  • 更新于 2021-11-01 10:36
  • 阅读 4782

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

Compound白皮书的思考

借贷的经济学:

如compound的v2版本白皮书所言,借贷的核心业务逻辑其实是发挥出资产的时间价值。如果你有资产,并且闲置,你想将这部分资产借出去收点利息。如果你有项目,急需要资产,你想找人去借一点资产来完成自己的项目,并且愿意支付一定的利息。那么其实最简单的思路就是,我做一个平台,想借钱的人再平台上发布借钱需求,并抵押出自己的其他资产,想放贷的人在平台上发布放贷需求,这样他们自己去相互联系,互相约定还款日期,借贷利率,最后到规定时间按时还款即可。

现实中的借贷

熟人借贷 - P2P

银行借贷 - P2B2P

借贷的核心业务逻辑:

  1. 相互联系
  2. 互相约定
  3. 还款日期
  4. 借贷金额
  5. 偿还利率
  6. 抵押资产
  7. 规定时间按时还款

区块链中的借贷

  1. 信任

作为借贷产品,最重要的一点是信任。如果是现实生活中,要把钱借出去产生利息,俗称放贷,这不是一般人能干的活。因为你无法去完全信任你所放贷的对象,如果那个人借了你的钱跑路了怎么办?我无法把钱借给一个我不信任的人,因为风险太高。当然你也可以选择将钱放在银行等大机构,由银行帮你把钱放贷出去,然后你直接从银行拿到稳定的利息。这样做的本质其实是你信任银行这个第三方机构。而区块链的最大的一个优势,即是其账本的不可篡改性,也就是说相对于信任某个人或者某个第三方,我可以选择不信任任何人,而只是验证账本是否不可篡改。而这一点就天然的解决了借贷中最核心的关键点:信任问题。

  1. 约定

    借贷事实上是发挥出资产的时间价值,也就是一笔债务需要明确的时间,债务金额,以及借贷利率。这样这笔债务就会按照约定好的时间,金额和利率来计算相应的利息以及本金。处于信任问题,互相约定好的时间,金额,利率等必须要记录在区块链上,这样才具有不可篡改性。

    这里的问题是,作为平台方,应该是用户直接找用户借钱,放贷呢?还是应该平台方作为中间人,用户找平台借钱,放贷?如果是用户找用户,平台需要针对每一笔交易的需求和供给进行撮合匹配,沟通成本很高;如果是用户找平台,平台管理所有的资金,这样的沟通成本会低。所以compound和aave都选择后者,自己成为第三方,由用户与平台交互。

    1. 金额

      如果用户与用户直接交互,放贷,很容易出现需求供给不匹配。即如果借钱的人想借的钱比放贷的人能放出来的钱多,导致一些小额放贷的人压根就没办法把钱放出去。但如果都是直接与平台交互,用户放贷直接把钱存到平台上,另一个用户想借钱的时候直接找平台借钱,这样平台就可以起到一个资金池的作用,有资金流入也有资金流出。更有利于需求供给匹配。

      但是不是借钱的金额就没有限制了呢?用户是否可以把这个池子里所有的钱全部借走呢?如果池子干了,即资金全部被借走了,此时原先再池子里存钱的人想要马上取钱出来怎么办?会不会发生类似于银行挤兑的情况?所以对于总的借贷金额一定要有限制,不能超过一个比例,要保证资金池不会枯竭,保护平台自己。

    2. 利率

      借贷利率应该如何设定?对于放贷的用户来讲,我肯定希望利率越高越好,最好是三天翻一番,但是对于借钱的用户来讲,我肯定是希望利率为0,这样我就一直借钱,少还或者不还利息。

      这里的借贷利率其实是分为两块,针对放贷的用户,其需要向池子里存钱,它所对应的是存款利率;针对借钱的用户,其需要池子给它转钱,它所对应的是借款利率。

      1. 固定利率
      2. 浮动利率
    3. 时间

      借贷中最核心的一部分即还款日期。这里有两种不同的思路来设计还款日期。第一种模式是借贷之前,我就跟你约定好,这笔钱借给你三个月,三个月之后你必须还款。第二种思路是我把钱借给你,按照一定的利率,如果我想用钱了,我希望你能马上还款,如果你不想再借了,你想提前还款,你也可随时提前还款。

      对于市场来讲,肯定是第二种模式更具有灵活性。但是对于平台方而言,应该去如何设计这个产品?因为借贷双方所约定的所有信息都必须保存在区块链上,而区块链上的任何数据修改都需要支付昂贵的Gas费。

      最简单的思路肯定是作为平台方,将用户放贷时候的时间,金额,约定的利率写一次到区块链中。等用户取钱的时候,再将之前存在区块链中的数据读出来,按照时间,金额,约定的利率计算出相应的利息,然后连同本金一起支付给用户。针对借款人也是类似。

      1. 定时还款
      2. 随借随还
  2. 按时还款
  3. 抵押资产

    1. 抵押资产价格波动
    2. 清算

模型设计

  1. 流动性来源

    1. 用户存钱
  2. 提供流动性激励

    1. 存款利率
  3. 资金池风险

    1. 防止挤兑
      1. 资金池储备金
        1. 储备金来源: 利息积累的一部分
    2. 为什么资金利用率很重要
    3. 如果资金池中大量资金被人在较低利率按照固定利率借走,会出现什么风险
  4. 利率计算

    1. 如何计算存款利率?

      1. 为什么跟资金利用率相关
      2. 为什么跟贷款利率相关

        $存款利率=贷款利率\times 资金利用率$

      3. 如何定义资金利用率

        资金利用率是针对一个资金池的,不是针对用户的

        $资金利用率:Ua=\frac{Borrows}{Cash+Borrows−Reserves}$

    2. 如何计算贷款利率?

      1. 为什么跟资金利用率相关
      2. 为什么贷款利率是浮动的
      3. 如何设计利率模型 image20211031205920314.png

        1. 坏账清算

业务逻辑梳理 - Compound

  1. 复利累计指数 image20211031201712955.png
  • 用户的债务利息是用户的债务总额,借款时间段,这个时间段的浮动利率的函数
  • 是否需要每一个用户单独保存一个数组记录
  • 为什么要定义复利累计指数?
    • 定义一根随时间变化的指数曲线
    • $\frac{FV}{PV}=(1+x)^t=1+x\times t$​​
    • 不表示任何单独的一个用户,反应资金池的变化情况
    • 借款时间点体现为横轴的$t_1,t_2$​
    • 纵轴y代表资金池中单位金额对应的FV与初始时刻的PV的比例
    • $\frac{y_b}{y_a}=\frac{Index_B}{Index_A}=(1+borrowRate[A]\Delta t)$
    • 1: 代表本金
    • borrowRate[A]: A点时刻的借贷利率
    • $\Delta t$: 从A点到B点的时间段
  • 什么时候需要计算复利累计指数
    • 最好是每一个block都计算一次
    • 如果一个块里没有用户交互,就算了 image20211107211334703.png
  1. 存钱

    总的业务逻辑是:存token mint cToken

    1. 先计算复利累积指数
    2. 把用户转账过来的token存到资金池里
    3. 根据当前时刻的汇率给用户发放cToken
    4. 更新池子的状态:总债务,总流动性,cToken的总供应量
    5. 汇率应该如何计算:

      ​ $汇率=\frac{token的总数}{cToken的总数}$

      $token的总数=underlyingBalance+totalBorrowBalance-reserves$

      $cToken的总数=cTokenSupply$

      $underlyingBalance: 池子中现货token的数量$

      $totalBorrowBalance: 池子中总共借出去的token数量,含利息(复利计算)$

      $reserves: 池子自己的储备金$​

    6. 汇率为什么会单调递增?

image20210810211227573.png

  1. 取钱

总的业务逻辑与存钱相反,burn cToken 返回 token

  1. 先计算复利累计指数
  2. 检查用户是否有足够的流动性来取钱

    1. 如果用户已经贷款了,取钱是否会出现用户资不抵债的情况
    2. 如何计算用户资金的流动性?即用户的总抵押品的可抵压价值与用户总债务的价值之差

      compound并不认为你存进来100U,就认为你最多可借出100U

      $总债务价值=(accountBorrows[A]⋅\frac{Index_B}{Index_A}+redeemAmount)⋅price$

      $总抵押品的价值 = cToken⋅exchangeRateB⋅price$

      $总抵押品的可抵压价值=总抵押品的价值 \times collateralFactor$​

      $用户的流动性 = 总抵押品的可抵压价值-总债务价值$​ image20210811222122455.png

  3. 借钱

    总的业务逻辑是用户以自己在compound中存钱获取得到的cToken作为抵押品,借到compound资金池中另一种underlying token

    1. 先计算复利累计指数
    2. 检查用户是否有足够的流动性借钱

      1. 与上面不同的一点是总债务价值的计算中,不是加要取钱的数量,redeemAmount, 而是加borrowAmount

        $总债务价值=(accountBorrows[A]⋅\frac{Index_B}{Index_A}+borrowAmount)⋅price$

    3. 更新用户的债务总额: $accountBorrows[msg.sender]_B=accountBorrows[msg.sender]_A\cdot \frac{Index_B}{Index_A}+borrowAmount$
    4. 更新资金池的总债务总额:

$totalBorrows = totalBorrowsPrev + borrowAmount$​

当上面的参数更新后,系统的资金利用率会移动

  1. 将token转移给用户

image20210810231949136.png

  1. 还钱

​ 总的业务逻辑是借钱的逆向操作,还钱可以还自己借的债务,也可以还别人借的债务。如果是还自己借的债务,则没有额外的激励;如果是还别人借的债务,就有额外的激励,即清算。所有的债务都是抵押cToken,得到underlying Token。则还钱应该是偿还underlying token,赎回cToken。在compound中,并没有发行债务token,它通过在系统内给用户记账的方式来记录用户的债务情况。

  1. 先计算复利累积指数
  2. 检查用户是否允许还钱

    1. 这里compound只检查了cToken的合法性,不需要检查用户的流动性
    2. 计算当前时刻的新的债务:

$accountBorrows_C=accountBorrows_B\cdot \frac{Index_c}{Index_B}-repayBorrowAmount$

  1. 把underlying token转账到资金池里

image20210811212049418.png

  1. 清算

    总的业务逻辑是帮别人还钱,然后拿到赎回的cToken。此刻清算者拿到的cToken数量比偿还等额的自己的债务得到的cToken数量多,多的一部分cToken即是清算者的激励

    $seizeTokens = \frac {repayAmount \times price{borrowed}\ /\ price{collateral}} {exchangeRate_{collateral}}\times liquidationIncentive$

    如何保护被清算者:

    image20210811234407902.png

点赞 12
收藏 20
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

3 条评论

请先 登录 后评论
bixia1994
bixia1994
0x92Fb...C666
learn to code