フラッシュローン ~Aave V1とV2ではどう変わったか~

Yuya Sugano
16 min readFeb 23, 2021

--

2020年の総括としてフラッシュローンが利用されたDeFiハックの事件をここにまとめていました。年明けもフラッシュローンを使ったハックが旺盛に行われていますので、フラッシュローンネタを引き続きこすっていきたいと思います。昨年12月にAave V2がローンチされAaveプロトコルのフラッシュローンの仕組みが変更されています。いまさらですがAave V2で何の機能が変わったかと共にAave V2のフラッシュローンについてSolidityで確認してみました。フラッシュローンは本当に画期的発明ですね。以下で説明していますがAave V2はバッチフラッシュローンをサポートするようになりました。たくさんの種類のトークンのフラッシュローンを一挙にシングルトランザクションで放出できるようになっています。

Disclaimer

This article is not either an investment advice or a recommendation or solicitation to buy or sell any investment and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice or investment recommendations. The contents reflected herein are subject to change without being updated.

Image by PIRO4D from Pixabay

一応目次を作りました。

  • フラッシュローンとは(再掲
  • プロトコル別の相違点(再掲
  • Aave V1とAave V2の違い
  • Aave V2のフラッシュローン
  • Appendix

フラッシュローンとは

通常の金融の世界のローンとはお金などの貸し付けのことであり、ユーザは担保を元にお金を借り受けることができます。その返済には利子が伴うことがあります。流動性選好の観点とお金の貯蔵性からマネーを借りる場合には、利子が発生することは避けられません(減価する貨幣などお金の機能を一部変化させている対象は除く)。フラッシュローンとは担保なしで対象資産(暗号資産やトークンなど)を借り受け、その債務の処理と返済を同じ取引(Ethereumブロックチェーン上では1つのトランザクション)で解消することができるDeFiプロトコルの機能のことです。このとき利子は発生せず、手数料が発生する場合があります。この記事ではAaveのFlash Loanを取り扱います。フラッシュローンの実装は各プロトコルによって異なるため各プロトコルのドキュメントを確認する必要があります。[1]

Flash Loans are special uncollateralised loans that allow the borrowing of an asset, as long as the borrowed amount (and a fee) is returned before the end of the transaction. There is no real world analogy to Flash Loans.

フラッシュローンは担保なしでマネーを融通することができる点、またトランザクション内で借りたマネーの操作や返済を一挙に行える点が特徴で、以下のような処理・アプリケーションへの応用が考えられています。アビトラはまさにdYdXのフラッシュローン事件で応用されており、当該事件では故意に価格差を発生させることでアビトラを成功させシングルトランザクションで裁定解消まで完結しています。DeFiではマネー・レゴという発想で各プロトコルを組み合わせおのおのが自由にトランザクションを作ったりスマートコントラクトをデプロイしたりすることができます。コンポーザビリティと自由度の高さからフラッシュローンを使ったプロトコルへの攻撃がさかんに行われているのが現状です。[2]

  • Arbitrage(アービトラージ)
  • Refinance loan(ローンの借り換え)
  • Swap collaterals(担保のスワップ)

フラッシュローンはシングルトランザクション内でアビトラの処理や返済(aaveは手数料も支払う必要あり)ができなければ処理はリバートされるため、もし貸し借りが成立したらどうなるだろうという as-if 的世界に見えます。このような取引は現実の取引所や金融資産では行えなかったので『There is no real world analogy to Flash Loans』という説明は非常に的を得ています。フラッシュローンのユースケースの1つであるアービトラージを例に取ってみます。ある商品の価格差(同一商品の先物と現物の価格や複数取引所間の価格など複数パターンあり)を認識して裁定取引のポジションを建てた場合、1) 裁定取引の解消に伴うリスク、2) 手数料などで利益が消滅するリスクが存在します。アービトラージを成功させるには複数の取引が必要でその複数の取引に関連する様々な不確実性が存在しています。端的にいうとそれら複数の取引を1つの取引としてDeFiのエコシステムで実行できることがフラッシュローンのメリットだと考えます。さらにフラッシュローンでは担保をデポジットする必要がありません。アトミックなトランザクション内で返済ができれば1億でも10億でも借りられるため、大きな金額をレバレッジすることが可能になります。

プロトコル別の相違点

フラッシュローンは現在3つのプロトコルAave/dYdX/Uniswapで利用することが可能です。比較が以下のサイトに掲載されているので簡単に記載しておきます。とりあえず簡単に使うならAaveがお勧めです。[3]

  1. Aave Flash Loan
    Pros: 扱える資産の種類が豊富、WETHでなく生のETHを直接扱える、Truffle boxにフラッシュローンのテンプレートが用意されている
    Cons: 0.09%の手数料がかかる
  2. dYdX Flashloans
    Pros: メタトランザクションでフラッシュローンを実現するため手数料がかからない、またdYdX上のアービトラージにその債務を使用できる
    Cons: 扱える資産の種類が限られる、ETHを直に扱えずWETHしか使用できない、メタトランザクションの構築が初心者には複雑
  3. Uniswap Flashswap
    Pros: swapで支払いより先にトークンを受け取ることができる、WETHでなく生のETHを直接扱える、Uniswap上の取引にそのまま使用できる
    Cons: 0.3%の手数料がかかる、但しこれは通常のUniswapのスワップ手数料と同じ

dYdXは少し上級者向けです。Aaveはドキュメントが平易でトランザクションやフラッシュローンに手数料がかかることを考慮しても全体的なコストは安いと思います。学習コストはほとんどかかりません。dYdXやUniswapを使いたい場合はライブラリの使用をお勧めします。[4] [5]

Aave V1とAave V2の違い

Aave V2では複数の新しい機能が導入されています。公式ブログの内容を簡単におさらいしてみました。[6]

  1. イールド&担保のスワップ — 担保としてプロトコルへロックしているトークンであってもプロトコル内でのスワップが可能です、例えば担保している資産の価格が下落してきた際にステーブルコインへ逃がして清算を防ぐことができます
  2. バッチフラッシュローン — 複数のトークンを1つのフラッシュローンのトランザクション内で借りることができます、プロトコル内のすべてのトークンに対してバッチでフラッシュローンを実行するようなことも可能です
  3. 担保資産による返済 — ローンの返済にいまロックしているトークンを使いたいとした場合に一度担保を引き揚げて、ローンの返済に必要なトークンを購入する必要がありました、V2では担保のトークンをそのまま返済に充てることができます
  4. フラッシュリクイデーション — フラッシュローンと同様に清算人もフラッシュローンの仕組みを使えるようになりました、清算の資金をフラッシュローンで都合してポジションを処理できます
  5. デットトークナイゼーション — 負債に対してトークンが付与されます、これによってCredit Delegation(信用委任)がプロトコル上でネイティブにサポートされるようになりました、昨年はOpenLawを使用したCDVでCreditDelegationを実現していましたが、Aave V2からはプロトコル内で完結できるようになっています [7]
  6. ガス料金最適化 — 最大で50%程度のガスコストの圧縮を行いました
  7. 固定・変動金利選択 — 特定のウォレットであるトークンの借受けを固定金利および変動金利両方で借りては作成できるようになりました
Credit Delegation

以下のツールやサービスへのダイレクトアクセスが提供されています。

Aave:

Aave V2のフラッシュローン

前述のとおりAave V2ではバッチフラッシュローンがサポートされています。ドキュメントを見たところAave V2ではフラッシュローンはむしろ必ずバッチフラッシュローンとなり、どのトークンを含めるかで単一のトークンを対象とするか複数トークンを取り入れるのかが変わってきます。

ブラウニー “Brownie” でDeFiのテストが簡単にできる!!』の記事でPythonを使用したスマートコントラクト開発とテストをお試ししてみましたが、今回もブラウニーさんでAave V2のフラッシュローンの動作を確認してみます。ブラウニーはyearn.finance系のチームで使用されているようです。

Aave V1がまだ稼働しているのでまずはAave V1をテストしてみましょう。メインネットをローカルにフォークして brownie test でテストを行えます。テストしたコードはこちらですが、ethを借りて返すだけのシンプルなもので上手くいきました。Aaveでのフラッシュローンの手数料は借りたトークン建てで債務の0.09%です。

$ brownie init
$ vim brownie-config.yaml
$ ganache-cli -f https://mainnet.infura.io/v3/<your end point> -i 1
$ brownie test
If an error occurred, print the remained eth in wei

Aave V2ではバッチフラッシュローンが導入されています。複数のトークンに対してシングルトランザクションでフラッシュローンを実行することができます。フラッシュローンを呼び出す flashLoan() の関数も大きく変わりました。以前の主な引数は _asset_amount ぐらいでしたが、V2は modes によって未済時の挙動を変更できるようになっています。

Aave V1では借りたトークンと手数料を自らレンディングプールへ送金する必要があることに対して、Aave V2ではレンディングプールのスマートコントラクト側から債務者・コントラクトのトークンをプルする使用になっています。この仕様の変更に伴って必要な金額がプルできなかった場合に、トランザクションをリバートするのか、それとも逆に負債として記録するのかを設定できるようになりました。

lendingpool#flashloan

フラッシュローンを実行するにはレンディングプールのインターフェースに実装されている flashLoan 関数を呼び出すだけですが、EOA(Externally Owned Address)から呼び出す場合とコントラクトアドレス(その他コントラクトやフラッシュローンが実装されているコントラクト自身)から呼び出すケースが考えられます。 receiverAddress がローンが振り込まれるアドレスで、フラッシュローンのコントラクトアドレスが該当します。 onBehalfOf はローン未済の場合の負債を発生させるアドレスを指定できます。

LENDING_POOL.flashLoan(
receiverAddress,
assets,
amounts,
modes,
onBehalfOf,
params,
referralCode
);

手数料は fee ではなく premiums と呼ばれるようになりました。返済はローンと手数料をレンディングプールへ送るのではなく、トークンをレンディングプールのアドレスに対してアプルーブするだけで良いです。

You do not need to transfer the owed amount back to the LendingPool. The funds will be automatically pulled at the conclusion of your operation.

Aave V2のテストコードはこのようなかんじでしょうか。実行は brownie test のコマンドで行えます。Aave V2のフラッシュローンの違いは見てきたとおり2つです。バッチフラッシュローンのサポートと返済がプッシュ型からプル型へ変更されたことでした。

Appendix

すでにデモを行っているコード群を途中で見つけたので後学のために貼っておきます。後で見返す用です。1つめがバッチフラッシュローンとレンディングプールの関数を使って以下のような処理をシングルトランザクションでテスト実行します。

このコードはKovanテストネット用ですが、フラッシュローンの実行にあたりフラッシュローンのコントラクトにKovanのAAVE/DAI/LINKを事前に送金しておく必要があります。送金金額はAAVE/DAI/LINKでそれぞれいくらのローンを立てるかに依存します。[8]

  1. フラッシュローンで借りたトークンを担保としてロックする
  2. 追加でKovan LINKをプールから借り受ける
  3. 追加で借りたKovan LINKを返済して担保を解放する
  4. レンディングプールからロックした担保を引き出す
  5. バッチフラッシュローンを返済できるよう処理をする

brownie-mixはbrownieを使ったプロジェクトテンプレートです。Aave V1およびAave V2両方をサポートするbrownie-mixが既に公開されています。

brownie bake でプロジェクトをローカルに展開できます。これはTruffleの truffle unbox と同じだと考えてよさそうです。[9]

--

--

Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。