使用 Aave 建立 flash loan
作者 Alchemy
簡介
在本教學中,我們將:
- 建立並部署一個 Flash loan 智慧合約
- 透過名為 Aave 的流動性協議取得資金
- 與已部署的合約互動以執行 Flash loan
在開始之前,先來看看這個專案的各個組成部分:
什麼是 flash loan?
在傳統金融中,借款人通常必須提供抵押品才能取得貸款。這種抵押品通常是像汽車或房屋這樣的資產。銀行以此抵押品作為擔保,在借款人無法還款時用以彌補損失。
在 去中心化金融(DeFi) 的世界中,借款人可以透過 flash loan 在不提供抵押品的情況下取得貸款。
在 flash loan 中,貸方可以在同一筆交易中同時提供貸款給借款人並收回還款。這是因為交易發起的時間點與其最終被寫入區塊鏈上某個區塊的時間點之間存在時間差。
以下是 flash loan 的步驟:
-
借款人執行 Flash loan 智慧合約
-
Flash loan 合約向流動性池請求一筆貸款金額
-
合約使用貸款資金執行指定的操作(例如在交易所進行交易)
-
操作完成後,借入的資金會歸還給流動性池
-
該交易被寫入區塊鏈
智慧合約讓我們能夠驗證以下事項:
- Flash loan 有足夠的資金來執行智慧合約中的操作。
- 在交易被加入新區塊之前,操作已經完成
- 這些操作不會導致借款人的資金損失
- 借貸池收到正確的還款金額,加上使用該協議的交易手續費
只要貸方能收回正確的借款金額,借款人可以用這筆資金做任何事。以下是一些常見的 Flash Loan 使用案例:
-
套利交易 - 將某代幣從一個交易所轉移到價格較高的另一個交易所以賺取利潤
-
抵押品互換 - 將已抵押貸款的代幣換成另一種代幣作為現有貸款的抵押品
-
自我清算 - 透過交換代幣並償還 flash loan 來償還已抵押的貸款
在 flash loan 合約執行之前,合約需要先取得資金。Flash loan 資金通常來自一個主要的借貸協議,即 Aave。
由於 flash loan 的機制不需要任何抵押品,因此借款十分容易。但這項特性也可能讓 flash loan 被攻擊者用來發動 flash loan 攻擊。所謂 flash loan 攻擊,是指借款人借入資金、操縱資產價格,然後以大幅獲利的方式歸還借入的資產。這通常是透過入侵報價 oracle 或在市場上製造人為波動來達成。選擇像 Chainlink 這樣的去中心化 oracle,並透過像 OpenZepplin 這樣的服務對智慧合約進行審計,都是防範這類攻擊的方法。
什麼是 Aave?
在傳統貸款中,資金由銀行提供。在 DeFi 中,Aave 協議是 flash loan 最主要的資金來源。Aave 讓使用者可以提供 ERC20 代幣的流動性池。借款人可以使用這些資金池取得貸款。根據貸款類型,借款人需支付利息,這筆利息會分配給提供資金的供應方作為其提供代幣的收益。目前 Aave 協議還會收取 0.09% 的交易手續費。
我們來看看這些概念是如何結合起來組成一個 flash loan 的:
需求
-
存取 Remix IDE
-
建立一個 Metamask Wallet
取得智慧合約程式碼
1)在 Remix IDE 中開啟一個新的 workspace。
2)在另一個分頁中,開啟 這裡 的 Github Gists。裡面包含我們用來建立 flash loan 的智慧合約程式碼。
3)在 Remix IDE 中依照以下確切名稱建立新的合約檔案,並將對應的程式碼複製貼上到各檔案中(共 6 個):
-
Flashloan.sol
-
FlashloanRecieverBase.sol
-
IFlashLoanReciever.sol
-
ILendingPool.sol
-
ILendingPoolAnddressesProvider.sol
-
Withdrawable.sol

關於這些合約
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 合約。為此,我們需要在錢包中準備好資金:
-
輸入你的錢包地址:
-
在你的 Metamask Wallet 中選擇 Kovan Network

- 確認選擇 .1 Test Eth

-
等待代幣轉帳的確認
-
資金應該已被加入你的 Metamask Wallet
部署合約
現在我們的錢包裡有一些資金了,接下來要將智慧合約部署到 Kovan Testnet,以便我們可以執行並與其互動。
1)前往 Remix 側邊欄中的 Solidity Compiler

2)使用以下設定:
Compiler:0.6.6+comitt.6c…
Language:Solidity
EVM Version:Default
Compile Flashloan.sol

4)點擊「Compile」- 若成功,你可能會收到一些警告訊息,但不會有錯誤
編譯完 flash loan 智慧合約後,我們需要進行部署:
1)前往「Deploy and Run Transactions」分頁

2)使用以下設定:
Environment: Injected Web3
Account:複製並貼上你的 Kovan 錢包地址
Contract: Flashloan - contracts/Flashloan

3)將 Lending Pool Contract 加入為 address_addressProvider:0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5。這是 Aave 借貸提供方的地址。你可以在 這裡 找到其他合約地址。

4)點擊「Deploy」
5)Metamask 應該會跳出視窗讓你「Confirm」該筆交易。在你的終端機中,你會看到可在 etherscan 上檢視交易的連結。

為 flash loan 加值
我們的智慧合約現在已經部署到 Kovan Test Network 上。接下來我們需要從 Aave 的 testnet 借貸池為合約加入資金。
-
連接你的 Metamask Wallet
-
確認你使用的是「Kovan Ethereum Market」。畫面上會有一個小小的「K」標記

注意:你可能需要在設定中啟用「Testnet mode」。

- 點擊「Assets to supply」下方的「Supply」按鈕,將一些 test Eth 供應給 Aave。我們可以先從 .001 開始

- 接著點擊 DAI 旁邊的「Borrow」按鈕來借入一些 DAI。借入 10 DAI。

- Metamask 會跳出視窗要求確認該筆交易,交易完成後 DAI 就會出現在你的錢包中:

- 如果這是你第一次收到 DAI,你需要先設定錢包才能在其中看到 DAI。
- 在 Metamask 中前往「Import Tokens」

- 輸入 Kovan 上的 DAI 合約地址:0xFf795577d9AC8bD7D90Ee22b6C170349
- 一旦你的錢包中有了 DAI,請將 10 DAI 傳送到你已部署的合約。你可以從 Remix 複製你已部署合約的地址:

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

執行 flash loan 合約
現在我們需要呼叫 Aave 的 KovanTestnet DAI 合約,以指定我們在執行智慧合約時要使用的資產。
-
回到你的 Remix IDE,前往「Deploy & Run Transactions」分頁
-
在「Deployed Contracts」下方,你會看到你的 flash loan 及其合約地址

- 前往標示為「flashloan」旁邊、標籤為「address asset」的文字欄位

-
在 address_asset 欄位中輸入這個合約地址:0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD。接著點擊 flashloan 標籤按鈕以開始這筆交易。
-
這會啟動 flash loan 流程,並在 etherscan 上產生 3 筆交易。

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

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


