コンテンツへスキップ
0%

Aaveを使ったフラッシュローンの作成

Alchemy team headshot

執筆者 Alchemy

2022年4月7日 公開読了時間 2 分

Introduction

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

  • Flash loanスマートコントラクトの作成とデプロイ
  • 流動性プロトコルAaveによる資金の受け取り
  • デプロイしたコントラクトとのトランザクションによるFlash loanの実行

始める前に、このプロジェクトを構成する各要素を見ていきましょう。

Flash loanとは

伝統的な金融では、借り手はローンを受けるために担保を提供する必要がある場合が多くあります。この担保は通常、車や住宅などの資産の形をとります。銀行はこの担保を、借り手が返済できなかった場合の損失を補填するための担保として利用します。

分散型金融(DeFi)の世界では、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から供給されます。

Flash loanの仕組みは、担保を必要としないため、容易な借り入れを可能にします。この特性は同時に、Flash loan攻撃を行う攻撃者にも利用され得ます。Flash loan攻撃とは、借り手が資金を借り、資産の価格を操作し、その後借りた資産を自分に有利な形で大きな利益とともに返済する攻撃です。これは通常、価格を提供するoracleを侵害するか、市場に人為的な値動きを作り出すことで行われます。Chainlinkのような分散型oracleを選ぶことや、OpenZepplinのようなサービスを通じてスマートコントラクトの監査を行うことが、こうした攻撃を防ぐための対策となります。

Aaveとは

伝統的なローンでは、銀行が資金を提供します。DeFiでは、AaveプロトコルがFlash loanの最大の資金源です。Aaveでは、ユーザーがERC20トークンの流動性プールに資金を供給できます。借り手はこれらのプールを利用してローンを受けることができます。ローンの種類に応じて、借り手は金利を支払い、これは供給者が供給したトークンに対する利息として供給者に渡ります。現在、Aaveプロトコルは0.09%のトランザクション手数料も課しています。

これらの概念がどのように組み合わさってFlash loanを構成するのか、見ていきましょう。

必要なもの

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

1)Remix IDEで新しいワークスペースを開きます。

2)別のタブで、こちらのGithub Gistsを開きます。ここには、今回作成するFlash loanで使用するスマートコントラクトコードが含まれています。

3)Remix IDEで、以下の名前と正確に一致する新しいコントラクトファイルを作成し、それぞれのファイルに対応するコードをコピー&ペーストします(6個)。

  • Flashloan.sol

  • FlashloanRecieverBase.sol

  • IFlashLoanReciever.sol

  • ILendingPool.sol

  • ILendingPoolAnddressesProvider.sol

  • Withdrawable.sol

Remix IDE内の新しいコントラクトファイル

各コントラクトについて

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にアクセスします

  2. ウォレットアドレスを入力します

Metamaskウォレットで選択されたKovanネットワーク
  1. .1 Test Ethを選択してください
Chainlink Kovan faucetのフォーム:0.1 test ETHをリクエストしている画面
  1. トークンの転送が完了したという確認を待ちます

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

コントラクトのデプロイ

ウォレットに資金が入ったので、次はスマートコントラクトをKovan Testnetにデプロイし、実行および操作できるようにします。

1)Remix内のサイドパネルにあるSolidityCompilerに移動します

Remix内のサイドパネルにあるSolidity Compiler

2)以下の設定を使用します。

Compiler: 0.6.6+comitt.6c…

Language: Solidity

EVM Version: Default

Flashloan.solをコンパイルする

Flashloan.solのコンパイル用RemixのSolidityコンパイラ設定

4)「Compile」をクリックします - 正常に完了すると、いくつかの警告が出ることがありますが、エラーは出ません

Flash loanスマートコントラクトのコンパイル後、次にデプロイを行います。

1)「Deploy and Run Transactions」タブに移動します

Deploy and Run Transactionsタブを示すRemixサイドバーのアイコン

2)以下の設定を使用します。

Environment: Injected Web3

Account: Kovanウォレットアドレスをコピー&ペーストします

Contract: Flashloan - contracts/Flashloan

Injected Web3環境が選択されたRemixのDeploy and Run Transactionsパネル

3)Lending Pool Contractをaddress_addressProviderとして追加します:0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5 。これはAaveの貸付プロバイダのアドレスです。他のコントラクトアドレスはこちらで確認できます。‍

Remixのデプロイパネル:Aave貸付プールのアドレスをaddress_addressProviderとして入力

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

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

コントラクトデプロイのトランザクションに対するEtherscanのリンクを表示するRemixターミナル

Flash loanへの資金の追加

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

  1. 以下のページにアクセスします:https://staging.aave.com/?marketName=proto_kovan

  2. Metamaskウォレットを接続します

  3. 'Kovan Ethereum Market'を使用していることを確認してください。小さな'K'の表示があります

Kovan Ethereum Marketを示すAaveのマーケットセレクター

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

Testnet modeのトグルが有効になっているAaveの設定メニュー
  1. 'Assets to supply'の下にある「Supply」ボタンをクリックして、test EthをAaveに供給します。.001から始められます
Supplyボタンでtest ETHを供給するAaveのAssets to supplyパネル
  1. 次に、DAIの隣にある「Borrow」ボタンをクリックしてDAIを借ります。10 DAIを借りてください。
DAIの隣にあるBorrowボタンをクリックするAaveの借入パネル
  1. Metamaskが開き、トランザクションの確認を求められます。トランザクションが完了すると、DAIがウォレットに表示されます。
借り入れたDAIとETHの残高を示すMetaMaskウォレット
  1. 初めてDAIを受け取る場合は、ウォレットでDAIを表示できるように設定する必要があります。
  • Metamask内の「Import Tokens」に移動します
DAIを追加するためのImport TokensオプションがあるMetaMaskメニュー
  • KovanのDAIコントラクトアドレスを入力します:0xFf795577d9AC8bD7D90Ee22b6C170349
  1. ウォレットにDAIが入ったら、デプロイしたコントラクトに10 DAIを送金します。デプロイしたコントラクトのアドレスは、Remixからコピーして取得できます。
Flash loanコントラクトアドレスをコピーするRemixのデプロイ済みコントラクトパネル

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

デプロイしたFlash loanコントラクトへDAIを送金するMetaMaskの送金画面

Flash loanコントラクトの実行

次に、スマートコントラクトの実行に使用するアセットを指定するため、AaveのKovan Testnet DAIコントラクトを呼び出す必要があります。

  1. Remix IDEに戻り、「Deploy & Run Transactions」タブに移動します

  2. 'Deployed Contracts'の下に、Flash loanとコントラクトアドレスが表示されます

Deployed Contracts'のFlash loanとコントラクトアドレス
  1. 'flashloan'ラベルの隣にある、「address asset」とラベルの付いたテキストフィールドに移動します
flashloanボタンの隣にあるRemixのaddress asset入力フィールド
  1. address_assetフィールドにこのコントラクトアドレスを入力します:0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD 。その後、flashloanラベルボタンをクリックしてトランザクションを開始します。

  2. これによりFlash loanのプロセスが開始され、etherscan上に3件のトランザクションが生成されます。

Flash loanプロセスにおけるetherscan上の3件のトランザクション

最初のトランザクションは、貸付プールから私たちのFlash loanコントラクトへのものです。スマートコントラクトに操作を含めなかったため、その金額に手数料を加えた額が貸付プールへ返済されます。最後のトランザクションは、借りた金額に対する利息であり、流動性プールの供給者へと渡ります。

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。