跳转到内容

闪电贷

闪电贷

本页内容正在整理中,欢迎贡献

概述

闪电贷(Flash Loan)是 DeFi 独有的金融原语:在同一笔交易中借入任意数量的资产,无需抵押,只要在交易结束前归还本金和手续费即可。如果无法归还,整笔交易会被 revert,借贷方零风险。

主要内容

闪电贷的工作原理

同一笔交易的原子性保证:
1. 用户调用 flashLoan()
2. 协议将资产转给用户合约
3. 调用用户合约的回调函数 onFlashLoan()
4. 用户在回调中执行套利/清算/其他操作
5. 用户合约还款(本金 + 手续费)
6. 协议验证余额
7a. 余额充足 → 交易成功
7b. 余额不足 → 整笔交易 revert(零风险)

Aave V3 闪电贷实现

// SPDX-License-Identifier: MIT
pragma 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 V30.05%
Aave V20.09%
Uniswap V3池手续费(0.01%/0.05%/0.3%/1%)
dYdX0%

安全风险

对 DeFi 协议的风险:

  1. 价格预言机操纵:用闪电贷操纵链上 DEX 价格,影响依赖 AMM 价格的协议

    • 防护:使用 Chainlink 或 TWAP 预言机,而非 AMM 即时价格
  2. 治理攻击:借入大量治理代币,在单笔交易内提案+投票+执行

    • 防护:治理快照需要提前多个区块
  3. 重入攻击配合:放大重入攻击的规模

开发自己的协议时:

  • 假设攻击者可以免费获得任意数量的任何代币
  • 不要依赖 token.balanceOf(address(this)) 作为权限检查

深入阅读