如何使用Aave進行閃電貸
概述
Aave,以前稱為 ETHLender,現在是 DeFi 領域的前沿應用。Aave 是該領域中第一個提出閃電貸[4]概念的人。在閃電貸之前,你必須用一個超額抵押的資產來借貸另一個資產。例如,如果我想借一個[DAI](https://en.wikipedia.org/wiki/Dai_(cryptocurrency "DAI")),我將不得不存入另一個超過該價值的加密貨幣。換句話說,你必須有錢才能借到錢。閃電貸打破了這種想法。他們為一個新的貸款系統打开了大門,並且做到了這一點,允許用戶在不提供任何東西作為抵押的情況下借款。
在本教程中,你將了解到閃電貸[5]是如何實現的,以及如何自己實現執行一筆閃電貸。
關於 Aave
摘自Aave 官網[6]:Aave 是一個去中心化的非托管流動性市場協議,用戶可以作為存款人或借款人參與。儲戶向市場提供流動性,以賺取被動收入,而借款人能夠以過度抵押(永久)或不足抵押(單塊流動性)的方式借款。
這個定義完全正確的,但如果你不熟悉 DeFi 行業的行話,你可能並不理解它的含義。你可以把 Aave 看成是一個去中心化的僞銀行。Aave 沒有一個驗證所有交易的中央銀行,而是利用智能合約,以自動化的方式完成所有這些工作。存款人將他們的代幣放入 Aave,並开始為他們的存款賺取利息。另一方面,借款人會做相反的事情。他們從 Aave 中取出錢,並开始對所借的金額計息。不過他們必須超額抵押[7]才能借到錢。
對於那些不想把錢存入 Aave,而只想借錢的人來說,還有一種方法。這就是我們前面提到的閃電貸。
關於閃電貸(Flash Loan)
之前提到的閃電貸是一種在區塊鏈上借入資產的新方式。最初由 Aave 實現,其他趨勢性的 DeFi 協議,如dYdX[8]迅速跟進,增加了這個新功能。所有以太坊交易的一個特性,使閃電貸成為可能。而這個關鍵特性就是[原子性](https://en.wikipedia.org/wiki/Atomicity_(database_systems "原子性")#:~:text=一個原子交易就是,直接拒絕整個系列。)。
一個交易的操作系列是不可分割和不可消減的,它就是原子的。簡單來說就是:要么所有執行,要么什么都沒有發生。沒有中間狀態! 閃電貸利用原子性,允許用戶在不提交抵押品的情況下先進行借款。首先,每當你在閃電貸中借入一項資產時,你必須支付貸款金額的 0.09%的費用。其次,你必須在借貸的同一交易中償還貸款。雖然這種能力很好,但它的用途卻有些局限。閃電貸主要用於資產間套利[9]。
Remix 設置
為了簡單起見,我們將使用Remix IDE[10]。Remix 是一個基於瀏覽器的 IDE。也被稱為集成开發環境。Remix 具有編寫、調試、部署和操作以太坊智能合約[11]的能力。瀏覽器中加載 Remix 後,你會看到這個菜單:
這裏不會對 IDE 進行深入的研究(你可以閱讀跟我學 Solidity :开發環境[12]),因為本教程的重點是閃電貸。不過,你需要了解一下上圖的四個部分:主面板、側邊面板、圖標面板和終端面板。
在我們开始編寫智能合約之前,我們要下載一個瀏覽器插件,現在最流行的是MetaMask[13],使我們能夠與以太坊區塊鏈對接。
MetaMask 安裝
如何安裝 MetaMask:
你將开始從網站https://metamask.io/上下載擴展程序。
點擊你新安裝的擴展程序,並同意條款和條件。
創建一個安全的密碼!
備份助記詞,它應該物理存在,不應該保存在你的電腦上的任何地方。
如果上述四個步驟都完成了,你就可以开始編寫你的第一個智能合約了!
智能合約
智能合約允許我們通過執行確定性的程序來讀寫區塊鏈的數據。我們使用一種名為Solidity[14]的編程語言編寫以太坊智能合約。Solidity 文件以.sol 擴展名結尾。
歡迎訂閱全面掌握 Solidity 智能合約开發[15]
你可以在第一次啓動 Remix 時刪除工作區中可能存在的任何文件。然後創建幾個文件:
FlashLoan.sol
**FlashLoanReceiverBase.sol **
ILendingPoolAddressesProvider.sol
IFlashLoanReceiver.sol
ILendingPool.sol
Withdrawable.sol
-
下面的代碼片斷是**FlashLoan.sol.**的實現。
這個閃電貸將借入 1 [DAI](https://en.wikipedia.org/wiki/Dai_(cryptocurrency "DAI"))。
pragma solidity ^0.6.6;
import "./FlashLoanReceiverBase.sol";
import "./ILendingPoolAddressesProvider.sol";
import "./ILendingPool.sol";
contract FlashloanV1 is FlashLoanReceiverBaseV1 {
constructor(address _addressProvider) FlashLoanReceiverBaseV1(_addressProvider) public{}
/**
Flash loan 1000000000000000000 wei (1 ether) worth of `_asset`
*/
function flashloan(address _asset) public onlyOwner {
bytes memory data = "";
uint amount = 1 ether;
ILendingPoolV1 lendingPool = ILendingPoolV1(addressesProvider.getLendingPool());
lendingPool.flashLoan(address(this), _asset, amount, data);
}
/**
This function is called after your contract has received the flash loaned amount
*/
function executeOperation(
address _reserve,
uint256 _amount,
uint256 _fee,
bytes calldata _params
)
external
override
{
require(_amount <= getBalanceInternal(address(this), _reserve), "Invalid balance, was the flashLoan successful?");
//
// Your logic goes here.
// !! Ensure that *this contract* has enough of `_reserve` funds to payback the `_fee` !!
//
uint totalDebt = _amount.add(_fee);
transferFundsBackToPoolInternal(_reserve, totalDebt);
}
}
總而言之,我們首先要導入執行閃電貸所需的依賴。其中一些依賴關系被稱為抽象合約[16])。一個抽象合約至少有個函數沒有實現。你可以把它想象成一個房子的圖紙。一個建築商使用這個圖紙來建造房子。然而,在我們的比喻中,圖紙是一個抽象合約,你是建造者,而房子是派生合約。
在我們的案例中,閃電貸合約使用的是一個名為FlashLoanReceiverBaseV1的抽象合約,它提供了必要的實現細節,如閃電貸的償還。
現在來逐行解讀代碼:
#1 首先,我們必須定義 solidity 編譯器的版本。在這個例子中,它是 0.6.6。
#2-4 為智能合約導入依賴項 #6 FlashLoanV1 合約是繼承自 FlashLoanReceiverBaseV1 合約。
#8 傳遞了 Aave 的一個借貸池提供者的地址。在這個例子中,我們提供的是 DAI 借貸池的地址。
#13 定義了一個叫做 flashLoan 的函數。參數是想要閃電貸的資產地址。在這種情況下,該資產是 DAI。
#14 由於這裏不需要任何閃電貸的數據,所以我們傳遞一個空字符串。
#15. 定義我們想要借出的 DAI 的數量(以 10^18 的 Wei 為單位)。
#16. 通過 Aave 提供的 ILendingPoolV1 初始化 LendingPool 接口,這樣我們就可以調用 flashLoan 函數。#17. 最後,調用 flashLoan 函數。該函數需要 4 個主要參數。首先,傳遞將接收貸款的地址。在我們的例子中,它是當前合約。其次,我們傳遞資產的地址。在我們的例子中,它是 Kovan 網絡中 DAI 的地址。第三,傳遞資產的數量,在我們的案例中,它是 1 個 ether 單位(或 10^18 的 wei
單位)的數量。第四,傳遞額外的空數據。
#24-31. 接下來第二個函數 executeOperation。這就是我們利用閃電貸的地方。它在 flashLoan 函數成功執行後被內部調用。它需要 4 個主要參數,分別是:
1). 必須償還貸款的儲備資產地址。2). 資產的數額 3). 協議書所收取的費用 4). 額外的參數,由函數內部使用。
#33. 檢查我們是否收到了適當的貸款金額,否則它將拋出一個錯誤信息。
#34. 在這裏,可以根據你自己的使用場景,定制自己的實現邏輯(例如去 DEX 中套利)。
#40. 我們通過使用 SafeMaths 庫提供的 add 函數,將費用和貸款金額加在一起。
#41.最後,把總的債務或貸款金額還給貸款人。
部署合約
首先,打开你的 MetaMask,將你的網絡設置為
Kovan測試網絡
。
使用這個 gist 代碼來定義 flashloan 智能合約的依賴關系。點擊每個鏈接並將代碼粘貼到你之前創建的相應的 Solidity 文件中:a. ILendingPool[17]b. IFlashLoanReceiver[18]c. ILendingPoolAddressesProvider[19]d. FlashLoanReceiverBase[20]e. Withdrawable[21]
切換到
Solidity Compiler
標籤。將編譯器設置為 0.6.6 並點擊compile FlashLoan.sol
。
你應該看到一些警告,但沒有錯誤信息。
現在,我們已經准備好將合約部署到 Kovan 網絡。切換到
Deploy & Run Transctions
標籤。把部署環境(ENVIRONMENT),從 JavaScript VM 改為 Injected Web3。這應該會打开 MetaMask 詢問你的權限。
確保合約選擇的是 FlashLoan.sol。在部署按鈕旁邊的文本字段中提供 LendingPool 的地址。在我們的例子中,它將是0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5。然後點擊
Deploy(部署)
,它應該會打开 MetaMask。
注意。所有已部署的合約地址列表可在這裏[22]找到。在那裏,你可以找到 Aave 支持的各種借貸池的地址。雖然每個代幣的地址都不同,但程序是相同的。
點擊
確認(Confirm)
。這樣做後,你應該看到 MetaMask 發出的成功通知。之後側邊欄應該有一個 “已部署的合約(Deployed Contracts)”。
為閃電貸准備資金
在新的 已部署合約
標籤下,可以復制已部署合約的地址。我們稍後會回到這一步;與此同時,我們需要給閃電貸合約添加一些 DAI。這是因為閃電貸需要合約中的資金才能成功執行。為此,你可以跳轉到水龍頭[23]鏈接,獲得一些 DAI 代幣(請確保連接到右上角有小 K
的 Aave v2市場
)。點擊 Faucet,粘貼你的 MetaMask 錢包地址,然後等待確認。
獲得確認後,我們將把 DAI 代幣添加到 MetaMask 中。為此,打开你的 MetaMask。點擊底部的 Add Token
。在 代幣合約地址(Token Contract Address)
欄輸入 0xF795577d9AC8bD7D90Ee22b6C1703490b6512FD。這是 Kovan 的 DAI 的合約地址。點擊 下一步
後,它應該顯示你先前從水龍頭(Faucet)得到的 DAI。
接下來,點擊 DAI 代幣。點擊 發送
,它應該打开一個類似於下圖的窗口:
輸入我們的閃電貸的合約地址,之前已經復制了該地址。輸入我們要發送的金額。在我們的案例中,發送 10DAI。然後點擊 下一步
。點擊 確認
!你現在已經成功地給你的閃電貸合約發送了 10DAI。
執行閃電貸
回到 Remix,在部署的閃電貸合約下,還有一個 flashloan
函數。這個函數需要一個我們想使用的資產的合約地址。在我們的例子中,它是 Kovan 測試網的 DAI 合約,是 0xF795577d9AC8bD7D90Ee22b6C1703490b6512FD。正確填寫該字段後,你現在可以點擊 交易(transact)
按鈕,如下圖所示:
點擊按鈕後,MetaMask 會彈出交易確認。確認交易後,你應該收到一條成功信息。在 Remix 的終端,你應該看到一個 URL。點擊後會跳轉到 Etherscan。
在 代幣轉移(Tokens Transferred)
下,你應該看到三個不同的轉账:
紅色的箭頭強調了從 LendingPool 轉移 1 個 DAI 到我們的合約。橙色的箭頭表示將 1 個 DAI 連同費用一起返還給 Landing pool。藍色的箭頭表示產生利息的 DAI。
小結
我們成功地編寫了閃電貸的智能合約, 它能夠從資金池中借入 DAI,支付閃電貸費用,然後在一次交易中償還所借金額。不需要沒有任何抵押物就借到了錢!
本翻譯由 CellETF[24] 贊助支持。
來源:How to Make a Flash Loan using Aave[25]
參考資料
[1]
登鏈翻譯計劃: https://github.com/lbc-team/Pioneer
[2]
翻譯小組: https://learnblockchain.cn/people/412
[3]
Tiny 熊: https://learnblockchain.cn/people/15
[4]
閃電貸: https://aave.com/flash-loans/
[5]
閃電貸: https://learnblockchain.cn/tags/%E9%97%AA%E7%94%B5%E8%B4%B7
[6]
Aave官網: https://aave.com/
[7]
超額抵押: https://www.oxfordreference.com/view/10.1093/oi/authority.20110803100257900
[8]
dYdX: https://dydx.exchange/
[9]
資產間套利: https://en.wikipedia.org/wiki/Arbitrage
[10]
Remix IDE: https://remix.ethereum.org/
[11]
以太坊智能合約: https://ethereum.org/en/developers/docs/smart-contracts/
[12]
跟我學 Solidity :开發環境: https://learnblockchain.cn/article/1755
[13]
MetaMask: https://metamask.io/
[14]
Solidity: https://learnblockchain.cn/docs/solidity/
[15]
全面掌握Solidity智能合約开發: https://learnblockchain.cn/column/1
[16]
抽象合約: https://learnblockchain.cn/docs/solidity/contracts.html#abstract-contract
[17]
ILendingPool: https://gist.github.com/akp111/e254b2b5b98aa5a79f3f8dc501dfaedb#file-ilendingpool-sol
[18]
IFlashLoanReceiver: https://gist.github.com/akp111/e254b2b5b98aa5a79f3f8dc501dfaedb#file-iflashloanreceiver-sol
[19]
ILendingPoolAddressesProvider: https://gist.github.com/akp111/e254b2b5b98aa5a79f3f8dc501dfaedb#file-ilendingpooladdressesprovider-sol
[20]
FlashLoanReceiverBase: https://gist.github.com/akp111/e254b2b5b98aa5a79f3f8dc501dfaedb#file-flashloanreceiverbase-sol
[21]
Withdrawable: https://gist.github.com/akp111/e254b2b5b98aa5a79f3f8dc501dfaedb#file-withdrawable-sol
[22]
這裏: https://docs.aave.com/developers/v/1.0/deployed-contracts/deployed-contract-instances
[23]
水龍頭: https://testnet.aave.com/faucet/DAI
[24]
CellETF: https://celletf.io/?utm_souce=learnblockchain
[25]
How to Make a Flash Loan using Aave: https://www.quicknode.com/guides/defi/how-to-make-a-flash-loan-using-aave
譯文出自:登鏈翻譯計劃[1]
譯者:翻譯小組[2]
校對:Tiny 熊[3]
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
XRP飆升至三年新高,ChatGPT預言2025年可達5美元!
人工智能預測XRP何時可能達到5美元,並對新興山寨幣STARS給出看漲預測 全球交易者正在轉向Ch...
今日推薦|傳統金融巨頭Visa、摩根大通等正在積極推動資產代幣化
什么是代幣化資產?代幣化資產是資產所有權的數字化表示,存儲在區塊鏈上。這些數字代幣使得高價值資產可...
COW 單日翻倍領漲 DeFi 賽道,V 神最愛的 swap 有什么本領?
隨着特朗普的勝選,加密資產全线普漲,但最為矚目的項目當屬剛剛上线幣安的 COW,最高漲幅204%。...
今日推薦|DeFi 代幣飆升 30%,交易員預計在特朗普領導下 DeFi 將迎來“更友好”的環境
DeFi 公司擔心在美國證券交易委員會的監督下為其代幣實施“價值累積機制”——但隨着當選總統唐納德...
登鏈社區
文章數量
6粉絲數
0