闪电贷:你需要知道的一切

闪电贷:你需要知道的一切

闪电贷是独特的金融产品,仅在 DeFi 中可用。这篇博客文章将教你什么是闪电贷,它是如何运作的,以及它可以用于什么。

闪电贷是一种无抵押贷款,借款人必须在同一笔区块链交易中偿还资产。

或者,用更简单的方式描述:闪电贷允许你借一百万美元,只要你立即归还。

Abstract iIllustration describing how a flash loan works on in a very general, humorous way.

在现实世界的背景下,这似乎相当愚蠢。然而,智能合约使得这些类型的贷款可以用来完成很多事情。在本文中,我们将描述:

  1. 什么是闪电贷?
  2. 闪电贷如何运作
  3. 闪电贷的用途 / 闪电贷用于什么
  4. 如何使用它们,附代码示例
  5. 闪电贷的安全性考虑

什么是闪电贷?

闪电贷是无担保(无抵押)的贷款,借款人必须在同一笔交易中将整个贷款偿还给贷方。它们是独特的金融产品,仅在 DeFi 世界中可用,因为智能合约可以强制用户立即偿还贷款。相比之下,传统金融中不存在这样的原语。像 AaveDyDx这样的 DeFi 协议支持闪电贷。人们认为像 MakerDAO 和 Uniswap 这样的协议也支持闪电贷,但从技术上讲,它们是“闪电铸造”,非常相似。

通过了解闪电贷的工作原理,更容易理解闪电贷。让我们深入了解。

闪电贷如何运作?

Diagram illustrating the mechanics of a flash loan including the deposit, the contract, asset movement, fee, and contract.

闪电贷的机制相当简单。以下是一个 USDC( 美元挂钩稳定币 )的闪电贷示例,从头到尾:

  1. 一个贷方(上图中的 Whale)决定他们想要借出$1,000 USDC。
    1. 他们将$1,000 存入一个具有闪电贷代码的智能合约中。
    2. 他们听说每次有人使用他们的钱进行闪电贷时,他们都会得到报酬,他们想要得到报酬。
  2. 一个用户(上图中的 MetaMask)决定他们想要进行闪电贷(见下文了解原因)。
  3. 在单笔交易中,用户(MetaMask)调用智能合约上的flashloan函数,该函数执行以下操作,要么“全部执行”,要么“完全不执行”:
    1. 用户(Metamask)获得$1,000 USDC
    2. 他们用它做任何他们想做的事情(再次强调,仍在同一笔交易中)
    3. 然后,他们偿还$1,000 加上一小笔费用

就是这样。

原子交易

所有区块链交易都是原子的,所谓原子是因为要么全部发生,要么完全不发生。这一特性也适用于flashloans,所有闪电贷都是原子的。在这种情况下,原子意味着如果用户没有立即偿还贷款,他们根本没有获得贷款。

听起来像魔法,对吧?让我们看看一些伪 Solidity 代码来解释它。

function flashLoan(uint256 amount) external {
        uint256 balanceBefore = token.balanceOf(address(this));

        token.transfer(msg.sender, amount);
        // Ignore IFlashLoanReceiver for this pseudo-code
        IFlashLoanReceiver(msg.sender).execute();

        if (token.balanceOf(address(this)) < balanceBefore) {
            revert RepayFailed();
        }
    }

调用flashloan函数的用户实际上会调用一个在智能合约中看起来像这样的函数。如果代码触及revert行,整个交易将不会成功或完成,这意味着用户根本没有借到钱!

智能合约的工作原理是:每当触及revert语句时,区块链会自动将所有状态更改从交易直接恢复到其原始状态。

  • 你给自己打印了$1,000,000,000 但触及了 revert 行?→ 你什么都没打印
  • 你做了一笔终生难得的交易但触及了 revert?→ 你不是Keith Gill
  • 你给失散多年的亲戚发送了一条链上消息,终于在多年疏远后重新联系,这是你唯一的机会,但触及了 revert?→ 悲剧总是成双成对

闪电贷 EIP-3156 - 技术细节

更深入地说,大多数 EVM 社区遵循 EIP-3156 标准来支持闪电贷功能。在闪电贷兼容合约中,最重要的函数看起来像这样:

/**
   * @dev Initiate a flash loan.
   * @param receiver The receiver of the tokens in the loan, and the receiver of the callback.
   * @param token The loan currency.
   * @param amount The amount of tokens lent.
   * @param data Arbitrary data structure, intended to contain user-defined parameters.
   */
function flashLoan(
    IERC3156FlashBorrower receiver,
    address token,
    uint256 amount,
    bytes calldata data
) external returns (bool);

通常, 外部拥有钱包 (即非智能合约钱包,即我们图中的 Metamask)不会是此类函数调用中的receiver。相反,闪电贷合约会将借来的代币发送到另一个智能合约,该合约通常具有“执行”操作的功能。

Diagram of a flash loan and how it interacts with the core contract, the receiver's contract, and replayment.

下面,我们将扩展用户的接收合约可能会做什么。

闪电贷如何使用?它们的用途是什么?

在实践中,闪电贷通常用于类似于常规贷款的原因。最常见的是“获得杠杆”或资本用于以下机会:

  1. 套利
  2. 清算
  3. 抵押品交换
  4. 其他MEV

我们不会详细介绍所有这些,但我们建议你深入了解每一个。我们将解释闪电贷套利,因为它是闪电贷使用的最强大可视化之一。

什么是套利?

套利是一种金融策略,利用不同市场中同一资产的价格差异。想象一下,eBay 和 Amazon(在线转售商)以 5 美元的价格出售苹果,而 Alibaba(另一个在线转售商)以 1 美元的价格出售。如果你有 100 美元,赚钱的简单方法是什么?

  1. 在阿里巴巴上购买 100 个苹果(\$1 每个苹果 * 100 个苹果 = $100 成本)
  2. 在 eBay 和亚马逊上卖掉这 100 个苹果(100 个苹果 * \$5 每个苹果 = \$500 利润)
  3. 你刚刚赚了\$400!(\$500 利润 - \$100 成本)

这种类型的金融策略几乎存在于世界上的每个市场,但利润率通常非常微薄。

在 DeFi 中,这种机会存在于像 Uniswap 这样的去中心化交易所。

Diagram illustrating how arbitrage works.

现在,让我们用 \$1 和 \$5 的苹果来看看这个相同的场景。我们只花了 \$100 买苹果,因为那是我们所有的钱,但如果我们有更多的钱,我们可以赚更多的利润。这就是闪电贷的用武之地。

闪电贷套利

让我们再来看看上述场景,但想象一下我们可以在先获得闪电贷后进行。

  1. 我们从一个闪电贷合约中借了 \$1,000 并开始交易。
    1. 记住,我们必须在同一笔交易中偿还!
    2. 因此,在同一笔交易中,我们用 \$1,000 从阿里巴巴购买了 1,000 个苹果。
    3. 然后我们立即以 \$5,000 的价格在亚马逊和 eBay 上卖掉这 1,000 个苹果,赚了\$5,000!
    4. 然后,我们偿还了最初从闪电贷中借的 \$1,000。由于贷款已偿还,交易不会回滚!(通常,你还需要支付一小笔费用,可能是$1。)
  2. 最后,交易结束,我们净赚 \$4,000(减去小额费用),而不是\$400!
    1. \$5,000 的销售额 - \$1,000 偿还给闪电贷合约
  3. 而我们做到这一切都不需要自己的资金!

这就是闪电贷的力量。任何人,无需抵押品,都可以利用套利机会。

Diagram illustrating how arbitrage works with flash loans.

通过 Cyfrin Updraft 的闪电贷课程示例套利 闪电贷安全课

Patrick 的备注

我喜欢闪电贷的一个原因是它们平衡了金融竞争环境。如果一个小投资者,或者正在阅读这篇文章的你,在传统金融中发现了一个惊人的套利机会,他们永远无法像资金雄厚的机构那样做得好,因为机构有更多的资金!但在 DeFi 中,由于闪电贷的存在,每个人都可以获得与大型对冲基金相同的资源!至少在单笔交易中是这样。

如何使用闪电贷

要使用闪电贷,你必须:

  1. 找到一个兼容闪电贷并且有流动性(即代币)的智能合约。这些通常可以在像 Aave、dydx 等平台上找到,
  2. 构建一个receiver合约以在闪电贷期间执行你想要的操作
  3. 确保你的receiver在最后偿还全额贷款。

Cyfrin Updraft Security and Auditing 课程中,我们会讲解闪电贷及其使用方法,因为它们对于理解价格 Oracle 操纵攻击至关重要(稍后会详细介绍)。

要使用 Foundry 运行一个闪电贷测试脚本并查看其端到端的工作原理,你可以在这里进行测试 ,然后运行:

    forge test --mt testFlashLoanBreaksIt

这个具体的例子还会向你展示如何利用闪电贷来利用安全漏洞!

安全考虑

闪电贷是 DeFi 开发者在设计项目时需要解决的最重要的考虑因素之一。

闪电贷只是一个工具/机制,用于利用代码库中的一个漏洞,而这个漏洞在历史上只有富有的用户/鲸鱼才能利用。由于闪电贷实际上“暂时让你变得富有”,它们使得资金不足的用户更容易利用传统上只有富人才能利用的漏洞。

涉及闪电贷的常见攻击向量之一是“ 价格 Oracle 操纵 ”攻击。这是当一个协议使用交易所的流动性来确定资产价格时,闪电贷使价格崩溃。你可以在我们的文章中阅读更多关于这些攻击的信息。

通常,人们错误地将漏洞归类为“闪电贷攻击”,而实际上它们更准确地被归类为“价格 Oracle 操纵”。

通常,作为一个协议或智能合约,防御此类攻击的简单方法是不使用去中心化交易所来获取定价信息!

总结

闪电贷是投资者最强大和最奇妙的工具之一,它们只在智能合约世界中才有可能。它们涉及在没有抵押品、信用或 KYC 的情况下暂时借出贷款,只要在同一笔交易中原子地偿还即可。闪电贷是一种可以用于套利、清算、抵押品交换和其他 MEV 机会的工具。在设计协议时,一定要考虑到闪电贷,否则可能会被利用!

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Patrick Collins
Patrick Collins
智能合约工程和安全爱好者