溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Flash Loan套利程序開發(fā)方法是什么

發(fā)布時間:2021-12-29 14:28:15 來源:億速云 閱讀:181 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“Flash Loan套利程序開發(fā)方法是什么”,在日常操作中,相信很多人在Flash Loan套利程序開發(fā)方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Flash Loan套利程序開發(fā)方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、DEX套利機器人使用的技術(shù)棧

教程中使用的技術(shù)棧如下:

  • Node.js:基礎(chǔ)運行環(huán)境

  • Ethers.js:以太坊JS開發(fā)庫

  • Infura:提供以太坊接入訪問點

  • Solidity:套利智能合約

后端采用Node開發(fā),使用Infura節(jié)點來跟蹤Uniswap和Sushiswap合約中ETH和Dai的價格。我們利用Infura端點來獲取主網(wǎng)上產(chǎn)出的每個新區(qū)塊上的價格。

我們之所以使用Ethers.js,是因為它與Typescript(項目的原始語言)兼容。

2、使用.env保存套利機器人的敏感信息

這是非常重要的!由于需要存儲私鑰來簽署主網(wǎng)交易,我們將所有敏感信息都放在.env文件中,此外,套利合約的地址和Infura主網(wǎng)端點的key也存入該文件:

PRIVATE_KEY=
FLASH_LOANER=
INFURA_KEY=

確保PRIVATE_KEY與部署FLASH_LOANER合約時使用的賬號相同。另外,與PRIVATE_KEY對應(yīng)的以太坊賬號需要有足夠的資金來支付GAS成本。

如果你不確定我們?yōu)槭裁催@樣做,請閱讀這篇文章,它解釋了如何避免將私鑰上傳到Github。如文章所述,我們需要將敏感信息放入此.env文件中,然后將其添加到.gitignore文件中,如下所示:

.env
yarn.lock
package-lock.json
node_modules

這樣,當我們將信息推送到Github時,將不包括該文件在內(nèi)。這一點超級、超級重要!

3、DEX合約實例化

接下來,我們在第11行和第12行上實例化Uniswap和Sushiswap合約:

// uni/sushiswap ABIs
const UniswapV2Pair = require('./abis/IUniswapV2Pair.json');
const UniswapV2Factory = require('./abis/IUniswapV2Factory.json');

Sushiswap本質(zhì)上是Uniswap的一個分支,因此它們具有完全相同的合同ABI和可供我們使用的完全相同的功能…。這也是他們適合套利的另一個原因!

4、定期檢查套利機會

第50行是套利機器人的關(guān)鍵所在。每隔一個區(qū)塊時間,我們將要求Infura檢查Uniswap和Sushiswap中ETH和Dai的價格。然后,我們將比較這些數(shù)字以獲得“價差”或可能的利潤空間。

provider.on('block', async (blockNumber) => {
    try {
      console.log(blockNumber);
      const sushiReserves = await sushiEthDai.getReserves();
      const uniswapReserves = await uniswapEthDai.getReserves();
[...]
  }
}

5、關(guān)于提前交易/Front Running

提前交易在中心化金融交易中很常見,通常利用數(shù)據(jù)速度獲取微小的優(yōu)勢。我們不必為此擔心太多,因為Uniswap和Sushiswap是去中心化交易所。它們的價格保持在鏈上,并且逐塊變化。

即使我們想以某種方式在網(wǎng)絡(luò)主體之前獲取信息,唯一能采取行動的方法是將交易包括在下一個區(qū)塊中,這對所有人都是可見的。我們需要支付高昂的GAS費來阻止搶先交易,但這大概是最大的收益。

6、避免無法獲利的交易 - GAS估算

這樣的DeFi交易可能非常昂貴。雖然套利活動可能獲利,但利潤空間更可能被GAS成本吞噬。我們的套利機器人程序的一項重要檢查就是確保GAS成本不會吃掉利潤。我們執(zhí)行此操作,并將其包含在shouldSendTx中:

const shouldSendTx = shouldStartEth
  ? (gasCost / ETH_TRADE) < spread
  : (gasCost / (DAI_TRADE / priceUniswap)) < spread;

對于像ETH和Dai這樣常見的交易對,并沒有很多的獲利機會。這些交易對的交易量很大,并且Uniswap和Sushiswap是比較受歡迎的交易所。從經(jīng)濟角度來講,套利機會是市場效率低下的結(jié)果。如果有很多人在使用這些貨幣對,那么我們不太可能找到很多機會。因此需要找到更新的代幣或交易所!

7、開發(fā)套利智能合約

點擊這里查看套利合約的源代碼。

基本上,合約是我們的套利中介。當程序檢測到有利可圖的機會時,它將向該合約發(fā)送資金和交易指令。我們的套利合約相對還是比較簡單的。大多數(shù)代碼來自Uniswap的示例代碼。

合約的構(gòu)造函數(shù),可以傳入一些硬編碼的數(shù)據(jù),例如Uniswap和Sushiswap的合約地址。合約還有一個函數(shù)uniswapV2Call,我們在其中以樂觀方式從一個交易所借入代幣,在另一個交易所執(zhí)行交換,然后立即償還第一筆借款:

pragma solidity =0.6.6;

import './UniswapV2Library.sol';
import './interfaces/IUniswapV2Router02.sol';
import './interfaces/IUniswapV2Pair.sol';
import './interfaces/IERC20.sol';

contract FlashLoaner {
  address immutable factory;
  uint constant deadline = 10 days;
  IUniswapV2Router02 immutable sushiRouter;

  constructor(address _factory, address _uniRouter, address _sushiRouter) public {
    factory = _factory;  
    sushiRouter = IUniswapV2Router02(_sushiRouter);
  }

  function uniswapV2Call(address _sender, uint _amount0, uint _amount1, bytes calldata _data) external {
      address[] memory path = new address[](2);
      uint amountToken = _amount0 == 0 ? _amount1 : _amount0;
      
      address token0 = IUniswapV2Pair(msg.sender).token0();
      address token1 = IUniswapV2Pair(msg.sender).token1();

      require(msg.sender == UniswapV2Library.pairFor(factory, token0, token1), "Unauthorized"); 
      require(_amount0 == 0 || _amount1 == 0);

      path[0] = _amount0 == 0 ? token1 : token0;
      path[1] = _amount0 == 0 ? token0 : token1;

      IERC20 token = IERC20(_amount0 == 0 ? token1 : token0);
      
      token.approve(address(sushiRouter), amountToken);

      // no need for require() check, if amount required is not sent sushiRouter will revert
      uint amountRequired = UniswapV2Library.getAmountsIn(factory, amountToken, path)[0];
      uint amountReceived = sushiRouter.swapExactTokensForTokens(amountToken, amountRequired, path, msg.sender, deadline)[1];

      // YEAHH PROFIT
      token.transfer(_sender, amountReceived - amountRequired);
    
  }
}

如果有任何利潤,合約會將其發(fā)送到發(fā)起交易的地址(_sender)。

到此,關(guān)于“Flash Loan套利程序開發(fā)方法是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI