---
title: "Aaveを使ったフラッシュローンの作成"
description: "定義、用途、開発者向けウォークスルー"
---

## Introduction

このチュートリアルでは、以下を行います。

- 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攻撃とは、借り手が資金を借り、資産の価格を操作し、その後借りた資産を自分に有利な形で大きな利益とともに返済する攻撃です。これは通常、価格を提供する[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ウォレット](https://metamask.io/download/)の作成

- [Github Gists - スマートコントラクトコード](https://remix.ethereum.org/)へのアクセス

### スマートコントラクトコードの取得

1）[Remix IDE](https://www.alchemy.com/dapps/remix)で新しいワークスペースを開きます。

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_ - 資金が誤って送金された、または動かせなくなった場合に、他のコントラクトがこのコントラクトから資金を引き出せるようにします

‍

### ウォレットへの資金の追加

Flash loanコントラクトのデプロイと実行には、Kovanテストネットワークを使用します。これを正常に行うには、ウォレットに資金が必要です。

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 faucetのフォーム：0.1 test ETHをリクエストしている画面"
  width={962}
  height={219}
/>

4. トークンの転送が完了したという確認を待ちます

5. Metamaskウォレットに資金が追加されているはずです

‍

### コントラクトのデプロイ

ウォレットに資金が入ったので、次はスマートコントラクトを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

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="Deploy and Run Transactionsタブを示すRemixサイドバーのアイコン"
  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貸付プールのアドレスをaddress_addressProviderとして入力"
  width={281}
  height={52}
/>

4）「Deploy」をクリックします

5）Metamaskがポップアップし、トランザクションを「Confirm」するよう求められます。ターミナル内に、トランザクションをetherscanで確認するためのリンクが表示されます。

<ImageBlock
  src="https://media.alchemy.com/1703769328-etherscan-transaction.png"
  alt="コントラクトデプロイのトランザクションに対するEtherscanのリンクを表示するRemixターミナル"
  width={1061}
  height={75}
/>



### Flash loanへの資金の追加

これで、スマートコントラクトがKovan Testnetにデプロイされました。次に、Aaveのtestnet貸付プールからコントラクトへ資金を追加する必要があります。

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="Kovan Ethereum Marketを示すAaveのマーケットセレクター"
  width={470}
  height={54}
/>

**注**：設定で「Testnet mode」を有効にする必要がある場合があります。

<ImageBlock
  src="https://media.alchemy.com/1703767345-testnet-mode.png"
  alt="Testnet modeのトグルが有効になっているAaveの設定メニュー"
  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="Supplyボタンでtest ETHを供給するAaveのAssets to supplyパネル"
  width={747}
  height={346}
/>

5. 次に、DAIの隣にある「Borrow」ボタンをクリックしてDAIを借ります。10 DAIを借りてください。

<ImageBlock
  src="https://media.alchemy.com/1703767451-borrow-dai.png"
  alt="DAIの隣にあるBorrowボタンをクリックするAaveの借入パネル"
  width={739}
  height={101}
/>

6. Metamaskが開き、トランザクションの確認を求められます。トランザクションが完了すると、DAIがウォレットに表示されます。

<ImageBlock
  src="https://media.alchemy.com/1703767494-metamask-transaction.png"
  alt="借り入れたDAIとETHの残高を示すMetaMaskウォレット"
  width={355}
  height={214}
/>

7. 初めてDAIを受け取る場合は、ウォレットでDAIを表示できるように設定する必要があります。

- Metamask内の「Import Tokens」に移動します

<ImageBlock
  src="https://media.alchemy.com/1703767533-metamask-import-tokens.png"
  alt="DAIを追加するためのImport TokensオプションがあるMetaMaskメニュー"
  width={181}
  height={63}
/>

- KovanのDAIコントラクトアドレスを入力します：0xFf795577d9AC8bD7D90Ee22b6C170349

 8. ウォレットにDAIが入ったら、デプロイしたコントラクトに10 DAIを送金します。デプロイしたコントラクトのアドレスは、Remixからコピーして取得できます。

<ImageBlock
  src="https://media.alchemy.com/1703767579-deployed-contract-address.png"
  alt="Flash loanコントラクトアドレスをコピーするRemixのデプロイ済みコントラクトパネル"
  width={300}
  height={97}
/>

その後、Metamaskを使ってそのアドレスに送金します。

<ImageBlock
  src="https://media.alchemy.com/1703767612-send-tokens-metamask.png"
  alt="デプロイしたFlash loanコントラクトへDAIを送金するMetaMaskの送金画面"
  width={354}
  height={380}
/>

### Flash loanコントラクトの実行

次に、スマートコントラクトの実行に使用するアセットを指定するため、AaveのKovan Testnet 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のaddress asset入力フィールド"
  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コントラクトへのものです。スマートコントラクトに操作を含めなかったため、その金額に手数料を加えた額が貸付プールへ返済されます。最後のトランザクションは、借りた金額に対する利息であり、流動性プールの供給者へと渡ります。
