一句话版本
闪电贷允许任何人不抵押、借出上亿美元,条件是在同一笔交易里还清,还不上整笔交易就作废。它让"本金"这个门槛彻底消失:任何依赖"操纵需要大量资金"的安全假设都失效了。 最常见的攻击是:借一大笔钱 → 砸歪某个交易池的价格 → 某个 DeFi 协议拿这个池子的即时价格当预言机,按错误价格放贷或清算 → 攻击者获利 → 还款。防御的关键是:永远不要用可以在一个区块内被操纵的价格。
全文分三层:
- 通俗理解:一秒钟的亿万富翁
- 实际用处:bZx、Mango Markets、Euler 等事件
- 原理与工程要点:恒定乘积做市商的价格为什么好砸、TWAP、去中心化预言机
第一层:通俗理解
1.1 一秒钟的亿万富翁
想象一家银行规定:你可以借任意金额,只要在离开柜台之前还上,否则这笔借款就当从没发生过。
普通人拿这个没用。但如果你在柜台前的这一分钟里,能用这笔钱做一笔稳赚的套利,那就是无本万利。区块链上,"一笔交易"就是这个柜台:交易里的所有步骤要么全部成功,要么全部回滚。
1.2 价格是怎么被砸歪的
很多去中心化交易所(AMM)里,价格完全由池子里两种资产的比例决定。往池子里砸一大笔 A 资产,A 的价格就会暴跌。
如果某个借贷协议说:"我按这个池子的当前价格来计算你的抵押品值多少钱",那攻击者只要先把池子价格拉高,他的抵押品就"值"很多钱,可以借走远超实际价值的资产。
第二层:实际用处
| 事件 | 经过 |
|---|---|
| bZx(2020 年 2 月) | 早期的闪电贷攻击:借来资金,在流动性较薄的交易所操纵价格,利用借贷协议读取这个价格的漏洞获利。两次攻击相隔几天 |
| Harvest Finance(2020) | 反复操纵稳定币池的价格,在"存入—取出"之间赚取差价,损失约 3400 万美元 |
| Mango Markets(2022) | 攻击者用两个账户在流动性很薄的市场里大幅拉高 MNGO 代币价格,抬高自己账户的抵押价值,借走约 1.1 亿美元。之后还公开声称这是"高利润的交易策略",后来被美国检方起诉 |
| Euler Finance(2023) | 利用闪电贷和一个"捐赠"函数的逻辑缺陷,制造出可以被清算获利的坏账,损失约 2 亿美元;攻击者后来归还了绝大部分资金 |
共同点:闪电贷只是放大器,真正的漏洞是协议自身的逻辑缺陷,尤其是信任了一个可以被瞬间操纵的价格。
第三层:原理与工程要点
3.1 恒定乘积做市商
Uniswap V2 式的池子维持
、 是两种资产的数量,价格 。用 买入 A,能得到
池子越小( 越小),同样的资金能把价格推得越远。
一个小池子能被推多远
池子里有 100 ETH 和 200,000 USDC,价格 2000 USDC/ETH。 投入 200,000 USDC 买 ETH:得到 ETH,池子剩 50 ETH 和 400,000 USDC,价格变成 8000,是原来的 4 倍。
闪电贷借 20 万美元几乎没有成本。如果某个协议此刻读这个池子的价格,攻击者手里的 ETH 抵押品就"值"了 4 倍。
3.2 防御:别用即时价格
| 方法 | 原理 | 局限 |
|---|---|---|
| TWAP(时间加权平均价) | 取过去一段时间(如 30 分钟)的平均价格。闪电贷只能影响一个区块,平均下来几乎无影响 | 价格反应慢;长时间、高成本的操纵仍可能有效 |
| 去中心化预言机(如 Chainlink) | 多个独立节点从多个交易所取价格,聚合后上链(见《多源交叉验证》) | 有更新延迟;依赖预言机网络本身的安全 |
| 多预言机 + 偏差检查 | 两个来源偏差过大就暂停(见《Fail-closed》) | 增加复杂度 |
| 限制低流动性资产 | 流动性差的代币不作为抵押品,或设很低的抵押率 | 限制了业务 |
3.3 测试方法
- 分叉主网测试:在本地复制主网状态(Foundry、Hardhat 都支持),模拟"借一大笔闪电贷后调用我的协议",看会发生什么;
- 不变量测试:比如"协议的总资产 ≥ 总负债"在任意操作序列下都成立;
- 经济审计:除了代码审计,还要问"如果某个价格在一个区块内变成 10 倍或 1/10,协议会怎样"。
3.4 一个反直觉的结论
闪电贷本身不是漏洞,它甚至有正当用途(套利、清算、无需本金的债务再融资)。它的意义在于揭示了漏洞:任何"只要你没有足够多的钱就做不了"的安全假设,在 DeFi 里都不成立。
总结
| 层次 | 要点 |
|---|---|
| 闪电贷 | 无抵押借款,同一笔交易内还清;本金门槛消失 |
| 攻击模式 | 借钱 → 砸价格 → 协议按错误价格操作 → 获利 → 还款 |
| 根因 | 协议信任了一个区块内可被操纵的即时价格 |
| 防御 | TWAP、去中心化预言机、偏差检查、分叉主网测试 |