前言:bZx事件发生之后,加密社区开始重视闪贷攻击。本文作者Haseeb认为闪贷用于套利不是其最大的用例,它最大的用例在于释放了闪贷攻击。闪贷攻击无法消失,且很难阻止。有些阻止攻击的措施看似合理,但成本很高,不切实际。而当前改进主要集中在价格预言机和治理代币机制上。比如价格采用通过TWAP或VWAP使用最后X个区块的加权平均值的机制。治理代币采用时间锁机制等。此外,如果闪贷攻击的利益足够高,矿工也可能会参与作恶。总之,面临闪贷攻击,DeFi还需要更好的应对。
闪贷最近成为加密社区关注的焦点。最近发生了两次使用闪贷对保证金交易协议bZx的攻击,第一次是35万美元的攻击,第二次是60万美元的模仿攻击。
用一句话来总结,这些攻击非常“华丽”。每次攻击中,攻击者不用花费一分钱立即借到数十万美元的ETH,然后通过一系列脆弱的链上协议,赚取数十万被盗资金,最后归还借来的数额巨大的ETH贷款。所有这些都是瞬间发生的。也就是说,在单个以太坊交易中完成。
我们不知道这些攻击者是谁或他们来自哪里。他们进来时两手空空,离开时拿走数十万美元的价值,且都没有留下痕迹。
在这些攻击之后,我一直在思考闪贷及其对DeFi安全的影响。我认为这值得公开思考。简言之,我认为闪贷对DeFi是巨大的安全威胁。但是,闪贷并不会消失,我们需要仔细思考它们对未来DeFi安全的影响。
什么是闪贷
闪贷的概念最初由Marble 协议的创建者Max Wolff于2018年提出。Marble在市场上将自己宣称为“智能合约银行”,其产品非常简单,但极具DeFi创新:通过智能合约进行零风险贷款。(蓝狐笔记:关于什么是闪贷,可以参考之前的文章《加密闪贷:互联网货币的神奇新发明》《闪贷策略:攻击者能取走Maker的7亿美元抵押品吗?》《bZx事件的启示》)
怎么可能有零风险的贷款?
传统的贷方承担两种形式的风险。首先是违约风险:如果借款人卷款跑了,很糟糕。贷方的第二个风险是流动性不足的风险:如果贷方在错误时间贷出太多资产,或者没有及时收回还款,贷方可能会意外地缺乏流动性,且无法履行其义务。
闪贷减轻了这两种风险。闪贷基本上是这样运作的:我在单个交易中借给你想要数额的钱。但是,在这笔交易结束之前,你必须至少偿还我借给你的钱。如果你无法执行此操作,我会自动回滚你的交易。是的,智能合约可以做到这一点。
简言之,你的闪贷具有原子性:如果你无法偿还贷款,整个事情就会还原,就像是借贷从未发生过一样。这样的事情只能发生在区块链。例如,你无法在BitMEX上闪贷。这是因为智能合约平台一次只能处理单个交易,因此,在单个交易发生的所有事情都是作为批处理按次序执行。你可以将其看作为交易执行期间的“冻结时间”。另一方面,中心化交易所可能会出现竞争状况,以致于你的订单无法履行。在区块链上,可以确保的是,你的所有代码都是按次序运行。
因此,让我们思考一下这里的经济学。传统的放贷人在两个方面得到补偿:他们承担的风险(违约风险和流动性风险),以及他们借出资本的机会成本(例如,如果我能在其他地方获得2%的利息,那么,借款人必须向我支付高于2%的无风险费用)。
而闪贷不同。从字面意义上说,闪贷没有风险,且没有机会成本。这是因为借款人在其闪贷期间“冻结了时间”,因此,在其他人眼中,系统的资本从未有风险且无负担,它也无法在其它地方赚取利息(即,它没有机会成本)。
在某种意义上,这意味着成为闪贷的放贷人没有成本。这是非常反直觉的。那么,均衡时的闪贷成本应该是多少?(蓝狐笔记:这里说的均衡时,是指经过充分竞争且发展成熟稳定时)
基本上,闪贷应该是免费的。或者更恰当的做法是,支付小额费用,以分摊包括使得资产可实现闪贷的额外三行代码的成本。
闪贷无法收取传统意义上的利息,因为这种贷款有效期为零(任何APR*0=0)。当然,如果闪贷放贷人收取更高的费用,他们很容易就被其他收取较低利率的闪贷池所超越。
闪贷使得资本变成真正的商品。这种竞争不可避免地会导致零费用或微不足道的象征性费用。dYdX当前对闪贷收取零费用。另一方面,AAVE对闪贷收取本金0.09%的费用。我怀疑这是不可持续的,确实,他们社区中的一些人呼吁将费用消减至零。(请注意,这两次攻击都没有使用AAVE作为他们的闪贷池)
闪贷有何用处?
闪贷最初的宣传是它们基本上用于套利。Marble的公告声称:
“通过闪贷,交易者可以从Marble银行借钱,随后在一个DEX上买入代币,并以更高的价格在另外一个DEX上卖出代币,然后将钱还给银行,并且在单个原子交易中获得套利收益。”
的确如此——就交易量来说,迄今为止,大多数闪贷都用于此类套利。
不过交易量较小。AAVE的闪贷业务开展以来,其借贷额仅为1万美元。与DeFi的套利和清算市场相比,这是微不足道的。
这是因为大多数套利都由运行复杂机器人的竞争套利人执行。他们从事链上优先gas拍卖,并使用gas代币来优化交易费用。这是非常有竞争力的市场,这些人非常乐意在其资产负债表上保留一些代币,以优化其收益。
另一方面,在AAVE上借钱花费80kgas成本,且收取本金0.09%的费用,这对竞争微薄差额的套利者来说,付出的价格很高。实际上,在大多数AAVE的套利中,借款人最终向借贷池支付的费用高于他们套利赚取的收益。
从长远看,除非情况特殊,否则套利者不太可能使用闪贷进行套利。但闪贷在DeFi中存在其他更引人注目的用例。其中一个例子是贷款再融资。例如,假设我有一个Maker小金库(蓝狐笔记:也就是抵押债务头寸),其中锁定了100美元的ETH,我从中借出了40 DAI的贷款,也就是说,除去债务,我还有60美元的净头寸。现在,假设我想在Compound再融资以获得更好的利息。通常,我需要回购40 Dai来关闭我的CDP,这需要一些前期资金。而现在的可替代方法是,我可以通过闪贷借出40 Dai,关闭100美元的CDP,然后将解锁的价值60美元的ETH存入Compound,通过Uniswap将剩余的价值40美元的ETH换成Dai,然后用它偿还闪贷。Boom!原子性的0资本再融资。
这真是太神奇了。这是货币乐高运作的很好例子。1x.ag实际上构建了一个保证金交易汇聚器,该汇聚器使用闪贷自动执行这一切。但是闪贷可以很酷,bZx攻击者向我们展示了它们不仅是好玩和游戏。
闪贷攻击对安全性有重大影响
我越来越相信,闪贷真正解锁的是闪贷攻击,一种由闪贷提供资金的资本密集型攻击。在最近的bZx攻击事件中,我们第一次看到这一现象,而我怀疑这只是冰山一角。
闪贷对攻击者尤其有吸引力的主要原因有两个:
· 很多攻击需要大量前期资金(例如预言机操纵攻击)。如果你在赚取价值1000万美元ETH的正向投资回报,则可能不是套利——你可能会说这是在扯淡。
· 闪贷可以最小化攻击者的污点。如果我有个用1000万美元ETH操纵预言机的想法,即便是我拥有这么多ETH,我也可能不会用自己的资本进行冒险。我的ETH将会有污点,交易所可能会拒绝我的存入,且它很难洗白。这有风险。不过,如果我借来1000万美元的ETH,那么,谁会在乎呢?全都是好处。dYdX抵押池不太可能会被认为有污点,因为这是我贷款的来源——dYdX的污点只会消失。
你可能不太喜欢交易所黑名单是如今区块链安全模型的一部分。这是非常黏糊且中心化的。但这是一个重要的现实,它为这些攻击提供演算信息。
在比特币的白皮书中,中本聪宣称比特币有免遭攻击的安全,因为:“攻击者应该会发现,遵守规则。..比破坏系统和其财富的有效性更有利可图。”
有了闪贷,攻击者不再需要有利益参与其中。(蓝狐笔记:也就是说,破坏系统不会影响攻击者的自身利益,因为攻击者没有利益相关)。闪贷实质上改变了攻击者的风险。请记住,闪贷可以累积!受制于gas limit,实际上,你可以在单个交易中(最高可达5000万美元 )汇聚各个闪贷池,并将所有资金集中涌入一个脆弱的合约中。这是一个5000万美元的攻城锤,现在任何人都可以猛击任何链上的彩陶罐。这实在恐怖。
当然,仅凭你很有钱还无法攻击协议。如果DeFi堆栈如它宣称的那样安全,所有这些都不是问题——什么类型的协议对巨鲸来说是不安全的?你可能会说,没有考虑这一点就是过失。
但是,我们承认以太坊自身也可能会遭受51%的攻击,当前的攻击成本是每小时不到20万美元。这不算非常多的资金。如果以太坊自身的安全模型都基本上是构建在资本限制上,那么,为什么我们要如此快地去嘲笑可以被1000万美元成功攻击的DeFi应用?(明确地说,我不认为这些数字——这一数字方便地忽略了滑点和供应不足——加上共识层安全和应用层安全是两码事。但你明白这个意思。)
那么,如何减轻闪贷攻击?
假设我是DeFi协议,我想避免被闪贷攻击。自然的可能问题是,我能否检测到与我交互的用户是否在使用闪贷?
简单答案是:不。
EVM并不允许你从任何其他合约中读取存储。因此,如果你想知道其他合约正在发生什么,则可以通过该合约告诉你。因此,如果你想知道是否闪贷合约在被使用,你必须直接询问合约。如今,很多借贷协议并没有对这种查询做出响应(而且一般来说,也没有办法强迫闪贷借贷者的行为)。另外,即便你试图检查,通过使用代理合约或通过串联闪贷池也容易误导此类查询。简单来说,通常很难辨别一个存储用户是否在使用闪贷。
简言之,如果有人拿着1000万美元敲你合约的前门,你无法判断这是否是他们自己的钱。那么,我们有什么真正的选择可以防止闪贷攻击?我们可以考虑如下几种方法。
说服闪贷借贷池停止提供服务。
哈,开玩笑。这是加密世界,你们懂的!
认真地说,试图让借贷池停止提供闪贷就像是试图停止噪音污染——这是典型的公地悲剧。提供闪贷符合每个协议的自身利益,且出于合理原因,它们的用户也希望使用这一功能。因此,我们尽可忽视这一条。闪贷并不会消失。
强制关键交易跨两个区块进行
请注意,闪贷允许你在单个交易时间段内借入资金。如果你需要一个资本密集型交易跨越两个区块,那么,用户必须取出至少两个区块的贷款,由此击败任何闪贷攻击。(注意:为此,用户必须将其资产锁定在两个区块之间,以防止他们偿还贷款。如果你没有正确地考虑设计,则用户可能只是在这两个区块中实施闪贷攻击)
显然,这会带来巨大的UX权衡:它意味着交易不再是同步的。它对普通用户来说极其糟糕,这是很难下决心采取的措施。(蓝狐笔记:为了防止闪贷攻击,导致用户体验糟糕,显然是下策)
很多开发者对异步智能合约操作感到烦恼,例如,与layer 2的交互,以及以太坊2.0的跨分片通信。具有讽刺意味的是,异步其实让这些系统在应对闪贷时更安全,因为你无法在单个原子交易中横跨分片或layer 2。这意味着不会有跨ETH2.0分片或在layer 2针对DEX的闪贷攻击。
要求提供链上证明,以证明用户的先前余额并没有因为闪贷而改变
如果能有方法检测出用户真实的余额多少(也就是他们获得借款之前的余额),我们就可以击败闪贷攻击。
无法在EVM中本地执行此操作,不过,你可以做点带有黑客意味的事情。这就是你要做的:
在用户与你的协议交互之前,你要求提供可以证明之前区块末尾的Merkle证明,他们有足够的余额来解释他们当前使用的资金。你需要对每个区块上的每位用户跟踪这一点。(Ari Juels向我概述了此方法)
这种方法可能有些效果。当然,它也存在棘手问题:在链上验证这些链上证明非常昂贵,并且没有用户会想要生成这些证明以及为此支付gas费用。另外,出于完全正当理由,用户有可能在早些时候在同一区块中已更改了余额。因此,从理论上它有一些优点,但这不是一个切实的解决方案。
以上提到的三个解决方案没有一个有特别的希望。我相信,没有针对闪贷攻击的全面防御措施。但是,有两个特定的应用确实可以缓解闪贷攻击:基于市场价格的预言机和治理代币。
对于像Uniswap或OasisDEX这样的基于市场的价格预言机,闪贷攻击使得你在任何情况下都不能将当前的中间市场价格用作为预言机。对于攻击者来说,在单个交易中移动中间市场价格并制造闪崩、破坏价格预言机,这是孩子的玩法。
这里最好的解决方案是通过TWAP或VWAP使用最后X个区块的加权平均值。Uniswap v2将原生提供这一点。还有Polaris,这是通用的方法,可以为DeFi协议提供移动平均值。具有讽刺意味的是,Polaris也是由Marble的创始人Max Wolff构建的。(Polaris现在已经被抛弃,但Max看到了这一角落的东西,值得赞)
链上治理本身就是自己罐头里的蠕虫。链上治理通常由治理代币持有者之间的代币加权投票决定。但是,如果这些治理代币出现在闪贷借贷池中,那么,任何攻击者可以捡起大量的治理代币并搞出任何他们想要的结果。
当然,大多数治理协议都要求在投票期间锁定这些代币,以防止闪贷攻击。但是,有些形式的投票并不要求这些,例如carbon投票,或Maker的执行合约。如今,随着闪贷攻击的出现,这些形式的投票应该认为完全遭到破坏。
理想情况下,如果治理代币不可用来闪贷,这就很好。但是,这不取决于代币的发行方,而是取决于市场。因此,所有治理行为应该要求锁定,以防止闪贷攻击。Compound的新COMP代币更进一步,它对所有协议投票都要求基于时间的加权,甚至削弱针对其治理代币的常规贷款攻击。
更广泛地说,所有治理代币必须有时间锁。时间锁要求所有治理决定必须等待一段时间才能生效(Compound的时间锁是两天)。这使得系统可以从任何意料之外的治理攻击中恢复。尽管MKR还无法被大量闪贷,MakerDAO最近因为易受此类攻击而被号召实施措施。它最近实施了24小时的时间锁,关闭了此类攻击向量。
从长远看,这一切意味着什么?
我相信bZx攻击改变了这一切。
这不会是最后一次闪贷攻击。第二次bZx攻击是对第一次的模仿,而且我怀疑在未来几个月会掀起一波攻击浪潮。现在,来自世界最遥远角落的成千上万名聪明少年正在嘲笑所有这些DeFi乐高,他们在显微镜下观察,试图发现可以实施闪贷攻击的方法。如果他们设法成功利用漏洞,那么,他们就可以赚取几十万美元,这在世界上的大部分地区都是可以明显改变生活的。
有人称闪贷并不会改变任何东西,因为如果攻击者有足够资金,这些攻击总是可能的。这既正确又相当不正确。大多数鲸鱼都不知道如何黑智能合约,而大多数聪明的攻击者也没有数百万美元的资产。(蓝狐笔记:此处是说,两者的交集不大。同时具备两者的是最可怕的攻击者。但闪贷到来让攻击者获得了免费的利器)现在,任何人仅花费几分钱就可以租用一个价值5000万美元的毁灭球。从现在开始这改变了每个建筑被构建的方式。
在bZx攻击之后,被闪贷攻击就像是在DAO攻击后被重入攻击一样令人尴尬:你不会得到人们的同情。你应该了解这一点。
最后,这些事件让我想到加密货币的一个古老的概念:矿工可提取的价值。矿工可提取的价值是矿工可以从区块链系统中提取的价值。这包括区块奖励和交易费用。但它也包括更多恶意形式的价值提取。例如对交易重新排序或将无赖交易插入区块。
从根本上讲,你应该将所有这些闪贷攻击都视为是在内存池中可以赚取大量金钱的单个交易。例如,第二次bZx攻击产生了价值64.5万美元ETH的收益。如果你一位矿工,你打算开始挖新区块,请想象一下,查看先前的区块交易,并对自己说:“等等,那是什么?当最后一个区块包含64.5万美元的利润时,我为什么还要打算为区区500美元左右的收益挖新区块呢?”你不会选择去扩展区块链,而是回去并试图重写历史,以使自己成为闪贷攻击者。想想看:仅此一笔交易就比4小时诚实地开采以太坊来得多!
这与包含1000倍于常规区块奖励的特殊超级区块是同构的,正如你预期的那样,这样的超级区块的理性结果应该是矿工竞相竞争以孤立链的打赏并为自己偷取该区块。
在均衡状态下,所有闪贷攻击应该最终会被矿工提取。(请注意,他们也应该会最终窃取所有链上套利和清算)具有讽刺意味的是,这会阻止闪贷攻击的发生,既然它会导致攻击者无法利用这些漏洞来获利。或许最后矿工会通过私人渠道征集攻击代码,并向潜在的攻击者支付发现者费用。从技术上讲,可以使用零知识证明无须信任地完成此类操作。
但这一切现在都还是科幻小说。显然矿工今天还没有这么做。
他们为什么不呢?
有大量的原因。它很难,需要很多工作。EVM很难模拟,它有风险,可能会有漏洞导致损失资金或孤块,流氓矿池可能会面临PR危机,被人们冠以“以太坊敌人”的烙印。就目前来看,相对于这么做的收益,矿工可能会在业务、R&D以及孤块上损失更多。
今天是如此。未来不一定永远如此。
这为以太坊提供了另外一个动力,以加速并过渡到ETH2.0。尽管以太坊上的DeFi总是很有趣,但它是绝对和不可撤销的。DeFi在PoW链上不稳定,因为所有高价值交易都受制于矿工的重新分配(也称时间劫匪攻击)。
为了让这些系统大规模运行,你需要最终性——让矿工无法重写已确认的区块。这将保护先前区块的交易免遭重新分配。此外,如果DeFi协议存在于单独的ETH2.0分片中,它们不容易遭到闪贷攻击。
据我估计,闪贷攻击给我们一个小的但有用的提醒,那就是现在还很早期。我们还远没拥有可持续的架构,一个可为未来金融系统构建的架构。
目前,闪贷会是新常态。也许从长期看,所有以太坊上的资产都可用于闪贷:交易所持有的所有抵押品,Uniswap中的所有抵押品,也许所有ERC-20代币本身。
谁知道呢?这只是几行代码的事。
责任编辑;zl
评论
查看更多