【缺陷】技术分析MakerDAO的清算机制缺陷及改进思路

作者:原始大胖鱼
2020 年 3 月 12 日,由于 COVID-2019 的全球爆发,引发了加密货币市场的一系列黑天鹅事件,整个市场全线崩溃。同时,以太坊 ETH 的价格暴跌,MakerDAO 的大量抵押债仓跌破清算门槛,引发了清算程序执行。
根据 MakerDAO 的系统设置,被清算的抵押物相比市场价存在折扣,因此能够吸引清算人参与其中,参与拍卖的清算人持续叫价,起拍价为 0 DAI,最终获胜者至少可以获得 3% 的折扣。而实际情况里,往往抵押物的最终清算价差会大于 3%,清算人的获益会更高。
也就是说,假设一共有市场价值 1500 DAI 的抵押物进行拍卖,对于清算人而言,最差情况下,参与者最高出价到 1455 DAI 就可以拍得这批抵押物(不计算其他费用)。而最好情况下,则有可能以 0 DAI 获得拍卖的抵押物。
只存在于理论里的 0 DAI 拍卖,在昨日实实在在的发生了。
根据媒体报道,由于以太坊网络 gas 费用剧增,导致 MakerDAO 的清算过程完全缺乏竞争,原本应该参与到清算过程中的清算机器人(Keeperbot)因为设置了较低的 gas 值,导致出价受阻,一位清算人(Keeper)在没有竞争者的情况下,以 0 DAI 的出价赢得了拍卖。
笔者在此从 MakerDAO 的合约代码层面,分析 0 DAI 事件的根本原因。
对于 MakerDAO 系统而言,当产生清算时,意味着系统会有潜在的债务损失,因此,为了避免损失,MakerDAO 通过一种拍卖机制来对 CDP 持有者进行抵押物的清算。
在拍卖开始之前,首先要确定的,是被清算的抵押物数量以及相应的债务,这依赖于一个 MarkerDAO 系统中事先预设的分割值 lump。也就是说,待清算抵押债仓 CDP 内的抵押物数量会被分割成为 m 批,
m=?n/lump?+1
对于 ETH-A,在当前的 MakerDAO 合约部署配置文件里,lump 被设置为 50:
 【缺陷】技术分析MakerDAO的清算机制缺陷及改进思路
文章图片
所以实际被清算的数量 lot (lot≤lump) 被计算为
MIN(用户 CDP 抵押物总量 , 50)
在确定了被清算的抵押物数量之后 , 紧接着需要确定这笔抵押物所对应的的债务数量 art。
MakerDAO 的算法是根据 lot 在用户 CDP 中抵押的 ETH-A 总量确定其占比,然后该 CDP 内所有 ETH-A 所对应的总债务的同等占比值即为相应的债务值,在代码里表示为
mul(lot, art) / ink
但是 art 仅是单纯的抵押物与债务的对应值 , 并没有考虑利息,所以 , 如果这部分抵押物被清算,那同样也要归还相应的债务,因此实际这部分抵押物对应的债务为 art * rate;
MakerDAO 的清算罚金机制里,目前罚金的比例被配置为 13%,所以实际要被拍卖的目标金额 tab 为
tab: rmul(mul(art, rate), ilks[ilk].chop)
综上 , 发起一笔抵押物拍卖 (flip.kick) 时,抵押物的数量为 lot, 预期拍卖的目标金额为 tab。
【 【缺陷】技术分析MakerDAO的清算机制缺陷及改进思路】MakerDAO 将抵押物拍卖设计为二阶段拍卖,其中第一阶段是一个「试价」的过程,就是参与者正向加价,直到出价满足 tab。基于此设计,MakerDAO 将拍卖起始价格设置为 0。理想情况下,参与者会衡量清算物 lot 的市场价值,以一个较为合理的价格进行叫价。
 【缺陷】技术分析MakerDAO的清算机制缺陷及改进思路
文章图片
重点来了 , 起拍价为 0 其实是做了一个假设:一定会有足够数量的 Keeper 参与到拍卖中。
很遗憾的是,当以太坊网络剧烈拥堵时,普通 Keeper 在面临的高昂的 gas 费时很可能没有动力参与到拍卖中去。另一方面,善良的 Keeper bot 也很可能因为其在 gas 升高时没有及时调整 gas 上限 , 竞拍交易迟迟不被确认而无法维持拍卖系统的正常运作。


推荐阅读