Compound 是一个以太坊上的货币市场,一个任何用户、机构和 dApps 都可以使用的链上账本。它提供了存币和借币的功能,就像一个银行,用户可以存币获的利息收益,或进行抵押借币。在实现原理上,Compound 的帐本模型也与银行类似,并遵循了国际会计准则。
目前区块链上没有负债和信用的概念,需要超额抵押资产才能完成借贷行为。例如想要借出价值 100 美元的资产 B,则需要抵押价值 150 美元的资产 A。
要了解 Compound 实现原理参看第一部分“Compound 分解“,如果完全不了解 Compound,请参看第二部分“Compound 白皮书整理”;其他资料参看第三部分“参考“;Compound 使用教程链接 小课堂 | 使用 imToken 体验去中心化「余额宝」。
一、Compound 分解
实时结算的帐本
Compound 是一个使用智能合约实现的实时结算帐本。帐本能实时结算的前提是交易逐笔发生,有确定的执行顺序,交易发生时间真实可靠等。区块链满足这些特性,为帐本自动结算提供基础。
在 Compound 上,当一个交易发生时账本会对账目进行一次结算,此时结算利息会更新到账目余额中。等到下次交易事件发生时,会再次触发这样的结算处理并更新余额。
利率模型
一个银行的简单模型就是通过借款产生营收,营收作为存款用户的利息。简化 Compound 的利率模型,不设定浮动的借款利率,不考虑盈利,只保证账目借贷平衡,有:
借款营收 = 存款利息
其中:
借款营收 = 借款总额 * 借款利率 * 时间
存款利息 = 存款总额 * 存款利率 * 时间
=>
借款总额 * 借款利率 * 时间 = 存款总额 * 存款利率 * 时间
=>
借款总额 * 借款利率 = 存款总额 * 存款利率
根据公式有:
- 借款总额为零(没有人进行借款),此时没有营收产生,存款利率为零
- 借款总额增大,产生营收增多,存款利率也会提高
- 借款总额不变(营收不变),存款总额增大,存款利率降低
结论:利率随着借款总额和存款总额的变动而变动。
帐本的变化
定义交易事件为:存款、提现、借款、还款。
如果没有任何交易事件发生,存款总额、借款总额就不会发生变化,利率在这个段时间里也会一直保持不变。随着交易事件的产生,存款/借款总额会发生变化,这会引起利率发生改变。
假定借款利率是 0.05,下面状态图中圆圈代表帐本和利率的状态,箭头代表事件:
图中 a 状态无借款,无营收,存款利率为 0。事件 1.借50
发生,根据公式,可得新的存款利率为 0.025。
存款利率 =(借款总额 * 借款利率)/ 存款总额
= (50 * 0.05)/ 100 = 0.025
事件 2、3 导致的帐本状态也可以根据公式计算。
结论:交易事件引起利率变化。
营收和时间的关系
上节的状态变化并没有包含结算环节。随着时间的推移,会有营收(利息)产生。
对于存款:
新的存款总额 = 存款总额 +(存款总额 * 存款利率 * 时间)
对于贷款:
新的贷款总额 = 贷款总额 +(贷款总额 * 贷款利率 * 时间)
假设借款利率 5% 为日利率(明显是高利贷,但便于计算),叠加时间后进行结算的状态图如下:
黄色箭头代表上一状态的持续时间,当事件发生后,状态更新并进入下一个时间段。
可以看出,考虑营收和时间的关系后,利率的变化变得更加复杂,但计算过程仍然清晰。
状态 a 持续了 1 天,由于借款为 0,存款利率为 0,发生事件 1 进行结算后存款没有产生变化,事件 1 增加了借款总额。重新计算利率可以得到新的存款利率 0.025。
事件 2 触发,状态 b 持续了 2 天,在进行结算时,可以推算出新的存款和借款总额:
## 结算
新的存款总额 = 100 +(100 * 0.025 * 2)= 105
新的借款总额 = 50 +(50 * 0.05 * 2) = 55
结算后,存款总额再增加事件 2 存入的 50,结果为 105 + 50 = 155
。根据存款总额 155 和借款总额 55 计算出新的存款利率为 0.01774。
事件 3 触发,状态 c 持续了 1 天:
## 结算
新的存款总额 = 155 +(155 * 0.01774 * 1) = 157.75
新的借款总额 = 55 + (55 * 0.05 * 1) = 57.75
由于还款为 20,此时借款总额是 57.75 - 20 = 37.75
。重新计算出存款利率为 0.012。
结论:交易事件发生时进行结算,结算结束后按事件调整余额并引起利率变化。
每一笔明细帐
上述过程已经具有一定的复杂性,但由事件触发状态变化这个过程是很明确的。在实际生产中,存款和借款总额并不是由一个单一账户产生的,而是由无数的小账目汇聚而成的。比如 Alice 存入 50,Bob 存入了 30,存款总额是 80。这里就产生了更多问题,由于 Alice 和 Bob 的存款时间不同,它们的利率也不一样。借款也与之类似。因此每一笔帐都要单独进行结算,它们的利率根据总帐额度的变化而变化。
我们把状态 a 的存款总额 100 归为其他存款。在 2 天后,Alice 存入 50,结算后其他存款更新为 105。Alice 的存款增加了存款总额,使总额增长到 155,最终存款利率计算为 0.01774。
1 天后,Bob 也存入 50,此时 Alice 存款和其他存款以 0.01774 利率进行结算。结算结果如状态 c 所示。
通过上述分析,可以发现每次事件产生,需要对每一笔明细帐进行结算。这样随着存款/借款的用户增多,账目会越来越多,每次结算的计算量也会越来越大。不过细心观察可以发现,只要记录了历史利率,事件发生不需要对所有账户结算。我们直接根据各明细帐的初始的状态计算图中状态 c:
其他存款 = 100 +(100 * 0.025 * 2)+((100 +(100 * 0.025 * 2))* 0.01774 * 1)
Alice存款 = 50 + (50 * 0.01774 * 1)
Bob存款 = 50
其中 100 是其他存款的初始额度,50 是 Alice存款的初始额度。0.025 是第一期利率,0.01774 是第二期利率。可以看出,只要有历史利率就可以通过迭代运算计算出每个明细账户的当前余额。所以在进行结算操作时只需要对事件操作的明细帐进行结算,其他账户可以暂时不用结算,直到它们被操作时再计算即可。
结论:每次结算只需要计算余额受影响的明细帐,并更新总帐。其他账目可以等到被操作时再进行计算。
总结
我们讨论了 Compound 的帐本原理,没有对 Compound 的抵押、价格预言机和“坏账”清算进行详细讨论。不过有了账本模型,其他部分也很容易。所谓 A 资产的抵押,实际上是将 A 资产存入智能合约,此时就可以借出 B、C、D…的资产(A 是超额抵押,借出价值必须低于 A 的价值)。价格预言机会时时更新 A、B、C、D…资产的价格,在抵押资产价值降低,达到一个风险阀值时(仍然没有低于借出资产的价值),将 A “拍卖”,此时拍卖价格比市场价格更加优惠,自动偿还了借出资产。
以上模型可以完全移植到区块链中,当我们对智能合约发起一笔交易事件就会触发结算处理,并更新利率。这些过程完全自动化。
Compound 的本质是将一套传统的会计模型复制到区块链中,使会计账本能进行实时结算。得益于此,存款/借款所需要签署的法律文件和手续,都被隐式的囊括在智能合约中。人们无需再进行任何协商,只需要轻点几下就可以使用该项服务。同时,它被部署在去中化的网络上,成为没有地域性、自由开放的合约协议。只要遵循了合约的规则,任何人、任何机构都能无区别的使用这项低摩擦的金融服务。
不过,在区块链上或许并不需要使用传统会计模型处理账务,我们有更多可行方案和更简洁的数学模型实现像 Compound 一样的金融服务。毋庸置疑,这些“未来”的金融服务会快速发展,构筑一个新世纪。
二、Compound 白皮书整理
基础特性
- 资金池
- 基于供需法则,由算法生成利率
- 浮动利率,无需协商
- 完全透明的代币余额信息,记录所有历史利率
存币
- 汇聚用户的代币
- 实时提现
- 利息实时支付
用例
- 用户进行存款,低风险获得利息收入
- dApp 应用程序、机构和交易所的代币增值
借币
- 需要超额抵押
- 无期限限制
风险控制
- 借出代币价值超过安全抵押率时,抵押会优于市场利率进行清算,鼓励套利者进行套利,降低风险
用例
- 快速借 utility token 进行使用。随时可借,无需等待(exchange 需要等待吃单)。
- 用户抵押持有的组合资产(多种代币)借出 ETH,进行 ICO 等投资。
- 做空
账务系统
现金 + 借款 = 存款 + 抵押资产
遵循国际会计准则:
事件 | 借 | 贷 |
---|---|---|
存入代币 | 现金 | 供给 |
提取代币 | 供给 | 现金 |
借出代币 | 借款 | 现金 |
偿还代币 | 现金 | 借款 |
清算(借款人) | 供给(抵押) | 借款(资产) |
清算(清算人) | 现金(资产) | 供给(抵押) |
利率增长(供给) | 抵押净值 | 供给 |
利率增长(贷) | 借款 | 抵押净值 |
利率模型
U = 借款 /( 现金 + 借款 )
借款利率 = 10% + U * 30%
存款利率 = 借款利率 * U *( 1 - S )