深度 | 全面解读闪电贷:为什么闪电攻击将成为新常态?
来源: 链闻
撰文: Haseeb Qureshi,加密货币风投机构 Dragonfly Capital 管理合伙人
闪电贷 最近成为外界关注的热点。两名黑客利用闪电贷攻击了 保证金交易协议 bZx ,第一起套利金额为 35 万美元 ,之后又搞了一起 套利金额 60 万美元 的翻版攻击。
如果用一个词来形容这些攻击的话,可以说是「 壮观 」。每次攻击中身无分文的黑客贷到价值数十万美元的 ETH,分散利用一系列链上协议的漏洞进行了一通操作,从所盗窃的资产中提走了 数十万美元 ,并成功堵上巨额 ETH 贷款窟窿。所有这一切在瞬间完成,就是说,在一个以太坊区块中完成。
Carmine Infantino 设计的漫画封面
我们不清楚这些攻击者是谁、身居何处。两人都是 空手套白狼 ,攻击完成赚到数十万美元,且没有留下任何暴露身份的 痕迹 。
刚爆出这些攻击消息时,我正在仔细思考闪电贷及 DeFi 的安全性问题。我认为这个问题值得公共讨论。
简单说一下我的观点:我认为闪电贷存在重大 安全威胁 。但闪电贷不会消失,我们需要认真考虑未来它对 DeFi 的安全性影响。
什么是闪电贷?
闪电贷概念最早由 Marble 协议 于 2018 年提出。Marble 自诩「 智能合约银行 」,其产品是很简单、但很具智慧的 DeFi 创新:通过 智能化合约 完成的零风险贷款。
贷款如何能零风险?
传统信贷机构放贷时面临两种风险。第一种是 违约风险 :如果贷款人携款潜逃,信贷机构会吞下苦果。但第二种是 流动性风险 :如果一家信贷机构在错误的时间放出太多贷款,或者借款人未及时还款,信贷机构可能意外遭遇流动性紧张,无法履行自己的义务。
闪电贷 减缓 了这两种传统放贷风险。闪电贷的基本工作原理是:在单笔交易中贷出借款人需要的金额。然而在交易结束时,借款人必须偿还 不少于贷款金额 的数目。如果借款人做不到,贷款机构会自动回滚交易。 (是的,智能合约能做到这一点! )
简单讲,闪电贷是自动的:如果借款人不能偿还贷款,整个交易就会回滚,就像贷款根本没发生一样。
这样的事情只有在区块链中才能发生。比如你不能在 BitMEX 交易所进行闪电贷。因为智能合约平台一次性处理交易,所以一次交易的所有元素是批处理执行的。交易执行时,可以把这个想成交易的「 冻结时间 」。而在中心化交易所中可能会出现激烈的竞争,可能导致你的交易部分失败;在区块链中,可以保障你的所有代码一行行逐次执行。
所以简单考虑一下这里面的经济机制。传统信贷机构因为两个元素而赚到回报:他们 承担的风险 (违约和流动性吃紧) ,以及他们所贷出资金的 机会成本 (例如,如果这笔钱原本可以让贷款机构得到 2% 的存款利息,所以借款人必须支付比无风险回报率 2% 更高的利率) 。
闪电贷则不同。闪电贷利率上没有风险,也没有机会成本!因为借款人在闪电贷过程中「 冻结了时间 」,所以在其他任何人眼中,该系统的资金从来没有风险,从来没有阻塞,因此你也赚不到利息 (例如,它没有任何机会成本) 。
这意味着,成为闪电贷出借方感觉上不需要任何成本。这严重违反了直觉。所以均衡状态下闪电贷的成本应该是多少?
基本上讲,闪电贷应该是没有成本费用的。或者更准确的说,一笔很小的费用,能补偿让一笔资产进入可放贷状态而添加的三行代码。
来自 0x 研发人员 Remco Bloemen
闪电贷不能收取传统意义上的利息,因为贷款的 持续时间为 0 , ( APR * 0 = 0) 。当然,如果任何放贷机构收取更高的利息,将会被利息更低的其他竞争对手碾压。
闪电贷让资金成为真正的商品。这种竞争到头来不可避免的将成本压低到 0 或者金额极小。 dYdX 目前闪电贷手续费为 0。而 AAVE 收取本金的 0.09% 作为利息。我估计这种情况不会持续下去,实际上 AAVE 社区已经开始呼吁 0 利息。 (请注意,我们前文提及的两次黑客攻击都没有选择从 AAVE 获得闪电贷)
闪电贷有什么用?
闪电贷最初的营销标签是主要用于 套利交易 。Marble 的亮相声明表示:
「闪电贷可以帮助交易者从 Marble 银行贷款,在一家去中心化交易所 DEX 中买币, 然后在另一家 DEX 以较高价格卖出代币,一笔自动化交易就可以让您将套利收益收入囊中。」
而现实确实如此—— 从金额上讲,我们目前看到的多数闪电贷都被用于此类套利交易。
AAVE 的闪电贷用途,来源: AAVE
但金额还很小。AAVE 自成立以来发起的闪电贷金额才 刚刚超过 1 万美元 。与套利交易规模和 DeFi 市场流动性相比,不过九牛一毛。
这主要是因为多数套利交易是由运行复杂机器人的竞争性套利者完成的。他们进行链上优先 gas 拍卖 ,然后利用 GasToken 来优化交易费。这一市场竞争非常激烈,他们很乐意在账面上保留部分代币来优化利润。
另一方面,从 AAVE 借款的成本约为 8 万 gas,并收取本金 0.09%,对利润微薄的套利竞争而言,这一成本过高。实际上多数 AAVE 套利交易中,借款人给贷款池支付的手续费多过其套利收益。
长期来看,除非是某些特殊情况,否则套利者不太可能使用闪电贷。
事实证明,闪电贷在 DeFi 中还有其他更引人注目的用例。一个例子是为贷款再融资。例如,假设我有一个 Maker 抵押债仓 (CDP) ,在里面中锁定了 100 美元的 ETH,我从其中借了 40 个 DAI 币的贷款,因此减去债务后我在 CDP 中的净头寸为 60 美元。假设我想再融资放在 Compound 换取更高的利率,通常我需要回购 40 DAI 才能关闭 CDP,这需要一些前期资金。相反我可以利用闪电贷借入 40 个 DAI 来关闭 CDP,将 60 美元的未锁定 ETH 存入 Compound,通过 Uniswap 将其余的 40 美元 ETH 转换回 DAI,并用来偿还闪电贷。一气呵成,自动化 0 成本再融资。
这太神奇了!这就是 资本乐高 运行的伟大范例。 1x.ag 实际上搭建了一个保证金交易聚合应用,利用闪电贷自动实现这类交易。
尽管这些很酷,但 bZx 攻击者让我们清楚看到,闪电贷能带来多大的伤害。
闪电攻击对安全的重大意义
我越来越相信闪电贷真正解锁的是 闪电攻击 ——利用闪电贷进行高额资金攻击。近期的 bZx 黑客攻击让我们管中窥豹,我怀疑这仅仅是个开头而已。
为何闪电贷成为攻击者的利器?主要有两个原因。
- 很多黑客攻击需要 大量的前置资金 (例如操纵 Oracle 币价格) 。如果你 1000 万美元的 ETH 取得正收益,那应该不是什么套利交易。
- 短期贷款可以最大程度地减少攻击者的污点。如果我有一个如何以 1000 万美元的 ETH 操纵 Oracle 币 的想法,即使我拥有那么多的 ETH,我可能也不想用自己的资金来冒险。我的 ETH 可能沾染污点,交易所可能会拒绝我的存款,洗钱难度大大增加。有风险!但是,如果我用闪电贷贷出 1000 万美元,谁在乎呢?各方都会有收益。我的贷款来源—— dYdX 的抵押池不会被污染, dYdX 的污染某种程度上消失了。
「(攻击者)应该会发现按照规则参与的话比毁坏系统更有利可图,而毁坏系统就是毁坏他自己的资产。」
而在闪电贷中,攻击者与闪电贷游戏丝毫 没有利益捆绑 。闪电贷从本质上改变了攻击者的风险。
另外请记住,闪电贷可以 累积 !鉴于 gas 的限制,你可以在一笔交易中从所有能放贷的资金池中贷款 (最高可达 5000 万美元) ,然后将所有资金捆绑到一个可攻击合约中。现在攻击者手里有了 5000 万美元的重磅大锤,只要 砸出重金 ,任何弱不禁风的链上协议都承受不了其巨大冲击。这太可怕了。
当然攻击者不是仅凭大量金钱就可以对这些协议实施攻击。如果所有 DeFi 堆栈都像它声称的那样安全,这应该不是个问题——面对富鲸哪种协议是不安全的?您可能会说,这些协议没有考虑到那种情况,仅仅是疏忽了。
不过据称每小时用不到 20 万美元的资金就可以让以太坊本身遭受 51% 攻击**。这个金额也并不很大!如果以太坊自身的安全模式仅仅能防止资金匮乏的攻击者,我们何必那么苛责那些防不住 1000 万美元攻击的 DeFi 应用呢?
(**说明一下,我个人并不相信这个数字,这个数字忽略了 ETH 短缺等情况的影响 , 不过它展示了一个思路。)
如何减缓闪电攻击?
假设你是一家衍生品平台,想避免受到闪电攻击。自然会问:我是否能检测出与我交易的用户是不是在用闪电贷?
简单的答案是:你做不到。
以太坊的 EVM 设计方式不允许你从任何其他合同中读取存储。因此,如果你想知道另一个合同中发生的事情,只能通过该合同告诉你。如果你想知道客户是否正在使用闪电贷合同,则必须询问该闪电贷合同。目前许多放贷协议都无法对此类查询做出回应 (而且一般来说,也没有办法强制闪电贷放贷方执行这一查询) 。
即使你的衍生产品平台试图检查已知的闪电贷协议, 协议平台 使用代理合同或通过跨闪电贷协议链接,也很容易将任何此类查询误导。通常根本无法判断用户是否正在使用闪电贷。
短短的一秒钟,如果有人要用 1000 万美元敲开你家交易平台的大门,无法判断这是他们自己的资金,还是一笔闪电贷。
所以我们要防范闪电攻击,真正的选择是什么?我想到三种方法。
- 说服闪电贷协议停止提供这种服务
严肃地讲,试图让贷款池停止提供闪电贷,就像试图阻止噪声污染一样, 这是公共领域的经典悲剧 。提供闪电贷款符合每个协议的利益,并且其用户有合理原因的希望使用此功能。因此,我们可以放心地消除这一选项。闪电贷不会消失。
- 迫使关键交易跨越两个区块
显然这是以大幅牺牲用户体验下进行的:这意味着交易将不再是同步的,很像 commit / reveal 方案。用户体验很糟糕,需要谨慎三思。
很多开发者抱怨智能合约异步操作,例如与 Layer 2 或以太坊 2.0 的跨片通信协议的互动。具有讽刺意味的是, 异步性 使得这些系统更安全,避免遭遇闪电攻击。因为攻击者无法在一次自动化交易中同步完成主链与 Layer 2 或分片的操作。这意味着 ETH 2.0 分片 或 Layer 2 DEX 不会遭遇闪电攻击。
- 要求提供链上证明,证明完成闪电贷后用户的账户余额未出现变化
在原生 EVM 机制中无法执行此操作,但是可以对其进行修改。你要做的是:在用户与你的协议进行交互之前,你要求其提供 Merkle 证明,证明在上一个区块末尾时他们有足够的余额来偿还当前使用的资金。你需要针对每个区块中的每个用户跟踪此情况。 (感谢康奈尔大学教授 Ari Juels 向我概述了这种方法)
这种方法一定程度上是奏效的。当然,它还很粗糙,有一些问题:验证这些链上证据在链上的 成本极高 ,思维正常的用户没有人愿意提供这类证明,并为整个过程支付 gas 费用。另外用户完全可能有合法合理的理由,在上个区块想调整其余额。所以,尽管这种方法理论上有些作用,它不是一种可行的解决方案。
很清楚,我上面所举的三种解决方案都不够理想。我相信面对闪电攻击没有真正好的解决办法。但有两个特别应用确实能减缓闪电攻击: 市场价预言机 和 治理代币 。
像 Uniswap 或 OasisDEX 等市场价预言机 , 由于闪电攻击的可能性,你任何情况下不能把当前市价中位数当成喂价。攻击者只需要一笔交易就能轻而易举地大幅改变市价中位数,让预言机失灵。对此最好的解决方案是通过 时间加权平均价格 (TWAP) 或 成交量加权平均价格 (VWAP) 计算 上一批 X 区块的加权平均数 。 Uniswap v2 会自带这一功能;经济学家 Max Wolff 的著作 《 Polaris 》为其它协议提供了一种通用方法。
链上治理 则是则会带来一连串令人头疼的问题。链上治理通常由治理代币持币人按权重投票决定。但如果这种治理代币进入某一贷款池,任何攻击者可以偷走大量选票,得到自己想要的结果。
当然,多数治理协议要求这些治理代币在投票期间锁定,这让闪电攻击无计可施。但有些治理协议并非如此,例如 「Carbon Vote」 和 Maker 的行政投票。在闪电攻击的阴影之下,这些治理机制完全可能被攻陷。
理想情况下,你不想让治理代币进入闪电贷款池。但这并非由发币者决定,它是由市场决定的。因此,所有治理行动应该要求 代币锁定期 ,以阻止闪电袭击。更关键的是,所有治理代币必须有 时间锁 (timelocks) 。时间锁迫使所有的执行决策在生效前都有一段等候期。 (例如 Compound 的时间锁是 2 天 ) 。如果遭遇意料之外的治理攻击,这一机制让系统有了 容错时间 。甚至尽管 MKR 目前大量未进入闪电贷资金池,近期已经有人称 MakerDAO 很容易遭遇此类攻击。MakerDAO 当前正加快修复。
这些有什么深远意义?
我认为 bZx 攻击事件彻底改变了局面。
这不会是最后一起闪电攻击事件。第二起 bZx 攻击只是第一次翻版而已,我怀疑未来几个月还有一波类似攻击。现在全球各个角落有数千名聪明的青少年对所有这些 DeFi 乐高虎视眈眈,用显微镜寻找任何漏洞,试图找出发动闪电攻击的办法。如果攻陷一个漏洞,他们也会赚到数十万美元,对全球多数国家和地区而言,这一数字足以改变人生。
对各家 DeFi 协议而言,闪电攻击意味着 安全模式已经改变 。在 bZx 黑客事件后如果再遭到类似攻击,会和 DAO 黑客事件后再遭重入式攻击一样,会成为加密世界的笑话。不过你可以预期,这是会出现的。
最后,这些事件让我去思考加密世界的古老概念: 矿工可提取价值 (MEV ) 。MEV 指矿工可以从一个区块链系统中可以提取的总价值,包括出块奖励和费用,但也包括其它不那么正大光明的收益,例如 交易重新排序 或 向块中插入流氓交易 。
从根本上讲,应该将所有这些闪电攻击都视为 海量资金内存池 (mempool) 中的单笔交易。例如,第二次 bZx 攻击在单笔交易中产生了 价值 64.5 万美元 的 ETH 利润。如果你是矿工,并且打算开始开采新区块,请想象一下查看先前区块的交易并对自己说:「这算怎么回事儿?上一个区块中包含 64.5 万美元的利润,我为什么要开采一个只换来 500 美元的新区块?」
更符合你利益的做法不是继续开采新区块,而是 试图重写历史 ,让你自己成为那个闪电攻击者。想一下:这一笔交易就相当于以太坊诚实挖矿四个小时的所得!这与拥有一个包含正常块奖励 1000 倍的超级块是同样的原理——这种超级块带来的合理结果是大批矿工疯狂争夺,为自己窃取那个超级块。
模拟展示矿工们的激烈争夺
均衡状态下,所有闪电攻击应该最终被 矿工 提取价值。 (注意他们应该也会最终窃取了所有链上套利和清算) 。讽刺的是,这会成为阻止闪电攻击的一个重要元素,因为会让攻击黑客无法将窃取成果折现。也许最终矿工们会开始私下悬赏攻击代码 ,为黑客提供 线人费 。技术上讲,利用零知识认证是可以在无需信任的情况下完成。 (这样想是不是有点怪? )
在今天这还都是科幻。矿工们明显没有这么做。
他们为什么没这么干?有无数的理由。首先它 很难 ,需要大量工作, EVM 很难模拟,风险很高,存在漏洞可能造成资金流失或孤块,会招致口诛笔伐,整个矿池会遭遇公关危机,可能被列为「 以太坊公敌 」。在目前情况下,矿工如果这么做更有可能带来更多经济损失和孤块,而不是拿到这笔钱。
在目前这是真的,但这种情况不会持续很久。
这给以太坊带来了一个新的动力去尽快过渡到 以太坊 2.0 。以太坊上的 DeFi 尽管令人惊叹且令人着迷,但毫无疑问是漏洞百出的。DeFi 在 PoW 链上不稳定,因为所有高价值交易都会由矿工重新分配 (也被称为时间匪徒攻击) 。
对于大规模运营的系统,你需要的是不可改变性——矿工 不能重写 已确认的区块。这将会保护之前的区块不会被重新分配。另外,如果 DeFi 协议存在于单独的以太坊 2.0 分片上,它们不会在闪电攻击面前弱不禁风。
依据我的估计 , 闪电攻击带给我们很小、但很有用的一个提醒是,这仅仅是个开局。我们还没有拥有出色的架构来构建未来的金融系统。
目前闪电贷款会是新常态。也许在长远来看,以太坊上的 所有资产 都可以被投入闪电贷。交易所所持有的所有抵押物, Uniswap 的抵押物,也许所有 ERC-20 标准代币。
谁知道呢,不过是几行代码的事儿。