假设你有50万DAI,你会选择存入Compound吗?
译者前言:当前DeFi生态的发展非常快速,这不,Coinbase刚 宣布分别在借贷协议Compound和dYdX投入了价值100万美元的稳定币 。那这是否意味着这些协议就是安全的,我们也可以参与投资呢?
当然没有那么简单,下面提到的这位CEO,就被Compound借贷的高利率而吸引,其手中拥有50万DAI,然而在做了详尽的调查后,他还是选择了观望。
这到底是怎么回事呢?
下面就是他所写文章的译文:
你可能听说过Compound,他们在以太坊上建立了 compound.finance ,这允许你对ETH、DAI、USDC和其他一些ERC20代币进行借贷理财,然后赚取利息。
如今,该平台上DAI的出借年化收益为10%,这一利率高得足以让以太坊爱好者回头观望(见下图)。
作为SpankChain的首席执行官,我的工作是管理公司的储备金,其中也包括50万 DAI。以10%的年利息计算,如果我们不把这些DAI放入Compound,那么每月账面上就相当于损失4000美元。这是机会成本, 但要谨记的是,天下没有免费的午餐,所有的投资都具有风险,在Compound上进行理财也不例外 。
上个月,我花了一些时间评估了在Compound上进行理财时具有的几种风险:
- 合约安全风险;
- 单点失败风险;
- 挤兑风险;
- 它的智能合约安全性似乎是有保障的;
- Compound是一个托管系统,如果他们的管理私钥被泄露,所有的借贷池资金都可能消失不见;
- 当你在Compound上进行放贷时,你无法做到随时取款。如果你试图取款,而所有的钱都被锁在未偿还的贷款中,那你的取款交易将会失败;
我希望这些放贷人了解这些风险…source:https://defipulse.com/compound
一、合约安全性
实际上,已经有多家行业内著名的智能合约安全公司审计过Compound的合约。
此外,Compound还为关键漏洞(定义为能够盗取超过1%的资金,或冻结超过10%的资金)提供了高达25万美元的漏洞奖金,据我所知,目前还没有哪家独立安全公司的研究员拿到过这笔奖金。这些合约还持有2000万美元资金超过6个月的时间,持有5000万美元超过2个月,目前合约持有资金已经超过了1亿美元。就我个人而言,合约安全最重要的衡量标准是合约中持有的总资金* 合约持有时间,迄今为止,Compound的表现是值得肯定的。
基于以上因素,我认为Compound的智能合约是安全的。
二、单点故障风险
我本身并不是一名智能合约专业人员,因此我找了 Samczsun 来帮忙,他之前因为在0X合约中发现了一个关键漏洞(尽管0X合约得到了顶级安全公司的多次审计)而出名,然后他拿到了10万美元报酬。
然后,这位专业人士就给出了关于Compound的单点故障风险(我的关注点):
Compound v2有四个不同的管理位置,这被设置为三个不同的地址:
- 每个cToken都有一个管理者(administrator)。目前,所有cToken的管理者都被设置为 0x8B8592E9570E96166336603A1B4BD1E8DB20FA20;
- 每个cToken还有一个审计者(comptroller),当前都设置为0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B. 这个unitroller还有一个管理者,其设置为0x8B8592E9570E96166336603a1b4bd1E8Db20fa20;
- 当前价格oracle都有一个锚定管理(anchor admin)和poster,分别设置为0xF06e41aDD8A7E7A8aD81a07C0ACA291E4573ca50和0x3c6809319201b978D821190Ba03fA19A3523BD96 ;
-
通过从
transferAllowed
返回‘false’值,来防止转移现有的cToken; -
通过从
transferAllowed
返回‘true’值,来转移作为质押品的cToken; -
通过从
mintAllowed
返回‘false’值,来防止生成新的cToken; -
通过从
redeemAllowed
返回‘false’值,来防止赎回现有的cToken; -
通过从
repayBorrowAllowed
返回‘false’值,来防止归还现有的借款; -
通过从
liquidateBorrowAllowed
返回‘false’值,来防止清算借款; -
通过从
seizeAllowed
返回‘true’值,来窃取用户的cToken; -
通过从
borrowAllowed
返回‘false’值,来防止借入基础资产; - 通过从borrowAllowed返回‘true’值,来耗尽所有基础资产 ;
- 将借款利率提高到每个区块0.0005%。
- 替换Unitroller的实现,如果他们可以替换cToken的审计者,这将允许他们执行相同的攻击,但这是对所有使用Unitroller的cToken(100%);
- 更改清算奖励,这将允许攻击者在清算时获取不成比例的token;
- 更改价格oracle,这将允许攻击者为现有的cToken(例如ETH、WBTC等)提供低价,并以此低价进行借款;
- 更改cToken的附带因素,当将其与添加新cToken的能力和更改价格oracle的能力结合起来使用时,攻击者可通过借用他们创建的token来耗尽所有资产;
- 使资产的价格与其真实价值偏离10%;
- 每小时将资产的价格与其存储价值偏离10%;
- 将资产价格设置为任意值;
总结一下samczsun的报告:Compound的协议设计,使得中央管理者可以对其进行修改。重要的合约只指向了一个单独的合约地址,该地址有它们的实现逻辑,管理员有权随意更改这些地址指针。 因为所有的cToken都使用同一个管理者,如果管理者密钥被泄露,那么存放在Compound中的所有资产都会被轻易地耗尽 。
sam在上面还提到了一些更狡猾的攻击方式,但真实情况下,攻击者更可能会选择拿钱走人,而不是追求更复杂的攻击。
OpenZeppelin在他们的Compound 审计摘要 中对此进行了有益的描述:
“然而,在权限掌握在恶意或受损害的管理者手中时,他们能够松冻结市场、审查交易或从系统中窃取所有资产。类似地,在控制价格馈送后,攻击者可以从系统中窃取大部分(如果不是全部)资产。目前,所有活跃市场的管理者是同一个账户。”有趣的是,Trail of Bits团队所审计的报告中没有提到这些。此外,Compound 的FAQ页面也特意淡化了管理员的权限,没有对资金可能耗尽的可能进行提醒:
“Compound Labs公司,该协议的开发团队,目前控制着以太坊地址0x8b8592e9570e96166336603a1b4bd1e8db20fa20, 这是协议管理者。管理者地址有权支持附加资产、升级价格馈送oracle、升级利率模型以及升级协议的风险模型。”需要注意的另一点是,compound当前的托管设置本身并不会使其系统不安全。他们非常积极地在保护管理密钥的安全,并且可能会和a16z领投的托管提供商合作。不过,在我决定是否存入50万 DAI之前,我还是需要再三思考一下。
挤兑风险
下面这条推文来自竞争借贷平台Dharma的首席运营官,是他让我跳进了一个兔子洞,然后想要了解关于Compound的挤兑风险是什么样子的。
引用的推文中提到的使用率是98.62%,这意味着当时放贷人存放的DAI中,有98.62%是借给借款人的。只有1.38%的DAI可用于提款,因此只有一小部分放款人可以在他们愿意的情况下收回DAI。
如果有足够多的DAI放贷人(cDAI持有人)希望同时收回DAI,那么他们的提款可能会耗尽可用的DAI,从而将利用率提高到100%,并阻止任何进一步的提款。试图退出的放贷人,只会看到他们的交易失败,并将被迫等到更多的借款人还清贷款后才能退出。
因为有可能会陷在cDAI当中,人们对此而产生担心,而一旦他们有了担心,就会导致问题的产生 。也就是说,在发生挤兑的情况下,一群cDAI持有人试图一次全部收回他们的DAI,而这可能仅仅是因为有足够多的cDAI持有人担心这种情况会发生。
陷入cDAI挤兑的放贷人,要么选择等待收到他们的DAI,要么选择出售他们的cDAI,然后换取DAI,由此会产生交易费用,如果很多其他放贷人也在同时出售cDAI,那么可能会出现cDAI价格暴跌。如果放贷人选择等待,并持有cDAI,他们仍然会在这期间产生利息。
Compound是如何解决这个问题的?
Compound团队对这一流动性风险其实是非常坦诚的,他们在白皮书中明确进行了说明:“该协议并不保证流动性,相反,它依赖于利率模型来激励流动性。在资产的极端需求时期,协议的流动性(可提取或借贷的token)将下降;当这种情况发生时,利率上升,刺激供应,然后抑制借贷。”Compound根据cToken特定的“利率合约”确定每个cToken的借款人利率。该合约目前执行cDAI的利率模型,其公式是:
借款人年利息 = 基准利率+ (乘数*利用率)
对于cDAI,其基准利率= 5% ,乘数=15% (数值硬编码到合约当中)。以100%的利用率计算,借款人支付的利息为20%。这意味着,当DAI被最大限度地利用时,借款人只会被激励以20%的利率偿还贷款 ——如果他们认为ETH(用作贷款抵押品)将在一年中上涨20%以上,那他们就没有偿还贷款的动力。这可能会让很多cDAI持有者……长期持有cDAI。Compound 唯一能解决这一问题的工具,就是使用中心管理账户来升级他们的利率模型,这正是6周前当利用率增加到~99%时,他们所做的事情。
综上所述,如果利用率达到最大值,出现流动性危机,挤兑风险暴增时,所有放款人只能希望Compound利用自己的力量来更新和提高借款人的利率,以激励他们偿还贷款,为想要退出的人提供流动性。
总结
像Compound这样的协议,在中心化与去中心化之间游荡,在快速升级的能力和他们必须引入的中心化故障点之间进行了权衡。
我并不责怪Compound选择以一种中心化的方式引导他们的产品(很明显它已经起作用了,否则我就不会写这篇文章了),但我确实希望他们的智能合约能够实现最高的标准,特别是他们应该向用户明确提示风险。
基本上,我们应该鼓励项目方采取与Robert Leshner(Compound首席执行官)相反的做法:
从技术上讲,这可能是正确的,但我们都知道管理者账号可能会因为其他方式而被滥用…
我还没有决定把自己的DAI存入Compound。也许我应该从10万DAI开始?那样的话,我只能选择信任Compound了。