关于借贷的思考 - 以compound为例
如compound的v2版本白皮书所言,借贷的核心业务逻辑其实是发挥出资产的时间价值。如果你有资产,并且闲置,你想将这部分资产借出去收点利息。如果你有项目,急需要资产,你想找人去借一点资产来完成自己的项目,并且愿意支付一定的利息。那么其实最简单的思路就是,我做一个平台,想借钱的人再平台上发布借钱需求,并抵押出自己的其他资产,想放贷的人在平台上发布放贷需求,这样他们自己去相互联系,互相约定还款日期,借贷利率,最后到规定时间按时还款即可。
作为借贷产品,最重要的一点是信任。如果是现实生活中,要把钱借出去产生利息,俗称放贷,这不是一般人能干的活。因为你无法去完全信任你所放贷的对象,如果那个人借了你的钱跑路了怎么办?我无法把钱借给一个我不信任的人,因为风险太高。当然你也可以选择将钱放在银行等大机构,由银行帮你把钱放贷出去,然后你直接从银行拿到稳定的利息。这样做的本质其实是你信任银行这个第三方机构。而区块链的最大的一个优势,即是其账本的不可篡改性,也就是说相对于信任某个人或者某个第三方,我可以选择不信任任何人,而只是验证账本是否不可篡改。而这一点就天然的解决了借贷中最核心的关键点:信任问题。
约定
借贷事实上是发挥出资产的时间价值,也就是一笔债务需要明确的时间,债务金额,以及借贷利率。这样这笔债务就会按照约定好的时间,金额和利率来计算相应的利息以及本金。处于信任问题,互相约定好的时间,金额,利率等必须要记录在区块链上,这样才具有不可篡改性。
这里的问题是,作为平台方,应该是用户直接找用户借钱,放贷呢?还是应该平台方作为中间人,用户找平台借钱,放贷?如果是用户找用户,平台需要针对每一笔交易的需求和供给进行撮合匹配,沟通成本很高;如果是用户找平台,平台管理所有的资金,这样的沟通成本会低。所以compound和aave都选择后者,自己成为第三方,由用户与平台交互。
金额
如果用户与用户直接交互,放贷,很容易出现需求供给不匹配。即如果借钱的人想借的钱比放贷的人能放出来的钱多,导致一些小额放贷的人压根就没办法把钱放出去。但如果都是直接与平台交互,用户放贷直接把钱存到平台上,另一个用户想借钱的时候直接找平台借钱,这样平台就可以起到一个资金池的作用,有资金流入也有资金流出。更有利于需求供给匹配。
但是不是借钱的金额就没有限制了呢?用户是否可以把这个池子里所有的钱全部借走呢?如果池子干了,即资金全部被借走了,此时原先再池子里存钱的人想要马上取钱出来怎么办?会不会发生类似于银行挤兑的情况?所以对于总的借贷金额一定要有限制,不能超过一个比例,要保证资金池不会枯竭,保护平台自己。
利率
借贷利率应该如何设定?对于放贷的用户来讲,我肯定希望利率越高越好,最好是三天翻一番,但是对于借钱的用户来讲,我肯定是希望利率为0,这样我就一直借钱,少还或者不还利息。
这里的借贷利率其实是分为两块,针对放贷的用户,其需要向池子里存钱,它所对应的是存款利率;针对借钱的用户,其需要池子给它转钱,它所对应的是借款利率。
时间
借贷中最核心的一部分即还款日期。这里有两种不同的思路来设计还款日期。第一种模式是借贷之前,我就跟你约定好,这笔钱借给你三个月,三个月之后你必须还款。第二种思路是我把钱借给你,按照一定的利率,如果我想用钱了,我希望你能马上还款,如果你不想再借了,你想提前还款,你也可随时提前还款。
对于市场来讲,肯定是第二种模式更具有灵活性。但是对于平台方而言,应该去如何设计这个产品?因为借贷双方所约定的所有信息都必须保存在区块链上,而区块链上的任何数据修改都需要支付昂贵的Gas费。
最简单的思路肯定是作为平台方,将用户放贷时候的时间,金额,约定的利率写一次到区块链中。等用户取钱的时候,再将之前存在区块链中的数据读出来,按照时间,金额,约定的利率计算出相应的利息,然后连同本金一起支付给用户。针对借款人也是类似。
抵押资产
流动性来源
提供流动性激励
资金池风险
利率计算
如何计算存款利率?
为什么跟贷款利率相关
$存款利率=贷款利率\times 资金利用率$
如何定义资金利用率
资金利用率是针对一个资金池的,不是针对用户的
$资金利用率:Ua=\frac{Borrows}{Cash+Borrows−Reserves}$
如何计算贷款利率?
如何设计利率模型
存钱
总的业务逻辑是:存token mint cToken
汇率应该如何计算:
$汇率=\frac{token的总数}{cToken的总数}$
$token的总数=underlyingBalance+totalBorrowBalance-reserves$
$cToken的总数=cTokenSupply$
$underlyingBalance: 池子中现货token的数量$
$totalBorrowBalance: 池子中总共借出去的token数量,含利息(复利计算)$
$reserves: 池子自己的储备金$
总的业务逻辑与存钱相反,burn cToken 返回 token
检查用户是否有足够的流动性来取钱
如何计算用户资金的流动性?即用户的总抵押品的可抵压价值与用户总债务的价值之差
compound并不认为你存进来100U,就认为你最多可借出100U
$总债务价值=(accountBorrows[A]⋅\frac{Index_B}{Index_A}+redeemAmount)⋅price$
$总抵押品的价值 = cToken⋅exchangeRateB⋅price$
$总抵押品的可抵压价值=总抵押品的价值 \times collateralFactor$
$用户的流动性 = 总抵押品的可抵压价值-总债务价值$
借钱
总的业务逻辑是用户以自己在compound中存钱获取得到的cToken作为抵押品,借到compound资金池中另一种underlying token
检查用户是否有足够的流动性借钱
与上面不同的一点是总债务价值的计算中,不是加要取钱的数量,redeemAmount, 而是加borrowAmount
$总债务价值=(accountBorrows[A]⋅\frac{Index_B}{Index_A}+borrowAmount)⋅price$
$totalBorrows = totalBorrowsPrev + borrowAmount$
当上面的参数更新后,系统的资金利用率会移动
总的业务逻辑是借钱的逆向操作,还钱可以还自己借的债务,也可以还别人借的债务。如果是还自己借的债务,则没有额外的激励;如果是还别人借的债务,就有额外的激励,即清算。所有的债务都是抵押cToken,得到underlying Token。则还钱应该是偿还underlying token,赎回cToken。在compound中,并没有发行债务token,它通过在系统内给用户记账的方式来记录用户的债务情况。
检查用户是否允许还钱
$accountBorrows_C=accountBorrows_B\cdot \frac{Index_c}{Index_B}-repayBorrowAmount$
清算
总的业务逻辑是帮别人还钱,然后拿到赎回的cToken。此刻清算者拿到的cToken数量比偿还等额的自己的债务得到的cToken数量多,多的一部分cToken即是清算者的激励
$seizeTokens = \frac {repayAmount \times price{borrowed}\ /\ price{collateral}} {exchangeRate_{collateral}}\times liquidationIncentive$
如何保护被清算者:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!