闪电贷是一种特殊的区块链交易,允许用户在无需提供任何抵押品的情况下借入资产,但借入的金额(加上手续费)必须在同一笔交易(也称为“单区块借贷”)结束前归还。由于其无抵押的特性,闪电贷在传统金融世界中并无直接对应的概念,理解它需要一些关于区块链区块状态管理的基础知识。
闪电贷是一个面向开发者的高级概念。要使用这一功能,您需要对以太坊虚拟机(EVM)、编程和智能合约有良好的理解。
闪电贷概述
闪电贷允许用户在一个交易内访问资金池的流动性(仅适用于已启用借贷的储备资产),只要在交易结束前归还所借金额及费用,或者(如果允许)通过开设债务头寸来结算。
Aave V3 提供了两种闪电贷选项:
- flashLoan():允许借款人在单笔闪电贷交易中访问多种储备资产的流动性。在这种情况下,借款人还可以选择以提供的抵押品或信用委托为支撑,开设可变利率的借贷头寸。
注意:对于经批准的闪电贷借款人(由 ACLManager 管理),闪电贷手续费会被免除。
- flashLoanSimple():允许借款人在交易中访问单一储备资产的流动性。在这种情况下,闪电贷手续费不会被免除,借款人也无法在交易结束时开设任何债务头寸。对于希望利用单一储备资产进行简单闪电贷操作的用户来说,此方法更具燃气效率。
执行流程
对开发者而言,在构建解决方案时,可以遵循以下心智模型:
- 您的合约调用 Pool 合约,使用
flashLoanSimple()或flashLoan()请求特定数量的某种或某几种储备资产的闪电贷。 - 经过一些完整性检查后,Pool 合约将所请求数量的储备资产转移至您的合约,然后调用接收者合约的
executeOperation()函数。 您的合约此时持有闪电贷获得的资产,并执行其代码中的任何任意操作。
- 如果您执行的是 flashLoanSimple,那么在您的代码执行完毕后,您需要授权 Pool 合约提取(approve)闪电贷金额 + 手续费。
- 如果您执行的是 flashLoan,那么对于所有储备资产,根据为该资产传递的
interestRateMode,要么必须授权 Pool 合约提取闪电贷金额 + 手续费,要么必须有足够的抵押品或信用委托来开设债务头寸。 - 如果应偿还的金额不足(由于余额不足、授权不足或抵押品不足无法负债),则整个交易将被回滚(revert)。
- 上述所有步骤均在1笔交易内完成(因此也在同一个以太坊区块内)。
闪电贷的应用场景
Aave 闪电贷已在 Aave V3 中用于流动性切换功能。其他实际应用案例包括:
- 套利交易:在不同资产之间进行套利,而无需自有本金来执行套利操作。
- 清算头寸:无需先偿还头寸的债务,即可清算借贷头寸,并利用折价获取的抵押品来偿付闪电贷金额 + 手续费。
如果您对如何利用这些高级策略进行套利或优化资金效率感兴趣,👉 可以查看实时工具和策略示例,深入了解市场机会。
闪电贷手续费
闪电贷手续费在部署时初始化为 0.05%,并可通过治理投票进行更新。使用 FLASHLOAN_PREMIUM_TOTAL 可以获取当前的总费用值。
闪电贷手续费可以在流动性提供者(LP)和协议国库之间共享。FLASHLOAN_PREMIUM_TOTAL 代表了借款人支付的总费用,其中:
- 支付给 LP 的费用:
FLASHLOAN_PREMIUM_TOTAL-FLASHLOAN_PREMIUM_TO_PROTOCOL - 支付给协议的费用:
FLASHLOAN_PREMIUM_TO_PROTOCOL
分步指南
1. 设置准备
接收闪电贷资金的合约必须通过实现相应的 executeOperation() 函数来符合 IFlashLoanSimpleReceiver 或 IFlashLoanReceiver 接口。
另请注意,由于应付金额将从您的合约中提取(pulled),您的合约必须授权(allowance)Pool 合约提取这些资金以偿还闪电贷本金 + 溢价。
2. 调用 flashLoan() 或 flashLoanSimple()
要调用 Pool 合约上的两种闪电贷方法之一,我们需要传入相关参数。您可以通过以下 3 种方式完成此操作:
- 从外部账户(EOA,即“普通”以太坊账户)调用
要使用 EOA,请向相关的 Pool 合约发送一笔交易,调用flashLoan()或flashLoanSimple()函数。有关参数详情,请参阅 Pool 文档,并确保使用您在步骤 1 中创建的合约地址作为receiverAddress参数。 - 从其他合约调用
与上述从 EOA 发送交易类似,确保receiverAddress是您在步骤 1 中的合约地址。 - 从同一个合约调用
如果您想使用与步骤 1 中相同的合约,请在闪电贷方法的receiverAddress参数中使用address(this)。
完成闪电贷
一旦您利用闪电贷获得的资产执行了您的逻辑(在您的 executeOperation() 函数中),如果您使用了 flashLoanSimple(),或者在 flashLoan() 中对 modes 参数中的任何资产使用了 interestRateModes = 0,您将需要偿还闪电贷资金。
偿还闪电贷资产
确保您的合约拥有足够的相关金额 + 溢价来偿还所借资产。您可以通过计算传入 executeOperation() 函数的 amounts 和 premiums 数组中相应条目之和来得到该金额。
您不需要将应付金额转移回 Pool 合约。资金将在您的操作结束时自动提取。
产生债务(即不立即偿还)
如果您最初在 modes 参数中对任何资产使用了 mode=1 或 mode=2,那么为 onBehalfOf 参数传递的地址将产生债务,前提是该 onBehalfOf 地址之前已授权 msg.sender 代表其产生债务。
这意味着您可以偿还部分资产,同时让其他资产产生债务。
常见问题
Q1: 什么是闪电贷?
闪电贷是一种无需抵押品的区块链借贷方式,允许用户在同一笔交易内借入并归还资产,只需支付少量手续费。其核心在于“使用即归还”,所有操作原子化完成,极大降低了风险。
Q2: 使用闪电贷需要什么条件?
使用者需要具备智能合约开发能力,能够部署实现特定接口的合约。同时,需要对 EVM、交易机制以及闪电贷的执行流程有清晰的理解。
Q3: 闪电贷的主要风险是什么?
主要风险在于智能合约的代码缺陷。如果合约中的逻辑(尤其是在 executeOperation 函数中)未能正确计算或预留足够的资金来偿还贷款+手续费,整个交易将失败,但用户仅损失燃气费,不会承受资产损失。
Q4: 闪电贷手续费是如何计算的?
手续费通常按贷款金额的固定比例收取(例如 Aave V3 初始为 0.05%)。总手续费(FLASHLOAN_PREMIUM_TOTAL)的一部分给流动性提供者,另一部分进入协议国库。
Q5: 普通用户(非开发者)能使用闪电贷吗?
通常不能。直接与闪电贷交互需要通过部署和调用智能合约来完成,这超出了普通用户的操作范围。但用户可能间接使用到基于闪电贷构建的应用程序(如某些DeFi聚合器)。
Q6: 除了套利和清算,闪电贷还有哪些潜在用途?
其他用途包括抵押品置换(快速将一种抵押品换成另一种)、债务再融资(以更低的利率重组债务)以及一些创新的代币互换和组合策略,这些都得益于其无需前置资本的特点。