Compound 中文白皮书
Compund:货币市场协议
版本 0.4
2018 年 6 月
作者
Robert Leshner, Geoffrey Hayes https://compound.finance
译者
七哥( https://yushuangqi.com) 译于2020年05月29日
摘要
本文介绍一种去中心化协议,该协议创建基于货币供求,通过算法设置利率的货币市场。允许用户零阻力地交易以太坊资产的时间价值(the time value of assets)。
加密货币市场和数字区块链资产已发展成为一个充满活力的投资者、投机者和交易者的生态系统,交易数千 [1] 区块链资产。不幸的是,金融市场的复杂性并没有遵循:参与者几乎没有能力交易资产的时间价值。
利率填补了他们无法使用的剩余资产和没有资产的人(具有生成性或投资用途)之间的差距;交易资产的时间价值使双方受益,且创造非零和财富。对于区块链资产,今天存在两个主要缺陷:
去中心化交易所(包括 Bitfinex,Poloniex......)允许客户交易区块链资产,以保证金为基础,在交易所内建“借贷市场”。这些是基于信任的系统(你必须相信交易所不会被黑客攻击,不会带着你的资产跑路,也不会错误地平仓你的持仓),它仅限于某些客户群,并且仅限于少数(最多是主流)资产。最后,余额和持仓是虚拟的,你不能在链上移动持仓。例如,在智能合约或者 ICO 中使用借来的以太币或者代币,使 dApps 无法使用这些设施 dApps [2] 。
点对点协议(包括 ETHLend、Ripio、Lendroid、dYdX......) 促进了市场参与者之间直接进行抵押和非抵押贷款。不幸的是,去中心化将巨大的成本和摩擦强加给用户;在所审查的每一个协议中,贷款人都需要发布、管理、(在抵押贷款情况下)监督贷款报价和活跃贷款,并且还贷往往是缓慢的且异步的(贷款必须要有资金,这需要时间)〔3-6〕。
本文介绍一种去中心化的零阻力以太坊代币借贷平台,摒弃现有方法的缺陷,使适当的货币市场能够正常运行,并创造了一种安全的正收益存储资产的途径。
Compound 是以太坊区块链上的一个协议,它建立了货币市场,是根据代币的供求关系,以算法推导出利率的代币池。资产的供应商(和借款人)直接与协议进行交互,赚取(和支付)浮动利率,无需与同行或者交易对手协商到期、利率或抵押品等条款。
每个货币市场都是 ERC-20 代币(如代币化的以太币,稳定币如 Dai 或实用代币如 Golem)所独有的,且包括一个透明的、可公开监督的资产负债表,记录了所有的交易和历史利率。
与交易所或点对点平台不同的是,一个用户的代币被匹配并借给另一个用户,而 Compound 协议则是将每个用户的供应量聚合在一起;当一个用户供应代币时,它变成了一种可变现的资源。这种方式提供了完整的流动性;用户可以随时提取代币,不需要等待特定的贷款到期。
货币市场中的余额根据该资产特有的供应利率计算利息。用户可以实时查看他们的余额(包括应计利息);当用户进行更新他或她的余额的交易(供应、转移或提取代币),应计利息被转换成本金并支付给用户。
长期投资以太和代币的个人(“HODLers”)可以使用 Compound 货币市场作为额外的投资收益来源。例如,拥有 OmiseGo 的用户可以将他们的代币提供给 Compound 协议,并赚钱利息(以 OmiseGo 计息),而无需管理其资产、满足贷款要求或承担投机风险。
去中心化应用、机器和有代币余额的交易所可以使用 Compound 协议作为货币化和增量回报来源;这有可能为以太坊生态解锁全新的商业模式。
Compound 允许用户使用抵押信贷额度从协议中轻松地借出,可在以太坊生态系统的任何地方使用。与点对点协议不同,从 Compound 借款,只需要指定所需的资产,没有任何条件可谈、到期日或融资期。借款是及时且可预测的。与提供资产类似,每个货币市场都有一个由市场利用决定的浮动利率,该利率决定了每种资产的借款成本。
我们执行的规则是,每个账户的余额必须超过未偿还的借款金额;我们称之为抵押率(collateral ratio), 一个账户可以不采取任何行动(例如,借入或提款),使其价值低于我们的预期比率;为了增加(或重置)抵押率,用户可以随时自由地偿还全部或部分借款资产。即使资产被用作抵押,在 Compound 中持有的余额仍会继续正常计息。
如果用户提所提供的资产价值除以其未偿还借款的价值下降到低于抵押率,则用户的抵押品就变成了可卖(与借款资产一起),价格为当前市场价格减去清算折扣(liquidation discount)。这就鼓励了套利者生态圈快速介入,降低了借款人的风险,消除了协议的风险。
任何拥有借入资产的以太坊地址都可以调用清算功能。用自己的资产换取借款人的全部或者部分抵押物。由于用户、资产和价格都包含在 Compound 协议中,因此清算是零阻力的,不依赖任何外部系统或订单簿。
能够无缝地持有新的资产(无需出售或重新安排投资组合),赋予 dApp 消费者、交易员和开发者新的能力:
Compound 维持一个完整的、可审计的资产负债表和账本,包括所有交易;每个货币市场 $a$有:
$Cash_a$+$borrow_a$=$Supply_a$+$Equity_a$
每笔交易都会使用国际会计准则产生两个会计分录(借方和贷方):
事件 | 借方 | 贷方 |
---|---|---|
供应代币(Supply token) | $Cash$ | $Supply$ |
代币取款 (Withdraw token) | $Supply$ | $Cash$ |
代币借款 (Borrow token) | $Borrows$ | $Cash$ |
偿还借款 (Repay borrow) | $Cash$ | $Borrows$ |
清算(借款人)、清算(调用者)Liquidate(Borrower)、Liquidate(Caller) | $Supply{抵押品}$+$Cash{资产}$ | $Borrows{资产}+Supply{抵押品}$ |
计息(Accrue Interest)(供给) | $Equity$ | $Supply$ |
计息(贷款) | $Borrows$ | $Equity$ |
Compound 协议采用的一种利率模型,在每个货币市场中,根据单个资产的供求关系,实现有效的利率均衡,而不是单个供应商或借款人必须就条款和利率进行谈判。每个货币市场 aaa 的利用率 UUU将供应关系统一为一个变量:
$U_a=Borrows_a/(Cash_a+Borrows_a)$
$利用率=借出款/货币量=/(现金+借出款)$
遵循经济学理论,利率(货币的“价格”)应该是货币需求的函数,当需求低时,利率应该是低的,反之亦然当需求高时,利率应该是高的。需求曲线是通过治理(总经济师可更新),用利用率函数表示。举例来说,借款利率(Borrowing Interest Rate)可能类似下面的情况:
$Borrowing$ $Interest$ $Rate_a$ $=$ 10 %+$U_a \ast 30 $%
为了使协议具有可持续性,且经受住经济冲击(在同一个货币市场上的供给和借贷),供给方赚钱的利息总额必须小于借款方赚钱的利息产品总额。供给利率(Supply Interest Rate)是借款利率(Borrowing Interest Rate)的函数,并包含一个利差SSS(如 0.10 ),代表协议的经济利润:
$Supply$ $Interest$ $Rate_a$ $= $ $Borrowing$ $Interest $ $Rate_a$ $\ast$ $U_a$ $\ast$ $(1−S) $
在其核心方面, Compound 货币市场是一种账本,它允许以太坊账户供给或借用代币,同时计算利息,是时间的函数。该协议的智能合约将可公开访问,完全免费提供给机器、dApps和人类使用。
一个 MoneyMarket 合约存储了每个账户的当前余额。在其最简单的形式下, MoneyMarket 的作用类似于 ERC-20 代币,持有每个账户资产的余额。MoneyMarket 中的余额随着时间的推移而累积利息,我们在下面描述了一种实现这些余额更新的低 Gas 方法。
当协议的客户端供给或借入资产时,MoneyMarket 合约会更新相应资产的资产负债表分录。此外,我们使用该资产负债表来计算上文 2.4 节中描述的供给与借入代币的当前利率。
Compound 货币市场是由一对现行利率(供给和借款利率)定义的,统一适用于所有用户,随着时间的推移,这对利率会随着供求关系的变化而调整。
每一个利率的历史,对于每个货币市场来说,每次利率的变化都是通过利率指数(Interest Rate Index)来掌握的。每次利率的变化,都是由用户供给、取款、借款、偿还或清算资产所产生。用户余额包括应记利息,简单地说,就是当前指数除以用户余额最后一次核对时的指数之比。
MoneyMarket 中每个账户地址的余额作为 account checkpoint 存储,account checkpoint 是一个 Solidity 元组 *<uint256 balance,uint256 interestIndex>*
,这个元组描述了账户最后一次计息时的余额。当前利率指数也会全局存储。
每次交易发生时,该资产的供给利率和借款利率指数都会被更新为自上一期指数以来的复利,使用期内的利息,以 $r \ast t$计价,按每期利率计算。
$Index{a,n}=Index{a,(n−1)} \ast (1+r \ast t)$
如果用户想借钱,并且在 Compound 中存储有足够的余额,可以在 MoneyMarket 合约上调用 *Borrow(address asset,uint amount)*
这个函数调用检查用户的账户价值,并给予足够的抵押品,就会更新用户的借款余额,将代币划转(*transfer*
)到用户的以太坊地址,并更新货币市场的浮动利率。
借款利息的计算方式与 3.2 章节中的余额计息方式完全相同。借款人有权在任何时候通过调用 repayBorrow(address asset,unit amount)
偿还借款人的本金和应计利息。
如果用户因其抵押物的价值发送变化(如用户拿 ZRX 作为抵押物借入以太,而 ZRX 的价值明显低于清算率),那么用户的账户总价值也会跌破清算率。那么,我们有一个公共函数 liquidateMarketBorrow(address customer, address collateralAsset, address borrowAsset, uint collateralAmount)
以略高于市场价将调用用户的资产转换成借款人的抵押品。
一个价格预言机(Price Oracle)维持每项支持的资产的当前汇率; Compound 协议将资产价值的设定能力委托给一个委员会,由该委员会将前 10 个交易所得价格集中起来。这些汇率用于确定借款能力和抵押品要求,并用于所需计算账户价值等价物的功能。
每个市场(由资产定义)在 Compound 货币市场中可以处于三种状态之一:不支持(unsupported)、支持(supported)或暂停(suspended)。每个市场都将从不支持状态开始,并可以过渡(根据管理员的操作)到支持状态。一旦市场被支持,任何用户都可以按照上述方式从市场中供给或借用资产。
如果因为任何原因,必须关闭市场,管理员有能力将已支持的市场转入到暂停状态。在暂停市场前,Comound 治理委员会将给用户一个重要的准备时间。已暂停的市场不允许用户继续供给或借用资产(尽管用户仍可以提取或平仓借入的头寸)。
如果一个市场被无期限暂停,则必须偿还所有借款;否则,协议将没有足够的现金来偿还所有未偿还的供给方。为此,一旦市场暂停,该资产的所有借款人无论抵押健康状况如何,该资产的所有借款都可以按标准折价清算。
Compound 将从集中控制协议开始(如选择每个资产的利率模型)开始,随着时间的推移,将过渡到社区和利益相关者控制。协议中的如下权限由管理员或治疗委员会控制:
选择一个新管理员的能力,如 DAO 等;
每个市场设定利率模型的能力;
支持、暂停或取消暂停市场的能力;
授权那个实体可以设定价格预言机的能力;
协议中股权(收益)提取能力;
随着时间推移,Compound 希望将这些权利转移到由社区控制的 DAO。DAO 将以以太坊合约的形式出现,通过提案和投票调用上述能力相关的功能。由于管理员(或 DAO)可能会选择一个新的管理员,该 DAO 将有能力根据利益相关者的决定随着时间的推移而演变。
功能 ABI | 动作 |
---|---|
supply(address asset, uint256 amount) | 1.划转 ERC-20 代币到 moneyMarket ;2.更新 msg.sender 的余额;3.更新利率模型; |
withdraw(address asset, uint256 amount) | 1.如果有资金,划转 ERC-20 代币到 msg.sender ; 2.更新利率模型; |
borrow(address asset, uint amount) | 1.检查 msg.sender 抵押品价值;2.如果足额,更新借款余额;3.划转 ERC-20 代币到 msg.sender;4.更新利率模型; |
repayBorrow(address asset, uint amount) | 1.划转 ERC-20 代币到 MoneyMarket;2.减少 msg.sender 的借款余额;3.更新利率模型; |
liquidate(address customer, address collateralAsset, address borrowAsset, uint borrowAmount) | 1.清偿借款人的利息;2.将 ERC-20 代币转入 MoneyMarket ,以偿还借款头寸;3.msg.sender 以折扣价接收借款人的抵押品;4.该功能只能在借款人违反了抵押率时,才能被调用。5.更新利率模型; |
setAssetPrice(address asset, uint256 value) | 设置给定资产价格的价格预言机 ,由指定的预言机地址调用。 |
译者注:此部分为了简化,并未遵循原文书写。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!