本文作者林榕,Matrixport高级副总裁,借贷及支付线负责人。曾任德意志银行环球市场部副总裁,从事外汇及利率结构衍生品销售交易;任蚂蚁金服高级专家,从事区块链跨境汇款、国际资金支付网络搭建。
近一年多来,去中心化金融(Decentralized Finance, 简称Defi)蓬勃发展。
Defi项目在去中心化的区块链网络上部署合约协议,依照代码规则进行金融业务 —— 每个项目可以看成是一个开放透明的银行。
目前为这每个“银行”工作的大部分只有几名到二三十名员工,“储蓄余额”却飞速增长,3月中最高达10亿美金,即使经历3月份市场历史性的动荡,目前又快速恢复。用户量也从零一路增长到五六万。
这可能对传统金融而言不是大数字,但需要考虑到的是,区块链金融还处于非常早期的阶段 ——在全球60亿人口中,拥有加密货币的估计也就只有2000多万。用户数的增长趋势接近于90年代初互联网。
Defi发展过程中,也受到了严重的安全性考验。我们先简单回顾上半年发生的三次重大攻击事件,探讨去中心化金融待改进的问题,并展望可能为金融带来的变革。这三个项目涉及的都是我们熟悉的借贷业务,都在以太坊(ETH)区块链网络上部署合约。
传统金融里银行给你贷款,一般要不是对你的情况调查一番,确认你的信用评分过关,要不你得提供抵押物。
一月份,Aave正式推出的“闪电贷”服务里,这两项都不需要。
你即使是个破产的人,也可以向比如Aave这样的“银行”借出一大笔资金,之后任意流转使用。银行怎么保证你还款呢?你需要在银行网络系统下一次记账前还钱,否则你借钱这个动作和用这笔钱做的事情,系统就会宣判全部无效 ——是的!反正钱和你的操作都在网络上,就是系统登个记而已。
咱们提到的这些“银行”都用的都是以太坊网络系统,平均15秒左右登记一个区块来记账一系列的交易,这便是一笔15秒左右的贷款
15秒贷款可以做什么呢?
数据显示,很多用户用来套利,或者借出来还款再融资
“闪电贷”这样运行了一段时间,到了2月份的时候,一下子名声大噪,正是因为巧妙的bZx攻击事件。
有人发现bZx杆杠交易协议有漏洞,下单成交前校验最新价格、看看你保证金够不够这一步会被跳过 。在这个情况下,可以用比较少的钱,来拉高资产的价格,便准备了一场攻击。怎么做呢?具体的分析,可以看看这篇《:硬核技术解析,》。
简单来说,他先用另外一个提供闪电贷的项目借了一大笔钱(即ETH,可以说是以太坊网络上的本位货币),一部分去借出囤积了一个规模还不大的资产WBTC,一部分到前面提到这个bZx平台加杠杠买入WBTC,拉高它的市场价格。接着,他趁机把前面囤的WBTC高价卖出,归还闪电贷款,还剩下一笔利润。
这种拉盘的方法,在传统金融里其实也很常见,但是通常要撼动市场,需要有一大笔本金。在这次事件特别的就是(1)攻击者无需动用任何自己的资本 (2)因为bZx的价格校验的bug,拉盘变得容易
也就是说,这个人空手而来,借钱囤货、拉盘哄抬价格、再乘高价卖货还钱。15秒钟内,横跨多个市场,挣走36万美金,然后消失的无影无踪。
MakerDao项目,是经典的“抵押借贷”逻辑。比如你抵押房子,可以按房价打个折借出现金,或者更类似的传统金融工具是回购,质押股票、国债、黄金或铜等大宗商品来借款。
简单来说,在MakerDao中,你可以抵押数字货币比如以太坊ETH,按市场价格打个折,借出来项目自己发行的美元稳定币叫Dai,每一个Dai的价格目标是等于一块钱美金。为了防止抵押物价格下跌太厉害,不够还贷款,规则设定如果ETH市场价格下跌到一定的程度,你没及时追加抵押或者还款,就会失去抵押物,由着系统让别人收走、拍卖,来偿还贷款。
3月12日黑色星期四,ETH价格大跌,部分的订单就进入了抵押物拍卖流程。结果,有400万左右美金的ETH,被按0元拍卖走了。
哪里出问题了呢?
我们只要一句句仔细看看规则的描述,就知道这类产品除了明显的利率、打折率这些之外,安全性上特别需要注意的是三点。
第一是“市场价格” —— 市场价格是如何确定,或者在区块链中被称为“预言机”。 比如规定说以太坊下跌到120美元,你就会失去抵押物,那么是谁来定义以太坊这时候是121美元,还是119呢?MakerDao采用的是多个数据源中位值,通过区块链网络传输价格。但是在大跌行情中,整个网络拥堵,导致市场价格没法及时传输更新。
第二“拍卖” —— 也就是处理抵押物的清算机制。MakerDao对抵押物清算机制出现多个问题:
一是拍卖时,得用的项目自己发的稳定币Dai来买抵押物,但整个市场缺Dai。本来市场流通量就不多,在大跌恐慌下,没有什么人愿意再抵押ETH来铸造新的Dai,而大量的Dai贷款又被归还,导致整个市场Dai流动性枯竭,本来目标是和美金1:1兑换,那时价格涨到了1.12美金。
二是清算采用的在区块链上拍卖机制设计:0元起拍,在以太坊区块链上提交拍卖价格,10分钟没人出更高价你就拍得。而那时候网络拥堵,以太坊上发交易的手续费是正常的10倍以上。支付普通手续费来参加拍卖的用户,价格没法及时的提交成功。
于是有人付了相对高点的手续费,提交成功了0 Dai的竞拍价格,买到了接近400万美金的ETH,整个系统陷入资不抵债的情况。
第三、 “抵押” —— 这个“银行”能否保证你放它那的抵押物的托管安全。MakerDao这次并没出什么问题,但下面我们介绍的,就是对此的攻击事件了。
4月19号,去中心化借贷项目Lendf.me被黑客攻击,取走了存在项目里全部近2500万美金的资产,当然,十分戏剧性地是,后来黑客又把钱全给还了。
怎么做到的呢?
具体的可以参见 《慢雾:解析 DeFi 平台 Lendf.Me 攻击细节及防御建议》。简单来说,这要从lenf.me的记账设计说起。
当你要来这个银行取钱和存钱,你的存折账本登记方法先系统设定好的。 存钱柜台这边,你账户余额计算方式是:(圆圈内数字为举例)
取钱柜台这边,账户余额计算方式是:
但是比如存钱这事,大家觉得最好能够穿插进去一些其他的操作。比如入账前,先去反洗钱中心查一下,这个钱的来源地址是不是哪个抢了银行的劫匪的,得先禁止了。于是lenf.me采用的是网络上一个改进的标准,在兼容原有逻辑基础上,支持了调用外部操作的功能。
这个功能,就被盯上了。
因为黑客调用的操作,是取钱。
让我们来解一道问题:
如果你的账户开始有5块,去存钱柜台存入1块,在存钱进行的过程中,你跑去取钱柜台,取出了2块,最后的余额应该是多少?
结果lenf.me最后登记的还是6
我们知道答案应该是4,但是整个过程中,虽然取钱柜台登记了一下取款动作,可是做最后确认的是存钱柜台这边,它只被告知说计算方式是用你存钱时余额+存入的钱,一看, 5+1 = 6。
存、取钱两个分开的处理方式都没问题,合着调用,而没有防止恶意的逻辑,就出问题了。黑客就利用这个调用,不断的取出这个银行的资产,直到把钱都掏空。
尤其让人非常惋惜的是,黑客的这个手法,我们叫『重入攻击』,以太坊很早之前就发生过。甚至在事件发生的前一天,大家已经看到这个漏洞,并且提醒了团队,可惜并没有得到很好的处理。
顺便提一下,这个可以进行外部调用的改进,是以太坊称之为ERC777的代币标准,和ERC20标准代币的重要区别。 ERC20就是前两年大家一直听到的“ICO”“发币”泡沫潮里大部分的代币采用的标准。它做了个很好的事情:标准化。大家都用同样的标准接口,无论新增加多少种资产,每种资产代表了什么,各种服务提供商钱包、交易所等等接入就变得很简单。
事情的结果,黑客戏剧性的把这笔钱还过来了,还加了一个『better future』的留言。不过,这不是因为什么奇幻的魔术,只是黑客身份被泄露罢了。
本文为作者在第三期Omni-中财数字经济讲坛讲演内容,感谢王泽龙协助文字整理。