---
title: "使用 Aave 创建闪电贷"
description: "定义、用途与开发者演练"
---

## 简介

在本教程中，我们将：

- 创建并部署一个 Flash loan 智能合约
- 通过名为 [Aave](https://aave.com/) 的流动性协议获得资金
- 与已部署的合约进行交易，执行一次 Flash loan

在开始之前，我们先来了解这个项目的各个组成部分：

## 什么是 Flash loan？

在传统金融中，借款人通常需要提供抵押物才能获得贷款。这种抵押物通常是汽车或房产等资产。银行使用这些抵押物作为担保，用以在借款人无法还款时弥补损失。

在[去中心化金融（DeFi）](https://www.alchemy.com/defi?a=af3d1feda6)的世界中，借款人可以通过使用 flash loan，在不提供抵押物的情况下获得贷款。

在 flash loan 中，贷方可以在同一笔交易中向借款人放款并收回还款。这之所以可能，是因为一笔交易从发起到最终被提交到区块链上的某个区块之间存在时间差。

以下是 flash loan 的执行步骤：

1. 借款人执行 Flash loan 智能合约

2. Flash loan 合约向流动性池请求一笔贷款金额

3. 合约使用贷款资金执行预先定义的操作（例如在交易所进行交易）

4. 操作完成后，借出的资金被归还给流动性池

5. 该交易被提交到区块链上

智能合约让我们可以验证以下几点：

- flash loan 拥有执行合约中操作所需的资金。
- 在交易被添加到新区块之前，操作已经完成
- 这些操作不会导致借款人资金损失。
- 借贷池收到了正确金额的还款，外加使用该协议的一笔交易手续费。

只要贷方能收回正确的借款金额，借款人可以用这笔资金做任何事情。Flash Loan 的一些常见用例有：

- _套利交易_ - 将某代币从一个交易所转移到价格更高的另一个交易所，以此获利

- _抵押品置换_ - 将已抵押贷款中的代币兑换为另一种代币，作为现有贷款的抵押品

- _自我清算_ - 通过兑换代币来偿还已抵押的贷款，并归还 flash loan

在 flash loan 合约执行之前，该合约需要先获得资金。Flash loan 的资金通常来自一个主要的借贷协议——[Aave](https://www.alchemy.com//blog/alchemy-x-aave-customer-story)。

Flash loan 的运作机制由于不需要任何抵押物，使借款变得容易。但这一特性也可能被攻击者利用，发起 flash loan 攻击。Flash loan 攻击是指借款人借入一定资金，操纵资产价格，然后以高额利润归还所借资产的行为。这通常是通过攻破价格[预言机](https://www.alchemy.com/overviews/what-is-an-oracle)，或在市场中制造人为的价格波动来实现的。选择像 [Chainlink](https://openzeppelin.com/) 这样的去中心化预言机，以及通过 [OpenZepplin](https://remix.ethereum.org/) 等服务对智能合约进行审计，是防范此类攻击的措施。

## 什么是 Aave？

在传统贷款中，资金由银行提供。而在 DeFi 中，[Aave](https://www.alchemy.com/dapps/aave) 协议是 flash loan 最大的资金来源。Aave 允许用户向 [ERC20](https://www.alchemy.com/overviews/erc20-solidity) 代币的流动性池提供资金。借款人随后可以使用这些资金池获得贷款。根据贷款类型的不同，借款人需支付一定的利率，这部分利息将支付给提供代币的供应方。目前 Aave 协议还会收取 0.09% 的交易手续费。

我们来看看这些概念是如何组合在一起构成一次 flash loan 的：

## 前置条件

- 可以访问 [Remix IDE](https://remix.ethereum.org/)

- 已创建 [Metamask 钱包](https://metamask.io/download/)

- 可以访问 [Github Gists - 智能合约代码](https://remix.ethereum.org/)

### 获取智能合约代码

1）在 [Remix IDE](https://www.alchemy.com/dapps/remix) 中打开一个新的工作区。

2）在另一个标签页中打开 Github Gists，[点击这里](https://gist.github.com/DappaDanDev/3f4d8247b505f6226b0be04853696a50)。其中包含我们将用来创建 flash loan 的智能合约代码。

3）在 Remix IDE 中按照下面精确的命名创建新的合约文件，并将对应文件（共 6 个）中的代码复制粘贴进去：

- Flashloan.sol

- FlashloanRecieverBase.sol

- IFlashLoanReciever.sol

- ILendingPool.sol

- ILendingPoolAnddressesProvider.sol

- Withdrawable.sol

<ImageBlock
  src="https://media.alchemy.com/1703766807-new-contract-files-in-remix-ide.png"
  alt="Remix IDE 中新建的合约文件"
  width={316}
  height={140}
/>

### 关于这些合约

_Flashloan.sol_ - 这是 flash loan 智能合约。它包含一个 ExecuteOperation 函数，该合约会调用这个函数来完成使用贷款资金的操作。

_FlashLoanRecieverBase.sol / IFlashLoanReciever.sol_ - 这使得合约能够接收 flash loan 的资金

_ILendingPool.sol / ILendingPoolAddressProvider.sol_ - 指向为 flash loan 提供资金的 Aave 借贷池

_Withdrawable.sol_ - 允许其他合约在资金错误或卡住的情况下，从该合约中提取资金

‍

### 向钱包中添加资金

我们将使用 Kovan 测试网络来部署并执行我们的 flash loan 合约。为此，我们需要在钱包中准备好资金：

1. 前往 [https://faucets.chain.link/kovan](https://faucets.chain.link/kovan)

2. 输入你的钱包地址：

- [如何获取你的钱包地址](https://metamask.zendesk.com/hc/en-us/articles/360015289512-How-to-copy-your-MetaMask-account-public-address-)

- 在你的 Metamask 钱包中选择 Kovan 网络

<ImageBlock
  src="https://media.alchemy.com/1703767058-kovan-network-metamask-wallet.png"
  alt="MetaMask 钱包中的 Kovan 网络"
  width={356}
  height={133}
/>

3. 确保选择 .1 Test Eth

<ImageBlock
  src="https://media.alchemy.com/1703767106-test-eth.png"
  alt="Chainlink Kovan 水龙头表单：申请 0.1 个测试 ETH"
  width={962}
  height={219}
/>

4. 等待代币转账确认完成

5. 资金应已添加到你的 Metamask 钱包中

‍

### 部署合约

现在我们的钱包中已经有了一些资金，接下来需要将智能合约部署到 Kovan 测试网上，以便我们可以对其执行交易并进行交互。

1）在 Remix 侧边栏中前往 [Solidity](https://www.alchemy.com/overviews/solidity) 编译器

<ImageBlock
  src="https://media.alchemy.com/1703767143-remix-side-panel.png"
  alt="Remix 侧边栏中的 Solidity 编译器"
  width={48}
  height={39}
/>

2）使用以下设置：

Compiler: 0.6.6\+comitt.6c…

Language: Solidity

EVM Version: Default

Compile Flashloan.sol

<ImageBlock
  src="https://media.alchemy.com/1703767171-solidity-compiler.png"
  alt="用于编译 Flashloan.sol 的 Remix Solidity 编译器设置"
  width={310}
  height={584}
/>

4）点击 “Compile” - 如果操作正确，可能会收到一些警告，但不会有错误

‍

编译完 flash loan 智能合约后，我们需要将其部署：

1）前往 “Deploy and Run Transactions” 标签页

<ImageBlock
  src="https://media.alchemy.com/1703767202-deploy-and-run-transactions-tab.png"
  alt="Remix 侧边栏中 Deploy and Run Transactions 标签的图标"
  width={43}
  height={37}
/>

2）使用以下设置：

**Environment:** Injected Web3

**Account**：复制粘贴你的 Kovan 钱包地址

**Contract:** Flashloan - contracts/Flashloan

<ImageBlock
  src="https://media.alchemy.com/1703767238-deploy-and-run-transactions.png"
  alt="选中 Injected Web3 环境的 Remix Deploy and Run Transactions 面板"
  width={302}
  height={573}
/>

3）将借贷池合约地址作为 _addressProvider: 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5 填入。这是 Aave 借贷提供方的地址。你可以在[这里](https://docs.aave.com/developers/v/1.0/deployed-contracts/deployed-contract-instances)找到其他合约地址。‍

<ImageBlock
  src="https://media.alchemy.com/1703769249-address-provider.png"
  alt="Remix 部署面板：将 Aave 借贷池地址填入 address_addressProvider"
  width={281}
  height={52}
/>

4）点击 “Deploy”

5）Metamask 会弹出窗口，让你 “Confirm” 交易。在终端中，你会看到查看该交易的 etherscan 链接。

<ImageBlock
  src="https://media.alchemy.com/1703769328-etherscan-transaction.png"
  alt="Remix 终端中显示合约部署交易的 Etherscan 链接"
  width={1061}
  height={75}
/>

 

### 向 flash loan 添加资金

我们的智能合约现已部署到 Kovan 测试网络。接下来我们需要从 Aave 的测试网借贷池向该合约添加资金。

1. 前往此页面：[https://staging.aave.com/?marketName=proto_kovan](https://staging.aave.com/?marketName=proto_kovan)

2. 连接你的 Metamask 钱包

3. 确保你使用的是 “Kovan Ethereum Market”。会有一个小小的 “K” 标记

<ImageBlock
  src="https://media.alchemy.com/1703767318-kovan-ethereum-market.png"
  alt="Aave 市场选择器中显示 Kovan Ethereum Market"
  width={470}
  height={54}
/>

**注意**：你可能需要在设置中开启 “Testnet mode”。

<ImageBlock
  src="https://media.alchemy.com/1703767345-testnet-mode.png"
  alt="Aave 设置菜单中启用的 Testnet 模式开关"
  width={258}
  height={243}
/>

4. 点击 “Assets to supply” 下方的 “Supply” 按钮，向 Aave 提供一些 Test Eth。我们可以先从 .001 开始。

<ImageBlock
  src="https://media.alchemy.com/1703767377-assets-to-supply.png"
  alt="Aave Assets to supply 面板：点击 Supply 按钮供应测试 ETH"
  width={747}
  height={346}
/>

5. 然后点击 DAI 旁边的 “Borrow” 按钮，借入一些 DAI。借入 10 DAI。

<ImageBlock
  src="https://media.alchemy.com/1703767451-borrow-dai.png"
  alt="Aave 借款面板：点击 DAI 旁边的 Borrow 按钮"
  width={739}
  height={101}
/>

6. Metamask 会弹出确认交易的窗口，交易完成后，DAI 就会出现在你的钱包中：

<ImageBlock
  src="https://media.alchemy.com/1703767494-metamask-transaction.png"
  alt="MetaMask 钱包余额中显示的借入 DAI 与 ETH"
  width={355}
  height={214}
/>

7. 如果这是你第一次收到 DAI，你需要设置钱包，才能在其中看到 DAI。

- 在 Metamask 中前往 “Import Tokens”

<ImageBlock
  src="https://media.alchemy.com/1703767533-metamask-import-tokens.png"
  alt="MetaMask 菜单中用于添加 DAI 的 Import Tokens 选项"
  width={181}
  height={63}
/>

- 输入 Kovan 上的 DAI 合约地址：0xFf795577d9AC8bD7D90Ee22b6C170349

 8. 当你钱包中有 DAI 后，向你部署的合约发送 10 DAI。你可以从 Remix 中复制你已部署合约的地址：

<ImageBlock
  src="https://media.alchemy.com/1703767579-deployed-contract-address.png"
  alt="Remix 已部署合约面板：复制闪电贷合约地址"
  width={300}
  height={97}
/>

然后使用 Metamask 将其发送到该地址：

<ImageBlock
  src="https://media.alchemy.com/1703767612-send-tokens-metamask.png"
  alt="MetaMask 发送界面：将 DAI 转入已部署的闪电贷合约"
  width={354}
  height={380}
/>

### 执行 flash loan 合约

现在我们需要调用 Aave 在 Kovan 测试网上的 DAI 合约，以指明我们将使用哪种资产来执行该智能合约。

1. 回到 Remix IDE 的 “Deploy & Run Transactions” 标签页

2. 在 “Deployed Contracts” 下，你会看到你的 flash loan 及合约地址

<ImageBlock
  src="https://media.alchemy.com/1703767645-flash-loan-and-contract-address.png"
  alt="Deployed Contracts 中的闪电贷合约及其地址"
  width={288}
  height={338}
/>

3. 找到标签 “flashloan” 旁边名为 “address asset” 的文本输入框

<ImageBlock
  src="https://media.alchemy.com/1703767698-flashloan.png"
  alt="flashloan 按钮旁的 Remix 地址输入框"
  width={274}
  height={43}
/>

4. 在 address_asset 字段中输入该合约地址：0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD 。然后点击 flashloan 标签按钮，开始交易。

5. 这将启动 flash loan 流程，并在 etherscan 上生成 3 笔交易。

<ImageBlock
  src="https://media.alchemy.com/1703767729-flashloan-process.png"
  alt="闪电贷流程中 Etherscan 上的 3 笔交易"
  width={947}
  height={138}
/>

第一笔交易是从借贷池转到我们的 flash loan 合约。由于我们没有在智能合约中加入任何操作，这笔金额会连同额外的手续费一起返还给借贷池。最后一笔交易是所借金额产生的利息，将支付给流动性池的供应方。
