闪电贷
闪电贷
本页内容正在整理中,欢迎贡献。
概述
闪电贷(Flash Loan)是 DeFi 独有的金融原语:在同一笔交易中借入任意数量的资产,无需抵押,只要在交易结束前归还本金和手续费即可。如果无法归还,整笔交易会被 revert,借贷方零风险。
主要内容
闪电贷的工作原理
同一笔交易的原子性保证: 1. 用户调用 flashLoan() 2. 协议将资产转给用户合约 3. 调用用户合约的回调函数 onFlashLoan() 4. 用户在回调中执行套利/清算/其他操作 5. 用户合约还款(本金 + 手续费) 6. 协议验证余额 7a. 余额充足 → 交易成功 7b. 余额不足 → 整笔交易 revert(零风险)Aave V3 闪电贷实现
// SPDX-License-Identifier: MITpragma solidity ^0.8.20;
import "@aave/core-v3/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol";import "@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol";import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract AaveFlashLoan is FlashLoanSimpleReceiverBase {
constructor(address _addressProvider) FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider)) {}
// 1. 发起闪电贷 function requestFlashLoan(address token, uint256 amount) external { address receiverAddress = address(this); bytes memory params = ""; uint16 referralCode = 0;
POOL.flashLoanSimple( receiverAddress, token, amount, params, referralCode ); }
// 2. 回调函数(Aave 调用) function executeOperation( address asset, uint256 amount, uint256 premium, // 手续费(0.05%) address initiator, bytes calldata params ) external override returns (bool) { // ===== 在这里执行你的套利/清算逻辑 ===== // 例如:DEX 套利 // uint256 profit = arbitrage(asset, amount);
// 还款:本金 + 手续费 uint256 amountToRepay = amount + premium; IERC20(asset).approve(address(POOL), amountToRepay);
return true; }}Uniswap V3 闪电贷
// Uniswap V3 的闪电贷通过 flash() 实现interface IUniswapV3Pool { function flash( address recipient, uint256 amount0, uint256 amount1, bytes calldata data ) external;}
interface IUniswapV3FlashCallback { function uniswapV3FlashCallback( uint256 fee0, uint256 fee1, bytes calldata data ) external;}
contract UniswapFlashLoan is IUniswapV3FlashCallback { IUniswapV3Pool constant pool = IUniswapV3Pool(/* ETH/USDC 0.05% 池 */);
function takeFlashLoan(uint256 amount0, uint256 amount1) external { pool.flash(address(this), amount0, amount1, abi.encode(msg.sender)); }
function uniswapV3FlashCallback( uint256 fee0, uint256 fee1, bytes calldata data ) external override { require(msg.sender == address(pool), "Only pool");
// 执行套利逻辑...
// 还款 if (fee0 > 0) IERC20(token0).transfer(address(pool), borrowed0 + fee0); if (fee1 > 0) IERC20(token1).transfer(address(pool), borrowed1 + fee1); }}闪电贷使用场景
1. 套利(Arbitrage)
发现 DEX A 上 ETH 价格 < DEX B: 借入 1000 USDC → 在 DEX A 买入 ETH → 在 DEX B 卖出 ETH(更高价格) → 还款 1000 USDC + 手续费 → 获利差价 - 手续费2. 清算
发现某账户健康系数 < 1: 借入 USDC → 调用 Aave liquidationCall() 还清债务 → 获得抵押品(含清算奖励) → 卖出抵押品换回 USDC → 还款 + 手续费 → 获利清算奖励 - 手续费3. 抵押品互换
用户有 ETH 抵押借出 USDC,想换成 WBTC 抵押: 借入 USDC(等于当前债务) → 还清 Aave 债务 → 取出 ETH 抵押品 → 卖出 ETH 换成 WBTC → 将 WBTC 存入 Aave → 重新借出 USDC 还款手续费对比
| 协议 | 手续费 |
|---|---|
| Aave V3 | 0.05% |
| Aave V2 | 0.09% |
| Uniswap V3 | 池手续费(0.01%/0.05%/0.3%/1%) |
| dYdX | 0% |
安全风险
对 DeFi 协议的风险:
-
价格预言机操纵:用闪电贷操纵链上 DEX 价格,影响依赖 AMM 价格的协议
- 防护:使用 Chainlink 或 TWAP 预言机,而非 AMM 即时价格
-
治理攻击:借入大量治理代币,在单笔交易内提案+投票+执行
- 防护:治理快照需要提前多个区块
-
重入攻击配合:放大重入攻击的规模
开发自己的协议时:
- 假设攻击者可以免费获得任意数量的任何代币
- 不要依赖
token.balanceOf(address(this))作为权限检查
深入阅读
- Aave 闪电贷文档
- Uniswap V3 Flash 文档
- MEV 基础 —— 闪电贷与 MEV 的关系
- 借贷协议 —— DeFi 借贷基础