套利(Arbitrage)、智慧合約開發(Contract Coding)和樂觀轉賬(Optimistic Transfer)共同 創造了一個令人印象深刻的新工具組合。這是在公共區塊鏈創新之上構建的創新。兩項創新相互融合, 創造了一個真正強大而獨特的獲利機制。 本教程分為兩個部分,在第一部分中,我們將解釋閃電貸(Flash Loan)和閃電兌換(Flash Swap)背後的 一些基本概念。在第二部分中,我們將展示如何構建自己的以太坊套利機器人(Arbitrage Bot), 該機器人在Infura上執行,利用閃電貸捕捉並執行套利機會。
用自己熟悉的語言學習 以太坊DApp開發 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart
1、套利/Arbitrage套利交易(Arbitrage Trading)並非區塊鏈或閃電貸(Flash Loan)獨有的概念,當你在不同的交易所 擁有相同資產且其價格不同的時候,就有機會利用套利交易獲利。
讓我們以Uniswap和Sushiswap這兩個DEX為例看一下套利的具體工作原理。Sushiswap是Uniswap的一個 分支,這意味著它們在相同的智慧合約程式碼上執行。雖然它們是兩個不同的去中心化交易所,但我們 可以使用相同的程式碼執行相同的交易。另外,由於Sushiswap是較新的交易所,因此支援它的機器人(Bot) 可能更少。
套利的工作原理大致如下:1 ETH在Uniswap中價值80 DAI,而在Sushiswap中則價值100 DAI。那麼我們 在Uniswap上購買1 ETH,然後立即在Sushiswap上出售,就可以賺取20 Dai(扣除汽油和費用之前)。 這就是典型的套利交易。
2、閃電貸 vs. 閃電兌換閃電貸(Flash Loan)和閃電兌換(Flash Swap)是區塊鏈獨有的概念。上圖顯示了兩者之間的一些 關鍵區別。讓我們進一步說明其中的要點。
閃電貸(Flash Loan)必須以你借入的同一資產償還:如果借入Dai,就需要償還Dai。 生息協議Aave對閃電貸收取0.09%的費用。它至少需要進行三個操作:
在Aave上借款在一個DEX上進行兌換在另一個DEX上進行套利交易以實現利潤閃電兌換(Flash Swap)允許交易者在交易後期支付(或返還)資產之前,先接收資產 並在其他地方利用該資產。就像在Uniswap上所做的那樣,閃電交換沒有固定費用,而是收取交換費。 與閃電貸相比,閃電兌換可以看作是“免費”貸款,因為兌換手續費是從交易訂單中扣除的,我們不必 單獨付款。最後一點區別:我們可以償還兌換的任何資產。如果我們使用閃電兌換拿ETH買入Dai, 那麼用Dai或ETH償還都可以,這使我們可以執行更復雜的操作。
閃電兌換和閃電貸均採用樂觀轉移(Optimistic Tranfer),這是我們稍後將介紹的一種迷人的技術。
3、閃電貸與智慧合約需要了解的閃電貸的另一個概念是以太坊交易的性質。所有以太坊交易均源自外部持有帳戶(EOA), 這是一個由人操作的以太坊地址。以太坊交易可以從一個EOA轉到另一個EOA,就像你付錢給朋友一樣。 以太坊交易也可以從EOA轉到智慧合約中執行程式碼。該合約可以呼叫另一個合約,依此類推,直到 你的交易用完GAS為止。
稍後我們將看到,閃電貸在其執行過程中需要進行多次函式呼叫,這對於EOA來說是不可能的。因此, 我們將部署一個包含多步驟流程的智慧合約來實現閃電貸。我們發起的套利交易將從EOA執行到AAVE合約, 只需要提供地址給已部署合約即可。此外,由於閃電貸交易的複雜性,可能導致交易成本很高,因此 我們還需要為EOA賬號提供足以支付交易的GAS成本的ETH。請記住,交易的價格取決於它需要多少計算能力。
4、樂觀轉賬 / Optimistic Transfer閃電貸和閃電兌換均採用稱為”樂觀轉賬“的技術。這個了不起的DeFi創新技術使使用者可以進行 無抵押貸款或兌換交易,只要使用者在交易結束時還清借款,就可以執行交易。為了更好地理解 這個想法,讓我們看一些程式碼。
這是Aave(V1)的LendingPool.sol 合約的程式碼。讓我們注意flashLoan函式的實現,尤其是以下方法:
在877行中,我們可以看到智慧合約“樂觀地”將資金轉移到使用者的合約中 - 它並沒有檢查使用者合約 的餘額以確保使用者有足夠的資產償還借款,就直接轉賬了。
這怎麼可能?難道使用者不會拿著這些代幣逃跑?好吧,如果這是交易的結束,那麼那將是一個嚴重 的問題。但是正如你所看到的,程式碼還沒有結束。使用者的合約是否保留這些代幣取決於成功執行的 接下來的幾行。
樂觀轉賬後,在第881行,我們看到Aave合約然後使用代幣的樂觀餘額(Optimistic Balance)和 使用者已傳入的任何引數呼叫使用者的合約。這些引數將是使用者需要將其傳遞給其合約的任何東西。 交易成功執行。現在,交易工作流程在Aave合約上暫時中止,並移至使用者的合約繼續執行,該合約 將執行其邏輯並有望成功交易。
在第884行,使用者的合約程式碼已執行完成,工作流程現在返回到Aave合約,該合約使用require語句檢查 使用者合約返回的值。樂觀精神到這裡就結束了,現在我們必須看看使用者合約是否已經執行了有利可圖 的交易!如果是這樣,Aave合約將能夠扣除其費用。如果交易沒有獲利,則該require宣告將失敗, 這意味著整個交易都將失敗,也意味著我們之前的樂觀轉賬實際上並不會發生。
讓我們看一下Uniswap如何實現其樂觀轉賬。這是從他們的UniswapV2Pair.sol合約中獲得的,特別 注意swap函式:
樂觀轉賬發生在170-171行,就是這個_safeTransfer方法。Uniswap甚至給出了這種樂觀轉賬的註釋, 以便更好地識別它(順便說一下,Uniswap提供有關其協議合約的大量文件和教程)。 下一行是Uniswap合約以樂觀餘額呼叫使用者的合約。
再次,假設事務工作流在Uniswap合約上暫停執行,並攜帶樂觀轉移的代幣到使用者合約繼續執行。 一旦執行完使用者合約,交易工作流就會回到Uniswap合約。然後,Uniswap合約分配使用者合約的新餘額, 並嘗試收取兌換手續費(第180-181行)。
如果使用者合約未能透過代幣獲利,則require關於182的宣告將失敗,並且整個交易將回滾。這是 樂觀轉賬的關鍵-100%取決於交易是否成功。如果不成功,則交易無效,並且將恢復為代幣轉讓之前 的狀態。但是,如果成功,則可以保持樂觀轉賬,並且使用者可以獲利。
在本系列的第二部分中,我們將逐步構建一個套利機器人。可以在此處預覽程式碼。
原文連結:http://blog.hubwiz.com/2021/01/23/flashloan-arbitrage-bot-tutorial/