---
title: "使用 Aave 建立 flash loan"
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 攻擊。所謂 flash loan 攻擊，是指借款人借入資金、操縱資產價格，然後以大幅獲利的方式歸還借入的資產。這通常是透過入侵報價 [oracle](https://www.alchemy.com/overviews/what-is-an-oracle) 或在市場上製造人為波動來達成。選擇像 [Chainlink](https://openzeppelin.com/) 這樣的去中心化 oracle，並透過像 [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 Wallet](https://metamask.io/download/)

- 存取 [Github Gists - 智慧合約程式碼](https://remix.ethereum.org/)

### 取得智慧合約程式碼

1）在 [Remix IDE](https://www.alchemy.com/dapps/remix) 中開啟一個新的 workspace。

2）在另一個分頁中，開啟 [這裡](https://gist.github.com/DappaDanDev/3f4d8247b505f6226b0be04853696a50) 的 Github Gists。裡面包含我們用來建立 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 Test Network 來部署並執行 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 Wallet 中選擇 Kovan Network

<ImageBlock
  src="https://media.alchemy.com/1703767058-kovan-network-metamask-wallet.png"
  alt="Metamask Wallet 上的 Kovan Network"
  width={356}
  height={133}
/>

3. 確認選擇 .1 Test Eth

<ImageBlock
  src="https://media.alchemy.com/1703767106-test-eth.png"
  alt="Chainlink Kovan faucet 表單：請求 0.1 個測試 ETH"
  width={962}
  height={219}
/>

4. 等待代幣轉帳的確認

5. 資金應該已被加入你的 Metamask Wallet

‍

### 部署合約

現在我們的錢包裡有一些資金了，接下來要將智慧合約部署到 Kovan Testnet，以便我們可以執行並與其互動。

1）前往 Remix 側邊欄中的 [Solidity](https://www.alchemy.com/overviews/solidity) Compiler

<ImageBlock
  src="https://media.alchemy.com/1703767143-remix-side-panel.png"
  alt="Remix 側邊面板中的 Solidity Compiler"
  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 compiler 設定"
  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）將 Lending Pool Contract 加入為 address_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 lending pool 位址作為 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 Test Network 上。接下來我們需要從 Aave 的 testnet 借貸池為合約加入資金。

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

2. 連接你的 Metamask Wallet

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 mode 開關已啟用"
  width={258}
  height={243}
/>

4. 點擊「Assets to supply」下方的「Supply」按鈕，將一些 test Eth 供應給 Aave。我們可以先從 .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 borrow 面板：點擊 DAI 旁的 Borrow 按鈕"
  width={739}
  height={101}
/>

6. Metamask 會跳出視窗要求確認該筆交易，交易完成後 DAI 就會出現在你的錢包中：

<ImageBlock
  src="https://media.alchemy.com/1703767494-metamask-transaction.png"
  alt="MetaMask wallet 餘額顯示已借出的 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 deployed contracts 面板：複製 flash loan 合約位址"
  width={300}
  height={97}
/>

接著使用 Metamask 將其傳送到該地址：

<ImageBlock
  src="https://media.alchemy.com/1703767612-send-tokens-metamask.png"
  alt="MetaMask send 畫面：將 DAI 轉到已部署的 flash loan 合約"
  width={354}
  height={380}
/>

### 執行 flash loan 合約

現在我們需要呼叫 Aave 的 KovanTestnet 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 中的 flash loan 與合約位址"
  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="flash loan 流程中 etherscan 上的 3 筆交易"
  width={947}
  height={138}
/>

第一筆交易是從借貸池轉入我們的 flash loan 合約。由於我們沒有在智慧合約中加入任何操作，這筆金額會連同額外的手續費一起歸還給借貸池。最後一筆交易是借入金額所產生的利息，這筆利息會歸屬於流動性池的供應方。
