本文主要参考有:
捕鲸船的分享](https://www.youtube.com/watch?v=_1dK61Qnv38))
SharkTeam系列文章—闪电贷](https://learnblockchain.cn/article/4502#Aave 闪电贷优缺点))
什么是区块链上的闪电贷:
闪电贷:
最初的目的是在区块链上实现,允许用户在不提供任何东西作为抵押的情况下进行借款。
如何让真正实现闪电贷这一功能,依靠区块链上交易的原子性,让闪电贷的借贷和偿还在同一交易中完成,如果没有完成相应的偿还,则回退整个交易;
为防止闪电贷在Defi中的滥用,每次闪电贷还款的时候需要支持贷款金额的贷款费用,如0.09%,否则也将回退整个交易。
Aave最初提出闪电贷的概念是为了想服务于金融业产品开发者群体,让更多的开发人员在无需资金的情况下,使用闪电贷创建再融资工具或套利工具,构建金融产品,降低开发门槛。(查了一圈找到的比较合理的答案)
但目前闪电贷被大量滥用与资产间套利。
闪电贷具体实现示例:
常见的闪电贷平台:Uniswap、Aave、Compound、MakerDAO、dYdX
等
存在闪电贷和闪电兑的区别:需不需要偿还相同的资产。
现有的闪电贷大多都是乐观转账,在借贷函数的实现的,先将借贷的代币转给借贷者,随后回调借贷者的函数,借贷者进行他的操作,最后在借贷函数结束前,必须还清借贷金额以及相应的手续费,否则交易回退
Aave_v2
检查闪电贷的代币数量,计算手续费,协议费等
进行乐观转账,将代币转到用户的地址中
回调用户的excuteOperation函数,用户自己来进行套利操作,aave_v1在函数的最后需要进行相应的还款,aave_v2不需要立刻还款,但需要向借贷合约进行相应的授权。
v1检查还款金额(合约借贷前余额+手续费),v2借贷合约调用safetransform函数自己进行相应的转账,实现对应的还款。
下图主要为aave_v1版本的实现
Uniswap_v2
uniswap其也提供闪电贷的功能,在v2版本中其主要是通过swap函数实现闪电贷
闪电贷其检测是否还款的原理,是根据自动做市商AMM原理,进行k值检验
可以粗略的理解uniswap,其代币的pair对是满足
最后的k值校验只要满足:
账户还款后的余额减去对应的交易费用,满足大于k即可。
从上式我们不难看出,在uniswap中还款,我们不一定需要还同一种资产,可以换相应pair对的资产也可。
- 进行相关借款的检验
- 进行乐观转账
- 回调借贷者的uniswapV2call函数,进行相应的套利操作,并在函数的最后实现还款
- k值校验,判断是否还款
其闪电贷其余步骤,与aave相似,唯一不同的是,uniswap是将对应的还款在uniswapV2call函数中,直接转给相应的借贷合约
闪电贷的攻击类型
- 利用闪电贷大的资金量操纵价格,一些项目中的询价机制存在漏洞,可见价格操纵文章](https://emmanuelwh.github.io/2023/12/16/价格操纵攻击再理解/))
- 一些项目在抵押或其它过程中会产生瞬时奖励,利用闪电贷获得大额奖励
- 项目中存在其它逻辑漏洞,利用闪电贷大的资金量发大套利空间
DFX攻击事件分析
漏洞的主要原因是主要有两个:
闪电贷归还逻辑为闪电贷前后池子中金额的差值
但DFX合约的中并未对它的借贷方法和添加流动性方法进行重入限制。通俗来说,就是将借贷的钱抵押到同一个池子中,用户需要还款的闪电贷很少,但却有着大量的LP流动性证明
攻击的主要步骤为:
- 调用flash函数借贷大量的USDC和XIDR
- 后将借到的两种代币在同一个池子中进行抵押
- 此时闪电贷前后的池子差,远远小于攻击者借出的资金,攻击者归还很少的资金即可
- 但用户抵押的流动性还依然在它手中,移除流动性,获得大量的USDC和XIDR